From a13e0075ee336f25e58f2be2e4bc2cce03dea714 Mon Sep 17 00:00:00 2001 From: "roberto@debian32" Date: Wed, 31 Aug 2011 07:55:34 +0200 Subject: [PATCH] fixed virtualhosting in fully-dynamic mode --- plugins/python/pyloader.c | 58 ++++++++++++++++++++++++++++++++++ plugins/python/python_plugin.c | 39 ----------------------- 2 files changed, 58 insertions(+), 39 deletions(-) diff --git a/plugins/python/pyloader.c b/plugins/python/pyloader.c index 604284f5..321033b4 100644 --- a/plugins/python/pyloader.c +++ b/plugins/python/pyloader.c @@ -22,6 +22,57 @@ PyMethodDef uwsgi_eventfd_read_method[] = { {"uwsgi_eventfd_read", py_eventfd_re PyMethodDef uwsgi_eventfd_write_method[] = { {"uwsgi_eventfd_write", py_eventfd_write, METH_VARARGS, ""}}; #endif +#ifdef UWSGI_MINTERPRETERS + +void set_dyn_pyhome(char *home, uint16_t pyhome_len) { + + + char venv_version[15]; + PyObject *site_module; + + PyObject *pysys_dict = get_uwsgi_pydict("sys"); + + PyObject *pypath = pypath = PyDict_GetItemString(pysys_dict, "path"); + if (!pypath) { + PyErr_Print(); + exit(1); + } + + // simulate a pythonhome directive + if (uwsgi.wsgi_req->pyhome_len > 0) { + + PyObject *venv_path = UWSGI_PYFROMSTRINGSIZE(uwsgi.wsgi_req->pyhome, uwsgi.wsgi_req->pyhome_len); + +#ifdef UWSGI_DEBUG + uwsgi_debug("setting dynamic virtualenv to %.*s\n", uwsgi.wsgi_req->pyhome_len, uwsgi.wsgi_req->pyhome); +#endif + + PyDict_SetItemString(pysys_dict, "prefix", venv_path); + PyDict_SetItemString(pysys_dict, "exec_prefix", venv_path); + + venv_version[14] = 0; + if (snprintf(venv_version, 15, "/lib/python%d.%d", PY_MAJOR_VERSION, PY_MINOR_VERSION) == -1) { + return; + } + + // check here + PyString_Concat(&venv_path, PyString_FromString(venv_version)); + + if (PyList_Insert(pypath, 0, venv_path)) { + PyErr_Print(); + } + + site_module = PyImport_ImportModule("site"); + if (site_module) { + PyImport_ReloadModule(site_module); + } + + } +} + +#endif + + int init_uwsgi_app(int loader, void *arg1, struct wsgi_request *wsgi_req, PyThreadState *interpreter, int app_type) { PyObject *app_list = NULL, *applications = NULL; @@ -110,6 +161,7 @@ int init_uwsgi_app(int loader, void *arg1, struct wsgi_request *wsgi_req, PyThre } if (interpreter == NULL && id) { + wi->interpreter = Py_NewInterpreter(); if (!wi->interpreter) { uwsgi_log( "unable to initialize the new python interpreter\n"); @@ -132,6 +184,12 @@ int init_uwsgi_app(int loader, void *arg1, struct wsgi_request *wsgi_req, PyThre wi->interpreter = up.main_thread; } +#ifdef UWSGI_MINTERPRETERS + if (wsgi_req->pyhome_len) { + set_dyn_pyhome(wsgi_req->pyhome, wsgi_req->pyhome_len); + } +#endif + if (wsgi_req->touch_reload_len) { struct stat trst; char *touch_reload = uwsgi_strncopy(wsgi_req->touch_reload, wsgi_req->touch_reload_len); diff --git a/plugins/python/python_plugin.c b/plugins/python/python_plugin.c index 21a5df18..a45984fc 100644 --- a/plugins/python/python_plugin.c +++ b/plugins/python/python_plugin.c @@ -295,7 +295,6 @@ PyObject *uwsgi_pyimport_by_filename(char *name, char *filename) { } - void init_uwsgi_vars() { int i; @@ -304,11 +303,6 @@ void init_uwsgi_vars() { PyObject *modules = PyImport_GetModuleDict(); PyObject *tmp_module; -#ifdef UWSGI_MINTERPRETERS - char venv_version[15]; - PyObject *site_module; -#endif - /* add cwd to pythonpath */ pysys = PyImport_ImportModule("sys"); if (!pysys) { @@ -331,39 +325,6 @@ void init_uwsgi_vars() { exit(1); } -#ifdef UWSGI_MINTERPRETERS - // simulate a pythonhome directive - if (uwsgi.wsgi_req->pyhome_len > 0) { - - PyObject *venv_path = UWSGI_PYFROMSTRINGSIZE(uwsgi.wsgi_req->pyhome, uwsgi.wsgi_req->pyhome_len); - -#ifdef UWSGI_DEBUG - uwsgi_debug("setting dynamic virtualenv to %.*s\n", uwsgi.wsgi_req->pyhome_len, uwsgi.wsgi_req->pyhome); -#endif - - PyDict_SetItemString(pysys_dict, "prefix", venv_path); - PyDict_SetItemString(pysys_dict, "exec_prefix", venv_path); - - venv_version[14] = 0; - if (snprintf(venv_version, 15, "/lib/python%d.%d", PY_MAJOR_VERSION, PY_MINOR_VERSION) == -1) { - return; - } - - // check here - PyString_Concat(&venv_path, PyString_FromString(venv_version)); - - if (PyList_Insert(pypath, 0, venv_path)) { - PyErr_Print(); - } - - site_module = PyImport_ImportModule("site"); - if (site_module) { - PyImport_ReloadModule(site_module); - } - - } -#endif - if (PyList_Insert(pypath, 0, UWSGI_PYFROMSTRING(".")) != 0) { PyErr_Print(); }