3
3
extern struct uwsgi_server uwsgi;
4
4
extern struct uwsgi_python up;
5
extern PyTypeObject uwsgi_InputType;
6
7
void *uwsgi_request_subhandler_wsgi(struct wsgi_request *wsgi_req, struct uwsgi_app *wi) {
10
//static PyObject *uwsgi_version = NULL;
13
if (uwsgi_version == NULL) {
14
uwsgi_version = PyString_FromString(UWSGI_VERSION);
11
PyObject *pydictkey, *pydictvalue;
14
for (i = 0; i < wsgi_req->var_cnt; i += 2) {
16
uwsgi_debug("%.*s: %.*s\n", wsgi_req->hvec[i].iov_len, wsgi_req->hvec[i].iov_base, wsgi_req->hvec[i+1].iov_len, wsgi_req->hvec[i+1].iov_base);
19
pydictkey = PyUnicode_DecodeLatin1(wsgi_req->hvec[i].iov_base, wsgi_req->hvec[i].iov_len, NULL);
20
pydictvalue = PyUnicode_DecodeLatin1(wsgi_req->hvec[i + 1].iov_base, wsgi_req->hvec[i + 1].iov_len, NULL);
22
pydictkey = PyString_FromStringAndSize(wsgi_req->hvec[i].iov_base, wsgi_req->hvec[i].iov_len);
23
pydictvalue = PyString_FromStringAndSize(wsgi_req->hvec[i + 1].iov_base, wsgi_req->hvec[i + 1].iov_len);
27
uwsgi_log("%p %d %p %d\n", pydictkey, wsgi_req->hvec[i].iov_len, pydictvalue, wsgi_req->hvec[i + 1].iov_len);
29
PyDict_SetItem(wsgi_req->async_environ, pydictkey, pydictvalue);
31
Py_DECREF(pydictvalue);
34
if (wsgi_req->uh.modifier1 == UWSGI_MODIFIER_MANAGE_PATH_INFO) {
35
wsgi_req->uh.modifier1 = 0;
36
pydictkey = PyDict_GetItemString(wsgi_req->async_environ, "SCRIPT_NAME");
38
if (PyString_Check(pydictkey)) {
39
pydictvalue = PyDict_GetItemString(wsgi_req->async_environ, "PATH_INFO");
41
if (PyString_Check(pydictvalue)) {
42
path_info = PyString_AsString(pydictvalue);
43
PyDict_SetItemString(wsgi_req->async_environ, "PATH_INFO", PyString_FromString(path_info + PyString_Size(pydictkey)));
52
// if async_post is mapped as a file, directly use it as wsgi.input
53
if (wsgi_req->async_post) {
55
wsgi_req->async_input = PyFile_FromFd(fileno(wsgi_req->async_post), "wsgi_input", "rb", 0, NULL, NULL, NULL, 0);
57
wsgi_req->async_input = PyFile_FromFile(wsgi_req->async_post, "wsgi_input", "r", NULL);
61
// create wsgi.input custom object
62
wsgi_req->async_input = (PyObject *) PyObject_New(uwsgi_Input, &uwsgi_InputType);
63
((uwsgi_Input*)wsgi_req->async_input)->wsgi_req = wsgi_req;
64
((uwsgi_Input*)wsgi_req->async_input)->pos = 0;
65
((uwsgi_Input*)wsgi_req->async_input)->readline_pos = 0;
66
((uwsgi_Input*)wsgi_req->async_input)->readline_max_size = 0;
71
PyDict_SetItemString(wsgi_req->async_environ, "wsgi.input", wsgi_req->async_input);
19
74
#ifdef UWSGI_SENDFILE
20
75
PyDict_SetItemString(wsgi_req->async_environ, "wsgi.file_wrapper", wi->sendfile);
32
zero = PyTuple_New(2);
33
PyTuple_SetItem(zero, 0, PyInt_FromLong(1));
34
PyTuple_SetItem(zero, 1, PyInt_FromLong(0));
35
PyDict_SetItemString(wsgi_req->async_environ, "wsgi.version", zero);
86
PyDict_SetItemString(wsgi_req->async_environ, "wsgi.version", wi->gateway_version);
38
zero = PyFile_FromFile(stderr, "wsgi_input", "w", NULL);
89
zero = PyFile_FromFile(stderr, "wsgi_errors", "w", NULL);
39
90
PyDict_SetItemString(wsgi_req->async_environ, "wsgi.errors", zero);
42
94
PyDict_SetItemString(wsgi_req->async_environ, "wsgi.run_once", Py_False);
44
98
if (uwsgi.threads > 1) {
45
99
PyDict_SetItemString(wsgi_req->async_environ, "wsgi.multithread", Py_True);
57
111
if (wsgi_req->scheme_len > 0) {
58
zero = PyString_FromStringAndSize(wsgi_req->scheme, wsgi_req->scheme_len);
112
zero = UWSGI_PYFROMSTRINGSIZE(wsgi_req->scheme, wsgi_req->scheme_len);
60
114
else if (wsgi_req->https_len > 0) {
61
115
if (!strncasecmp(wsgi_req->https, "on", 2) || wsgi_req->https[0] == '1') {
62
zero = PyString_FromString("https");
116
zero = UWSGI_PYFROMSTRING("https");
65
zero = PyString_FromString("http");
119
zero = UWSGI_PYFROMSTRING("http");
69
zero = PyString_FromString("http");
123
zero = UWSGI_PYFROMSTRING("http");
71
125
PyDict_SetItemString(wsgi_req->async_environ, "wsgi.url_scheme", zero);
75
129
wsgi_req->async_app = wi->callable;
77
132
// export .env only in non-threaded mode
78
134
if (uwsgi.threads < 2) {
79
135
PyDict_SetItemString(up.embedded_dict, "env", wsgi_req->async_environ);
82
zero = PyString_FromString(UWSGI_VERSION);
83
PyDict_SetItemString(wsgi_req->async_environ, "uwsgi.version", zero);
139
PyDict_SetItemString(wsgi_req->async_environ, "uwsgi.version", wi->uwsgi_version);
86
141
if (uwsgi.cores > 1) {
87
PyDict_SetItemString(wsgi_req->async_environ, "uwsgi.core", PyInt_FromLong(wsgi_req->async_id));
142
zero = PyInt_FromLong(wsgi_req->async_id);
143
PyDict_SetItemString(wsgi_req->async_environ, "uwsgi.core", zero);
90
148
if (uwsgi.cluster_fd >= 0) {
91
149
zero = PyString_FromString(uwsgi.cluster);
92
150
PyDict_SetItemString(wsgi_req->async_environ, "uwsgi.cluster", zero);