void CHttpServer::readClient(void) { QTcpSocket* socket = qobject_cast<QTcpSocket*>(sender()); CTcpRequestEvent* event_ = new CTcpRequestEvent(); CHttpHeader header; try { if(isPaused()) throw("output disabled"); if(socket->bytesAvailable() <= 0 && socket->bytesAvailable() >= (1 << 20)) // hard limit of 1MB input throw("Illegal request size."); if(!socket->canReadLine()) throw("Invalid request"); if(!header.read(socket)) return; switch(hashed_t(header.method())) { // HTTP 1.0 case "GET"_hash: if(header.path() == "/favicon.ico") { static QByteArray favicon; if(favicon.isEmpty()) favicon = CFileCache::get(1); socket->write("HTTP/1.1 200 OK\r\n" "Content-Type: image/png\r\n" "Connection: close\r\n\r\n"); socket->write(favicon); // favicon throw("favicon"); } if(header.path() == "/") { socket->write("HTTP/1.1 301 Moved Permanently\r\n" "Location: /Main_Page\r\n"); throw("forward to Main_Page"); } if(header.path().contains("%20")) { QByteArray path = header.path(); path = path.replace("%20", "_"); socket->write("HTTP/1.1 301 Moved Permanently\r\nLocation: "); socket->write(path); socket->write("\r\n"); throw("forward to proper page name"); } break; case "HEAD"_hash: break; case "POST"_hash: break; // HTTP 1.1 case "OPTIONS"_hash: break; case "PUT"_hash: break; case "DELETE"_hash: break; case "TRACE"_hash: break; case "CONNECT"_hash: break; case "PATCH"_hash: break; // HTTP 2.x (?) case "MOVE"_hash: break; case "PURGE"_hash: break; case "REFRESH"_hash: break; // WebDAV // HTTP 1.1 case "PROPFIND"_hash: break; case "PROPPATCH"_hash: break; case "MKCOL"_hash: break; case "COPY"_hash: break; case "LOCK"_hash: break; case "UNLOCK"_hash: break; // HTTP 2.x case "VERSION-CONTROL"_hash: break; case "REPORT"_hash: break; case "CHECKIN"_hash: break; case "CHECKOUT"_hash: break; case "UNCHECKOUT"_hash: break; case "UPDATE"_hash: break; case "MKWORKSPACE"_hash: break; case "LABEL"_hash: break; case "MERGE"_hash: break; case "BASELINE-CONTROL"_hash: break; case "MKACTIVITY"_hash: break; case "BIND"_hash: break; case "SEARCH"_hash: break; default: qDebug() << "unknown header type"; break; } event_->setHeader(header); event_->setSocket(socket); QCoreApplication::postEvent(qApp, event_, Qt::RealTimeEventPriority); // set network request event QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents | QEventLoop::X11ExcludeTimers); // process the network request event QtServiceBase::instance()->logMessage("Wrote to client"); } catch(const char* error_message) { QtServiceBase::instance()->logMessage(error_message); } if(socket->isOpen()) socket->close(); if(socket->state() == QTcpSocket::UnconnectedState) { delete socket; QtServiceBase::instance()->logMessage("Connection closed"); } }