@@ -45,11 +45,6 @@ namespace boost { namespace network { namespace http {
45
45
, socket_(service_)
46
46
, wrapper_(service_)
47
47
{
48
- try {
49
- socket_.set_option (tcp::no_delay (true )); // Don't delay writing
50
- } catch (system::system_error & e) {
51
- handler_.log (e.what ());
52
- }
53
48
}
54
49
55
50
tcp::socket & socket () {
@@ -62,6 +57,9 @@ namespace boost { namespace network { namespace http {
62
57
// and then pass that request object to the
63
58
// handler_ instance.
64
59
//
60
+ boost::system::error_code option_error;
61
+ socket_.set_option (tcp::no_delay (true ), option_error);
62
+ if (option_error) handler_.log (system::system_error (option_error).what ());
65
63
socket_.async_read_some (
66
64
boost::asio::buffer (buffer_),
67
65
wrapper_.wrap (
@@ -87,7 +85,8 @@ namespace boost { namespace network { namespace http {
87
85
void handle_read_headers (system::error_code const &ec, size_t bytes_transferred) {
88
86
if (!ec) {
89
87
tribool done;
90
- tie (done,tuples::ignore) = parser_.parse_headers (request_, buffer_.data (), buffer_.data () + bytes_transferred);
88
+ array<char , BOOST_HTTP_SERVER_BUFFER_SIZE>::iterator new_start;
89
+ tie (done,new_start) = parser_.parse_headers (request_, buffer_.data (), buffer_.data () + bytes_transferred);
91
90
if (done) {
92
91
if (request_.method [0 ] == ' P' ) {
93
92
// look for the content-length header
@@ -134,21 +133,25 @@ namespace boost { namespace network { namespace http {
134
133
}
135
134
136
135
if (content_length != 0 ) {
137
- async_read (
138
- socket_,
139
- boost::asio::buffer (buffer_),
140
- boost::asio::transfer_at_least (content_length),
141
- wrapper_.wrap (
142
- bind (
143
- &connection<Tag,Handler>::handle_read_body_contents,
144
- connection<Tag,Handler>::shared_from_this (),
145
- boost::asio::placeholders::error,
146
- content_length,
147
- boost::asio::placeholders::bytes_transferred
136
+ if (new_start != (buffer_.begin () + bytes_transferred)) {
137
+ request_.body .append (new_start, buffer_.begin () + bytes_transferred);
138
+ content_length -= std::distance (new_start, buffer_.begin () + bytes_transferred);
139
+ }
140
+ if (content_length > 0 ) {
141
+ socket_.async_read_some (
142
+ boost::asio::buffer (buffer_),
143
+ wrapper_.wrap (
144
+ bind (
145
+ &connection<Tag,Handler>::handle_read_body_contents,
146
+ connection<Tag,Handler>::shared_from_this (),
147
+ boost::asio::placeholders::error,
148
+ content_length,
149
+ boost::asio::placeholders::bytes_transferred
150
+ )
148
151
)
149
- )
150
- ) ;
151
- return ;
152
+ );
153
+ return ;
154
+ }
152
155
}
153
156
154
157
handler_ (request_, response_);
@@ -210,7 +213,10 @@ namespace boost { namespace network { namespace http {
210
213
void handle_read_body_contents (boost::system::error_code const & ec, size_t bytes_to_read, size_t bytes_transferred) {
211
214
if (!ec) {
212
215
size_t difference = bytes_to_read - bytes_transferred;
213
- request_.body .append (buffer_.begin (), buffer_.end ());
216
+ array<char ,BOOST_HTTP_SERVER_BUFFER_SIZE>::iterator start = buffer_.begin (),
217
+ past_end = start;
218
+ std::advance (past_end, std::min (bytes_to_read,bytes_transferred));
219
+ request_.body .append (buffer_.begin (), past_end);
214
220
if (difference == 0 ) {
215
221
handler_ (request_, response_);
216
222
boost::asio::async_write (
@@ -246,6 +252,7 @@ namespace boost { namespace network { namespace http {
246
252
if (!ec) {
247
253
boost::system::error_code ignored_ec;
248
254
socket_.shutdown (tcp::socket::shutdown_both, ignored_ec);
255
+ socket_.close (ignored_ec);
249
256
}
250
257
}
251
258
0 commit comments