author | Gregory Szorc <gregory.szorc@gmail.com> |
Sun, 12 Mar 2017 21:52:17 -0700 | |
changeset 31391 | d2878bec55bd |
parent 30639 | d524c88511a7 |
child 34227 | ac96ff471c9a |
permissions | -rw-r--r-- |
2391
d351a3be3371
Fixing up comment headers for split up code.
Eric Hopper <hopper@omnifarious.org>
parents:
2355
diff
changeset
|
1 |
# hgweb/server.py - The standalone hg web server. |
131 | 2 |
# |
238
3b92f8fe47ae
hgweb.py: kill #! line, clean up copyright notice
mpm@selenic.com
parents:
222
diff
changeset
|
3 |
# Copyright 21 May 2005 - (c) 2005 Jake Edge <jake@edge2.net> |
4635
63b9d2deed48
Updated copyright notices and add "and others" to "hg version"
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4633
diff
changeset
|
4 |
# Copyright 2005-2007 Matt Mackall <mpm@selenic.com> |
131 | 5 |
# |
8225
46293a0c7e9f
updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents:
8224
diff
changeset
|
6 |
# This software may be used and distributed according to the terms of the |
10263 | 7 |
# GNU General Public License version 2 or any later version. |
131 | 8 |
|
27046
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
26848
diff
changeset
|
9 |
from __future__ import absolute_import |
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
26848
diff
changeset
|
10 |
|
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
26848
diff
changeset
|
11 |
import errno |
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
26848
diff
changeset
|
12 |
import os |
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
26848
diff
changeset
|
13 |
import socket |
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
26848
diff
changeset
|
14 |
import sys |
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
26848
diff
changeset
|
15 |
import traceback |
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
26848
diff
changeset
|
16 |
|
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
26848
diff
changeset
|
17 |
from ..i18n import _ |
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
26848
diff
changeset
|
18 |
|
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
26848
diff
changeset
|
19 |
from .. import ( |
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
26848
diff
changeset
|
20 |
error, |
30639
d524c88511a7
py3: replace os.name with pycompat.osname (part 1 of 2)
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30264
diff
changeset
|
21 |
pycompat, |
27046
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
26848
diff
changeset
|
22 |
util, |
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
26848
diff
changeset
|
23 |
) |
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
26848
diff
changeset
|
24 |
|
29566
075146e85bb6
py3: conditionalize BaseHTTPServer, SimpleHTTPServer and CGIHTTPServer import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29555
diff
changeset
|
25 |
httpservermod = util.httpserver |
29433
33770d2b6cf9
py3: conditionalize SocketServer import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
28883
diff
changeset
|
26 |
socketserver = util.socketserver |
28883
032c4c2f802a
pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents:
27046
diff
changeset
|
27 |
urlerr = util.urlerr |
032c4c2f802a
pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents:
27046
diff
changeset
|
28 |
urlreq = util.urlreq |
032c4c2f802a
pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents:
27046
diff
changeset
|
29 |
|
27046
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
26848
diff
changeset
|
30 |
from . import ( |
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
26848
diff
changeset
|
31 |
common, |
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
26848
diff
changeset
|
32 |
) |
138 | 33 |
|
2355
eb08fb4d41e1
Splitting up hgweb so it's easier to change.
Eric Hopper <hopper@omnifarious.org>
parents:
2328
diff
changeset
|
34 |
def _splitURI(uri): |
17427
57c6c24b9bc4
improve some comments and docstrings, fixing issues found when spell checking
Mads Kiilerich <mads@kiilerich.com>
parents:
17424
diff
changeset
|
35 |
"""Return path and query that has been split from uri |
2123
c0729a7f6f8a
Fixed path handling of the standalone server, fixed typo.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents:
2122
diff
changeset
|
36 |
|
c0729a7f6f8a
Fixed path handling of the standalone server, fixed typo.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents:
2122
diff
changeset
|
37 |
Just like CGI environment, the path is unquoted, the query is |
c0729a7f6f8a
Fixed path handling of the standalone server, fixed typo.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents:
2122
diff
changeset
|
38 |
not. |
c0729a7f6f8a
Fixed path handling of the standalone server, fixed typo.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents:
2122
diff
changeset
|
39 |
""" |
c0729a7f6f8a
Fixed path handling of the standalone server, fixed typo.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents:
2122
diff
changeset
|
40 |
if '?' in uri: |
c0729a7f6f8a
Fixed path handling of the standalone server, fixed typo.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents:
2122
diff
changeset
|
41 |
path, query = uri.split('?', 1) |
c0729a7f6f8a
Fixed path handling of the standalone server, fixed typo.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents:
2122
diff
changeset
|
42 |
else: |
c0729a7f6f8a
Fixed path handling of the standalone server, fixed typo.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents:
2122
diff
changeset
|
43 |
path, query = uri, '' |
28883
032c4c2f802a
pycompat: switch to util.urlreq/util.urlerr for py3 compat
timeless <timeless@mozdev.org>
parents:
27046
diff
changeset
|
44 |
return urlreq.unquote(path), query |
2123
c0729a7f6f8a
Fixed path handling of the standalone server, fixed typo.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents:
2122
diff
changeset
|
45 |
|
2506
d0db3462d568
This patch make several WSGI related alterations.
Eric Hopper <hopper@omnifarious.org>
parents:
2505
diff
changeset
|
46 |
class _error_logger(object): |
d0db3462d568
This patch make several WSGI related alterations.
Eric Hopper <hopper@omnifarious.org>
parents:
2505
diff
changeset
|
47 |
def __init__(self, handler): |
d0db3462d568
This patch make several WSGI related alterations.
Eric Hopper <hopper@omnifarious.org>
parents:
2505
diff
changeset
|
48 |
self.handler = handler |
d0db3462d568
This patch make several WSGI related alterations.
Eric Hopper <hopper@omnifarious.org>
parents:
2505
diff
changeset
|
49 |
def flush(self): |
d0db3462d568
This patch make several WSGI related alterations.
Eric Hopper <hopper@omnifarious.org>
parents:
2505
diff
changeset
|
50 |
pass |
3130
2e043c9a38a6
hgweb: fix errors spotted by pychecker
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3079
diff
changeset
|
51 |
def write(self, str): |
2506
d0db3462d568
This patch make several WSGI related alterations.
Eric Hopper <hopper@omnifarious.org>
parents:
2505
diff
changeset
|
52 |
self.writelines(str.split('\n')) |
3130
2e043c9a38a6
hgweb: fix errors spotted by pychecker
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3079
diff
changeset
|
53 |
def writelines(self, seq): |
2506
d0db3462d568
This patch make several WSGI related alterations.
Eric Hopper <hopper@omnifarious.org>
parents:
2505
diff
changeset
|
54 |
for msg in seq: |
d0db3462d568
This patch make several WSGI related alterations.
Eric Hopper <hopper@omnifarious.org>
parents:
2505
diff
changeset
|
55 |
self.handler.log_error("HG error: %s", msg) |
d0db3462d568
This patch make several WSGI related alterations.
Eric Hopper <hopper@omnifarious.org>
parents:
2505
diff
changeset
|
56 |
|
29566
075146e85bb6
py3: conditionalize BaseHTTPServer, SimpleHTTPServer and CGIHTTPServer import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29555
diff
changeset
|
57 |
class _httprequesthandler(httpservermod.basehttprequesthandler): |
4870
8f430b1b3025
Make hg serve set the wsgi.url_scheme property correctly.
Wesley J. Landaker <wjl@icecavern.net>
parents:
4868
diff
changeset
|
58 |
|
8f430b1b3025
Make hg serve set the wsgi.url_scheme property correctly.
Wesley J. Landaker <wjl@icecavern.net>
parents:
4868
diff
changeset
|
59 |
url_scheme = 'http' |
4957
cdd33a048289
removed trailing whitespace
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4871
diff
changeset
|
60 |
|
12783
191d0fd5c2fd
hgweb: refactor all pyOpenSSL references into one class
Mads Kiilerich <mads@kiilerich.com>
parents:
12740
diff
changeset
|
61 |
@staticmethod |
29553
cd3e58862cab
hgweb: pass ui into preparehttpserver
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29433
diff
changeset
|
62 |
def preparehttpserver(httpserver, ui): |
12783
191d0fd5c2fd
hgweb: refactor all pyOpenSSL references into one class
Mads Kiilerich <mads@kiilerich.com>
parents:
12740
diff
changeset
|
63 |
"""Prepare .socket of new HTTPServer instance""" |
191d0fd5c2fd
hgweb: refactor all pyOpenSSL references into one class
Mads Kiilerich <mads@kiilerich.com>
parents:
12740
diff
changeset
|
64 |
pass |
191d0fd5c2fd
hgweb: refactor all pyOpenSSL references into one class
Mads Kiilerich <mads@kiilerich.com>
parents:
12740
diff
changeset
|
65 |
|
2355
eb08fb4d41e1
Splitting up hgweb so it's easier to change.
Eric Hopper <hopper@omnifarious.org>
parents:
2328
diff
changeset
|
66 |
def __init__(self, *args, **kargs): |
2434
a2df85adface
http server: support persistent connections.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2404
diff
changeset
|
67 |
self.protocol_version = 'HTTP/1.1' |
29566
075146e85bb6
py3: conditionalize BaseHTTPServer, SimpleHTTPServer and CGIHTTPServer import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29555
diff
changeset
|
68 |
httpservermod.basehttprequesthandler.__init__(self, *args, **kargs) |
1498
78590fb4a82b
hgweb: Added archive download buttons to manifest page.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1473
diff
changeset
|
69 |
|
5549
f2f42262adbd
hgweb.server: flush log files after every access
Patrick Mezard <pmezard@gmail.com>
parents:
5150
diff
changeset
|
70 |
def _log_any(self, fp, format, *args): |
f2f42262adbd
hgweb.server: flush log files after every access
Patrick Mezard <pmezard@gmail.com>
parents:
5150
diff
changeset
|
71 |
fp.write("%s - - [%s] %s\n" % (self.client_address[0], |
f2f42262adbd
hgweb.server: flush log files after every access
Patrick Mezard <pmezard@gmail.com>
parents:
5150
diff
changeset
|
72 |
self.log_date_time_string(), |
f2f42262adbd
hgweb.server: flush log files after every access
Patrick Mezard <pmezard@gmail.com>
parents:
5150
diff
changeset
|
73 |
format % args)) |
f2f42262adbd
hgweb.server: flush log files after every access
Patrick Mezard <pmezard@gmail.com>
parents:
5150
diff
changeset
|
74 |
fp.flush() |
f2f42262adbd
hgweb.server: flush log files after every access
Patrick Mezard <pmezard@gmail.com>
parents:
5150
diff
changeset
|
75 |
|
2355
eb08fb4d41e1
Splitting up hgweb so it's easier to change.
Eric Hopper <hopper@omnifarious.org>
parents:
2328
diff
changeset
|
76 |
def log_error(self, format, *args): |
5549
f2f42262adbd
hgweb.server: flush log files after every access
Patrick Mezard <pmezard@gmail.com>
parents:
5150
diff
changeset
|
77 |
self._log_any(self.server.errorlog, format, *args) |
131 | 78 |
|
2355
eb08fb4d41e1
Splitting up hgweb so it's easier to change.
Eric Hopper <hopper@omnifarious.org>
parents:
2328
diff
changeset
|
79 |
def log_message(self, format, *args): |
5549
f2f42262adbd
hgweb.server: flush log files after every access
Patrick Mezard <pmezard@gmail.com>
parents:
5150
diff
changeset
|
80 |
self._log_any(self.server.accesslog, format, *args) |
538 | 81 |
|
14093
ce99d887585f
httprepo: long arguments support (issue2126)
Steven Brown <StevenGBrown@gmail.com>
parents:
13570
diff
changeset
|
82 |
def log_request(self, code='-', size='-'): |
19877
52ed85d9ac26
hgweb: log headers only if headers were successfully parsed
David Soria Parra <dsp@experimentalworks.net>
parents:
18380
diff
changeset
|
83 |
xheaders = [] |
52ed85d9ac26
hgweb: log headers only if headers were successfully parsed
David Soria Parra <dsp@experimentalworks.net>
parents:
18380
diff
changeset
|
84 |
if util.safehasattr(self, 'headers'): |
52ed85d9ac26
hgweb: log headers only if headers were successfully parsed
David Soria Parra <dsp@experimentalworks.net>
parents:
18380
diff
changeset
|
85 |
xheaders = [h for h in self.headers.items() |
52ed85d9ac26
hgweb: log headers only if headers were successfully parsed
David Soria Parra <dsp@experimentalworks.net>
parents:
18380
diff
changeset
|
86 |
if h[0].startswith('x-')] |
14093
ce99d887585f
httprepo: long arguments support (issue2126)
Steven Brown <StevenGBrown@gmail.com>
parents:
13570
diff
changeset
|
87 |
self.log_message('"%s" %s %s%s', |
ce99d887585f
httprepo: long arguments support (issue2126)
Steven Brown <StevenGBrown@gmail.com>
parents:
13570
diff
changeset
|
88 |
self.requestline, str(code), str(size), |
ce99d887585f
httprepo: long arguments support (issue2126)
Steven Brown <StevenGBrown@gmail.com>
parents:
13570
diff
changeset
|
89 |
''.join([' %s:%s' % h for h in sorted(xheaders)])) |
ce99d887585f
httprepo: long arguments support (issue2126)
Steven Brown <StevenGBrown@gmail.com>
parents:
13570
diff
changeset
|
90 |
|
4860
f3802f9f1840
Add SSL support to hg serve, activated via --certificate option
Brendan Cully <brendan@kublai.com>
parents:
4635
diff
changeset
|
91 |
def do_write(self): |
f3802f9f1840
Add SSL support to hg serve, activated via --certificate option
Brendan Cully <brendan@kublai.com>
parents:
4635
diff
changeset
|
92 |
try: |
f3802f9f1840
Add SSL support to hg serve, activated via --certificate option
Brendan Cully <brendan@kublai.com>
parents:
4635
diff
changeset
|
93 |
self.do_hgweb() |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23409
diff
changeset
|
94 |
except socket.error as inst: |
4860
f3802f9f1840
Add SSL support to hg serve, activated via --certificate option
Brendan Cully <brendan@kublai.com>
parents:
4635
diff
changeset
|
95 |
if inst[0] != errno.EPIPE: |
f3802f9f1840
Add SSL support to hg serve, activated via --certificate option
Brendan Cully <brendan@kublai.com>
parents:
4635
diff
changeset
|
96 |
raise |
f3802f9f1840
Add SSL support to hg serve, activated via --certificate option
Brendan Cully <brendan@kublai.com>
parents:
4635
diff
changeset
|
97 |
|
2355
eb08fb4d41e1
Splitting up hgweb so it's easier to change.
Eric Hopper <hopper@omnifarious.org>
parents:
2328
diff
changeset
|
98 |
def do_POST(self): |
eb08fb4d41e1
Splitting up hgweb so it's easier to change.
Eric Hopper <hopper@omnifarious.org>
parents:
2328
diff
changeset
|
99 |
try: |
4860
f3802f9f1840
Add SSL support to hg serve, activated via --certificate option
Brendan Cully <brendan@kublai.com>
parents:
4635
diff
changeset
|
100 |
self.do_write() |
13443
8fa83d7159eb
serve: catch and log all Exceptions, not only StandardException
Mads Kiilerich <mads@kiilerich.com>
parents:
12797
diff
changeset
|
101 |
except Exception: |
4015
769be3c57564
Handle exceptions in do_hgweb: Send "Internal Server Error", log traceback
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3836
diff
changeset
|
102 |
self._start_response("500 Internal Server Error", []) |
769be3c57564
Handle exceptions in do_hgweb: Send "Internal Server Error", log traceback
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3836
diff
changeset
|
103 |
self._write("Internal Server Error") |
23409
dc4d2cd3aa3e
hgweb: send proper HTTP response after uncaught exception
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23070
diff
changeset
|
104 |
self._done() |
4015
769be3c57564
Handle exceptions in do_hgweb: Send "Internal Server Error", log traceback
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3836
diff
changeset
|
105 |
tb = "".join(traceback.format_exception(*sys.exc_info())) |
8663
45f626a39def
wrap string literals in error messages
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
106 |
self.log_error("Exception happened during processing " |
45f626a39def
wrap string literals in error messages
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
107 |
"request '%s':\n%s", self.path, tb) |
133
fb84d3e71042
added template support for some hgweb output, also, template files for
jake@edge2.net
parents:
132
diff
changeset
|
108 |
|
2355
eb08fb4d41e1
Splitting up hgweb so it's easier to change.
Eric Hopper <hopper@omnifarious.org>
parents:
2328
diff
changeset
|
109 |
def do_GET(self): |
eb08fb4d41e1
Splitting up hgweb so it's easier to change.
Eric Hopper <hopper@omnifarious.org>
parents:
2328
diff
changeset
|
110 |
self.do_POST() |
131 | 111 |
|
2355
eb08fb4d41e1
Splitting up hgweb so it's easier to change.
Eric Hopper <hopper@omnifarious.org>
parents:
2328
diff
changeset
|
112 |
def do_hgweb(self): |
5835
bd34f0ac3cb0
adding "prefix" option to "hg serve" (command line and [web] section)
Michele Cella <michele.cella@gmail.com>
parents:
5690
diff
changeset
|
113 |
path, query = _splitURI(self.path) |
138 | 114 |
|
2355
eb08fb4d41e1
Splitting up hgweb so it's easier to change.
Eric Hopper <hopper@omnifarious.org>
parents:
2328
diff
changeset
|
115 |
env = {} |
eb08fb4d41e1
Splitting up hgweb so it's easier to change.
Eric Hopper <hopper@omnifarious.org>
parents:
2328
diff
changeset
|
116 |
env['GATEWAY_INTERFACE'] = 'CGI/1.1' |
eb08fb4d41e1
Splitting up hgweb so it's easier to change.
Eric Hopper <hopper@omnifarious.org>
parents:
2328
diff
changeset
|
117 |
env['REQUEST_METHOD'] = self.command |
eb08fb4d41e1
Splitting up hgweb so it's easier to change.
Eric Hopper <hopper@omnifarious.org>
parents:
2328
diff
changeset
|
118 |
env['SERVER_NAME'] = self.server.server_name |
eb08fb4d41e1
Splitting up hgweb so it's easier to change.
Eric Hopper <hopper@omnifarious.org>
parents:
2328
diff
changeset
|
119 |
env['SERVER_PORT'] = str(self.server.server_port) |
3263
3207e30bf468
hgweb: support for generating and parsing NWI URLs
Brendan Cully <brendan@kublai.com>
parents:
3130
diff
changeset
|
120 |
env['REQUEST_URI'] = self.path |
5835
bd34f0ac3cb0
adding "prefix" option to "hg serve" (command line and [web] section)
Michele Cella <michele.cella@gmail.com>
parents:
5690
diff
changeset
|
121 |
env['SCRIPT_NAME'] = self.server.prefix |
bd34f0ac3cb0
adding "prefix" option to "hg serve" (command line and [web] section)
Michele Cella <michele.cella@gmail.com>
parents:
5690
diff
changeset
|
122 |
env['PATH_INFO'] = path[len(self.server.prefix):] |
4359
80d3f6f0d8e5
hg serve: don't do DNS lookups
Matt Mackall <mpm@selenic.com>
parents:
4245
diff
changeset
|
123 |
env['REMOTE_HOST'] = self.client_address[0] |
80d3f6f0d8e5
hg serve: don't do DNS lookups
Matt Mackall <mpm@selenic.com>
parents:
4245
diff
changeset
|
124 |
env['REMOTE_ADDR'] = self.client_address[0] |
2355
eb08fb4d41e1
Splitting up hgweb so it's easier to change.
Eric Hopper <hopper@omnifarious.org>
parents:
2328
diff
changeset
|
125 |
if query: |
eb08fb4d41e1
Splitting up hgweb so it's easier to change.
Eric Hopper <hopper@omnifarious.org>
parents:
2328
diff
changeset
|
126 |
env['QUERY_STRING'] = query |
1579
85803ec2daab
Remove tabs, and trailing whitespace from hgweb.py
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents:
1575
diff
changeset
|
127 |
|
2355
eb08fb4d41e1
Splitting up hgweb so it's easier to change.
Eric Hopper <hopper@omnifarious.org>
parents:
2328
diff
changeset
|
128 |
if self.headers.typeheader is None: |
eb08fb4d41e1
Splitting up hgweb so it's easier to change.
Eric Hopper <hopper@omnifarious.org>
parents:
2328
diff
changeset
|
129 |
env['CONTENT_TYPE'] = self.headers.type |
eb08fb4d41e1
Splitting up hgweb so it's easier to change.
Eric Hopper <hopper@omnifarious.org>
parents:
2328
diff
changeset
|
130 |
else: |
eb08fb4d41e1
Splitting up hgweb so it's easier to change.
Eric Hopper <hopper@omnifarious.org>
parents:
2328
diff
changeset
|
131 |
env['CONTENT_TYPE'] = self.headers.typeheader |
eb08fb4d41e1
Splitting up hgweb so it's easier to change.
Eric Hopper <hopper@omnifarious.org>
parents:
2328
diff
changeset
|
132 |
length = self.headers.getheader('content-length') |
eb08fb4d41e1
Splitting up hgweb so it's easier to change.
Eric Hopper <hopper@omnifarious.org>
parents:
2328
diff
changeset
|
133 |
if length: |
eb08fb4d41e1
Splitting up hgweb so it's easier to change.
Eric Hopper <hopper@omnifarious.org>
parents:
2328
diff
changeset
|
134 |
env['CONTENT_LENGTH'] = length |
4633
ff7253a0d1da
Cleanup of whitespace, indentation and line continuation.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4534
diff
changeset
|
135 |
for header in [h for h in self.headers.keys() |
2505
01b856927970
Fix server to set up a more WSGI compliant environment.
Eric Hopper <hopper@omnifarious.org>
parents:
2434
diff
changeset
|
136 |
if h not in ('content-type', 'content-length')]: |
01b856927970
Fix server to set up a more WSGI compliant environment.
Eric Hopper <hopper@omnifarious.org>
parents:
2434
diff
changeset
|
137 |
hkey = 'HTTP_' + header.replace('-', '_').upper() |
01b856927970
Fix server to set up a more WSGI compliant environment.
Eric Hopper <hopper@omnifarious.org>
parents:
2434
diff
changeset
|
138 |
hval = self.headers.getheader(header) |
01b856927970
Fix server to set up a more WSGI compliant environment.
Eric Hopper <hopper@omnifarious.org>
parents:
2434
diff
changeset
|
139 |
hval = hval.replace('\n', '').strip() |
01b856927970
Fix server to set up a more WSGI compliant environment.
Eric Hopper <hopper@omnifarious.org>
parents:
2434
diff
changeset
|
140 |
if hval: |
01b856927970
Fix server to set up a more WSGI compliant environment.
Eric Hopper <hopper@omnifarious.org>
parents:
2434
diff
changeset
|
141 |
env[hkey] = hval |
01b856927970
Fix server to set up a more WSGI compliant environment.
Eric Hopper <hopper@omnifarious.org>
parents:
2434
diff
changeset
|
142 |
env['SERVER_PROTOCOL'] = self.request_version |
2506
d0db3462d568
This patch make several WSGI related alterations.
Eric Hopper <hopper@omnifarious.org>
parents:
2505
diff
changeset
|
143 |
env['wsgi.version'] = (1, 0) |
4871 | 144 |
env['wsgi.url_scheme'] = self.url_scheme |
13570
617a87cb7eb2
hgweb: add support for 100-continue as recommended by PEP 333.
Augie Fackler <durin42@gmail.com>
parents:
13443
diff
changeset
|
145 |
if env.get('HTTP_EXPECT', '').lower() == '100-continue': |
617a87cb7eb2
hgweb: add support for 100-continue as recommended by PEP 333.
Augie Fackler <durin42@gmail.com>
parents:
13443
diff
changeset
|
146 |
self.rfile = common.continuereader(self.rfile, self.wfile.write) |
617a87cb7eb2
hgweb: add support for 100-continue as recommended by PEP 333.
Augie Fackler <durin42@gmail.com>
parents:
13443
diff
changeset
|
147 |
|
2506
d0db3462d568
This patch make several WSGI related alterations.
Eric Hopper <hopper@omnifarious.org>
parents:
2505
diff
changeset
|
148 |
env['wsgi.input'] = self.rfile |
d0db3462d568
This patch make several WSGI related alterations.
Eric Hopper <hopper@omnifarious.org>
parents:
2505
diff
changeset
|
149 |
env['wsgi.errors'] = _error_logger(self) |
d0db3462d568
This patch make several WSGI related alterations.
Eric Hopper <hopper@omnifarious.org>
parents:
2505
diff
changeset
|
150 |
env['wsgi.multithread'] = isinstance(self.server, |
29433
33770d2b6cf9
py3: conditionalize SocketServer import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
28883
diff
changeset
|
151 |
socketserver.ThreadingMixIn) |
2506
d0db3462d568
This patch make several WSGI related alterations.
Eric Hopper <hopper@omnifarious.org>
parents:
2505
diff
changeset
|
152 |
env['wsgi.multiprocess'] = isinstance(self.server, |
29433
33770d2b6cf9
py3: conditionalize SocketServer import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
28883
diff
changeset
|
153 |
socketserver.ForkingMixIn) |
2506
d0db3462d568
This patch make several WSGI related alterations.
Eric Hopper <hopper@omnifarious.org>
parents:
2505
diff
changeset
|
154 |
env['wsgi.run_once'] = 0 |
601 | 155 |
|
2506
d0db3462d568
This patch make several WSGI related alterations.
Eric Hopper <hopper@omnifarious.org>
parents:
2505
diff
changeset
|
156 |
self.saved_status = None |
d0db3462d568
This patch make several WSGI related alterations.
Eric Hopper <hopper@omnifarious.org>
parents:
2505
diff
changeset
|
157 |
self.saved_headers = [] |
d0db3462d568
This patch make several WSGI related alterations.
Eric Hopper <hopper@omnifarious.org>
parents:
2505
diff
changeset
|
158 |
self.sent_headers = False |
2508
ab460a3f0e3a
Put support for persistent connections back in.
Eric Hopper <hopper@omnifarious.org>
parents:
2507
diff
changeset
|
159 |
self.length = None |
18354
cf5c76017e11
serve: use chunked encoding in hgweb responses
Mads Kiilerich <mads@kiilerich.com>
parents:
18353
diff
changeset
|
160 |
self._chunked = None |
6784
18c429ea3a0e
hgweb: all protocol functions have become generators
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6403
diff
changeset
|
161 |
for chunk in self.server.application(env, self._start_response): |
18c429ea3a0e
hgweb: all protocol functions have become generators
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6403
diff
changeset
|
162 |
self._write(chunk) |
18349
c007e5c54b16
serve: send response headers even if response has no body
Mads Kiilerich <mads@kiilerich.com>
parents:
17427
diff
changeset
|
163 |
if not self.sent_headers: |
c007e5c54b16
serve: send response headers even if response has no body
Mads Kiilerich <mads@kiilerich.com>
parents:
17427
diff
changeset
|
164 |
self.send_headers() |
18354
cf5c76017e11
serve: use chunked encoding in hgweb responses
Mads Kiilerich <mads@kiilerich.com>
parents:
18353
diff
changeset
|
165 |
self._done() |
2506
d0db3462d568
This patch make several WSGI related alterations.
Eric Hopper <hopper@omnifarious.org>
parents:
2505
diff
changeset
|
166 |
|
d0db3462d568
This patch make several WSGI related alterations.
Eric Hopper <hopper@omnifarious.org>
parents:
2505
diff
changeset
|
167 |
def send_headers(self): |
d0db3462d568
This patch make several WSGI related alterations.
Eric Hopper <hopper@omnifarious.org>
parents:
2505
diff
changeset
|
168 |
if not self.saved_status: |
8663
45f626a39def
wrap string literals in error messages
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
169 |
raise AssertionError("Sending headers before " |
45f626a39def
wrap string literals in error messages
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
170 |
"start_response() called") |
2506
d0db3462d568
This patch make several WSGI related alterations.
Eric Hopper <hopper@omnifarious.org>
parents:
2505
diff
changeset
|
171 |
saved_status = self.saved_status.split(None, 1) |
d0db3462d568
This patch make several WSGI related alterations.
Eric Hopper <hopper@omnifarious.org>
parents:
2505
diff
changeset
|
172 |
saved_status[0] = int(saved_status[0]) |
d0db3462d568
This patch make several WSGI related alterations.
Eric Hopper <hopper@omnifarious.org>
parents:
2505
diff
changeset
|
173 |
self.send_response(*saved_status) |
18354
cf5c76017e11
serve: use chunked encoding in hgweb responses
Mads Kiilerich <mads@kiilerich.com>
parents:
18353
diff
changeset
|
174 |
self.length = None |
cf5c76017e11
serve: use chunked encoding in hgweb responses
Mads Kiilerich <mads@kiilerich.com>
parents:
18353
diff
changeset
|
175 |
self._chunked = False |
2506
d0db3462d568
This patch make several WSGI related alterations.
Eric Hopper <hopper@omnifarious.org>
parents:
2505
diff
changeset
|
176 |
for h in self.saved_headers: |
d0db3462d568
This patch make several WSGI related alterations.
Eric Hopper <hopper@omnifarious.org>
parents:
2505
diff
changeset
|
177 |
self.send_header(*h) |
2508
ab460a3f0e3a
Put support for persistent connections back in.
Eric Hopper <hopper@omnifarious.org>
parents:
2507
diff
changeset
|
178 |
if h[0].lower() == 'content-length': |
ab460a3f0e3a
Put support for persistent connections back in.
Eric Hopper <hopper@omnifarious.org>
parents:
2507
diff
changeset
|
179 |
self.length = int(h[1]) |
18380
a4d7fd7ad1f7
serve: don't send any content headers with 304 responses
Mads Kiilerich <madski@unity3d.com>
parents:
18354
diff
changeset
|
180 |
if (self.length is None and |
a4d7fd7ad1f7
serve: don't send any content headers with 304 responses
Mads Kiilerich <madski@unity3d.com>
parents:
18354
diff
changeset
|
181 |
saved_status[0] != common.HTTP_NOT_MODIFIED): |
18354
cf5c76017e11
serve: use chunked encoding in hgweb responses
Mads Kiilerich <mads@kiilerich.com>
parents:
18353
diff
changeset
|
182 |
self._chunked = (not self.close_connection and |
cf5c76017e11
serve: use chunked encoding in hgweb responses
Mads Kiilerich <mads@kiilerich.com>
parents:
18353
diff
changeset
|
183 |
self.request_version == "HTTP/1.1") |
cf5c76017e11
serve: use chunked encoding in hgweb responses
Mads Kiilerich <mads@kiilerich.com>
parents:
18353
diff
changeset
|
184 |
if self._chunked: |
cf5c76017e11
serve: use chunked encoding in hgweb responses
Mads Kiilerich <mads@kiilerich.com>
parents:
18353
diff
changeset
|
185 |
self.send_header('Transfer-Encoding', 'chunked') |
cf5c76017e11
serve: use chunked encoding in hgweb responses
Mads Kiilerich <mads@kiilerich.com>
parents:
18353
diff
changeset
|
186 |
else: |
cf5c76017e11
serve: use chunked encoding in hgweb responses
Mads Kiilerich <mads@kiilerich.com>
parents:
18353
diff
changeset
|
187 |
self.send_header('Connection', 'close') |
2506
d0db3462d568
This patch make several WSGI related alterations.
Eric Hopper <hopper@omnifarious.org>
parents:
2505
diff
changeset
|
188 |
self.end_headers() |
d0db3462d568
This patch make several WSGI related alterations.
Eric Hopper <hopper@omnifarious.org>
parents:
2505
diff
changeset
|
189 |
self.sent_headers = True |
d0db3462d568
This patch make several WSGI related alterations.
Eric Hopper <hopper@omnifarious.org>
parents:
2505
diff
changeset
|
190 |
|
d0db3462d568
This patch make several WSGI related alterations.
Eric Hopper <hopper@omnifarious.org>
parents:
2505
diff
changeset
|
191 |
def _start_response(self, http_status, headers, exc_info=None): |
d0db3462d568
This patch make several WSGI related alterations.
Eric Hopper <hopper@omnifarious.org>
parents:
2505
diff
changeset
|
192 |
code, msg = http_status.split(None, 1) |
d0db3462d568
This patch make several WSGI related alterations.
Eric Hopper <hopper@omnifarious.org>
parents:
2505
diff
changeset
|
193 |
code = int(code) |
d0db3462d568
This patch make several WSGI related alterations.
Eric Hopper <hopper@omnifarious.org>
parents:
2505
diff
changeset
|
194 |
self.saved_status = http_status |
2508
ab460a3f0e3a
Put support for persistent connections back in.
Eric Hopper <hopper@omnifarious.org>
parents:
2507
diff
changeset
|
195 |
bad_headers = ('connection', 'transfer-encoding') |
4633
ff7253a0d1da
Cleanup of whitespace, indentation and line continuation.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4534
diff
changeset
|
196 |
self.saved_headers = [h for h in headers |
ff7253a0d1da
Cleanup of whitespace, indentation and line continuation.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4534
diff
changeset
|
197 |
if h[0].lower() not in bad_headers] |
2506
d0db3462d568
This patch make several WSGI related alterations.
Eric Hopper <hopper@omnifarious.org>
parents:
2505
diff
changeset
|
198 |
return self._write |
d0db3462d568
This patch make several WSGI related alterations.
Eric Hopper <hopper@omnifarious.org>
parents:
2505
diff
changeset
|
199 |
|
d0db3462d568
This patch make several WSGI related alterations.
Eric Hopper <hopper@omnifarious.org>
parents:
2505
diff
changeset
|
200 |
def _write(self, data): |
d0db3462d568
This patch make several WSGI related alterations.
Eric Hopper <hopper@omnifarious.org>
parents:
2505
diff
changeset
|
201 |
if not self.saved_status: |
d0db3462d568
This patch make several WSGI related alterations.
Eric Hopper <hopper@omnifarious.org>
parents:
2505
diff
changeset
|
202 |
raise AssertionError("data written before start_response() called") |
d0db3462d568
This patch make several WSGI related alterations.
Eric Hopper <hopper@omnifarious.org>
parents:
2505
diff
changeset
|
203 |
elif not self.sent_headers: |
d0db3462d568
This patch make several WSGI related alterations.
Eric Hopper <hopper@omnifarious.org>
parents:
2505
diff
changeset
|
204 |
self.send_headers() |
2508
ab460a3f0e3a
Put support for persistent connections back in.
Eric Hopper <hopper@omnifarious.org>
parents:
2507
diff
changeset
|
205 |
if self.length is not None: |
ab460a3f0e3a
Put support for persistent connections back in.
Eric Hopper <hopper@omnifarious.org>
parents:
2507
diff
changeset
|
206 |
if len(data) > self.length: |
8663
45f626a39def
wrap string literals in error messages
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
207 |
raise AssertionError("Content-length header sent, but more " |
45f626a39def
wrap string literals in error messages
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
208 |
"bytes than specified are being written.") |
2508
ab460a3f0e3a
Put support for persistent connections back in.
Eric Hopper <hopper@omnifarious.org>
parents:
2507
diff
changeset
|
209 |
self.length = self.length - len(data) |
18354
cf5c76017e11
serve: use chunked encoding in hgweb responses
Mads Kiilerich <mads@kiilerich.com>
parents:
18353
diff
changeset
|
210 |
elif self._chunked and data: |
cf5c76017e11
serve: use chunked encoding in hgweb responses
Mads Kiilerich <mads@kiilerich.com>
parents:
18353
diff
changeset
|
211 |
data = '%x\r\n%s\r\n' % (len(data), data) |
2506
d0db3462d568
This patch make several WSGI related alterations.
Eric Hopper <hopper@omnifarious.org>
parents:
2505
diff
changeset
|
212 |
self.wfile.write(data) |
d0db3462d568
This patch make several WSGI related alterations.
Eric Hopper <hopper@omnifarious.org>
parents:
2505
diff
changeset
|
213 |
self.wfile.flush() |
136 | 214 |
|
18354
cf5c76017e11
serve: use chunked encoding in hgweb responses
Mads Kiilerich <mads@kiilerich.com>
parents:
18353
diff
changeset
|
215 |
def _done(self): |
cf5c76017e11
serve: use chunked encoding in hgweb responses
Mads Kiilerich <mads@kiilerich.com>
parents:
18353
diff
changeset
|
216 |
if self._chunked: |
cf5c76017e11
serve: use chunked encoding in hgweb responses
Mads Kiilerich <mads@kiilerich.com>
parents:
18353
diff
changeset
|
217 |
self.wfile.write('0\r\n\r\n') |
cf5c76017e11
serve: use chunked encoding in hgweb responses
Mads Kiilerich <mads@kiilerich.com>
parents:
18353
diff
changeset
|
218 |
self.wfile.flush() |
cf5c76017e11
serve: use chunked encoding in hgweb responses
Mads Kiilerich <mads@kiilerich.com>
parents:
18353
diff
changeset
|
219 |
|
12784
763be3cd084a
hgweb: use Pythons ssl module for HTTPS serve when using Python 2.6 or later
Mads Kiilerich <mads@kiilerich.com>
parents:
12783
diff
changeset
|
220 |
class _httprequesthandlerssl(_httprequesthandler): |
26202
04af43009c8b
hgweb.server: fix _httprequesthandlerssl help text
timeless@mozdev.org
parents:
25660
diff
changeset
|
221 |
"""HTTPS handler based on Python's ssl module""" |
12784
763be3cd084a
hgweb: use Pythons ssl module for HTTPS serve when using Python 2.6 or later
Mads Kiilerich <mads@kiilerich.com>
parents:
12783
diff
changeset
|
222 |
|
763be3cd084a
hgweb: use Pythons ssl module for HTTPS serve when using Python 2.6 or later
Mads Kiilerich <mads@kiilerich.com>
parents:
12783
diff
changeset
|
223 |
url_scheme = 'https' |
763be3cd084a
hgweb: use Pythons ssl module for HTTPS serve when using Python 2.6 or later
Mads Kiilerich <mads@kiilerich.com>
parents:
12783
diff
changeset
|
224 |
|
763be3cd084a
hgweb: use Pythons ssl module for HTTPS serve when using Python 2.6 or later
Mads Kiilerich <mads@kiilerich.com>
parents:
12783
diff
changeset
|
225 |
@staticmethod |
29553
cd3e58862cab
hgweb: pass ui into preparehttpserver
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29433
diff
changeset
|
226 |
def preparehttpserver(httpserver, ui): |
12784
763be3cd084a
hgweb: use Pythons ssl module for HTTPS serve when using Python 2.6 or later
Mads Kiilerich <mads@kiilerich.com>
parents:
12783
diff
changeset
|
227 |
try: |
29555
121d11814c62
hgweb: use sslutil.wrapserversocket()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29553
diff
changeset
|
228 |
from .. import sslutil |
121d11814c62
hgweb: use sslutil.wrapserversocket()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29553
diff
changeset
|
229 |
sslutil.modernssl |
12784
763be3cd084a
hgweb: use Pythons ssl module for HTTPS serve when using Python 2.6 or later
Mads Kiilerich <mads@kiilerich.com>
parents:
12783
diff
changeset
|
230 |
except ImportError: |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26202
diff
changeset
|
231 |
raise error.Abort(_("SSL support is unavailable")) |
29553
cd3e58862cab
hgweb: pass ui into preparehttpserver
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29433
diff
changeset
|
232 |
|
cd3e58862cab
hgweb: pass ui into preparehttpserver
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29433
diff
changeset
|
233 |
certfile = ui.config('web', 'certificate') |
29555
121d11814c62
hgweb: use sslutil.wrapserversocket()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29553
diff
changeset
|
234 |
|
121d11814c62
hgweb: use sslutil.wrapserversocket()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29553
diff
changeset
|
235 |
# These config options are currently only meant for testing. Use |
121d11814c62
hgweb: use sslutil.wrapserversocket()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29553
diff
changeset
|
236 |
# at your own risk. |
121d11814c62
hgweb: use sslutil.wrapserversocket()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29553
diff
changeset
|
237 |
cafile = ui.config('devel', 'servercafile') |
121d11814c62
hgweb: use sslutil.wrapserversocket()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29553
diff
changeset
|
238 |
reqcert = ui.configbool('devel', 'serverrequirecert') |
121d11814c62
hgweb: use sslutil.wrapserversocket()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29553
diff
changeset
|
239 |
|
121d11814c62
hgweb: use sslutil.wrapserversocket()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29553
diff
changeset
|
240 |
httpserver.socket = sslutil.wrapserversocket(httpserver.socket, |
121d11814c62
hgweb: use sslutil.wrapserversocket()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29553
diff
changeset
|
241 |
ui, |
121d11814c62
hgweb: use sslutil.wrapserversocket()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29553
diff
changeset
|
242 |
certfile=certfile, |
121d11814c62
hgweb: use sslutil.wrapserversocket()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29553
diff
changeset
|
243 |
cafile=cafile, |
121d11814c62
hgweb: use sslutil.wrapserversocket()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29553
diff
changeset
|
244 |
requireclientcert=reqcert) |
12784
763be3cd084a
hgweb: use Pythons ssl module for HTTPS serve when using Python 2.6 or later
Mads Kiilerich <mads@kiilerich.com>
parents:
12783
diff
changeset
|
245 |
|
763be3cd084a
hgweb: use Pythons ssl module for HTTPS serve when using Python 2.6 or later
Mads Kiilerich <mads@kiilerich.com>
parents:
12783
diff
changeset
|
246 |
def setup(self): |
763be3cd084a
hgweb: use Pythons ssl module for HTTPS serve when using Python 2.6 or later
Mads Kiilerich <mads@kiilerich.com>
parents:
12783
diff
changeset
|
247 |
self.connection = self.request |
763be3cd084a
hgweb: use Pythons ssl module for HTTPS serve when using Python 2.6 or later
Mads Kiilerich <mads@kiilerich.com>
parents:
12783
diff
changeset
|
248 |
self.rfile = socket._fileobject(self.request, "rb", self.rbufsize) |
763be3cd084a
hgweb: use Pythons ssl module for HTTPS serve when using Python 2.6 or later
Mads Kiilerich <mads@kiilerich.com>
parents:
12783
diff
changeset
|
249 |
self.wfile = socket._fileobject(self.request, "wb", self.wbufsize) |
763be3cd084a
hgweb: use Pythons ssl module for HTTPS serve when using Python 2.6 or later
Mads Kiilerich <mads@kiilerich.com>
parents:
12783
diff
changeset
|
250 |
|
10639
a6808629f450
server: externalize and streamline mixin setup
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents:
10638
diff
changeset
|
251 |
try: |
27046
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
26848
diff
changeset
|
252 |
import threading |
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
26848
diff
changeset
|
253 |
threading.activeCount() # silence pyflakes and bypass demandimport |
29433
33770d2b6cf9
py3: conditionalize SocketServer import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
28883
diff
changeset
|
254 |
_mixin = socketserver.ThreadingMixIn |
10639
a6808629f450
server: externalize and streamline mixin setup
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents:
10638
diff
changeset
|
255 |
except ImportError: |
14957
16e5271b216f
hgweb: move remaining hasattr calls to safehasattr
Augie Fackler <durin42@gmail.com>
parents:
14764
diff
changeset
|
256 |
if util.safehasattr(os, "fork"): |
29433
33770d2b6cf9
py3: conditionalize SocketServer import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
28883
diff
changeset
|
257 |
_mixin = socketserver.ForkingMixIn |
10639
a6808629f450
server: externalize and streamline mixin setup
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents:
10638
diff
changeset
|
258 |
else: |
14764
a7d5816087a9
classes: fix class style problems found by b071cd58af50
Thomas Arendsen Hein <thomas@intevation.de>
parents:
14093
diff
changeset
|
259 |
class _mixin(object): |
10639
a6808629f450
server: externalize and streamline mixin setup
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents:
10638
diff
changeset
|
260 |
pass |
a6808629f450
server: externalize and streamline mixin setup
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents:
10638
diff
changeset
|
261 |
|
10643
1874697a8863
server: unnest server classes into module namespace
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents:
10642
diff
changeset
|
262 |
def openlog(opt, default): |
1874697a8863
server: unnest server classes into module namespace
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents:
10642
diff
changeset
|
263 |
if opt and opt != '-': |
1874697a8863
server: unnest server classes into module namespace
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents:
10642
diff
changeset
|
264 |
return open(opt, 'a') |
1874697a8863
server: unnest server classes into module namespace
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents:
10642
diff
changeset
|
265 |
return default |
1874697a8863
server: unnest server classes into module namespace
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents:
10642
diff
changeset
|
266 |
|
30082
ebc03e64548a
hgweb: fix the MRO in Python 3
Martijn Pieters <mjpieters@fb.com>
parents:
29566
diff
changeset
|
267 |
class MercurialHTTPServer(_mixin, httpservermod.httpserver, object): |
10643
1874697a8863
server: unnest server classes into module namespace
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents:
10642
diff
changeset
|
268 |
|
1874697a8863
server: unnest server classes into module namespace
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents:
10642
diff
changeset
|
269 |
# SO_REUSEADDR has broken semantics on windows |
30639
d524c88511a7
py3: replace os.name with pycompat.osname (part 1 of 2)
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30264
diff
changeset
|
270 |
if pycompat.osname == 'nt': |
10643
1874697a8863
server: unnest server classes into module namespace
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents:
10642
diff
changeset
|
271 |
allow_reuse_address = 0 |
1874697a8863
server: unnest server classes into module namespace
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents:
10642
diff
changeset
|
272 |
|
1874697a8863
server: unnest server classes into module namespace
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents:
10642
diff
changeset
|
273 |
def __init__(self, ui, app, addr, handler, **kwargs): |
29566
075146e85bb6
py3: conditionalize BaseHTTPServer, SimpleHTTPServer and CGIHTTPServer import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29555
diff
changeset
|
274 |
httpservermod.httpserver.__init__(self, addr, handler, **kwargs) |
10643
1874697a8863
server: unnest server classes into module namespace
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents:
10642
diff
changeset
|
275 |
self.daemon_threads = True |
1874697a8863
server: unnest server classes into module namespace
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents:
10642
diff
changeset
|
276 |
self.application = app |
2124
27fd8b7a6c51
Cleaned trailing whitespace in hgweb.py, removed command line shortcut for webdir-conf.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents:
2123
diff
changeset
|
277 |
|
29553
cd3e58862cab
hgweb: pass ui into preparehttpserver
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29433
diff
changeset
|
278 |
handler.preparehttpserver(self, ui) |
10643
1874697a8863
server: unnest server classes into module namespace
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents:
10642
diff
changeset
|
279 |
|
1874697a8863
server: unnest server classes into module namespace
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents:
10642
diff
changeset
|
280 |
prefix = ui.config('web', 'prefix', '') |
1874697a8863
server: unnest server classes into module namespace
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents:
10642
diff
changeset
|
281 |
if prefix: |
1874697a8863
server: unnest server classes into module namespace
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents:
10642
diff
changeset
|
282 |
prefix = '/' + prefix.strip('/') |
1874697a8863
server: unnest server classes into module namespace
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents:
10642
diff
changeset
|
283 |
self.prefix = prefix |
1874697a8863
server: unnest server classes into module namespace
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents:
10642
diff
changeset
|
284 |
|
30264
dd3dd80fca10
hgweb: make log streams compatible with command server
Yuya Nishihara <yuya@tcha.org>
parents:
30082
diff
changeset
|
285 |
alog = openlog(ui.config('web', 'accesslog', '-'), ui.fout) |
dd3dd80fca10
hgweb: make log streams compatible with command server
Yuya Nishihara <yuya@tcha.org>
parents:
30082
diff
changeset
|
286 |
elog = openlog(ui.config('web', 'errorlog', '-'), ui.ferr) |
10643
1874697a8863
server: unnest server classes into module namespace
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents:
10642
diff
changeset
|
287 |
self.accesslog = alog |
1874697a8863
server: unnest server classes into module namespace
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents:
10642
diff
changeset
|
288 |
self.errorlog = elog |
1874697a8863
server: unnest server classes into module namespace
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents:
10642
diff
changeset
|
289 |
|
1874697a8863
server: unnest server classes into module namespace
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents:
10642
diff
changeset
|
290 |
self.addr, self.port = self.socket.getsockname()[0:2] |
1874697a8863
server: unnest server classes into module namespace
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents:
10642
diff
changeset
|
291 |
self.fqaddr = socket.getfqdn(addr[0]) |
1874697a8863
server: unnest server classes into module namespace
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents:
10642
diff
changeset
|
292 |
|
1874697a8863
server: unnest server classes into module namespace
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents:
10642
diff
changeset
|
293 |
class IPv6HTTPServer(MercurialHTTPServer): |
1874697a8863
server: unnest server classes into module namespace
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents:
10642
diff
changeset
|
294 |
address_family = getattr(socket, 'AF_INET6', None) |
1874697a8863
server: unnest server classes into module namespace
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents:
10642
diff
changeset
|
295 |
def __init__(self, *args, **kwargs): |
1874697a8863
server: unnest server classes into module namespace
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents:
10642
diff
changeset
|
296 |
if self.address_family is None: |
1874697a8863
server: unnest server classes into module namespace
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents:
10642
diff
changeset
|
297 |
raise error.RepoError(_('IPv6 is not available on this system')) |
1874697a8863
server: unnest server classes into module namespace
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents:
10642
diff
changeset
|
298 |
super(IPv6HTTPServer, self).__init__(*args, **kwargs) |
1874697a8863
server: unnest server classes into module namespace
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents:
10642
diff
changeset
|
299 |
|
10644
63948e7d37f7
server: initialize wsgi app in command, then wrap server around it
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents:
10643
diff
changeset
|
300 |
def create_server(ui, app): |
938 | 301 |
|
10644
63948e7d37f7
server: initialize wsgi app in command, then wrap server around it
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents:
10643
diff
changeset
|
302 |
if ui.config('web', 'certificate'): |
26848
d962e955da08
hgweb.server: drop support for Python 2.4
Siddharth Agarwal <sid0@fb.com>
parents:
26587
diff
changeset
|
303 |
handler = _httprequesthandlerssl |
4860
f3802f9f1840
Add SSL support to hg serve, activated via --certificate option
Brendan Cully <brendan@kublai.com>
parents:
4635
diff
changeset
|
304 |
else: |
12783
191d0fd5c2fd
hgweb: refactor all pyOpenSSL references into one class
Mads Kiilerich <mads@kiilerich.com>
parents:
12740
diff
changeset
|
305 |
handler = _httprequesthandler |
4860
f3802f9f1840
Add SSL support to hg serve, activated via --certificate option
Brendan Cully <brendan@kublai.com>
parents:
4635
diff
changeset
|
306 |
|
10644
63948e7d37f7
server: initialize wsgi app in command, then wrap server around it
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents:
10643
diff
changeset
|
307 |
if ui.configbool('web', 'ipv6'): |
10641
dedf88fe945a
server: abstract setup of ipv6 vs. normal server
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents:
10640
diff
changeset
|
308 |
cls = IPv6HTTPServer |
dedf88fe945a
server: abstract setup of ipv6 vs. normal server
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents:
10640
diff
changeset
|
309 |
else: |
dedf88fe945a
server: abstract setup of ipv6 vs. normal server
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents:
10640
diff
changeset
|
310 |
cls = MercurialHTTPServer |
dedf88fe945a
server: abstract setup of ipv6 vs. normal server
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents:
10640
diff
changeset
|
311 |
|
8224
1075f5c1b3fa
hgweb: pre-init mimetypes module (fixes ugly bug in python-2.6.2 mimetypes)
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7928
diff
changeset
|
312 |
# ugly hack due to python issue5853 (for threaded use) |
20357
6863d42eb59a
hgweb: hack around mimetypes encoding thinko (issue4160)
Matt Mackall <mpm@selenic.com>
parents:
19877
diff
changeset
|
313 |
try: |
6863d42eb59a
hgweb: hack around mimetypes encoding thinko (issue4160)
Matt Mackall <mpm@selenic.com>
parents:
19877
diff
changeset
|
314 |
import mimetypes |
6863d42eb59a
hgweb: hack around mimetypes encoding thinko (issue4160)
Matt Mackall <mpm@selenic.com>
parents:
19877
diff
changeset
|
315 |
mimetypes.init() |
6863d42eb59a
hgweb: hack around mimetypes encoding thinko (issue4160)
Matt Mackall <mpm@selenic.com>
parents:
19877
diff
changeset
|
316 |
except UnicodeDecodeError: |
6863d42eb59a
hgweb: hack around mimetypes encoding thinko (issue4160)
Matt Mackall <mpm@selenic.com>
parents:
19877
diff
changeset
|
317 |
# Python 2.x's mimetypes module attempts to decode strings |
6863d42eb59a
hgweb: hack around mimetypes encoding thinko (issue4160)
Matt Mackall <mpm@selenic.com>
parents:
19877
diff
changeset
|
318 |
# from Windows' ANSI APIs as ascii (fail), then re-encode them |
6863d42eb59a
hgweb: hack around mimetypes encoding thinko (issue4160)
Matt Mackall <mpm@selenic.com>
parents:
19877
diff
changeset
|
319 |
# as ascii (clown fail), because the default Python Unicode |
6863d42eb59a
hgweb: hack around mimetypes encoding thinko (issue4160)
Matt Mackall <mpm@selenic.com>
parents:
19877
diff
changeset
|
320 |
# codec is hardcoded as ascii. |
6863d42eb59a
hgweb: hack around mimetypes encoding thinko (issue4160)
Matt Mackall <mpm@selenic.com>
parents:
19877
diff
changeset
|
321 |
|
20529
ca970d6acedb
hgweb: make sure sys module is loaded prior to reload hack
Yuya Nishihara <yuya@tcha.org>
parents:
20357
diff
changeset
|
322 |
sys.argv # unwrap demand-loader so that reload() works |
20357
6863d42eb59a
hgweb: hack around mimetypes encoding thinko (issue4160)
Matt Mackall <mpm@selenic.com>
parents:
19877
diff
changeset
|
323 |
reload(sys) # resurrect sys.setdefaultencoding() |
6863d42eb59a
hgweb: hack around mimetypes encoding thinko (issue4160)
Matt Mackall <mpm@selenic.com>
parents:
19877
diff
changeset
|
324 |
oldenc = sys.getdefaultencoding() |
6863d42eb59a
hgweb: hack around mimetypes encoding thinko (issue4160)
Matt Mackall <mpm@selenic.com>
parents:
19877
diff
changeset
|
325 |
sys.setdefaultencoding("latin1") # or any full 8-bit encoding |
6863d42eb59a
hgweb: hack around mimetypes encoding thinko (issue4160)
Matt Mackall <mpm@selenic.com>
parents:
19877
diff
changeset
|
326 |
mimetypes.init() |
6863d42eb59a
hgweb: hack around mimetypes encoding thinko (issue4160)
Matt Mackall <mpm@selenic.com>
parents:
19877
diff
changeset
|
327 |
sys.setdefaultencoding(oldenc) |
8224
1075f5c1b3fa
hgweb: pre-init mimetypes module (fixes ugly bug in python-2.6.2 mimetypes)
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7928
diff
changeset
|
328 |
|
10644
63948e7d37f7
server: initialize wsgi app in command, then wrap server around it
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents:
10643
diff
changeset
|
329 |
address = ui.config('web', 'address', '') |
12076
49463314c24f
mail/hgweb: support service names for ports (issue2350)
Brodie Rao <brodie@bitheap.org>
parents:
10905
diff
changeset
|
330 |
port = util.getport(ui.config('web', 'port', 8000)) |
3628
dc3504af7722
hgweb: internalize some socket details
Matt Mackall <mpm@selenic.com>
parents:
3263
diff
changeset
|
331 |
try: |
10644
63948e7d37f7
server: initialize wsgi app in command, then wrap server around it
Dirkjan Ochtman <djc.ochtman@kentyde.com>
parents:
10643
diff
changeset
|
332 |
return cls(ui, app, (address, port), handler) |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23409
diff
changeset
|
333 |
except socket.error as inst: |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26202
diff
changeset
|
334 |
raise error.Abort(_("cannot start server at '%s:%d': %s") |
6262
de7256c82fad
hgweb: clarify which address and port can/cannot be bound at startup (bug 769)
Stephen Deasey <sdeasey@gmail.com>
parents:
6217
diff
changeset
|
335 |
% (address, port, inst.args[1])) |