(there is no new release sinc 2013 ...) - do not alter httpd.conf, install a dedicated module file PR: 204793 Submitted by: SBB
416 lines
16 KiB
Text
416 lines
16 KiB
Text
--- 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 <src>")
|
|
|
|
- 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 */
|