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; }
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; }