static int on_message_complete(http_parser* parser) { switch(parser->method) { case HTTP_GET: _set_header(_REQUEST_METHOD, _GET); break; case HTTP_POST: _set_header(_REQUEST_METHOD, _POST); break; default: _set_header_free_value( _REQUEST_METHOD, PyString_FromString(http_method_str(parser->method)) ); } _set_header_free_value( _wsgi_input, PycStringIO->NewInput( REQUEST->body ? PycStringIO->cgetvalue(REQUEST->body) : _empty_string ) ); _set_header( _SERVER_PROTOCOL, parser->http_minor == 1 ? _HTTP_1_1 : _HTTP_1_0 ); PyDict_Update(REQUEST->headers, wsgi_base_dict); REQUEST->state.parse_finished = true; return 0; }
static int on_path(http_parser* parser, char* path, size_t len) { if(!(len = unquote_url_inplace(path, len))) return 1; _set_header_free_value(_PATH_INFO, PyString_FromStringAndSize(path, len)); return 0; }
static int on_fragment(http_parser* parser, const char* fragm_start, const size_t fragm_len) { _set_header_free_value( _HTTP_FRAGMENT, PyString_FromStringAndSize(fragm_start, fragm_len) ); return 0; }
static int on_url(http_parser* parser, const char* url_start, const size_t url_len) { _set_header_free_value( _REQUEST_URI, PyString_FromStringAndSize(url_start, url_len) ); return 0; }
static int on_query_string(http_parser* parser, const char* query_start, const size_t query_len) { _set_header_free_value( _QUERY_STRING, PyString_FromStringAndSize(query_start, query_len) ); return 0; }
static int on_message_complete(http_parser* parser) { /* HTTP_CONTENT_{LENGTH,TYPE} -> CONTENT_{LENGTH,TYPE} */ PyDict_ReplaceKey(REQUEST->headers, _HTTP_CONTENT_LENGTH, _CONTENT_LENGTH); PyDict_ReplaceKey(REQUEST->headers, _HTTP_CONTENT_TYPE, _CONTENT_TYPE); /* SERVER_PROTOCOL (REQUEST_PROTOCOL) */ _set_header(_SERVER_PROTOCOL, parser->http_minor == 1 ? _HTTP_1_1 : _HTTP_1_0); /* REQUEST_METHOD */ if(parser->method == HTTP_GET) { /* I love useless micro-optimizations. */ _set_header(_REQUEST_METHOD, _GET); } else { _set_header_free_value(_REQUEST_METHOD, PyString_FromString(http_method_str(parser->method))); } /* REMOTE_ADDR */ _set_header(_REMOTE_ADDR, REQUEST->client_addr); PyObject* body = PyDict_GetItem(REQUEST->headers, _wsgi_input); if(body) { /* We abused the `pos` member for tracking the amount of data copied from * the buffer in on_body, so reset it to zero here. */ ((Iobject*)body)->pos = 0; } else { /* Request has no body */ _set_header_free_value(_wsgi_input, PycStringIO->NewInput(_empty_string)); } PyDict_Update(REQUEST->headers, wsgi_base_dict); REQUEST->state.parse_finished = true; return 0; }