#pragma once
#include "error.h"
#include "MessageParser.h"
namespace panda { namespace protocol { namespace http {
struct ResponseParser : MessageParser {
struct Result {
ResponseSP response;
size_t position;
State state;
std::error_code error;
};
ResponseParser ();
ResponseParser (ResponseParser&&) = default;
const RequestSP& context_request () const { return _context_request; }
void set_context_request (const RequestSP& request) {
if (_context_request) throw ParserError("can't set another context request until response is done");
_context_request = request;
}
Result parse (const string& buffer);
Result parse_shift (string& s) {
auto result = parse(s);
s.offset(result.position);
result.position = 0;
return result;
}
Result eof ();
void reset () { _reset(false); }
protected:
bool on_headers ();
bool on_empty_body ();
private:
RequestSP _context_request;
void ensure_response_created () {
if (!response) {
if (!_context_request) throw ParserError("Cannot create response as there are no corresponding request");
response = _context_request->new_response();
message = response;
}
}
void _reset (bool keep_context);
void parse_cookie (const string&);
};
}}}