12 #include <boost/asio.hpp>
13 #include <boost/regex.hpp>
14 #include <boost/logic/tribool.hpp>
15 #include <pion/net/HTTPMessage.hpp>
16 #include <pion/net/HTTPRequest.hpp>
17 #include <pion/net/HTTPParser.hpp>
18 #include <pion/net/TCPConnection.hpp>
26 const boost::regex HTTPMessage::REGEX_ICASE_CHUNKED(
".*chunked.*", boost::regex::icase);
32 boost::system::error_code& ec,
44 return tcp_conn.
write(write_buffers, ec);
48 boost::system::error_code& ec,
52 const bool is_request = (
dynamic_cast<HTTPRequest*
>(
this) != NULL);
55 std::size_t last_bytes_read = 0;
63 const char *read_end_ptr;
65 last_bytes_read = (read_end_ptr - read_ptr);
71 PION_ASSERT(last_bytes_read > 0);
76 bool force_connection_closed =
false;
77 boost::tribool parse_result;
80 parse_result = http_parser.
parse(*
this, ec);
81 if (! boost::indeterminate(parse_result))
break;
85 if (ec || last_bytes_read == 0) {
89 ec = make_error_code(boost::system::errc::io_error);
95 force_connection_closed =
true;
107 if (parse_result ==
false) {
114 if ( http_parser.
eof() ) {
116 tcp_conn.
setLifecycle(TCPConnection::LIFECYCLE_KEEPALIVE);
119 tcp_conn.
setLifecycle(TCPConnection::LIFECYCLE_PIPELINED);
124 const char *read_ptr;
125 const char *read_end_ptr;
138 boost::system::error_code& ec,
bool headers_only)
152 std::size_t bytes_out = 0;
153 for (WriteBuffers::const_iterator i=write_buffers.begin(); i!=write_buffers.end(); ++i) {
154 const char *ptr = boost::asio::buffer_cast<
const char*>(*i);
155 size_t len = boost::asio::buffer_size(*i);
164 boost::system::error_code& ec,
bool headers_only)
171 const bool is_request = (
dynamic_cast<HTTPRequest*
>(
this) != NULL);
176 boost::tribool parse_result;
181 ec = make_error_code(boost::system::errc::io_error);
185 parse_result = http_parser.
parse(*
this, ec);
186 if (! boost::indeterminate(parse_result))
break;
189 if (boost::indeterminate(parse_result)) {
193 ec = make_error_code(boost::system::errc::io_error);
210 if (m_chunk_cache.size() > 0)
211 std::copy(m_chunk_cache.begin(), m_chunk_cache.end(), post_buffer);