Esempio n. 1
0
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;
}
Esempio n. 2
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;
}
Esempio n. 3
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;
}
Esempio n. 4
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;
}
Esempio n. 5
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;
}
Esempio n. 6
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;
}