void Connection::handleWriteResponse() { LOG_DEBUG(socket().native() << ": handleWriteResponse() " << moreDataToSendNow_ << " " << reply_->waitMoreData()); if (moreDataToSendNow_) { startWriteResponse(); } else { if (reply_->waitMoreData()) { /* * Keep connection open and wait for more data. */ } else { reply_->logReply(request_handler_.logger()); if (reply_->closeConnection()) { ConnectionManager_.stop(shared_from_this()); } else { request_parser_.reset(); request_.reset(); reply_.reset(); server_->service() .post(boost::bind(&Connection::handleReadRequest0, shared_from_this())); } } } }
void Connection::handleWriteResponse(ReplyPtr reply) { LOG_DEBUG(socket().native() << ": handleWriteResponse() " << haveResponse_ << " " << responseDone_); if (haveResponse_) startWriteResponse(reply); else { if (!responseDone_) { /* * Keep reply open and wait for more data. */ } else { reply->logReply(request_handler_.logger()); if (reply->closeConnection()) ConnectionManager_.stop(shared_from_this()); else { request_parser_.reset(); request_.reset(); responseDone_ = false; while (rcv_buffers_.size() > 1) rcv_buffers_.pop_front(); if (rcv_remaining_ < rcv_buffers_.back().data() + rcv_buffer_size_) handleReadRequest0(); else startAsyncReadRequest(rcv_buffers_.back(), KEEPALIVE_TIMEOUT); } } } }
void Connection::sendStockReply(StockReply::status_type status) { reply_.reset(new StockReply(request_, status, "", server_->configuration())); reply_->setConnection(shared_from_this()); reply_->setCloseConnection(); moreDataToSendNow_ = true; startWriteResponse(); }
void Connection::sendStockReply(StockReply::status_type status) { ReplyPtr reply (new StockReply(request_, status, "", server_->configuration())); reply->setConnection(shared_from_this()); reply->setCloseConnection(); startWriteResponse(reply); }
void Connection::handleReadBody(ReplyPtr reply) { if (request_.type != Request::WebSocket) { /* * For a WebSocket: reading and writing may happen in parallel, * And writing and reading is asynchronous (post() from within * WtReply::consumeWebSocketMessage() */ haveResponse_ = false; waitingResponse_ = true; } RequestParser::ParseResult result = request_parser_ .parseBody(request_, reply, rcv_remaining_, rcv_buffers_.back().data() + rcv_buffer_size_); if (request_.type != Request::WebSocket) waitingResponse_ = false; if (result == RequestParser::ReadMore) { readMore(reply, BODY_TIMEOUT); } else if (result == RequestParser::Done && haveResponse_) startWriteResponse(reply); }