#include "RequestParser.h"

#define PARSER_DEFINITIONS_ONLY
#include "MessageParser.cc"

namespace panda { namespace protocol { namespace http {

RequestParser::RequestParser (IFactory* fac) : factory(fac) {
    reset();
}

void RequestParser::reset () {
    MessageParser::reset();
    cs = message_parser_en_request;
}

RequestParser::Result RequestParser::parse (const string& buffer) {
    if (!request) {
        request = new_request();
        message = request;
    }

    auto pos = MessageParser::_parse(buffer);
    Result ret = {request, pos, state, error};
    if (state >= State::done) reset();
    return ret;
}

bool RequestParser::on_headers () {
    if (proto_relative_uri) {
        request->uri->path(string("//") + request->uri->host() + request->uri->path());
        request->uri->host("");
    }

    for (const auto& s : request->headers.get_multi("Cookie")) parse_cookie(s);

    return true;
}

bool RequestParser::on_empty_body () {
    state = State::done;
    return false;
}


}}}