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_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; }
static int on_body(http_parser* parser, const char* data, const size_t len) { Iobject* body; body = (Iobject*)PyDict_GetItem(REQUEST->headers, _wsgi_input); if(body == NULL) { if(!parser->content_length) { REQUEST->state.error_code = HTTP_LENGTH_REQUIRED; return 1; } PyObject* buf = PyString_FromStringAndSize(NULL, parser->content_length); body = (Iobject*)PycStringIO->NewInput(buf); Py_XDECREF(buf); if(body == NULL) return 1; _set_header(_wsgi_input, (PyObject*)body); Py_DECREF(body); } memcpy(body->buf + body->pos, data, len); body->pos += len; return 0; }