summaryrefslogtreecommitdiff
path: root/contrib/win32/hgwebdir_wsgi.py
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/win32/hgwebdir_wsgi.py')
-rw-r--r--contrib/win32/hgwebdir_wsgi.py95
1 files changed, 95 insertions, 0 deletions
diff --git a/contrib/win32/hgwebdir_wsgi.py b/contrib/win32/hgwebdir_wsgi.py
new file mode 100644
index 0000000..efa866e
--- /dev/null
+++ b/contrib/win32/hgwebdir_wsgi.py
@@ -0,0 +1,95 @@
+# An example WSGI script for IIS/isapi-wsgi to export multiple hgweb repos
+# Copyright 2010 Sune Foldager <cryo@cyanite.org>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+#
+# Requirements:
+# - Python 2.6
+# - PyWin32 build 214 or newer
+# - Mercurial installed from source (python setup.py install)
+# - IIS 7
+#
+# Earlier versions will in general work as well, but the PyWin32 version is
+# necessary for win32traceutil to work correctly.
+#
+#
+# Installation and use:
+#
+# - Download the isapi-wsgi source and run python setup.py install:
+# http://code.google.com/p/isapi-wsgi/
+#
+# - Run this script (i.e. python hgwebdir_wsgi.py) to get a shim dll. The
+# shim is identical for all scripts, so you can just copy and rename one
+# from an earlier run, if you wish.
+#
+# - Setup an IIS application where your hgwebdir is to be served from.
+# On 64-bit systems, make sure it's assigned a 32-bit app pool.
+#
+# - In the application, setup a wildcard script handler mapping of type
+# IpsapiModule with the shim dll as its executable. This file MUST reside
+# in the same directory as the shim. Remove all other handlers, if you wish.
+#
+# - Make sure the ISAPI and CGI restrictions (configured globally on the
+# web server) includes the shim dll, to allow it to run.
+#
+# - Adjust the configuration variables below to match your needs.
+#
+
+# Configuration file location
+hgweb_config = r'c:\src\iis\hg\hgweb.config'
+
+# Global settings for IIS path translation
+path_strip = 0 # Strip this many path elements off (when using url rewrite)
+path_prefix = 1 # This many path elements are prefixes (depends on the
+ # virtual path of the IIS application).
+
+import sys
+
+# Adjust python path if this is not a system-wide install
+#sys.path.insert(0, r'c:\path\to\python\lib')
+
+# Enable tracing. Run 'python -m win32traceutil' to debug
+if getattr(sys, 'isapidllhandle', None) is not None:
+ import win32traceutil
+
+# To serve pages in local charset instead of UTF-8, remove the two lines below
+import os
+os.environ['HGENCODING'] = 'UTF-8'
+
+
+import isapi_wsgi
+from mercurial import demandimport; demandimport.enable()
+from mercurial.hgweb.hgwebdir_mod import hgwebdir
+
+# Example tweak: Replace isapi_wsgi's handler to provide better error message
+# Other stuff could also be done here, like logging errors etc.
+class WsgiHandler(isapi_wsgi.IsapiWsgiHandler):
+ error_status = '500 Internal Server Error' # less silly error message
+
+isapi_wsgi.IsapiWsgiHandler = WsgiHandler
+
+# Only create the hgwebdir instance once
+application = hgwebdir(hgweb_config)
+
+def handler(environ, start_response):
+
+ # Translate IIS's weird URLs
+ url = environ['SCRIPT_NAME'] + environ['PATH_INFO']
+ paths = url[1:].split('/')[path_strip:]
+ script_name = '/' + '/'.join(paths[:path_prefix])
+ path_info = '/'.join(paths[path_prefix:])
+ if path_info:
+ path_info = '/' + path_info
+ environ['SCRIPT_NAME'] = script_name
+ environ['PATH_INFO'] = path_info
+
+ return application(environ, start_response)
+
+def __ExtensionFactory__():
+ return isapi_wsgi.ISAPISimpleHandler(handler)
+
+if __name__=='__main__':
+ from isapi.install import *
+ params = ISAPIParameters()
+ HandleCommandLine(params)