コード例 #1
0
ファイル: request.c プロジェクト: gorakhargosh/bjoern
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;
}
コード例 #2
0
ファイル: request.c プロジェクト: RaNaN/bjoern
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;
}
コード例 #3
0
ファイル: request.c プロジェクト: RaNaN/bjoern
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;
}