Merged in fhunleth/libqxt/scgi-parsing-fix (pull request #11)

Fix SCGI header parsing [V2]
This commit is contained in:
Arvid Picciani 2013-05-02 21:09:42 +02:00
commit 413fb3caa9

View File

@ -131,7 +131,9 @@ bool QxtScgiServerConnector::canParseRequest(const QByteArray& buffer)
return false;
}
return (buffer.size() > expectedsize.toInt());
// The SCGI header is [len]":"[key/value pairs]","
int headersize = expectedsize.count() + expectedsize.toInt() + 2;
return (buffer.size() >= headersize);
}
/*!
@ -159,25 +161,26 @@ QHttpRequestHeader QxtScgiServerConnector::parseRequest(QByteArray& buffer)
}
buffer = buffer.right(buffer.size() - (expectedsize_s.count() + 1));
int expectedsize = expectedsize_s.toInt();
QByteArray requestheaders = buffer.mid(expectedsize_s.count() + 1, expectedsize);
buffer = buffer.mid(expectedsize_s.count() + expectedsize + 2);
QHttpRequestHeader request_m;
QByteArray name;
int i = 0;
while ((i = buffer.indexOf('\0')) > -1)
while ((i = requestheaders.indexOf('\0')) > -1)
{
if (name.isEmpty())
{
name = buffer.left(i);
name = requestheaders.left(i);
}
else
{
request_m.setValue(QString::fromLatin1(name).toLower(), QString::fromLatin1(buffer.left(i)));
request_m.setValue(QString::fromLatin1(name).toLower(), QString::fromLatin1(requestheaders.left(i)));
name = "";
}
buffer = buffer.mid(i + 1);
requestheaders = requestheaders.mid(i + 1);
}
@ -188,16 +191,13 @@ QHttpRequestHeader QxtScgiServerConnector::parseRequest(QByteArray& buffer)
{
if (key.startsWith(QString("http_")))
{
request_m.setValue(key.right(key.size() - 5), request_m.value(key));
QString realKey = key.right(key.size() - 5).replace(QLatin1Char('_'), QLatin1Char('-'));
request_m.setValue(realKey, request_m.value(key));
}
}
request_m.setValue("Connection", "close");
buffer.chop(1);
return request_m;
}