Mercurial > public > mercurial-scm > hg-stable
annotate mercurial/hgweb/request.py @ 5930:c301f15c965a
send conservatively capitalized HTTP headers
author | Dirkjan Ochtman <dirkjan@ochtman.nl> |
---|---|
date | Wed, 23 Jan 2008 14:28:25 +0100 |
parents | b06c56f8fab7 |
children | 948a41e77902 |
rev | line source |
---|---|
2391
d351a3be3371
Fixing up comment headers for split up code.
Eric Hopper <hopper@omnifarious.org>
parents:
2355
diff
changeset
|
1 # hgweb/request.py - An http request from either CGI or the standalone 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> |
2859 | 4 # Copyright 2005, 2006 Matt Mackall <mpm@selenic.com> |
131 | 5 # |
6 # This software may be used and distributed according to the terms | |
7 # of the GNU General Public License, incorporated herein by reference. | |
8 | |
3963
ba45041827a2
remove various unused import
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3877
diff
changeset
|
9 import socket, cgi, errno |
2311
b832b6eb65ab
Moving hgweb.py into it's own module in preparation for breaking it up.
Eric Hopper <hopper@omnifarious.org>
parents:
2275
diff
changeset
|
10 from mercurial.i18n import gettext as _ |
5563
d61fea133f2d
hgweb: fix breaking tests on Python < 2.5
Bryan O'Sullivan <bos@serpentine.com>
parents:
5561
diff
changeset
|
11 from common import ErrorResponse, statusmessage |
138 | 12 |
5566
d74fc8dec2b4
Less indirection in the WSGI web interface. This simplifies some code, and makes it more compliant with WSGI.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5563
diff
changeset
|
13 class wsgirequest(object): |
d74fc8dec2b4
Less indirection in the WSGI web interface. This simplifies some code, and makes it more compliant with WSGI.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5563
diff
changeset
|
14 def __init__(self, wsgienv, start_response): |
2506
d0db3462d568
This patch make several WSGI related alterations.
Eric Hopper <hopper@omnifarious.org>
parents:
2466
diff
changeset
|
15 version = wsgienv['wsgi.version'] |
3673
eb0b4a2d70a9
white space and line break cleanups
Thomas Arendsen Hein <thomas@intevation.de>
parents:
2859
diff
changeset
|
16 if (version < (1, 0)) or (version >= (2, 0)): |
4633
ff7253a0d1da
Cleanup of whitespace, indentation and line continuation.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4250
diff
changeset
|
17 raise RuntimeError("Unknown and unsupported WSGI version %d.%d" |
2506
d0db3462d568
This patch make several WSGI related alterations.
Eric Hopper <hopper@omnifarious.org>
parents:
2466
diff
changeset
|
18 % version) |
d0db3462d568
This patch make several WSGI related alterations.
Eric Hopper <hopper@omnifarious.org>
parents:
2466
diff
changeset
|
19 self.inp = wsgienv['wsgi.input'] |
d0db3462d568
This patch make several WSGI related alterations.
Eric Hopper <hopper@omnifarious.org>
parents:
2466
diff
changeset
|
20 self.server_write = None |
d0db3462d568
This patch make several WSGI related alterations.
Eric Hopper <hopper@omnifarious.org>
parents:
2466
diff
changeset
|
21 self.err = wsgienv['wsgi.errors'] |
d0db3462d568
This patch make several WSGI related alterations.
Eric Hopper <hopper@omnifarious.org>
parents:
2466
diff
changeset
|
22 self.threaded = wsgienv['wsgi.multithread'] |
d0db3462d568
This patch make several WSGI related alterations.
Eric Hopper <hopper@omnifarious.org>
parents:
2466
diff
changeset
|
23 self.multiprocess = wsgienv['wsgi.multiprocess'] |
d0db3462d568
This patch make several WSGI related alterations.
Eric Hopper <hopper@omnifarious.org>
parents:
2466
diff
changeset
|
24 self.run_once = wsgienv['wsgi.run_once'] |
d0db3462d568
This patch make several WSGI related alterations.
Eric Hopper <hopper@omnifarious.org>
parents:
2466
diff
changeset
|
25 self.env = wsgienv |
1407
db571bcaa35d
allow empty values for url so we can have /?tip
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1406
diff
changeset
|
26 self.form = cgi.parse(self.inp, self.env, keep_blank_values=1) |
5888
956afc025c0f
hgweb: separate out start_response() calling
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5887
diff
changeset
|
27 self._start_response = start_response |
2506
d0db3462d568
This patch make several WSGI related alterations.
Eric Hopper <hopper@omnifarious.org>
parents:
2466
diff
changeset
|
28 self.headers = [] |
d0db3462d568
This patch make several WSGI related alterations.
Eric Hopper <hopper@omnifarious.org>
parents:
2466
diff
changeset
|
29 |
d0db3462d568
This patch make several WSGI related alterations.
Eric Hopper <hopper@omnifarious.org>
parents:
2466
diff
changeset
|
30 def __iter__(self): |
d0db3462d568
This patch make several WSGI related alterations.
Eric Hopper <hopper@omnifarious.org>
parents:
2466
diff
changeset
|
31 return iter([]) |
131 | 32 |
2464
09b1c9ef317c
push over http: server support.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2434
diff
changeset
|
33 def read(self, count=-1): |
09b1c9ef317c
push over http: server support.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2434
diff
changeset
|
34 return self.inp.read(count) |
09b1c9ef317c
push over http: server support.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2434
diff
changeset
|
35 |
5888
956afc025c0f
hgweb: separate out start_response() calling
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5887
diff
changeset
|
36 def start_response(self, status): |
956afc025c0f
hgweb: separate out start_response() calling
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5887
diff
changeset
|
37 if self._start_response is not None: |
956afc025c0f
hgweb: separate out start_response() calling
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5887
diff
changeset
|
38 if not self.headers: |
5922
df7f66f290b9
hgweb: cleanup buglet introduced in 956afc025c0f
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5888
diff
changeset
|
39 raise RuntimeError("request.write called before headers sent") |
5888
956afc025c0f
hgweb: separate out start_response() calling
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5887
diff
changeset
|
40 |
5926
15ef6b9c1f2f
hgweb: be sure to send a valid content-type for raw files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5922
diff
changeset
|
41 for k, v in self.headers: |
15ef6b9c1f2f
hgweb: be sure to send a valid content-type for raw files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5922
diff
changeset
|
42 if not isinstance(v, str): |
15ef6b9c1f2f
hgweb: be sure to send a valid content-type for raw files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5922
diff
changeset
|
43 raise TypeError('header value must be string: %r' % v) |
15ef6b9c1f2f
hgweb: be sure to send a valid content-type for raw files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5922
diff
changeset
|
44 |
5888
956afc025c0f
hgweb: separate out start_response() calling
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5887
diff
changeset
|
45 if isinstance(status, ErrorResponse): |
956afc025c0f
hgweb: separate out start_response() calling
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5887
diff
changeset
|
46 status = statusmessage(status.code) |
956afc025c0f
hgweb: separate out start_response() calling
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5887
diff
changeset
|
47 elif isinstance(status, int): |
956afc025c0f
hgweb: separate out start_response() calling
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5887
diff
changeset
|
48 status = statusmessage(status) |
956afc025c0f
hgweb: separate out start_response() calling
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5887
diff
changeset
|
49 |
956afc025c0f
hgweb: separate out start_response() calling
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5887
diff
changeset
|
50 self.server_write = self._start_response(status, self.headers) |
956afc025c0f
hgweb: separate out start_response() calling
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5887
diff
changeset
|
51 self._start_response = None |
956afc025c0f
hgweb: separate out start_response() calling
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5887
diff
changeset
|
52 self.headers = [] |
956afc025c0f
hgweb: separate out start_response() calling
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5887
diff
changeset
|
53 |
5561
22713dce19f6
hgweb: return meaningful HTTP status codes instead of nonsense
Bryan O'Sullivan <bos@serpentine.com>
parents:
4633
diff
changeset
|
54 def respond(self, status, *things): |
5888
956afc025c0f
hgweb: separate out start_response() calling
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5887
diff
changeset
|
55 if not things: |
956afc025c0f
hgweb: separate out start_response() calling
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5887
diff
changeset
|
56 self.start_response(status) |
1159
b6f5a947e62e
Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents:
1143
diff
changeset
|
57 for thing in things: |
b6f5a947e62e
Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents:
1143
diff
changeset
|
58 if hasattr(thing, "__iter__"): |
b6f5a947e62e
Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents:
1143
diff
changeset
|
59 for part in thing: |
5561
22713dce19f6
hgweb: return meaningful HTTP status codes instead of nonsense
Bryan O'Sullivan <bos@serpentine.com>
parents:
4633
diff
changeset
|
60 self.respond(status, part) |
1159
b6f5a947e62e
Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents:
1143
diff
changeset
|
61 else: |
2514
419c42223bee
Really fix http headers for web UI and issue 254.
Eric Hopper <hopper@omnifarious.org>
parents:
2507
diff
changeset
|
62 thing = str(thing) |
5888
956afc025c0f
hgweb: separate out start_response() calling
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5887
diff
changeset
|
63 self.start_response(status) |
1159
b6f5a947e62e
Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents:
1143
diff
changeset
|
64 try: |
2514
419c42223bee
Really fix http headers for web UI and issue 254.
Eric Hopper <hopper@omnifarious.org>
parents:
2507
diff
changeset
|
65 self.server_write(thing) |
1174
9d9f4973c76a
Added missing 'import errno', and use errno for EPIPE, too.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1172
diff
changeset
|
66 except socket.error, inst: |
9d9f4973c76a
Added missing 'import errno', and use errno for EPIPE, too.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
1172
diff
changeset
|
67 if inst[0] != errno.ECONNRESET: |
1159
b6f5a947e62e
Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents:
1143
diff
changeset
|
68 raise |
5760
0145f9afb0e7
Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents:
5566
diff
changeset
|
69 |
5561
22713dce19f6
hgweb: return meaningful HTTP status codes instead of nonsense
Bryan O'Sullivan <bos@serpentine.com>
parents:
4633
diff
changeset
|
70 def write(self, *things): |
22713dce19f6
hgweb: return meaningful HTTP status codes instead of nonsense
Bryan O'Sullivan <bos@serpentine.com>
parents:
4633
diff
changeset
|
71 self.respond('200 Script output follows', *things) |
1159
b6f5a947e62e
Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents:
1143
diff
changeset
|
72 |
4246
cc81c512a531
avoid _wsgioutputfile <-> _wsgirequest circular reference
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3673
diff
changeset
|
73 def writelines(self, lines): |
cc81c512a531
avoid _wsgioutputfile <-> _wsgirequest circular reference
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3673
diff
changeset
|
74 for line in lines: |
cc81c512a531
avoid _wsgioutputfile <-> _wsgirequest circular reference
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3673
diff
changeset
|
75 self.write(line) |
cc81c512a531
avoid _wsgioutputfile <-> _wsgirequest circular reference
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3673
diff
changeset
|
76 |
cc81c512a531
avoid _wsgioutputfile <-> _wsgirequest circular reference
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3673
diff
changeset
|
77 def flush(self): |
cc81c512a531
avoid _wsgioutputfile <-> _wsgirequest circular reference
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3673
diff
changeset
|
78 return None |
cc81c512a531
avoid _wsgioutputfile <-> _wsgirequest circular reference
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3673
diff
changeset
|
79 |
cc81c512a531
avoid _wsgioutputfile <-> _wsgirequest circular reference
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3673
diff
changeset
|
80 def close(self): |
cc81c512a531
avoid _wsgioutputfile <-> _wsgirequest circular reference
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3673
diff
changeset
|
81 return None |
cc81c512a531
avoid _wsgioutputfile <-> _wsgirequest circular reference
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3673
diff
changeset
|
82 |
5930
c301f15c965a
send conservatively capitalized HTTP headers
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5927
diff
changeset
|
83 def header(self, headers=[('Content-Type','text/html')]): |
2506
d0db3462d568
This patch make several WSGI related alterations.
Eric Hopper <hopper@omnifarious.org>
parents:
2466
diff
changeset
|
84 self.headers.extend(headers) |
1159
b6f5a947e62e
Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents:
1143
diff
changeset
|
85 |
2466
e10665147d26
push over http: server side authorization support.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2464
diff
changeset
|
86 def httphdr(self, type, filename=None, length=0, headers={}): |
e10665147d26
push over http: server side authorization support.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2464
diff
changeset
|
87 headers = headers.items() |
5930
c301f15c965a
send conservatively capitalized HTTP headers
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5927
diff
changeset
|
88 headers.append(('Content-Type', type)) |
2434
a2df85adface
http server: support persistent connections.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2394
diff
changeset
|
89 if filename: |
5930
c301f15c965a
send conservatively capitalized HTTP headers
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5927
diff
changeset
|
90 headers.append(('Content-Disposition', 'inline; filename=%s' % |
2434
a2df85adface
http server: support persistent connections.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2394
diff
changeset
|
91 filename)) |
a2df85adface
http server: support persistent connections.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2394
diff
changeset
|
92 if length: |
5930
c301f15c965a
send conservatively capitalized HTTP headers
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5927
diff
changeset
|
93 headers.append(('Content-Length', str(length))) |
1159
b6f5a947e62e
Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents:
1143
diff
changeset
|
94 self.header(headers) |
5566
d74fc8dec2b4
Less indirection in the WSGI web interface. This simplifies some code, and makes it more compliant with WSGI.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5563
diff
changeset
|
95 |
d74fc8dec2b4
Less indirection in the WSGI web interface. This simplifies some code, and makes it more compliant with WSGI.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5563
diff
changeset
|
96 def wsgiapplication(app_maker): |
5887
41a3fce17625
hgweb: return iterable, add deprecation note
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5886
diff
changeset
|
97 '''For compatibility with old CGI scripts. A plain hgweb() or hgwebdir() |
41a3fce17625
hgweb: return iterable, add deprecation note
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5886
diff
changeset
|
98 can and should now be used as a WSGI application.''' |
5760
0145f9afb0e7
Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents:
5566
diff
changeset
|
99 application = app_maker() |
0145f9afb0e7
Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents:
5566
diff
changeset
|
100 def run_wsgi(env, respond): |
5887
41a3fce17625
hgweb: return iterable, add deprecation note
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
5886
diff
changeset
|
101 return application(env, respond) |
5760
0145f9afb0e7
Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents:
5566
diff
changeset
|
102 return run_wsgi |