Enable specifying raw headers for the request

Use "--headers=file" where the file contains the raw headers to send.
This is useful for replaying requests from log files.

Change-Id: I3bbe582d96fc9797f692a0d5772e8164f8265ce0
Reviewed-by: Martin Petersson <Martin.Petersson@nokia.com>
This commit is contained in:
Shane Kearns 2012-04-24 15:57:24 +01:00 committed by Qt by Nokia
parent 1aeaf0e708
commit 32adb82741
3 changed files with 33 additions and 10 deletions

View File

@ -61,23 +61,20 @@ DownloadManager::~DownloadManager()
}
void DownloadManager::get(const QUrl &url, const QString &user, const QString &password)
void DownloadManager::get(const QNetworkRequest &request, const QString &user, const QString &password)
{
DownloadItem *dl = new DownloadItem(QNetworkRequest(url), user, password, nam);
DownloadItem *dl = new DownloadItem(request, user, password, nam);
transfers.append(dl);
connect(dl, SIGNAL(downloadFinished(TransferItem*)), SLOT(downloadFinished(TransferItem*)));
}
void DownloadManager::upload(const QUrl &url, const QString &user, const QString &password, const QString &filename, const QString &contentType, TransferItem::Method method)
void DownloadManager::upload(const QNetworkRequest &request, const QString &user, const QString &password, const QString &filename, TransferItem::Method method)
{
QScopedPointer<QFile> file(new QFile(filename));
if (!file->open(QFile::ReadOnly)) {
qDebug() << "Can't open input file" << file->fileName() << file->errorString();
return;
}
QNetworkRequest request(url);
if (!contentType.isEmpty())
request.setHeader(QNetworkRequest::ContentTypeHeader, contentType);
UploadItem *ul = new UploadItem(request, user, password, nam, file.take(), method);
transfers.append(ul);
connect(ul, SIGNAL(downloadFinished(TransferItem*)), SLOT(downloadFinished(TransferItem*)));

View File

@ -74,6 +74,7 @@ void printUsage()
<< " ,socks SOCKS5 proxy" << endl
<< " ,ftp FTP proxy" << endl
<< " ,httpcaching HTTP caching proxy (no CONNECT method)" << endl
<< "--headers=filename Set request headers from file contents" << endl
<< "--post=filename upload the file to the next url using HTTP POST" << endl
<< "--put=filename upload the file to the next url using HTTP PUT" << endl
<< "--content-type=<MIME> set content-type header for upload" << endl
@ -96,6 +97,7 @@ int main(int argc, char *argv[])
QString contentType;
QString httpUser;
QString httpPassword;
QString headersFile;
TransferItem::Method method = TransferItem::Get;
//arguments match wget where possible
foreach (QString str, app.arguments().mid(1)) {
@ -161,19 +163,43 @@ int main(int argc, char *argv[])
}
else if (str.startsWith("--content-type="))
contentType=str.mid(15);
else if (str.startsWith("--headers="))
headersFile=str.mid(10);
else if (str == "--serial")
dl.setQueueMode(DownloadManager::Serial);
else if (str.startsWith("-"))
qDebug() << "unsupported option" << str;
else {
QUrl url(QUrl::fromUserInput(str));
QNetworkRequest request(url);
//set headers
if (!headersFile.isEmpty()) {
QFile f(headersFile);
if (!f.open(QFile::ReadOnly | QFile::Text)) {
qDebug() << "can't open headers file: " << headersFile;
} else {
while (!f.atEnd()) {
QByteArray line = f.readLine().trimmed();
if (line.isEmpty()) break;
int colon = line.indexOf(':');
qDebug() << line;
if (colon > 0 && colon < line.length() - 2) {
request.setRawHeader(line.left(colon), line.mid(colon+2));
}
}
f.close();
}
}
if (!contentType.isEmpty())
request.setHeader(QNetworkRequest::ContentTypeHeader, contentType);
switch (method) {
case TransferItem::Put:
case TransferItem::Post:
dl.upload(url, httpUser, httpPassword, uploadFileName, contentType, method);
dl.upload(request, httpUser, httpPassword, uploadFileName, method);
break;
case TransferItem::Get:
dl.get(url, httpUser, httpPassword);
dl.get(request, httpUser, httpPassword);
break;
}
method = TransferItem::Get; //default for urls without a request type before it

View File

@ -98,8 +98,8 @@ class DownloadManager : public QObject
public:
DownloadManager();
~DownloadManager();
void get(const QUrl &url, const QString &user, const QString &password);
void upload(const QUrl &url, const QString &user, const QString &password, const QString &filename, const QString &contentType, TransferItem::Method method);
void get(const QNetworkRequest &request, const QString &user, const QString &password);
void upload(const QNetworkRequest &request, const QString &user, const QString &password, const QString &filename, TransferItem::Method method);
void setProxy(const QNetworkProxy &proxy) { nam.setProxy(proxy); }
void setProxyUser(const QString &user) { proxyUser = user; }
void setProxyPassword(const QString &password) { proxyPassword = password; }