/** * soup_connection_send_request: * @conn: a #SoupConnection * @req: a #SoupMessage * * Sends @req on @conn. This is a low-level function, intended for use * by #SoupSession. **/ void soup_connection_send_request (SoupConnection *conn, SoupMessage *req) { SoupConnectionPrivate *priv; g_return_if_fail (SOUP_IS_CONNECTION (conn)); g_return_if_fail (SOUP_IS_MESSAGE (req)); priv = SOUP_CONNECTION_GET_PRIVATE (conn); g_return_if_fail (priv->state != SOUP_CONNECTION_NEW && priv->state != SOUP_CONNECTION_DISCONNECTED); if (req != priv->cur_req) set_current_request (conn, req); soup_message_send_request (req, priv->socket, conn, priv->proxy_uri != NULL); }
static inline int check_status_code(client_t *client) { request *req; req = client->request_queue->head; if(req->bad_request_code > 200){ //error //shift #ifdef DEBUG printf("bad_request_code \n"); #endif set_current_request(client); send_error_page(client); close_conn(client, main_loop); return 0; } return 1; }
static inline void prepare_call_wsgi(client_t *client) { PyObject *input = NULL, *c = NULL; char *val; set_current_request(client); //check Expect if(client->http->http_minor == 1){ c = PyDict_GetItemString(client->environ, "HTTP_EXPECT"); if(c){ val = PyString_AS_STRING(c); if(!strcasecmp(val, "100-continue")){ int ret = write(client->fd, "HTTP/1.1 100 Continue\r\n\r\n", 25); if(ret < 0){ PyErr_SetFromErrno(PyExc_IOError); write_error_log(__FILE__, __LINE__); client->keep_alive = 0; client->status_code = 500; send_error_page(client); close_conn(client, main_loop); return; } }else{ //417 client->keep_alive = 0; client->status_code = 417; send_error_page(client); close_conn(client, main_loop); return; } } } if(client->body_type == BODY_TYPE_TMPFILE){ FILE *tmp = (FILE *)client->body; fflush(tmp); rewind(tmp); input = PyFile_FromFile(tmp, "<tmpfile>", "r", fclose); PyDict_SetItem((PyObject *)client->environ, wsgi_input_key, input); Py_DECREF(input); client->body = NULL; }else{ if(client->body_type == BODY_TYPE_BUFFER){ input = StringIOObject_New((buffer *)client->body); PyDict_SetItem((PyObject *)client->environ, wsgi_input_key, input); }else{ if(client->body){ input = StringIOObject_New((buffer *)client->body); }else{ input = StringIOObject_New(new_buffer(0, 0)); } PyDict_SetItem((PyObject *)client->environ, wsgi_input_key, input); } client->body = NULL;; Py_DECREF(input); } if(is_keep_alive){ //support keep-alive c = PyDict_GetItemString(client->environ, "HTTP_CONNECTION"); if(client->http->http_minor == 1){ //HTTP 1.1 if(c){ val = PyString_AS_STRING(c); if(!strcasecmp(val, "close")){ client->keep_alive = 0; }else{ client->keep_alive = 1; } }else{ client->keep_alive = 1; } }else{ //HTTP 1.0 if(c){ val = PyString_AS_STRING(c); if(!strcasecmp(val, "keep-alive")){ client->keep_alive = 1; }else{ client->keep_alive = 0; } }else{ client->keep_alive = 0; } } } }