void Connection::startWriteResponse() { if (state_ != Idle || !reply_) { close(); return; } std::vector<asio::const_buffer> buffers; moreDataToSendNow_ = !reply_->nextBuffers(buffers); unsigned s = 0; #ifdef DEBUG for (unsigned i = 0; i < buffers.size(); ++i) { int size = asio::buffer_size(buffers[i]); s += size; #ifdef DEBUG_DUMP char *data = (char *)asio::detail::buffer_cast_helper(buffers[i]); for (int j = 0; j < size; ++j) std::cerr << data[j]; #endif } #endif LOG_DEBUG(socket().native() << " sending: " << s << "(buffers: " << buffers.size() << ")"); if (!buffers.empty()) { startAsyncWriteResponse(buffers, CONNECTION_TIMEOUT); } else { cancelWriteTimer(); handleWriteResponse(); } }
void Connection::handleWriteResponse(const asio_error_code& e, std::size_t bytes_transferred) { LOG_DEBUG(socket().native() << ": handleWriteResponse(): " << bytes_transferred << " ; " << e.message()); cancelWriteTimer(); if (!e) handleWriteResponse(); else if (e != asio::error::operation_aborted) handleError(e); }
void Connection::startWriteResponse(ReplyPtr reply) { haveResponse_ = false; if (disconnectCallback_) socket().cancel(); if (state_ & Writing) { LOG_ERROR("Connection::startWriteResponse(): connection already writing"); close(); server_->service() .post(strand_.wrap(boost::bind(&Reply::writeDone, reply, false))); return; } std::vector<asio::const_buffer> buffers; responseDone_ = reply->nextBuffers(buffers); unsigned s = 0; #ifdef DEBUG for (unsigned i = 0; i < buffers.size(); ++i) { int size = asio::buffer_size(buffers[i]); s += size; #ifdef DEBUG_DUMP char *data = (char *)asio::detail::buffer_cast_helper(buffers[i]); for (int j = 0; j < size; ++j) std::cerr << data[j]; #endif } #endif LOG_DEBUG(socket().native() << " sending: " << s << "(buffers: " << buffers.size() << ")"); if (!buffers.empty()) { startAsyncWriteResponse(reply, buffers, BODY_TIMEOUT); } else { cancelWriteTimer(); handleWriteResponse(reply); } }
void Connection::handleWriteResponse(ReplyPtr reply, const asio_error_code& e, std::size_t bytes_transferred) { LOG_DEBUG(socket().native() << ": handleWriteResponse(): " << bytes_transferred << " ; " << e.message()); cancelWriteTimer(); haveResponse_ = false; waitingResponse_ = true; reply->writeDone(!e); waitingResponse_ = false; if (!e) { handleWriteResponse(reply); } else { if (e != asio::error::operation_aborted) handleError(e); } }