Description
The standalone server doesn't work when using it behind a proxy that doesn't map to a root directory.
It also doesn't support HTTP authentication in Apache reverse proxy setups.
-- Marc-Andre Lemburg <mal@egenix.com>
Steps to reproduce
Running a standalone server as http://localhost:4200/mywiki/ causes the root page to be names "mywiki"
- Using authmodule.http doesn't work in such a setup
Example
No example available.
Details
This patch against Moin 1.5.6 fixes both problems:
--- /usr/local/src/moin-1.5.6/MoinMoin/request.py 2006-10-08 15:50:08.000000000 +0200
+++ request.py 2006-11-01 21:38:54.067887397 +0100
@@ -5,11 +5,11 @@
@copyright: 2001-2003 by Jürgen Hermann <jh@web.de>
@copyright: 2003-2006 by Thomas Waldmann
@license: GNU GPL, see COPYING for details.
"""
-import os, re, time, sys, cgi, StringIO
+import os, re, time, sys, cgi, StringIO, base64
import copy
from MoinMoin import config, wikiutil, user, caching
from MoinMoin import error, multiconfig
from MoinMoin.util import MoinMoinNoFooter, IsWin9x
@@ -495,22 +495,25 @@ class RequestBase(object):
TODO: does not work for Apache 1 and others that do not allow
setting custom headers per request.
@param env: dict like object containing cgi meta variables or http headers.
"""
+ scriptAndPath = self.script_name + self.path_info
+
+ # Adjust .script_name
location = (env.get(self.moin_location) or
env.get(cgiMetaVariable(self.moin_location)))
- if location is None:
- return
-
- scriptAndPath = self.script_name + self.path_info
- location = location.rstrip('/')
- self.script_name = location
-
- # This may happen when using mod_python
- if scriptAndPath.startswith(location):
- self.path_info = scriptAndPath[len(location):]
+ if location is not None:
+ location = location.rstrip('/')
+ self.script_name = location
+ # This may happen when using mod_python
+ if scriptAndPath.startswith(location):
+ self.path_info = scriptAndPath[len(location):]
+
+ # Remove .script_name from .path_info
+ if self.path_info.startswith(self.script_name):
+ self.path_info = self.path_info[len(self.script_name):]
# Recreate the URI from the modified parts
if self.request_uri:
self.request_uri = self.makeURI()
@@ -1678,11 +1681,13 @@ class RequestStandAlone(RequestBase):
"""
try:
self.sareq = sa
self.wfile = sa.wfile
self.rfile = sa.rfile
- self.headers = sa.headers
+ env = sa.headers
+ self.headers = env
+ self.env = env
self.is_ssl = 0
# Copy headers
self.http_accept_language = (sa.headers.getheader('accept-language')
or self.http_accept_language)
@@ -1690,23 +1695,38 @@ class RequestStandAlone(RequestBase):
co = filter(None, sa.headers.getheaders('cookie'))
self.saved_cookie = ', '.join(co) or ''
self.if_modified_since = sa.headers.getheader('if-modified-since')
self.if_none_match = sa.headers.getheader('if-none-match')
+ # Get path
+ path = sa.path
+ script_name = properties.get('script_name', '')
+ if script_name and path.startswith(script_name):
+ path = path[len(script_name):]
+
# Copy rest from standalone request
self.server_name = sa.server.server_name
self.server_port = str(sa.server.server_port)
self.request_method = sa.command
- self.request_uri = sa.path
+ self.request_uri = path
+ self.script_name = script_name
self.remote_addr = sa.client_address[0]
- # Values that need more work
- self.path_info, self.query_string = self.splitURI(sa.path)
+ # Values that need more work
+ self.path_info, self.query_string = self.splitURI(path)
self.setHttpReferer(sa.headers.getheader('referer'))
self.setHost(sa.headers.getheader('host'))
self.setURL(sa.headers)
+ # Decode authorization (from Apache reverse proxy)
+ auth = sa.headers.get('authorization', None)
+ if auth is not None:
+ auth_type, credentials = auth.split()
+ env['AUTH_TYPE'] = auth_type
+ if auth_type == 'Basic':
+ env['REMOTE_USER'] = base64.decodestring(credentials).split(':')[0]
+
##self.debugEnvironment(sa.headers)
RequestBase.__init__(self, properties)
except Exception, err:
Workaround
Discussion
Plan
- Priority:
- Assigned to:
- Status:
