annotate mercurial/hgweb/server.py @ 33766:4c706037adef

wireproto: overhaul iterating batcher code (API) The remote batching code is difficult to read. Let's improve it. As part of the refactor, the future returned by method calls on batchiter() instances is now populated. However, you still need to consume the results() generator for the future to be set. But at least now we can stuff the future somewhere and not have to worry about aligning method call order with result order since you can use a future to hold the result. Also as part of the change, we now verify that @batchable generators yield exactly 2 values. In other words, we enforce their API. The non-iter batcher has been unused since b6e71f8af5b8. And to my surprise we had no explicit unit test coverage of it! test-batching.py has been overhauled to use the iterating batcher. Since the iterating batcher doesn't allow non-batchable method calls nor local calls, tests have been updated to reflect reality. The iterating batcher has been used for multiple releases apparently without major issue. So this shouldn't cause alarm. .. api:: @peer.batchable functions must now yield exactly 2 values Differential Revision: https://phab.mercurial-scm.org/D319
author Gregory Szorc <gregory.szorc@gmail.com>
date Wed, 09 Aug 2017 23:29:30 -0700
parents d524c88511a7
children ac96ff471c9a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
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
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
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
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
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
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 9037
diff changeset
7 # GNU General Public License version 2 or any later version.
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
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
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
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
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
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
7140bc781655 Add multiple keyword search to hgweb
mpm@selenic.com
parents: 536
diff changeset
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
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
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
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
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
d787d9ad67cc cosmetics
Brendan Cully <brendan@kublai.com>
parents: 4870
diff changeset
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
8865eb8ade99 Add globals to templater/fixup RSS
mpm@selenic.com
parents: 600
diff changeset
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
0e8d60d2bb2b added annotate
jake@edge2.net
parents: 135
diff changeset
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
54b2a42e501e hgweb: add [web] section to hgrc
mpm@selenic.com
parents: 937
diff changeset
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]))