static int sapi_uwsgi_send_headers(sapi_headers_struct *sapi_headers) { sapi_header_struct *h; zend_llist_position pos; if (SG(request_info).no_headers == 1) { return SAPI_HEADER_SENT_SUCCESSFULLY; } struct wsgi_request *wsgi_req = (struct wsgi_request *) SG(server_context); if (!SG(sapi_headers).http_status_line) { char status[4]; int hrc = SG(sapi_headers).http_response_code; if (!hrc) hrc = 200; uwsgi_num2str2n(hrc, status, 4); uwsgi_response_prepare_headers(wsgi_req, status, 3); } else { char *sl = SG(sapi_headers).http_status_line; uwsgi_response_prepare_headers(wsgi_req, sl, strlen(sl)); } h = zend_llist_get_first_ex(&sapi_headers->headers, &pos); while (h) { uwsgi_response_add_header(wsgi_req, NULL, 0, h->header, h->header_len); h = zend_llist_get_next_ex(&sapi_headers->headers, &pos); } return SAPI_HEADER_SENT_SUCCESSFULLY; }
static int sapi_uwsgi_send_headers(sapi_headers_struct *sapi_headers) { sapi_header_struct *h; zend_llist_position pos; struct iovec iov[6]; char status[4]; struct http_status_codes *http_sc; if (SG(request_info).no_headers == 1) { return SAPI_HEADER_SENT_SUCCESSFULLY; } struct wsgi_request *wsgi_req = (struct wsgi_request *) SG(server_context); wsgi_req->status = SG(sapi_headers).http_response_code; if (!wsgi_req->status) wsgi_req->status = 200; if (!SG(sapi_headers).http_status_line) { iov[0].iov_base = wsgi_req->protocol; iov[0].iov_len = wsgi_req->protocol_len; iov[1].iov_base = " "; iov[1].iov_len = 1; uwsgi_num2str2n(wsgi_req->status, status, 4); iov[2].iov_base = status; iov[2].iov_len = 3; iov[3].iov_base = " "; iov[3].iov_len = 1; // get the status code for (http_sc = hsc; http_sc->message != NULL; http_sc++) { if (!strncmp(http_sc->key, status, 3)) { iov[4].iov_base = (char *) http_sc->message; iov[4].iov_len = http_sc->message_size; break; } } if (iov[4].iov_len == 0) { iov[4].iov_base = "Unknown"; iov[4].iov_len = 7; } iov[5].iov_base = "\r\n"; iov[5].iov_len = 2; wsgi_req->headers_size += wsgi_req->socket->proto_writev_header(wsgi_req, iov, 6); } else { iov[0].iov_base = SG(sapi_headers).http_status_line; iov[0].iov_len = strlen(iov[0].iov_base); iov[1].iov_base = "\r\n"; iov[1].iov_len = 2; wsgi_req->headers_size += wsgi_req->socket->proto_writev_header(wsgi_req, iov, 2); } h = zend_llist_get_first_ex(&sapi_headers->headers, &pos); while (h) { iov[0].iov_base = h->header; iov[0].iov_len = h->header_len; iov[1].iov_base = "\r\n"; iov[1].iov_len = 2; wsgi_req->headers_size += wsgi_req->socket->proto_writev_header(wsgi_req, iov, 2); wsgi_req->header_cnt++; h = zend_llist_get_next_ex(&sapi_headers->headers, &pos); } struct uwsgi_string_list *ah = uwsgi.additional_headers; while(ah) { iov[0].iov_base = ah->value; iov[0].iov_len = ah->len; iov[1].iov_base = "\r\n"; iov[1].iov_len = 2; wsgi_req->headers_size += wsgi_req->socket->proto_writev_header(wsgi_req, iov, 2); wsgi_req->header_cnt++; ah = ah->next; } ah = wsgi_req->additional_headers; while(ah) { iov[0].iov_base = ah->value; iov[0].iov_len = ah->len; iov[1].iov_base = "\r\n"; iov[1].iov_len = 2; wsgi_req->headers_size += wsgi_req->socket->proto_writev_header(wsgi_req, iov, 2); wsgi_req->header_cnt++; ah = ah->next; } wsgi_req->headers_size += wsgi_req->socket->proto_write_header(wsgi_req, "\r\n", 2); return SAPI_HEADER_SENT_SUCCESSFULLY; }
int uwsgi_response_subhandler_pump(struct wsgi_request *wsgi_req) { PyObject *pychunk; int i; char sc[4]; // ok its a yield if (!wsgi_req->async_placeholder) { if (PyDict_Check((PyObject *)wsgi_req->async_result)) { PyObject *status = PyDict_GetItemString((PyObject *)wsgi_req->async_result, "status"); if (!status) { uwsgi_log("invalid Pump response (status code).\n"); goto clear; } PyObject *headers = PyDict_GetItemString((PyObject *)wsgi_req->async_result, "headers"); if (!headers) { uwsgi_log("invalid Pump response (headers).\n"); goto clear; } wsgi_req->async_placeholder = PyDict_GetItemString((PyObject *)wsgi_req->async_result, "body"); if (!wsgi_req->async_placeholder) { uwsgi_log("invalid Pump response (body).\n"); goto clear; } // get the status code if (!PyInt_Check(status)) { uwsgi_log("invalid Pump response (status code).\n"); goto clear; } if (uwsgi_num2str2n(PyInt_AsLong(status), sc, 4) != 3) { uwsgi_log("invalid Pump response (status code).\n"); goto clear; } if (uwsgi_response_prepare_headers(wsgi_req, sc, 3)) { uwsgi_log("unable to prepare response headers\n"); } PyObject *hhkey, *hhvalue; #ifdef UWSGI_PYTHON_OLD int hhpos = 0; #else Py_ssize_t hhpos = 0; #endif while (PyDict_Next(headers, &hhpos, &hhkey, &hhvalue)) { if (!PyString_Check(hhkey)) continue; char *k = PyString_AsString(hhkey); size_t kl = PyString_Size(hhkey); k[0] = toupper((int) k[0]); if (PyList_Check(hhvalue)) { for(i=0;i<PyList_Size(hhvalue);i++) { PyObject *item = PyList_GetItem(hhvalue, i); if (PyString_Check(item)) { if (uwsgi_response_add_header(wsgi_req, k, kl, PyString_AsString(item), PyString_Size(item))) goto clear; } } } else if (PyString_Check(hhvalue)) { if (uwsgi_response_add_header(wsgi_req, k, kl, PyString_AsString(hhvalue), PyString_Size(hhvalue))) goto clear; } } Py_INCREF((PyObject *)wsgi_req->async_placeholder); if (PyString_Check((PyObject *)wsgi_req->async_placeholder)) { UWSGI_RELEASE_GIL uwsgi_response_write_body_do(wsgi_req, PyString_AsString(wsgi_req->async_placeholder), PyString_Size(wsgi_req->async_placeholder)); UWSGI_GET_GIL uwsgi_py_check_write_errors { uwsgi_py_write_exception(wsgi_req); } goto clear; } #ifdef PYTHREE else if ((wsgi_req->sendfile_fd = PyObject_AsFileDescriptor((PyObject *)wsgi_req->async_placeholder)) > -1) {