int onHeadersComplete(http_parser *parser) { TcpSocket *socket = static_cast<TcpSocket*>(parser->data); #ifndef NO_LOG sLog(LogEndpoint::LogLevel::DEBUG) << " === parsed header ===="; const QHash<QString, QSharedPointer<QString>> &headers = socket->getHeader().getHeaderInfo(); QHash<QString, QSharedPointer<QString>>::const_iterator i = headers.constBegin(); while (i != headers.constEnd()) { sLog(LogEndpoint::LogLevel::DEBUG) << i.key() << *(i.value().data()); ++i; } sLog(LogEndpoint::LogLevel::DEBUG) << " === ============= ===="; sLogFlush(); #endif QWeakPointer<QString> host = socket->getHeader().getHeaderInfo("Host"); if (!host.isNull()) { socket->getHeader().setHost(*host.data()); } return 0; }
void Worker::readClient() { //if (disabled) // return; // This slot is called when the client sent data to the server. The // server looks if it was a get request and sends a very simple HTML // document back. TcpSocket* socket = static_cast<TcpSocket*>(sender()); if(socket->bytesAvailable()) { if ( socket->isNewSocket()) { QByteArray incomingContent=socket->readAll(); http_parser_settings settings; settings. on_message_begin=onMessageBegin; settings. on_url=onUrl; settings. on_header_field=onHeaderField; settings. on_header_value=onHeaderValue; settings. on_headers_complete=onHeadersComplete; settings. on_body=onBody; settings. on_message_complete=onMessageComplete; http_parser_init(&m_parser,HTTP_REQUEST); m_parser.data = socket; size_t nparsed = http_parser_execute(&m_parser,&settings,incomingContent.constData(),incomingContent.count()); if(m_parser.upgrade) { qDebug()<<"upgrade"; } else if(nparsed != static_cast<size_t>(incomingContent.count())) { qDebug()<<"nparsed:"<<nparsed<<"buffer size:"<<incomingContent.count(); } else { //qDebug()<<"parsing seems to be succeed!"; } socket->setRawHeader(incomingContent); bool isBodySizeOK=false; unsigned int bodySize = 0; QSharedPointer<QString> contentLength = socket->getHeader().getHeaderInfo("Content-Length"); if (!contentLength.isNull()) { bodySize = contentLength->toUInt(&isBodySizeOK); if(isBodySizeOK==false) { bodySize=0; } } socket->setTotalBytes(bodySize); socket->notNew(); } else { qDebug()<<"socket size:"<<socket->getTotalBytes()<<"current Size:"<<socket->getBytesHaveRead(); QByteArray incomingContent=socket->readAll(); socket->appendData(incomingContent); } if (socket->getBytesHaveRead() > (16*1024*1024)) { socket->getResponse().setStatusCode(400); socket->getResponse() << "maximum message size above 16mb."; socket->getResponse().finish(); socket->waitForBytesWritten(); socket->close(); } else if(socket->isEof()) { PathTreeNode::HttpVerb handlerType; if(m_parser.method==HTTP_GET) { socket->getHeader().setHttpMethod(HttpHeader::HttpMethod::HTTP_GET); handlerType=PathTreeNode::GET; } else if(m_parser.method==HTTP_POST) { socket->getHeader().setHttpMethod(HttpHeader::HttpMethod::HTTP_POST); handlerType=PathTreeNode::POST; } else { qDebug()<<"not get and post"<<socket->atEnd()<<socket->bytesAvailable()<<socket->ConnectedState; socket->close(); return; } socket->getRequest().processCookies(); socket->getRequest().parseFormData(); //qDebug() << "path" << socket->getRequest().getHeader().getPath(); #ifndef NO_LOG sLog() << "handle request:" << socket->getRequest().getHeader().getPath(); qDebug() << "handle request:" << socket->getRequest().getHeader().getPath(); #endif if (!m_consolePath.isEmpty() && m_consolePath == socket->getRequest().getHeader().getPath()) { handleConsole(socket->getRequest(), socket->getResponse()); socket->getResponse().finish(); } else { const std::function<void (HttpRequest &, HttpResponse &)> &th = m_pathTree->getTaskHandlerByPath(socket->getRequest().getHeader().getPath(), handlerType); if(th) { th(socket->getRequest(), socket->getResponse()); socket->getResponse().finish(); } else { #ifndef NO_LOG qDebug()<<"empty task handler!" << socket->getRequest().getHeader().getPath() << ";" <<handlerType; sLog()<<"empty task handler!" << socket->getRequest().getHeader().getPath() << ";" <<handlerType; #endif socket->getResponse().setStatusCode(404); socket->getResponse().finish(); } } socket->waitForBytesWritten(); socket->close(); } else { qDebug()<<"socket size:"<<socket->getTotalBytes()<<"current size:"<<socket->getBytesHaveRead(); return; } } }