mirror of
https://bitbucket.org/smil3y/kdelibs.git
synced 2025-02-24 02:42:48 +00:00
kio: implement HEAD method for KHTTP
kinda not worth it tho - neither browsers nor KIO use it actually, maybe optimization for bots and web crawlers Signed-off-by: Ivailo Monev <xakepa10@gmail.com>
This commit is contained in:
parent
ea22f815a4
commit
7cfaf11ad3
1 changed files with 22 additions and 17 deletions
|
@ -244,10 +244,10 @@ static QByteArray HTTPStatusToBytes(const ushort httpstatus)
|
||||||
return QByteArray("OK");
|
return QByteArray("OK");
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool shouldWriteData(const ushort httpstatus)
|
static bool shouldWriteContent(const ushort httpstatus, const bool get)
|
||||||
{
|
{
|
||||||
// 1xx and 204 are exceptions
|
// 1xx and 204 are exceptions
|
||||||
return (httpstatus >= 200 && httpstatus != 204);
|
return (get && httpstatus >= 200 && httpstatus != 204);
|
||||||
}
|
}
|
||||||
|
|
||||||
static QByteArray HTTPDate(const QDateTime &datetime)
|
static QByteArray HTTPDate(const QDateTime &datetime)
|
||||||
|
@ -260,9 +260,6 @@ static QByteArray HTTPDate(const QDateTime &datetime)
|
||||||
|
|
||||||
static QByteArray HTTPStatusToContent(const ushort httpstatus)
|
static QByteArray HTTPStatusToContent(const ushort httpstatus)
|
||||||
{
|
{
|
||||||
if (!shouldWriteData(httpstatus)) {
|
|
||||||
return QByteArray();
|
|
||||||
}
|
|
||||||
QByteArray httpdata("<html>\n");
|
QByteArray httpdata("<html>\n");
|
||||||
httpdata.append(QByteArray::number(httpstatus));
|
httpdata.append(QByteArray::number(httpstatus));
|
||||||
httpdata.append(" ");
|
httpdata.append(" ");
|
||||||
|
@ -280,7 +277,7 @@ static KHTTPHeaders HTTPHeaders(const QString &serverid, const bool authenticate
|
||||||
khttpheaders.insert("Date", httpdate);
|
khttpheaders.insert("Date", httpdate);
|
||||||
// optional for anything but 405, see:
|
// optional for anything but 405, see:
|
||||||
// https://www.rfc-editor.org/rfc/rfc9110.html#section-10.2.1
|
// https://www.rfc-editor.org/rfc/rfc9110.html#section-10.2.1
|
||||||
khttpheaders.insert("Allow", "GET");
|
khttpheaders.insert("Allow", "GET, HEAD");
|
||||||
// optional, see:
|
// optional, see:
|
||||||
// https://www.rfc-editor.org/rfc/rfc9110.html#section-14.3
|
// https://www.rfc-editor.org/rfc/rfc9110.html#section-14.3
|
||||||
khttpheaders.insert("Accept-Ranges", "none");
|
khttpheaders.insert("Accept-Ranges", "none");
|
||||||
|
@ -457,7 +454,7 @@ public:
|
||||||
QTcpServer* tcpserver;
|
QTcpServer* tcpserver;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void writeResponse(const ushort httpstatus, const bool authenticate, QTcpSocket *client);
|
void writeResponse(const ushort httpstatus, const bool authenticate, QTcpSocket *client, const bool get);
|
||||||
|
|
||||||
QAtomicInt m_ref;
|
QAtomicInt m_ref;
|
||||||
QThreadPool* m_filepool;
|
QThreadPool* m_filepool;
|
||||||
|
@ -500,7 +497,7 @@ void KHTTPPrivate::slotNewConnection()
|
||||||
const qint64 httpclientresult = client->read(httpbuffer.data(), httpbuffer.size());
|
const qint64 httpclientresult = client->read(httpbuffer.data(), httpbuffer.size());
|
||||||
if (client->bytesAvailable() > 0) {
|
if (client->bytesAvailable() > 0) {
|
||||||
kWarning(s_khttpdebugarea) << "client payload too large" << client->peerAddress() << client->peerPort();
|
kWarning(s_khttpdebugarea) << "client payload too large" << client->peerAddress() << client->peerPort();
|
||||||
writeResponse(413, false, client);
|
writeResponse(413, false, client, true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const QByteArray clientdata = httpbuffer.mid(0, httpclientresult);
|
const QByteArray clientdata = httpbuffer.mid(0, httpclientresult);
|
||||||
|
@ -512,19 +509,20 @@ void KHTTPPrivate::slotNewConnection()
|
||||||
khttpheadersparser.parseHeaders(clientdata, requiresauthorization);
|
khttpheadersparser.parseHeaders(clientdata, requiresauthorization);
|
||||||
kDebug(s_khttpdebugarea) << "client request" << khttpheadersparser.method() << khttpheadersparser.path() << khttpheadersparser.version();
|
kDebug(s_khttpdebugarea) << "client request" << khttpheadersparser.method() << khttpheadersparser.path() << khttpheadersparser.version();
|
||||||
|
|
||||||
if (khttpheadersparser.method() != "GET") {
|
const bool get = (khttpheadersparser.method() == "GET");
|
||||||
writeResponse(405, false, client);
|
if (!get && khttpheadersparser.method() != "HEAD") {
|
||||||
|
writeResponse(405, false, client, get);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (khttpheadersparser.version() != "HTTP/1.1") {
|
if (khttpheadersparser.version() != "HTTP/1.1") {
|
||||||
writeResponse(505, false, client);
|
writeResponse(505, false, client, get);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (requiresauthorization &&
|
if (requiresauthorization &&
|
||||||
(khttpheadersparser.authUser() != authusername || khttpheadersparser.authPass() != authpassword)) {
|
(khttpheadersparser.authUser() != authusername || khttpheadersparser.authPass() != authpassword)) {
|
||||||
writeResponse(401, true, client);
|
writeResponse(401, true, client, get);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -541,7 +539,7 @@ void KHTTPPrivate::slotNewConnection()
|
||||||
QFile* httpfile = new QFile(responsefilepath);
|
QFile* httpfile = new QFile(responsefilepath);
|
||||||
if (!httpfile->open(QFile::ReadOnly)) {
|
if (!httpfile->open(QFile::ReadOnly)) {
|
||||||
kWarning(s_khttpdebugarea) << "could not open" << responsefilepath;
|
kWarning(s_khttpdebugarea) << "could not open" << responsefilepath;
|
||||||
writeResponse(500, false, client);
|
writeResponse(500, false, client, get);
|
||||||
delete httpfile;
|
delete httpfile;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -565,7 +563,14 @@ void KHTTPPrivate::slotNewConnection()
|
||||||
client->write(httpdata);
|
client->write(httpdata);
|
||||||
client->flush();
|
client->flush();
|
||||||
|
|
||||||
m_filepool->start(new KHTTPRunnable(httpfile, client, &m_ref));
|
if (get) {
|
||||||
|
m_filepool->start(new KHTTPRunnable(httpfile, client, &m_ref));
|
||||||
|
} else {
|
||||||
|
kDebug(s_khttpdebugarea) << "done with client" << client->peerAddress() << client->peerPort();
|
||||||
|
client->disconnectFromHost();
|
||||||
|
client->deleteLater();
|
||||||
|
delete httpfile;
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -576,7 +581,7 @@ void KHTTPPrivate::slotNewConnection()
|
||||||
const QByteArray httpdata = HTTPData(responsestatus, khttpheaders, responsedata.size());
|
const QByteArray httpdata = HTTPData(responsestatus, khttpheaders, responsedata.size());
|
||||||
client->write(httpdata);
|
client->write(httpdata);
|
||||||
client->flush();
|
client->flush();
|
||||||
if (shouldWriteData(responsestatus)) {
|
if (shouldWriteContent(responsestatus, get)) {
|
||||||
client->write(responsedata);
|
client->write(responsedata);
|
||||||
client->flush();
|
client->flush();
|
||||||
}
|
}
|
||||||
|
@ -600,7 +605,7 @@ void KHTTPPrivate::stop()
|
||||||
tcpserver->close();
|
tcpserver->close();
|
||||||
}
|
}
|
||||||
|
|
||||||
void KHTTPPrivate::writeResponse(const ushort httpstatus, const bool authenticate, QTcpSocket *client)
|
void KHTTPPrivate::writeResponse(const ushort httpstatus, const bool authenticate, QTcpSocket *client, const bool get)
|
||||||
{
|
{
|
||||||
kDebug(s_khttpdebugarea) << "sending status to client" << httpstatus << client->peerAddress() << client->peerPort();
|
kDebug(s_khttpdebugarea) << "sending status to client" << httpstatus << client->peerAddress() << client->peerPort();
|
||||||
KHTTPHeaders khttpheaders = HTTPHeaders(serverid, authenticate);
|
KHTTPHeaders khttpheaders = HTTPHeaders(serverid, authenticate);
|
||||||
|
@ -608,7 +613,7 @@ void KHTTPPrivate::writeResponse(const ushort httpstatus, const bool authenticat
|
||||||
const QByteArray httpdata = HTTPData(httpstatus, khttpheaders, contentdata.size());
|
const QByteArray httpdata = HTTPData(httpstatus, khttpheaders, contentdata.size());
|
||||||
client->write(httpdata);
|
client->write(httpdata);
|
||||||
client->flush();
|
client->flush();
|
||||||
if (shouldWriteData(httpstatus)) {
|
if (shouldWriteContent(httpstatus, get)) {
|
||||||
client->write(contentdata);
|
client->write(contentdata);
|
||||||
client->flush();
|
client->flush();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue