From 6d1577ecaa0035b0582b339f21ca2a2ed7230013 Mon Sep 17 00:00:00 2001 From: eidheim Date: Sat, 18 Nov 2017 09:55:24 +0100 Subject: [PATCH] chunked transfer encoding cleanup --- client_http.hpp | 70 ++++++++++++++++++++++++------------------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/client_http.hpp b/client_http.hpp index eae43f1..464236c 100644 --- a/client_http.hpp +++ b/client_http.hpp @@ -492,8 +492,8 @@ namespace SimpleWeb { session->callback(session->connection, ec); } else if((header_it = session->response->header.find("Transfer-Encoding")) != session->response->header.end() && header_it->second == "chunked") { - auto tmp_streambuf = std::make_shared(); - this->read_chunked(session, tmp_streambuf); + auto chunks_streambuf = std::make_shared(); + this->read_chunked_transfer_encoded(session, chunks_streambuf); } else if(session->response->http_version < "1.1" || ((header_it = session->response->header.find("Session")) != session->response->header.end() && header_it->second == "close")) { session->connection->set_timeout(); @@ -540,9 +540,9 @@ namespace SimpleWeb { }); } - void read_chunked(const std::shared_ptr &session, const std::shared_ptr &tmp_streambuf) { + void read_chunked_transfer_encoded(const std::shared_ptr &session, const std::shared_ptr &chunks_streambuf) { session->connection->set_timeout(); - asio::async_read_until(*session->connection->socket, session->response->streambuf, "\r\n", [this, session, tmp_streambuf](const error_code &ec, size_t bytes_transferred) { + asio::async_read_until(*session->connection->socket, session->response->streambuf, "\r\n", [this, session, chunks_streambuf](const error_code &ec, size_t bytes_transferred) { session->connection->cancel_timeout(); auto lock = session->connection->handler_runner->continue_lock(); if(!lock) @@ -567,37 +567,9 @@ namespace SimpleWeb { auto num_additional_bytes = session->response->streambuf.size() - bytes_transferred; - auto post_process = [this, session, tmp_streambuf, length]() { - std::ostream tmp_stream(tmp_streambuf.get()); - if(length > 0) { - std::unique_ptr buffer(new char[length]); - session->response->content.read(buffer.get(), static_cast(length)); - tmp_stream.write(buffer.get(), static_cast(length)); - if(tmp_streambuf->size() == tmp_streambuf->max_size()) { - session->callback(session->connection, make_error_code::make_error_code(errc::message_size)); - return; - } - } - - // Remove "\r\n" - session->response->content.get(); - session->response->content.get(); - - if(length > 0) - this->read_chunked(session, tmp_streambuf); - else { - if(tmp_streambuf->size() > 0) { - std::ostream response_stream(&session->response->streambuf); - response_stream << tmp_streambuf.get(); - } - error_code ec; - session->callback(session->connection, ec); - } - }; - if((2 + length) > num_additional_bytes) { session->connection->set_timeout(); - asio::async_read(*session->connection->socket, session->response->streambuf, asio::transfer_exactly(2 + length - num_additional_bytes), [this, session, post_process](const error_code &ec, size_t /*bytes_transferred*/) { + asio::async_read(*session->connection->socket, session->response->streambuf, asio::transfer_exactly(2 + length - num_additional_bytes), [this, session, chunks_streambuf, length](const error_code &ec, size_t /*bytes_transferred*/) { session->connection->cancel_timeout(); auto lock = session->connection->handler_runner->continue_lock(); if(!lock) @@ -607,19 +579,47 @@ namespace SimpleWeb { session->callback(session->connection, make_error_code::make_error_code(errc::message_size)); return; } - post_process(); + this->read_chunked_transfer_encoded_chunk(session, chunks_streambuf, length); } else session->callback(session->connection, ec); }); } else - post_process(); + this->read_chunked_transfer_encoded_chunk(session, chunks_streambuf, length); } else session->callback(session->connection, ec); }); } + + void read_chunked_transfer_encoded_chunk(const std::shared_ptr &session, const std::shared_ptr &chunks_streambuf, unsigned long length) { + std::ostream tmp_stream(chunks_streambuf.get()); + if(length > 0) { + std::unique_ptr buffer(new char[length]); + session->response->content.read(buffer.get(), static_cast(length)); + tmp_stream.write(buffer.get(), static_cast(length)); + if(chunks_streambuf->size() == chunks_streambuf->max_size()) { + session->callback(session->connection, make_error_code::make_error_code(errc::message_size)); + return; + } + } + + // Remove "\r\n" + session->response->content.get(); + session->response->content.get(); + + if(length > 0) + read_chunked_transfer_encoded(session, chunks_streambuf); + else { + if(chunks_streambuf->size() > 0) { + std::ostream response_stream(&session->response->streambuf); + response_stream << chunks_streambuf.get(); + } + error_code ec; + session->callback(session->connection, ec); + } + } }; template