28 #ifndef HTTP_PARSER_RESPONSE_IMPL_HPP 29 #define HTTP_PARSER_RESPONSE_IMPL_HPP 43 if (m_state == DONE) {
return 0;}
45 if (m_state == BODY) {
46 return this->process_body(buf,len);
50 m_buf->append(buf,len);
53 std::string::iterator begin = m_buf->begin();
54 std::string::iterator end = begin;
70 throw exception(
"Maximum header size exceeded.",
74 if (end == m_buf->end()) {
77 std::copy(begin,end,m_buf->begin());
78 m_buf->resize(static_cast<std::string::size_type>(end-begin));
90 if (m_state == RESPONSE_LINE) {
95 std::string length =
get_header(
"Content-Length");
101 std::istringstream ss(length);
103 if ((ss >> m_read).fail()) {
104 throw exception(
"Unable to parse Content-Length header",
113 len -
static_cast<std::string::size_type
>(m_buf->end() - end)
119 read += this->process_body(buf+read,(len-read));
127 if (m_state == RESPONSE_LINE) {
128 this->process(begin,end);
142 size_t bytes_processed;
147 bytes_read =
static_cast<size_t>(s.gcount());
149 if (s.fail() || s.eof()) {
150 bytes_processed = this->
consume(buf,bytes_read);
151 total += bytes_processed;
153 if (bytes_processed != bytes_read) {
157 }
else if (s.bad()) {
164 buf[bytes_read-1] =
'\n';
165 bytes_processed = this->
consume(buf,bytes_read);
166 total += bytes_processed;
168 if (bytes_processed != bytes_read) {
181 std::stringstream ret;
183 ret <<
get_version() <<
" " << m_status_code <<
" " << m_status_msg;
193 m_status_code = code;
201 m_status_code = code;
205 inline void response::process(std::string::iterator begin,
206 std::string::iterator end)
208 std::string::iterator cursor_start = begin;
209 std::string::iterator cursor_end = std::find(begin,end,
' ');
211 if (cursor_end == end) {
217 cursor_start = cursor_end+1;
218 cursor_end = std::find(cursor_start,end,
' ');
220 if (cursor_end == end) {
226 std::istringstream ss(std::string(cursor_start,cursor_end));
228 if ((ss >> code).fail()) {
235 inline size_t response::process_body(
char const * buf,
size_t len) {
257 m_body.append(buf,to_read);
266 #endif // HTTP_PARSER_RESPONSE_IMPL_HPP std::string const & get_header(std::string const &key) const
Get the value of an HTTP header.
static char const header_delimiter[]
Literal value of the HTTP header delimiter.
void process_header(std::string::iterator begin, std::string::iterator end)
Process a header line.
std::string raw_headers() const
Generate and return the HTTP headers as a string.
std::string const & get_version() const
Get the HTTP version string.
size_t const istream_buffer
Number of bytes to use for temporary istream read buffers.
std::string raw() const
Returns the full raw response.
Namespace for the WebSocket++ project.
size_t const max_header_size
Maximum size in bytes before rejecting an HTTP header as too big.
void set_status(status_code::value code)
Set response status code and message.
std::string get_string(value code)
Return a human readable interpretation of a WebSocket close code.
void set_version(std::string const &version)
Set HTTP parser Version.
size_t consume(char const *buf, size_t len)
Process bytes in the input buffer.