void Connection::handleReadBody(ReplyPtr reply, const asio_error_code& e, std::size_t bytes_transferred) { LOG_DEBUG(socket().native() << ": handleReadBody(): " << e.message()); if (disconnectCallback_) { if (e && e != asio::error::operation_aborted) { boost::function<void()> f = disconnectCallback_; disconnectCallback_ = boost::function<void()>(); f(); } else if (e != asio::error::operation_aborted) { LOG_ERROR(socket().native() << ": handleReadBody(): while waiting for disconnect, " "unexpected error code: " << e.message()); close(); } return; } cancelReadTimer(); if (!e) { rcv_remaining_ = rcv_buffers_.back().data(); rcv_buffer_size_ = bytes_transferred; handleReadBody(reply); } else if (e != asio::error::operation_aborted && e != asio::error::bad_descriptor) { reply->consumeData(rcv_remaining_, rcv_remaining_, Request::Error); handleError(e); } }
void Connection::handleReadRequest0() { #ifdef DEBUG try { LOG_DEBUG(socket().native() << "incoming request: " << socket().remote_endpoint().port() << ": " << std::string(remaining_, std::min((unsigned long)(buffer_.data() - remaining_ + buffer_size_), (long unsigned)1000))); } catch (...) { } #endif // DEBUG boost::tribool result; boost::tie(result, remaining_) = request_parser_.parse(request_, remaining_, buffer_.data() + buffer_size_); if (result) { Reply::status_type status = request_parser_.validate(request_); bool doWebSockets = server_->controller()->configuration().webSockets(); if (doWebSockets) request_.enableWebSocket(); LOG_DEBUG(socket().native() << "request: " << status); if (status >= 300) sendStockReply(status); else { if (request_.webSocketVersion >= 0) request_.urlScheme = "ws" + urlScheme().substr(4); else request_.urlScheme = urlScheme(); try { request_.port = socket().local_endpoint().port(); reply_ = request_handler_.handleRequest(request_); reply_->setConnection(shared_from_this()); moreDataToSendNow_ = true; } catch (asio_system_error& e) { LOG_ERROR("Error in handleRequest0(): " << e.what()); handleError(e.code()); return; } handleReadBody(); } } else if (!result) { sendStockReply(StockReply::bad_request); } else { startAsyncReadRequest(buffer_, request_parser_.initialState() ? KEEPALIVE_TIMEOUT : CONNECTION_TIMEOUT); } }
void Connection::handleReadBody(const asio_error_code& e, std::size_t bytes_transferred) { LOG_DEBUG(socket().native() << ": handleReadBody(): " << e.message()); cancelReadTimer(); if (!e) { remaining_ = buffer_.data(); buffer_size_ = bytes_transferred; handleReadBody(); } else if (e != asio::error::operation_aborted && e != asio::error::bad_descriptor) { if (reply_) reply_->consumeData(remaining_, remaining_, Request::Error); handleError(e); } }
void Connection::handleReadRequest0() { Buffer& buffer = rcv_buffers_.back(); #ifdef DEBUG try { LOG_DEBUG(socket().native() << "incoming request: " << socket().remote_endpoint().port() << " (avail= " << (rcv_buffer_size_ - (rcv_remaining_ - buffer.data())) << "): " << std::string(rcv_remaining_, std::min((unsigned long)(buffer.data() - rcv_remaining_ + rcv_buffer_size_), (long unsigned)1000))); } catch (...) { } #endif // DEBUG boost::tribool result; boost::tie(result, rcv_remaining_) = request_parser_.parse(request_, rcv_remaining_, buffer.data() + rcv_buffer_size_); if (result) { Reply::status_type status = request_parser_.validate(request_); // FIXME: Let the reply decide whether we're doing websockets, move this logic to WtReply bool doWebSockets = server_->controller()->configuration().webSockets() && (server_->controller()->configuration().sessionPolicy() != Wt::Configuration::DedicatedProcess || server_->configuration().parentPort() != -1); if (doWebSockets) request_.enableWebSocket(); LOG_DEBUG(socket().native() << "request: " << status); if (status >= 300) sendStockReply(status); else { if (request_.webSocketVersion >= 0) { // replace 'http' with 'ws' request_.urlScheme[0] = 'w'; request_.urlScheme[1] = 's'; strncpy(request_.urlScheme + 2, urlScheme() + 4, 7); request_.urlScheme[9] = 0; } else strncpy(request_.urlScheme, urlScheme(), 9); ReplyPtr reply; try { reply = request_handler_.handleRequest (request_, lastWtReply_, lastProxyReply_, lastStaticReply_); reply->setConnection(shared_from_this()); } catch (asio_system_error& e) { LOG_ERROR("Error in handleRequest0(): " << e.what()); handleError(e.code()); return; } rcv_body_buffer_ = false; handleReadBody(reply); } } else if (!result) { sendStockReply(StockReply::bad_request); } else { rcv_buffers_.push_back(Buffer()); startAsyncReadRequest(rcv_buffers_.back(), request_parser_.initialState() ? KEEPALIVE_TIMEOUT : CONNECTION_TIMEOUT); } }