summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBarry Warsaw2017-02-10 18:29:41 +0000
committerBarry Warsaw2017-02-10 18:29:41 +0000
commita23f2cf7aa69ebdc08843db99a6a766bc7696797 (patch)
tree524886346cffa2e399c8358553decabd933ece47
parent03e04a93efa312bfec58dd267959d401e9bcf22b (diff)
parent06cce8370c5b2b78fdb8f388e7ace21d27eead03 (diff)
downloadmailman-a23f2cf7aa69ebdc08843db99a6a766bc7696797.tar.gz
mailman-a23f2cf7aa69ebdc08843db99a6a766bc7696797.tar.zst
mailman-a23f2cf7aa69ebdc08843db99a6a766bc7696797.zip
-rw-r--r--contrib/gunicorn.py61
-rw-r--r--src/mailman/docs/NEWS.rst2
-rw-r--r--src/mailman/rest/wsgiapp.py6
3 files changed, 64 insertions, 5 deletions
diff --git a/contrib/gunicorn.py b/contrib/gunicorn.py
new file mode 100644
index 000000000..829845c79
--- /dev/null
+++ b/contrib/gunicorn.py
@@ -0,0 +1,61 @@
+# Copyright (C) 2015-2017 by the Free Software Foundation, Inc.
+#
+# This file is part of GNU Mailman.
+#
+# GNU Mailman is free software: you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free
+# Software Foundation, either version 3 of the License, or (at your option)
+# any later version.
+#
+# GNU Mailman is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+# more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# GNU Mailman. If not, see <http://www.gnu.org/licenses/>.
+
+"""Experimental Gunicorn based REST server.
+
+To use this do the following:
+
+* Install gunicorn as a Python 3 application (in a venv if necessary).
+* Copy this file into your Python's site-packages under the name mmgunicorn.py
+* Create a mailman.cfg with at least the following in it:
+
+ [runner.rest]
+ start: no
+
+* Start Mailman as normal: `mailman start`
+* Set the MAILMAN_CONFIG_FILE environment variable to the location of your
+ mailman.cfg file from above.
+* Run: gunicorn mmgunicorn:run
+"""
+
+from public import public
+
+
+_initialized = False
+
+
+@public
+def run(environ, start_response):
+ """Create the WSGI application.
+
+ Use this if you want to integrate Mailman's REST server with an external
+ WSGI server, such as gunicorn. Be sure to set the $MAILMAN_CONFIG_FILE
+ environment variable.
+ """
+ # Imports are here to evaluate them lazily, prevent circular imports, and
+ # make flake8 happy.
+ global _initialized
+ if not _initialized:
+ from mailman.core.initialize import initialize
+ # First things first, initialize the system before any other imports or
+ # other operations. It must only be initialized once though.
+ initialize(propagate_logs=True)
+ _initialized = True
+ # Hook things up to WSGI.
+ from mailman.rest.wsgiapp import make_application
+ app = make_application()
+ return app(environ, start_response)
diff --git a/src/mailman/docs/NEWS.rst b/src/mailman/docs/NEWS.rst
index 5b580bd9d..d2d4a39d2 100644
--- a/src/mailman/docs/NEWS.rst
+++ b/src/mailman/docs/NEWS.rst
@@ -195,6 +195,8 @@ REST
integers, since the latter are not compatible with all versions of
JavaScript. (Closes #121)
* REST clients must minimally support HTTP/1.1. (Closes #288)
+ * Experimental Gunicorn support. See ``contrib/gunicorn.py`` docstring for
+ details. With assistance from Eric Searcy. (Closes #287)
* The new template system is introduced for API 3.1. See
``src/mailman/rest/docs/templates.rst`` for details. (Closes #249)
* When creating a user via REST using an address that already exists, but
diff --git a/src/mailman/rest/wsgiapp.py b/src/mailman/rest/wsgiapp.py
index 83922ce9d..70d756405 100644
--- a/src/mailman/rest/wsgiapp.py
+++ b/src/mailman/rest/wsgiapp.py
@@ -216,11 +216,7 @@ class RootedAPI(API):
@public
def make_application():
- """Create the WSGI application.
-
- Use this if you want to integrate Mailman's REST server with your own WSGI
- server.
- """
+ """Return a callable WSGI application object."""
return RootedAPI(Root())