Exemplo n.º 1
0
bool HttpServerConnection::parse_request() {
    std::string first_line;
    http_request_headers.clear();
    if (!HttpCommon::parseHeaders(current_request, first_line,
                                  http_request_headers))
        return false;
    size_t eom = first_line.find(' ');
    if (eom == std::string::npos)
        return false;
    size_t eor = first_line.find(' ', eom+1);
    if (eor == std::string::npos)
        return false;
    current_method = first_line.substr(0, eom);
    current_uri = first_line.substr(eom+1, eor-eom-1);
    {
        // HTTP/1.1
        unsigned int major, minor;
        int pos = sscanf(first_line.substr(eor+1).c_str(), "HTTP/%u.%u",
                         &major, &minor);
        if (pos != 2)
            return false;

        set_http_version(major, minor);
    }
    current_query_pars.clear();
    size_t qpos = current_uri.find("?");
    if (qpos != std::string::npos) {
        current_query_string = current_uri.substr(qpos+1);
        current_uri.resize(qpos);
        get_all_parameters(current_query_string.c_str(), current_query_pars);
    } else {
        current_query_string.clear();
    }

    // uri might be given as http://some.domain/blah
    if (current_uri.substr(0, 4) == "http") {
        if (current_uri.substr(0, 7) == "http://")
            qpos = current_uri.find('/', 7);
        else if (current_uri.substr(0, 8) == "https://")
            qpos = current_uri.find('/', 8);
        else
            return true;
        if (qpos == std::string::npos)
            current_uri = "/";
        else
            current_uri.erase(0, qpos);
    }
    return true;
}
Exemplo n.º 2
0
static VALUE
aspirin_response_create_env(VALUE obj, VALUE default_env)
{
    VALUE env = rb_obj_dup(default_env);

    Aspirin_Response *response;
    Data_Get_Struct(obj, Aspirin_Response, response);

    struct evhttp_request *request = response->request;

    set_rack_input(env, request->input_buffer);
    set_rack_errors(env);
    set_request_method(env, request->type);
    set_remote_host(env, request->remote_host);
    set_http_version(env, request->major, request->minor);
    set_async_callback(env, obj);
    set_request_uri(env, evhttp_request_uri(request));
    set_request_path(env, evhttp_request_uri(request));
    set_http_header(env, request->input_headers);

    return env;
}