--- Doc/Makefile.in.orig 2013-11-12 03:21:34 UTC +++ Doc/Makefile.in @@ -16,7 +16,7 @@ ALLSPHINXOPTS = -b $(BUILDER) -d build/d $(SPHINXOPTS) . build/$(BUILDER) $(SOURCES) .PHONY: help checkout update build html htmlhelp latex text changes linkcheck \ - suspicious coverage htmlview distclean clean dist check serve \ + suspicious coverage htmlview clean dist check serve \ autobuild-dev autobuild-stable help: @@ -102,8 +102,6 @@ coverage: build htmlview: html $(PYTHON) -c "import webbrowser; webbrowser.open('build/html/index.html')" -distclean: clean - clean: -rm -rf build/* -rm -rf tools/sphinx @@ -111,6 +109,9 @@ clean: -rm -rf tools/jinja2 -rm -rf tools/docutils +distclean: clean + rm -f Makefile + dist: rm -rf dist mkdir -p dist --- Doc/changes.rst.orig 2013-11-12 03:21:34 UTC +++ Doc/changes.rst @@ -5,22 +5,6 @@ Changes ******* -.. _changes_from_3_4_1: - -Changes from version 3.4.1 -========================== - -New Features ------------- - -* Support for Python 3.3 - -Improvements ------------- - -* Simpler, faster and up-to-date with latest Python code for creating/maintaining interpreter and thread state. -* A much faster WSGI implementation (start_response now implemented in C) - .. _changes_from_3_3_1: Changes from version 3.3.1 --- NEWS.orig 2013-11-12 03:21:34 UTC +++ NEWS @@ -1,3 +1,5 @@ +Nov 13 2013 - 3.5.0 released + Oct 22 2013 - 3.4.1 released Jan 29 2007 - 3.3.1 is being tagged --- configure.orig 2013-11-12 03:21:34 UTC +++ configure @@ -3340,11 +3340,7 @@ PyMAJVERSION=`$PYTHON_BIN -c 'import sys PyMINVERSION=`$PYTHON_BIN -c 'import sys; print(sys.version.split(".")[1])'` { $as_echo "$as_me:$LINENO: result: $PyVERSION" >&5 $as_echo "$PyVERSION" >&6; } -if test -z "$PyMAJVERSION"; then - { { $as_echo "$as_me:$LINENO: error: Unable to get Python version - is your Python working?" >&5 -$as_echo "$as_me: error: Unable to get Python version - is your Python working?" >&2;} - { (exit 1); exit 1; }; } -fi + # make sure Python version is >= 2.6 for 2 and >= 3.3 for 3 if test "$PyMAJVERSION" -lt "2"; then { { $as_echo "$as_me:$LINENO: error: This version of mod_python only works with Python major version 2 or higher. The one you have seems to be $PyVERSION." >&5 @@ -3395,8 +3391,7 @@ if test "${PYTHONFRAMEWORKDIR}" = "no-fr LDFLAGS="${LDFLAGS1} ${LDFLAGS2}" if test "$PyMAJVERSION" -eq "3"; then - PyLDVERSION=`$PYTHON_BIN -c 'from distutils import sysconfig; print(sysconfig.get_config_var("LDVERSION"))'` - LDLIBS1="-lpython${PyLDVERSION}" + LDLIBS1="-lpython${PyMAJVERSION}" else LDLIBS1="-lpython${PyVERSION}" fi --- configure.in.orig 2013-11-12 03:21:34 UTC +++ configure.in @@ -171,9 +171,7 @@ PyVERSION=`$PYTHON_BIN -c ['import sys; PyMAJVERSION=`$PYTHON_BIN -c ['import sys; print(sys.version[:1])'`] PyMINVERSION=`$PYTHON_BIN -c ['import sys; print(sys.version.split(".")[1])'`] AC_MSG_RESULT($PyVERSION) -if test -z "$PyMAJVERSION"; then - AC_MSG_ERROR([Unable to get Python version - is your Python working?]) -fi + # make sure Python version is >= 2.6 for 2 and >= 3.3 for 3 if test "$PyMAJVERSION" -lt "2"; then AC_MSG_ERROR([This version of mod_python only works with Python major version 2 or higher. The one you have seems to be $PyVERSION.]) @@ -218,8 +216,7 @@ if test "${PYTHONFRAMEWORKDIR}" = "no-fr LDFLAGS="${LDFLAGS1} ${LDFLAGS2}" if test "$PyMAJVERSION" -eq "3"; then - PyLDVERSION=`$PYTHON_BIN -c ['from distutils import sysconfig; print(sysconfig.get_config_var("LDVERSION"))'`] - LDLIBS1="-lpython${PyLDVERSION}" + LDLIBS1="-lpython${PyMAJVERSION}" else LDLIBS1="-lpython${PyVERSION}" fi @@ -326,9 +323,9 @@ if test "$LEX" && test -x "$LEX"; then AC_MSG_CHECKING(flex version) FlexVERSION=`$LEX --version | sed 's/version//g' | awk '/flex/ {print $2}'` - Flex_MAJOR=`echo $FlexVERSION| awk -F . '{print $1}'` - Flex_MINOR=`echo $FlexVERSION| awk -F . '{print $2}'` - Flex_PATCH=`echo $FlexVERSION| awk -F . '{print $3}'` + Flex_MAJOR=`echo $FlexVERSION| awk -F. '{print $1}'` + Flex_MINOR=`echo $FlexVERSION| awk -F. '{print $2}'` + Flex_PATCH=`echo $FlexVERSION| awk -F. '{print $3}'` if test "$Flex_MAJOR" -eq "2" && test "$Flex_MINOR" -eq "5" && test "$Flex_PATCH" -ge "31"; then AC_MSG_RESULT([$FlexVERSION. Good]) --- dist/version.sh.orig 2013-11-12 03:21:34 UTC +++ dist/version.sh @@ -5,6 +5,17 @@ MPV_PATH="`dirname $0`/../src/include/mp MAJ=`awk '/MP_VERSION_MAJOR/ {print $3}' $MPV_PATH` MIN=`awk '/MP_VERSION_MINOR/ {print $3}' $MPV_PATH` PCH=`awk '/MP_VERSION_PATCH/ {print $3}' $MPV_PATH` -GIT=`git describe --always` -echo $MAJ.$MIN.$PCH-$GIT +# if git exists in path +if type git >/dev/null 2>&1; then + # and we are in a checkout + if git rev-parse 2>/dev/null; then + # but not on a tag (which means this is a release) + if test -z "`git log 'HEAD^!' --format=%d 2>/dev/null | grep 'tag: '`"; then + # append git revision hash to version + GIT="-`git describe --always`" + fi + fi +fi + +echo $MAJ.$MIN.$PCH$GIT --- lib/python/mod_python/Cookie.py.orig 2013-11-12 03:21:34 UTC +++ lib/python/mod_python/Cookie.py @@ -59,7 +59,7 @@ class metaCookie(type): _valid_attr = ( "version", "path", "domain", "secure", - "comment", "max_age", + "comment", "expires", "max_age", # RFC 2965 "commentURL", "discard", "port", # Microsoft Extension --- lib/python/mod_python/util.py.orig 2013-11-12 03:21:34 UTC +++ lib/python/mod_python/util.py @@ -156,7 +156,7 @@ else: disp_options = None def __new__(self, value): - return bytes.__new__(self, value) + return bytes.__new__(self, value, "utf8") def __init__(self, value): self.value = value --- scripts/Makefile.in.orig 2013-11-12 03:21:34 UTC +++ scripts/Makefile.in @@ -17,7 +17,7 @@ # INSTALL=@INSTALL@ -BINDIR=@prefix@/bin +BINDIR=`dirname @PYTHON_BIN@` clean: rm -rf *~ @@ -26,4 +26,5 @@ distclean: clean rm -f Makefile install: + $(INSTALL) -m 0755 -d $(DESTDIR)$(BINDIR) $(INSTALL) -m 0755 mod_python $(DESTDIR)$(BINDIR)/mod_python --- scripts/mod_python.in.orig 2013-11-12 03:21:34 UTC +++ scripts/mod_python.in @@ -26,7 +26,7 @@ import sys import os import platform -import io +import StringIO import mod_python from mod_python import httpdconf @@ -64,7 +64,7 @@ def cmd_genconfig(): if len(args) != 1: parser.error("Must specify ") - exec(compile(open(args[0]).read(), args[0], 'exec')) + execfile(args[0]) def cmd_create(): --- src/Makefile.in.orig 2013-11-12 03:21:34 UTC +++ src/Makefile.in @@ -50,11 +50,11 @@ psp_parser.c: psp_parser.l dso: mod_python.so -mod_python.so: $(SRCS) @SOLARIS_HACKS@ +mod_python.so: $(SRCS) @SOLARIS_HACKS@ @echo @echo 'Building mod_python.so.' @echo - $(APXS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) -c $(SRCS) $(LDFLAGS) $(LDLIBS) @SOLARIS_HACKS@ + $(APXS) $(INCLUDES) $(CPPFLAGS) $(APXSFLAGS) $(CFLAGS) -c $(SRCS) $(LDFLAGS) $(LDLIBS) @SOLARIS_HACKS@ @rm -f mod_python.so @ln -s .libs/mod_python.so mod_python.so clean: @@ -64,21 +64,17 @@ distclean: clean rm -f Makefile .depend version.c: - @MP_GIT_SHA=$$(git describe --always); \ - echo > version.c ; \ + @echo > version.c ; \ echo "/* THIS FILE IS AUTO-GENERATED BY Makefile */" >> version.c ; \ echo "#include \"mp_version.h\"" >> version.c ; \ - echo "const char * const mp_git_sha = \"$${MP_GIT_SHA}\";" >> version.c ; \ echo "const int mp_version_major = MP_VERSION_MAJOR;" >> version.c ; \ echo "const int mp_version_minor = MP_VERSION_MINOR;" >> version.c ; \ echo "const int mp_version_patch = MP_VERSION_PATCH;" >> version.c ; \ - echo "const char * const mp_version_string = MP_VERSION_STRING(MP_VERSION_MAJOR,MP_VERSION_MINOR,MP_VERSION_PATCH) \"-$${MP_GIT_SHA}\";" >> version.c ; \ - echo "const char * const mp_version_component = \"mod_python/\" MP_VERSION_STRING(MP_VERSION_MAJOR,MP_VERSION_MINOR,MP_VERSION_PATCH) \"-$${MP_GIT_SHA}\";" >> version.c - -# echo "const char * const mp_version_component = \"mod_python/\" #MP_VERSION_MAJOR \".\" #MP_VERSION_MINOR \".\" #MP_VERSION_PATCH \"-$${MP_GIT_SHA}\";" >> version.c + echo "const char * const mp_version_string = \"`../dist/version.sh`\";" >> version.c ; \ + echo "const char * const mp_version_component = \"mod_python/\" \"`../dist/version.sh`\";" >> version.c # this is a hack to help avoid a gcc/solaris problem -# python uses assert() which needs _eprintf(). See +# python uses assert() which needs _eprintf(). See # SOLARIS_HACKS above _eprintf.o: ar -x `gcc -print-libgcc-file-name` _eprintf.o --- src/_apachemodule.c.orig 2013-11-12 03:21:34 UTC +++ src/_apachemodule.c @@ -213,9 +213,11 @@ static PyObject *parse_qs(PyObject *self cval = PyBytes_AS_STRING(val); if (unicode) { + // The query string is supposed to be a valid UTF8 string + // https://url.spec.whatwg.org/#percent-encoded-bytes PyObject *list, *ukey, *uval; - ukey = PyUnicode_DecodeLatin1(ckey, strlen(ckey), NULL); - uval = PyUnicode_DecodeLatin1(ckey, strlen(cval), NULL); + ukey = PyUnicode_DecodeUTF8(ckey, strlen(ckey), NULL); + uval = PyUnicode_DecodeUTF8(ckey, strlen(cval), NULL); list = PyDict_GetItem(dict, ukey); if (list) { PyList_Append(list, uval); @@ -371,8 +373,8 @@ static PyObject *parse_qsl(PyObject *sel PyObject *listitem = NULL; if (unicode) { PyObject *ukey, *uval; - ukey = PyUnicode_DecodeLatin1(ckey, strlen(ckey), NULL); - uval = PyUnicode_DecodeLatin1(cval, strlen(cval), NULL); + ukey = PyUnicode_DecodeUTF8(ckey, strlen(ckey), NULL); + uval = PyUnicode_DecodeUTF8(cval, strlen(cval), NULL); listitem = Py_BuildValue("(O,O)", ukey, uval); Py_DECREF(ukey); Py_DECREF(uval); --- src/include/mod_python.h.orig 2013-11-12 03:21:34 UTC +++ src/include/mod_python.h @@ -156,7 +156,6 @@ extern module AP_MODULE_DECLARE_DATA pyt #define MUTEX_DIR "/tmp" /* version stuff */ -extern const char * const mp_git_sha; extern const int mp_version_major; extern const int mp_version_minor; extern const int mp_version_patch; @@ -267,7 +266,7 @@ APR_DECLARE_OPTIONAL_FN(PyObject *, mp_g if (PY_MAJOR_VERSION >= 3 && PY_MINOR_VERSION >= 3 && \ PyUnicode_KIND(obj) == PyUnicode_1BYTE_KIND) { \ if (obj_is_borrowed) Py_INCREF(obj); /* so DECREF ok */ \ - str = (char *)PyUnicode_1BYTE_DATA(obj); \ + str = PyUnicode_1BYTE_DATA(obj); \ } else { \ PyObject *latin = PyUnicode_AsLatin1String(obj); \ if (latin) { \ @@ -292,11 +291,11 @@ static inline PyObject *MpObject_ReprAsB PyObject *result; PyObject *ucode = PyObject_Repr(o); /* we can do this because repr() should never have non-ascii characters XXX (really?) */ - char *c = (char *)PyUnicode_1BYTE_DATA(ucode); + char *c = PyUnicode_1BYTE_DATA(ucode); if (c[0] == 'b') - result = PyBytes_FromStringAndSize((char *)PyUnicode_1BYTE_DATA(ucode)+1, PyUnicode_GET_LENGTH(ucode)-1); + result = PyBytes_FromStringAndSize(PyUnicode_1BYTE_DATA(ucode)+1, PyUnicode_GET_LENGTH(ucode)-1); else - result = PyBytes_FromStringAndSize((char *)PyUnicode_1BYTE_DATA(ucode), PyUnicode_GET_LENGTH(ucode)); + result = PyBytes_FromStringAndSize(PyUnicode_1BYTE_DATA(ucode), PyUnicode_GET_LENGTH(ucode)); Py_DECREF(ucode); return result; } --- src/include/mod_python.h.in.orig 2013-11-12 03:21:34 UTC +++ src/include/mod_python.h.in @@ -156,7 +156,6 @@ extern module AP_MODULE_DECLARE_DATA pyt #define MUTEX_DIR "@MUTEX_DIR@" /* version stuff */ -extern const char * const mp_git_sha; extern const int mp_version_major; extern const int mp_version_minor; extern const int mp_version_patch; @@ -267,7 +266,7 @@ APR_DECLARE_OPTIONAL_FN(PyObject *, mp_g if (PY_MAJOR_VERSION >= 3 && PY_MINOR_VERSION >= 3 && \ PyUnicode_KIND(obj) == PyUnicode_1BYTE_KIND) { \ if (obj_is_borrowed) Py_INCREF(obj); /* so DECREF ok */ \ - str = (char *)PyUnicode_1BYTE_DATA(obj); \ + str = PyUnicode_1BYTE_DATA(obj); \ } else { \ PyObject *latin = PyUnicode_AsLatin1String(obj); \ if (latin) { \ @@ -292,11 +291,11 @@ static inline PyObject *MpObject_ReprAsB PyObject *result; PyObject *ucode = PyObject_Repr(o); /* we can do this because repr() should never have non-ascii characters XXX (really?) */ - char *c = (char *)PyUnicode_1BYTE_DATA(ucode); + char *c = PyUnicode_1BYTE_DATA(ucode); if (c[0] == 'b') - result = PyBytes_FromStringAndSize((char *)PyUnicode_1BYTE_DATA(ucode)+1, PyUnicode_GET_LENGTH(ucode)-1); + result = PyBytes_FromStringAndSize(PyUnicode_1BYTE_DATA(ucode)+1, PyUnicode_GET_LENGTH(ucode)-1); else - result = PyBytes_FromStringAndSize((char *)PyUnicode_1BYTE_DATA(ucode), PyUnicode_GET_LENGTH(ucode)); + result = PyBytes_FromStringAndSize(PyUnicode_1BYTE_DATA(ucode), PyUnicode_GET_LENGTH(ucode)); Py_DECREF(ucode); return result; } --- src/include/mp_version.h.orig 2013-11-12 03:21:34 UTC +++ src/include/mp_version.h @@ -10,5 +10,3 @@ #define MP_VERSION_MINOR 5 #define MP_VERSION_PATCH 0 -#define STR(x) #x -#define MP_VERSION_STRING(maj, min, p) STR(maj) "." STR(min) "." STR(p) --- src/mod_python.c.orig 2013-11-12 03:21:34 UTC +++ src/mod_python.c @@ -748,10 +748,10 @@ static int python_init(apr_pool_t *p, ap py_compile_version, py_dynamic_version); ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, "python_init: Python executable found '%s'.", - (char *)Py_GetProgramFullPath()); + Py_GetProgramFullPath()); ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, "python_init: Python path being used '%s'.", - (char *)Py_GetPath()); + Py_GetPath()); } /* Python version */ @@ -772,8 +772,18 @@ static int python_init(apr_pool_t *p, ap { initialized = 1; - /* initialze the interpreter */ + /* disable user site directories */ + Py_NoUserSiteDirectory = 1; + + /* Initialze the main interpreter. We do not want site.py to + * be imported because as of Python 2.7.9 it would cause a + * circular dependency related to _locale which breaks + * graceful restart so we set Py_NoSiteFlag to 1 just for this + * one time. (https://github.com/grisha/mod_python/issues/46) + */ + Py_NoSiteFlag = 1; Py_Initialize(); + Py_NoSiteFlag = 0; #ifdef WITH_THREAD /* create and acquire the interpreter lock */ @@ -1795,7 +1805,7 @@ static apr_status_t python_filter(int is } /* are we in transparent mode? transparent mode is on after an error, - so a fitler can spit out an error without causing infinite loop */ + so a filter can spit out an error without causing infinite loop */ if (ctx->transparent) { if (is_input) return ap_get_brigade(f->next, bb, mode, block, readbytes); @@ -2646,7 +2656,7 @@ static void PythonChildInitHandler(apr_p * problems as well. Thus disable cleanup of Python when * child processes are being shutdown. (MODPYTHON-109) * - apr_pool_cleanup_register(p, NULL, python_finalize, apr_pool_cleanup_null); + * apr_pool_cleanup_register(p, NULL, python_finalize, apr_pool_cleanup_null); */ /* --- src/requestobject.c.orig 2013-11-12 03:21:34 UTC +++ src/requestobject.c @@ -1967,6 +1967,10 @@ static int setreq_recmbr(requestobject * return 0; } else if (strcmp(name, "args") == 0) { + if (val == Py_None) { + self->request_rec->args = 0; + return 0; + } MP_ANYSTR_AS_STR(v, val, 1); if (!v) { Py_DECREF(val); /* MP_ANYSTR_AS_STR */