hgwebdir_wsgi.py
139 lines
| 4.8 KiB
| text/x-python
|
PythonLexer
Sune Foldager
|
r10572 | # An example WSGI script for IIS/isapi-wsgi to export multiple hgweb repos | ||
Sune Foldager
|
r28187 | # Copyright 2010-2016 Sune Foldager <cyano@me.com> | ||
Sune Foldager
|
r10572 | # | ||
Martin Geisler
|
r10578 | # This software may be used and distributed according to the terms of the | ||
# GNU General Public License version 2 or any later version. | ||||
# | ||||
Sune Foldager
|
r10572 | # Requirements: | ||
Sune Foldager
|
r28187 | # - Python 2.7, preferably 64 bit | ||
# - Mercurial installed from source (python setup.py install) or download the | ||||
# python module installer from https://www.mercurial-scm.org/wiki/Download | ||||
# - IIS 7 or newer | ||||
Sune Foldager
|
r10572 | # | ||
# | ||||
# Installation and use: | ||||
# | ||||
Sune Foldager
|
r28187 | # - Download or clone the isapi-wsgi source and run python setup.py install. | ||
# https://github.com/hexdump42/isapi-wsgi | ||||
# | ||||
# - Create a directory to hold the shim dll, config files etc. This can reside | ||||
# inside the standard IIS directory, C:\inetpub, or anywhere else. Copy this | ||||
# script there. | ||||
Sune Foldager
|
r10572 | # | ||
# - 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 | ||||
Sune Foldager
|
r28187 | # from an earlier run, if you wish. The shim needs to reside in the same | ||
# directory as this script. | ||||
# | ||||
# - Start IIS manager and create a new app pool: | ||||
# .NET CLR Version: No Managed Code | ||||
# Advanced Settings: Enable 32 Bit Applications, if using 32 bit Python. | ||||
# You can adjust the identity and maximum worker processes if you wish. This | ||||
# setup works fine with multiple worker processes. | ||||
Sune Foldager
|
r10572 | # | ||
Sune Foldager
|
r28187 | # - Create an IIS application where your hgwebdir is to be served from. | ||
# Assign it the app pool you just created and point its physical path to the | ||||
# directory you created. | ||||
# | ||||
# - In the application, remove all handler mappings and setup a wildcard script | ||||
# handler mapping of type IsapiModule with the shim dll as its executable. | ||||
# This file MUST reside in the same directory as the shim. The easiest way | ||||
# to do all this is to close IIS manager, place a web.config file in your | ||||
# directory and start IIS manager again. The file should contain: | ||||
Sune Foldager
|
r10572 | # | ||
Sune Foldager
|
r28187 | # <?xml version="1.0" encoding="UTF-8"?> | ||
# <configuration> | ||||
# <system.webServer> | ||||
# <handlers accessPolicy="Read, Script"> | ||||
# <clear /> | ||||
# <add name="hgwebdir" path="*" verb="*" modules="IsapiModule" | ||||
# scriptProcessor="C:\your\directory\_hgwebdir_wsgi.dll" | ||||
# resourceType="Unspecified" requireAccess="None" | ||||
# preCondition="bitness64" /> | ||||
# </handlers> | ||||
# </system.webServer> | ||||
# </configuration> | ||||
# | ||||
# Where "bitness64" should be replaced with "bitness32" for 32 bit Python. | ||||
# | ||||
# - Edit ISAPI And CGI Restrictions on the web server (global setting). Add a | ||||
# restriction pointing to your shim dll and allow it to run. | ||||
Sune Foldager
|
r10572 | # | ||
Sune Foldager
|
r28187 | # - Create a configuration file in your directory and adjust the configuration | ||
# variables below to match your needs. Example configuration: | ||||
# | ||||
# [web] | ||||
# style = gitweb | ||||
# push_ssl = false | ||||
# allow_push = * | ||||
# encoding = utf8 | ||||
Sune Foldager
|
r10572 | # | ||
Sune Foldager
|
r28187 | # [server] | ||
# validate = true | ||||
# | ||||
# [paths] | ||||
# repo1 = c:\your\directory\repo1 | ||||
# repo2 = c:\your\directory\repo2 | ||||
# | ||||
# - Restart the web server and see if things are running. | ||||
Sune Foldager
|
r10572 | # | ||
Pulkit Goyal
|
r29385 | |||
Sune Foldager
|
r10572 | # Configuration file location | ||
Sune Foldager
|
r28187 | hgweb_config = r'c:\your\directory\wsgi.config' | ||
Sune Foldager
|
r10572 | |||
# Global settings for IIS path translation | ||||
Augie Fackler
|
r43346 | path_strip = 0 # Strip this many path elements off (when using url rewrite) | ||
Sune Foldager
|
r10572 | path_prefix = 1 # This many path elements are prefixes (depends on the | ||
Augie Fackler
|
r43346 | # virtual path of the IIS application). | ||
Sune Foldager
|
r10572 | |||
import sys | ||||
Sune Foldager
|
r10586 | # Adjust python path if this is not a system-wide install | ||
Augie Fackler
|
r43346 | # sys.path.insert(0, r'C:\your\custom\hg\build\lib.win32-2.7') | ||
Sune Foldager
|
r10586 | |||
# Enable tracing. Run 'python -m win32traceutil' to debug | ||||
Augie Fackler
|
r14974 | if getattr(sys, 'isapidllhandle', None) is not None: | ||
Sune Foldager
|
r10586 | import win32traceutil | ||
Augie Fackler
|
r43346 | |||
win32traceutil.SetupForPrint # silence unused import warning | ||||
Sune Foldager
|
r10586 | |||
Sune Foldager
|
r10572 | import isapi_wsgi | ||
from mercurial.hgweb.hgwebdir_mod import hgwebdir | ||||
Raphaël Gomès
|
r52596 | |||
Sune Foldager
|
r10572 | # 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): | ||||
Augie Fackler
|
r43346 | error_status = '500 Internal Server Error' # less silly error message | ||
Sune Foldager
|
r10572 | |||
isapi_wsgi.IsapiWsgiHandler = WsgiHandler | ||||
# Only create the hgwebdir instance once | ||||
application = hgwebdir(hgweb_config) | ||||
Augie Fackler
|
r43346 | |||
Sune Foldager
|
r10572 | 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) | ||||
Augie Fackler
|
r43346 | |||
Sune Foldager
|
r10572 | def __ExtensionFactory__(): | ||
return isapi_wsgi.ISAPISimpleHandler(handler) | ||||
Augie Fackler
|
r43346 | |||
if __name__ == '__main__': | ||||
Mads Kiilerich
|
r22198 | from isapi.install import ISAPIParameters, HandleCommandLine | ||
Augie Fackler
|
r43346 | |||
Sune Foldager
|
r10572 | params = ISAPIParameters() | ||
HandleCommandLine(params) | ||||