void HttpServer::onMessage(const TcpConnectionPtr& conn, ByteBuffer *buf, Timestamp receiveTime) { LOG_INFO("HttpServer::onConnection recv data [%d][%s]", conn->fd(), buf->toString().c_str()); HttpContext *context = zl::stl::any_cast<HttpContext>(conn->getMutableContext()); assert(context); if(!context->parseRequest(buf, receiveTime)) { conn->send("HTTP/1.1 400 Bad Request\r\n\r\n"); conn->send("HTTP/1.1 400 Bad Request\r\n\r\n"); conn->shutdown(); } if (context->gotAll()) { LOG_INFO("HttpServer::onMessage parse request over."); response(conn, context->request()); context->reset(); // process request and return response, then reset, for long-connection } }
bool UrlElement::siteconnect(const std::string &server, const std::string &path, bool headonly) { // check that we actually got data.. if (server.empty()) return false; if (!context) context = new HttpContext(); string thePath("/"); // prefix the path with / if it doesn't start with it.. if (path.c_str()[0] != '/') thePath += url; else thePath = url; string url("http://"); url += server.c_str() + thePath; // start the request context->request(url, headonly); // block until the request is finished // or there is timeout QTimer timer; timer.setSingleShot(true); context->setTimer(&timer); timer.start(20000); while (!context->processed) { QCoreApplication::processEvents(); } timer.stop(); return context->status && context->code < 400; } /* end, siteconnect */