@@ -51,12 +51,12 @@ namespace boost { namespace network { namespace http { namespace impl {
5151
5252http_async_connection (
5353 resolver_type & resolver,
54- resolve_function resolve,
55- bool follow_redirect
56- ) :
54+ resolve_function resolve,
55+ bool follow_redirect
56+ ) :
5757follow_redirect_ (follow_redirect),
5858resolver_ (resolver),
59- resolve_ (resolve),
59+ resolve_ (resolve),
6060request_strand_ (resolver.get_io_service())
6161 {}
6262
@@ -68,7 +68,7 @@ namespace boost { namespace network { namespace http { namespace impl {
6868 std::ostreambuf_iterator<typename char_<Tag>::type>(&command_streambuf));
6969this ->method = method;
7070 boost::uint16_t port_ =port (request);
71- resolve_ (resolver_,host (request),
71+ resolve_ (resolver_,host (request),
7272 port_,
7373 request_strand_.wrap (
7474boost::bind (
@@ -83,6 +83,17 @@ namespace boost { namespace network { namespace http { namespace impl {
8383
8484http_async_connection (http_async_connectionconst &);// = delete
8585
86+ void set_errors (boost::system::error_codeconst & ec) {
87+ boost::system::system_errorerror (ec);
88+ this ->version_promise .set_exception (boost::copy_exception (error));
89+ this ->status_promise .set_exception (boost::copy_exception (error));
90+ this ->status_message_promise .set_exception (boost::copy_exception (error));
91+ this ->headers_promise .set_exception (boost::copy_exception (error));
92+ this ->source_promise .set_exception (boost::copy_exception (error));
93+ this ->destination_promise .set_exception (boost::copy_exception (error));
94+ this ->body_promise .set_exception (boost::copy_exception (error));
95+ }
96+
8697void handle_resolved (boost::uint16_t port,bool get_body, body_callback_function_type callback, boost::system::error_codeconst & ec, resolver_iterator_pair endpoint_range) {
8798 resolver_iterator iter =boost::begin (endpoint_range);
8899if (!ec && !boost::empty (endpoint_range)) {
@@ -103,14 +114,7 @@ namespace boost { namespace network { namespace http { namespace impl {
103114 boost::asio::placeholders::error
104115 )));
105116 }else {
106- boost::system::system_errorerror (ec ? ec : boost::asio::error::host_not_found);
107- this ->version_promise .set_exception (boost::copy_exception (error));
108- this ->status_promise .set_exception (boost::copy_exception (error));
109- this ->status_message_promise .set_exception (boost::copy_exception (error));
110- this ->headers_promise .set_exception (boost::copy_exception (error));
111- this ->source_promise .set_exception (boost::copy_exception (error));
112- this ->destination_promise .set_exception (boost::copy_exception (error));
113- this ->body_promise .set_exception (boost::copy_exception (error));
117+ set_errors (ec ? ec : boost::asio::error::host_not_found);
114118 }
115119 }
116120
@@ -123,7 +127,7 @@ namespace boost { namespace network { namespace http { namespace impl {
123127boost::bind (
124128 &http_async_connection<Tag,version_major,version_minor>::handle_sent_request,
125129 http_async_connection<Tag,version_major,version_minor>::shared_from_this (),
126- get_body, callback,
130+ get_body, callback,
127131 boost::asio::placeholders::error,
128132 boost::asio::placeholders::bytes_transferred
129133 )));
@@ -146,16 +150,7 @@ namespace boost { namespace network { namespace http { namespace impl {
146150 boost::asio::placeholders::error
147151 )));
148152 }else {
149- boost::system::system_errorerror (
150- ec ? ec : boost::asio::error::host_not_found
151- );
152- this ->version_promise .set_exception (boost::copy_exception (error));
153- this ->status_promise .set_exception (boost::copy_exception (error));
154- this ->status_message_promise .set_exception (boost::copy_exception (error));
155- this ->headers_promise .set_exception (boost::copy_exception (error));
156- this ->source_promise .set_exception (boost::copy_exception (error));
157- this ->destination_promise .set_exception (boost::copy_exception (error));
158- this ->body_promise .set_exception (boost::copy_exception (error));
153+ set_errors (ec ? ec : boost::asio::error::host_not_found);
159154 }
160155 }
161156 }
@@ -173,36 +168,34 @@ namespace boost { namespace network { namespace http { namespace impl {
173168 &http_async_connection<Tag,version_major,version_minor>::handle_received_data,
174169 http_async_connection<Tag,version_major,version_minor>::shared_from_this (),
175170 version, get_body, callback,
176- boost::asio::placeholders::error,
171+ boost::asio::placeholders::error,
177172 boost::asio::placeholders::bytes_transferred)));
178173 }else {
179- boost::system::system_errorerror (ec);
180- this ->version_promise .set_exception (boost::copy_exception (error));
181- this ->status_promise .set_exception (boost::copy_exception (error));
182- this ->status_message_promise .set_exception (boost::copy_exception (error));
183- this ->headers_promise .set_exception (boost::copy_exception (error));
184- this ->source_promise .set_exception (boost::copy_exception (error));
185- this ->destination_promise .set_exception (boost::copy_exception (error));
186- this ->body_promise .set_exception (boost::copy_exception (error));
174+ set_errors (ec);
187175 }
188176 }
189177
190178void handle_received_data (state_t state,bool get_body, body_callback_function_type callback, boost::system::error_codeconst & ec, std::size_t bytes_transferred) {
191179if (!ec || ec == boost::asio::error::eof) {
180+ // Sanity check
181+ if (ec == boost::asio::error::eof && state < headers) {
182+ return ;
183+ }
192184 logic::tribool parsed_ok;
193185size_t remainder;
194186switch (state) {
195187case version:
196- parsed_ok =
188+ parsed_ok =
197189this ->parse_version (*socket_,
198190 request_strand_.wrap (
199191boost::bind (
200192 &http_async_connection<Tag,version_major,version_minor>::handle_received_data,
201193 http_async_connection<Tag,version_major,version_minor>::shared_from_this (),
202- status , get_body, callback,
194+ version , get_body, callback,
203195 boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred
204196 )
205- )
197+ ),
198+ bytes_transferred
206199 );
207200if (parsed_ok !=true )return ;
208201case status:
@@ -212,10 +205,11 @@ namespace boost { namespace network { namespace http { namespace impl {
212205boost::bind (
213206 &http_async_connection<Tag,version_major,version_minor>::handle_received_data,
214207 http_async_connection<Tag,version_major,version_minor>::shared_from_this (),
215- status_message , get_body, callback,
208+ status , get_body, callback,
216209 boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred
217210 )
218- )
211+ ),
212+ bytes_transferred
219213 );
220214if (parsed_ok !=true )return ;
221215case status_message:
@@ -225,10 +219,11 @@ namespace boost { namespace network { namespace http { namespace impl {
225219boost::bind (
226220 &http_async_connection<Tag,version_major,version_minor>::handle_received_data,
227221 http_async_connection<Tag,version_major,version_minor>::shared_from_this (),
228- headers , get_body, callback,
222+ status_message , get_body, callback,
229223 boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred
230224 )
231- )
225+ ),
226+ bytes_transferred
232227 );
233228if (parsed_ok !=true )return ;
234229case headers:
@@ -241,7 +236,8 @@ namespace boost { namespace network { namespace http { namespace impl {
241236 headers, get_body, callback,
242237 boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred
243238 )
244- )
239+ ),
240+ bytes_transferred
245241 );
246242if (parsed_ok !=true )return ;
247243if (!get_body) {
@@ -253,8 +249,9 @@ namespace boost { namespace network { namespace http { namespace impl {
253249std::advance (begin, remainder);
254250typename protocol_base::buffer_type::const_iterator end = begin;
255251std::advance (end,this ->part .size () - remainder);
252+ this ->body_promise .set_value (" " );
256253callback (make_iterator_range (begin, end), ec);
257- socket_->async_read_some (
254+ socket_->async_read_some (
258255boost::asio::mutable_buffers_1 (this ->part .c_array (),this ->part .size ()),
259256 request_strand_.wrap (
260257boost::bind (
@@ -264,7 +261,6 @@ namespace boost { namespace network { namespace http { namespace impl {
264261 boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)
265262 )
266263 );
267- this ->body_promise .set_value (" " );
268264 }else {
269265this ->parse_body (
270266 *socket_,
@@ -278,7 +274,7 @@ namespace boost { namespace network { namespace http { namespace impl {
278274 ),
279275 remainder);
280276 }
281- break ;
277+ return ;
282278case body:
283279if (ec == boost::asio::error::eof) {
284280if (callback) {
@@ -304,7 +300,7 @@ namespace boost { namespace network { namespace http { namespace impl {
304300typename protocol_base::buffer_type::const_iterator begin =this ->part .begin (), end = begin;
305301std::advance (end, bytes_transferred);
306302callback (make_iterator_range (begin, end), ec);
307- socket_->async_read_some (
303+ socket_->async_read_some (
308304boost::asio::mutable_buffers_1 (this ->part .c_array (),this ->part .size ()),
309305 request_strand_.wrap (
310306boost::bind (
@@ -328,7 +324,7 @@ namespace boost { namespace network { namespace http { namespace impl {
328324 bytes_transferred);
329325 }
330326 }
331- break ;
327+ return ;
332328default :
333329BOOST_ASSERT (false &&" Bug, report this to the developers!" );
334330 }
@@ -337,13 +333,13 @@ namespace boost { namespace network { namespace http { namespace impl {
337333this ->source_promise .set_exception (boost::copy_exception (error));
338334this ->destination_promise .set_exception (boost::copy_exception (error));
339335switch (state) {
340- case version:
336+ case version:
341337this ->version_promise .set_exception (boost::copy_exception (error));
342- case status:
338+ case status:
343339this ->status_promise .set_exception (boost::copy_exception (error));
344340case status_message:
345341this ->status_message_promise .set_exception (boost::copy_exception (error));
346- case headers:
342+ case headers:
347343this ->headers_promise .set_exception (boost::copy_exception (error));
348344case body:
349345this ->body_promise .set_exception (boost::copy_exception (error));