##// END OF EJS Templates
win32/hgwebdir_wsgi: clarify documentation and clean up script a bit
Sune Foldager -
r10586:efd3b71f default
parent child Browse files
Show More
@@ -1,95 +1,95 b''
1 # An example WSGI script for IIS/isapi-wsgi to export multiple hgweb repos
1 # An example WSGI script for IIS/isapi-wsgi to export multiple hgweb repos
2 # Copyright 2010 Sune Foldager <cryo@cyanite.org>
2 # Copyright 2010 Sune Foldager <cryo@cyanite.org>
3 #
3 #
4 # This software may be used and distributed according to the terms of the
4 # This software may be used and distributed according to the terms of the
5 # GNU General Public License version 2 or any later version.
5 # GNU General Public License version 2 or any later version.
6 #
6 #
7 # Requirements:
7 # Requirements:
8 # - Python 2.6
8 # - Python 2.6
9 # - PyWin32 build 214 or newer
10 # - Mercurial installed from source (python setup.py install)
9 # - IIS 7
11 # - IIS 7
10 # - PyWin32 build 214 or newer
11 #
12 #
12 # Earlier versions will in general work as well, but the PyWin32 version is
13 # Earlier versions will in general work as well, but the PyWin32 version is
13 # necessary for win32traceutil to work correctly.
14 # necessary for win32traceutil to work correctly.
14 #
15 #
15 #
16 #
16 # Installation and use:
17 # Installation and use:
17 #
18 #
18 # - Download the isapi-wsgi source and run python setup.py install:
19 # - Download the isapi-wsgi source and run python setup.py install:
19 # http://code.google.com/p/isapi-wsgi/
20 # http://code.google.com/p/isapi-wsgi/
20 #
21 #
21 # - Run this script (i.e. python hgwebdir_wsgi.py) to get a shim dll. The
22 # - Run this script (i.e. python hgwebdir_wsgi.py) to get a shim dll. The
22 # shim is identical for all scripts, so you can just copy and rename one
23 # shim is identical for all scripts, so you can just copy and rename one
23 # from an earlier run instead.
24 # from an earlier run, if you wish.
24 #
25 #
25 # - Setup an IIS application where your hgwebdir is to be served from.
26 # - Setup an IIS application where your hgwebdir is to be served from.
26 # Make sure it's assigned a 32-bit app pool.
27 # On 64-bit systems, make sure it's assigned a 32-bit app pool.
27 #
28 #
28 # - In the application, setup a wildcard script handler mapping of type
29 # - In the application, setup a wildcard script handler mapping of type
29 # IpsapiModule, with the shim dll as its executable. This file MUST reside
30 # IpsapiModule with the shim dll as its executable. This file MUST reside
30 # in the same directory as the shim. Remove all other handlers, if you wish.
31 # in the same directory as the shim. Remove all other handlers, if you wish.
31 #
32 #
32 # - Make sure the ISAPI and CGI restrictions (configured globally on the
33 # - Make sure the ISAPI and CGI restrictions (configured globally on the
33 # web server) includes the shim dll, to allow it to run.
34 # web server) includes the shim dll, to allow it to run.
34 #
35 #
35 # - Adjust the configuration variables below to match your needs.
36 # - Adjust the configuration variables below to match your needs.
36 #
37 #
37
38
38 # Configuration file location
39 # Configuration file location
39 hgweb_config = r'c:\src\iis\hg\hgweb.config'
40 hgweb_config = r'c:\src\iis\hg\hgweb.config'
40
41
41 # Global settings for IIS path translation
42 # Global settings for IIS path translation
42 path_strip = 0 # Strip this many path elements off (when using url rewrite)
43 path_strip = 0 # Strip this many path elements off (when using url rewrite)
43 path_prefix = 1 # This many path elements are prefixes (depends on the
44 path_prefix = 1 # This many path elements are prefixes (depends on the
44 # virtual path of the IIS application).
45 # virtual path of the IIS application).
45
46
46 import sys
47 import sys
47
48
48 # To stop serving pages in UTF-8, remove the two lines below
49 import os
50 os.environ['HGENCODING'] = 'UTF-8'
51
52 # Adjust python path if this is not a system-wide install
49 # Adjust python path if this is not a system-wide install
53 #sys.path.insert(0, "/path/to/python/lib")
50 #sys.path.insert(0, r'c:\path\to\python\lib')
54
55
51
56 # Enable tracing. Run 'python -m win32traceutil' to debug
52 # Enable tracing. Run 'python -m win32traceutil' to debug
57 if hasattr(sys, 'isapidllhandle'):
53 if hasattr(sys, 'isapidllhandle'):
58 import win32traceutil
54 import win32traceutil
59
55
56 # To serve pages in local charset instead of UTF-8, remove the two lines below
57 import os
58 os.environ['HGENCODING'] = 'UTF-8'
59
60
60 import isapi_wsgi
61 import isapi_wsgi
61
62 from mercurial import demandimport; demandimport.enable()
62 from mercurial import demandimport; demandimport.enable()
63 from mercurial.hgweb.hgwebdir_mod import hgwebdir
63 from mercurial.hgweb.hgwebdir_mod import hgwebdir
64
64
65 # Example tweak: Replace isapi_wsgi's handler to provide better error message
65 # Example tweak: Replace isapi_wsgi's handler to provide better error message
66 # Other stuff could also be done here, like logging errors etc.
66 # Other stuff could also be done here, like logging errors etc.
67 class WsgiHandler(isapi_wsgi.IsapiWsgiHandler):
67 class WsgiHandler(isapi_wsgi.IsapiWsgiHandler):
68 error_status = '500 Internal Server Error' # less silly error message
68 error_status = '500 Internal Server Error' # less silly error message
69
69
70 isapi_wsgi.IsapiWsgiHandler = WsgiHandler
70 isapi_wsgi.IsapiWsgiHandler = WsgiHandler
71
71
72 # Only create the hgwebdir instance once
72 # Only create the hgwebdir instance once
73 application = hgwebdir(hgweb_config)
73 application = hgwebdir(hgweb_config)
74
74
75 def handler(environ, start_response):
75 def handler(environ, start_response):
76
76
77 # Translate IIS's weird URLs
77 # Translate IIS's weird URLs
78 url = environ['SCRIPT_NAME'] + environ['PATH_INFO']
78 url = environ['SCRIPT_NAME'] + environ['PATH_INFO']
79 paths = url[1:].split('/')[path_strip:]
79 paths = url[1:].split('/')[path_strip:]
80 script_name = '/' + '/'.join(paths[:path_prefix])
80 script_name = '/' + '/'.join(paths[:path_prefix])
81 path_info = '/'.join(paths[path_prefix:])
81 path_info = '/'.join(paths[path_prefix:])
82 if path_info:
82 if path_info:
83 path_info = '/' + path_info
83 path_info = '/' + path_info
84 environ['SCRIPT_NAME'] = script_name
84 environ['SCRIPT_NAME'] = script_name
85 environ['PATH_INFO'] = path_info
85 environ['PATH_INFO'] = path_info
86
86
87 return application(environ, start_response)
87 return application(environ, start_response)
88
88
89 def __ExtensionFactory__():
89 def __ExtensionFactory__():
90 return isapi_wsgi.ISAPISimpleHandler(handler)
90 return isapi_wsgi.ISAPISimpleHandler(handler)
91
91
92 if __name__=='__main__':
92 if __name__=='__main__':
93 from isapi.install import *
93 from isapi.install import *
94 params = ISAPIParameters()
94 params = ISAPIParameters()
95 HandleCommandLine(params)
95 HandleCommandLine(params)
General Comments 0
You need to be logged in to leave comments. Login now