1212#include < boost/throw_exception.hpp>
1313#include < boost/cstdint.hpp>
1414#include < boost/range/algorithm/transform.hpp>
15+ #include < boost/algorithm/string/trim.hpp>
1516#include < boost/network/constants.hpp>
1617#include < boost/network/traits/ostream_iterator.hpp>
17- #include < boost/regex.hpp>
18+ #include < boost/network/traits/istream.hpp>
19+ #include < boost/logic/tribool.hpp>
20+ #include < boost/network/protocol/http/parser/incremental.hpp>
1821#include < iterator>
1922
2023namespace boost {namespace network {namespace http {namespace impl {
@@ -209,14 +212,12 @@ namespace boost { namespace network { namespace http { namespace impl {
209212
210213void handle_sent_request (string_type method, boost::system::error_codeconst & ec, std::size_t bytes_transferred) {
211214if (!ec) {
212- static boost::regexconst version_pattern (" HTTP/\\ d+\\ .\\ d+\\ s\\ d{3}\\ s[\\ w\\ s\\ d]+\\ r\\ n" );
213- boost::asio::async_read_until (
215+ boost::asio::async_read (
214216 *socket_,
215217 response_buffer_,
216- version_pattern,
217218 request_strand_->wrap (
218219boost::bind (
219- &http_async_connection<Tag,version_major,version_minor>::handle_received_status ,
220+ &http_async_connection<Tag,version_major,version_minor>::handle_received_version ,
220221 http_async_connection<Tag,version_major,version_minor>::shared_from_this (),
221222 method, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)));
222223 }else {
@@ -233,9 +234,44 @@ namespace boost { namespace network { namespace http { namespace impl {
233234 }
234235 }
235236
236- void handle_received_status (string_type method, boost::system::error_codeconst & ec, std::size_t bytes_transferred) {
237+ void handle_received_version (string_type method, boost::system::error_codeconst & ec, std::size_t bytes_transferred) {
237238if (!ec) {
238- // FIXME -- make it happen
239+ logic::tribool parsed_ok;
240+ typename response_parser_type::range_type result_range;
241+ typename istream<Tag>::typeinput_stream (&response_buffer_);
242+ part.append (
243+ std::istream_iterator<typename char_<Tag>::type>(input_stream)
244+ , std::istream_iterator<typename char_<Tag>::type>()
245+ );
246+ fusion::tie (parsed_ok, result_range) = response_parser.parse_until (
247+ response_parser_type::http_version_done,
248+ part);
249+ if (parsed_ok ==true ) {
250+ string_typeversion (boost::begin (result_range),boost::end (result_range));
251+ algorithm::trim (version);
252+ version_promise.set_value (version);
253+ typename string_type::const_iterator end = part.end ();
254+ part.assign (boost::end (result_range), end);
255+ }else if (parsed_ok ==false ) {
256+ // FIXME create proper errors, use Boost.System errors and categories
257+ std::runtime_errorerror (" Invalid Version Part." );
258+ version_promise.set_exception (boost::copy_exception (error));
259+ status_promise.set_exception (boost::copy_exception (error));
260+ status_message_promise.set_exception (boost::copy_exception (error));
261+ headers_promise.set_exception (boost::copy_exception (error));
262+ source_promise.set_exception (boost::copy_exception (error));
263+ destination_promise.set_exception (boost::copy_exception (error));
264+ body_promise.set_exception (boost::copy_exception (error));
265+ }else {
266+ boost::asio::async_read (
267+ *socket_,
268+ response_buffer_,
269+ request_strand_->wrap (
270+ boost::bind (
271+ &http_async_connection<Tag,version_major,version_minor>::handle_received_version,
272+ http_async_connection<Tag,version_major,version_minor>::shared_from_this (),
273+ method, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)));
274+ }
239275 }
240276 }
241277
@@ -247,6 +283,8 @@ namespace boost { namespace network { namespace http { namespace impl {
247283// FIXME -- wire the correct parameters
248284 }
249285
286+ typedef response_parser<Tag> response_parser_type;
287+
250288 boost::shared_ptr<resolver_type> resolver_;
251289 resolve_function resolve_;
252290bool follow_redirect_;
@@ -261,6 +299,8 @@ namespace boost { namespace network { namespace http { namespace impl {
261299 boost::promise<string_type> body_promise;
262300 string_type command_string_;
263301 boost::asio::streambuf response_buffer_;
302+ response_parser_type response_parser;
303+ string_type part;
264304 };
265305
266306}// namespace impl