##// END OF EJS Templates
tests: make and use a new `svnurlof.py` helper for constructing svn urls...
tests: make and use a new `svnurlof.py` helper for constructing svn urls The previous trick of a Python oneliner and some subshells is too hard to make portable, and this lets us consolidate some Windows-specific logic down to a single place. Differential Revision: https://phab.mercurial-scm.org/D5766

File last commit:

r29385:aa1d5600 default
r41526:d6b76d62 default
Show More
hgwebdir_wsgi.py
135 lines | 4.9 KiB | text/x-python | PythonLexer
Sune Foldager
add wsgi script for Microsoft IIS with isapi-wsgi
r10572 # An example WSGI script for IIS/isapi-wsgi to export multiple hgweb repos
Sune Foldager
hgwebdir_wsgi: update script and expand help...
r28187 # Copyright 2010-2016 Sune Foldager <cyano@me.com>
Sune Foldager
add wsgi script for Microsoft IIS with isapi-wsgi
r10572 #
Martin Geisler
win32/hgwebdir_wsgi: clarify copyright license
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
add wsgi script for Microsoft IIS with isapi-wsgi
r10572 # Requirements:
Sune Foldager
hgwebdir_wsgi: update script and expand help...
r28187 # - Python 2.7, preferably 64 bit
# - PyWin32 for Python 2.7 (32 or 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
add wsgi script for Microsoft IIS with isapi-wsgi
r10572 #
#
# Installation and use:
#
Sune Foldager
hgwebdir_wsgi: update script and expand help...
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
add wsgi script for Microsoft IIS with isapi-wsgi
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
hgwebdir_wsgi: update script and expand help...
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
add wsgi script for Microsoft IIS with isapi-wsgi
r10572 #
Sune Foldager
hgwebdir_wsgi: update script and expand help...
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
add wsgi script for Microsoft IIS with isapi-wsgi
r10572 #
Sune Foldager
hgwebdir_wsgi: update script and expand help...
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
add wsgi script for Microsoft IIS with isapi-wsgi
r10572 #
Sune Foldager
hgwebdir_wsgi: update script and expand help...
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
add wsgi script for Microsoft IIS with isapi-wsgi
r10572 #
Sune Foldager
hgwebdir_wsgi: update script and expand help...
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
add wsgi script for Microsoft IIS with isapi-wsgi
r10572 #
Pulkit Goyal
py3: shift from __future__ import absolute import to beginning (issue5269)
r29385 from __future__ import absolute_import
Sune Foldager
add wsgi script for Microsoft IIS with isapi-wsgi
r10572 # Configuration file location
Sune Foldager
hgwebdir_wsgi: update script and expand help...
r28187 hgweb_config = r'c:\your\directory\wsgi.config'
Sune Foldager
add wsgi script for Microsoft IIS with isapi-wsgi
r10572
# 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
Sune Foldager
win32/hgwebdir_wsgi: clarify documentation and clean up script a bit
r10586 # Adjust python path if this is not a system-wide install
Sune Foldager
hgwebdir_wsgi: update script and expand help...
r28187 #sys.path.insert(0, r'C:\your\custom\hg\build\lib.win32-2.7')
Sune Foldager
win32/hgwebdir_wsgi: clarify documentation and clean up script a bit
r10586
# Enable tracing. Run 'python -m win32traceutil' to debug
Augie Fackler
win32/hgwebdir_wsgi: use getattr instead of hasattr
r14974 if getattr(sys, 'isapidllhandle', None) is not None:
Sune Foldager
win32/hgwebdir_wsgi: clarify documentation and clean up script a bit
r10586 import win32traceutil
Mads Kiilerich
cleanup: make sure we always access members of imported modules...
r22198 win32traceutil.SetupForPrint # silence unused import warning
Sune Foldager
win32/hgwebdir_wsgi: clarify documentation and clean up script a bit
r10586
Sune Foldager
add wsgi script for Microsoft IIS with isapi-wsgi
r10572 import isapi_wsgi
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__':
Mads Kiilerich
cleanup: make sure we always access members of imported modules...
r22198 from isapi.install import ISAPIParameters, HandleCommandLine
Sune Foldager
add wsgi script for Microsoft IIS with isapi-wsgi
r10572 params = ISAPIParameters()
HandleCommandLine(params)