##// END OF EJS Templates
hgweb: revert to showing file instead of offering for download
Dirkjan Ochtman -
r5927:b06c56f8 default
parent child Browse files
Show More
@@ -1,102 +1,102 b''
1 # hgweb/request.py - An http request from either CGI or the standalone server.
1 # hgweb/request.py - An http request from either CGI or the standalone server.
2 #
2 #
3 # Copyright 21 May 2005 - (c) 2005 Jake Edge <jake@edge2.net>
3 # Copyright 21 May 2005 - (c) 2005 Jake Edge <jake@edge2.net>
4 # Copyright 2005, 2006 Matt Mackall <mpm@selenic.com>
4 # Copyright 2005, 2006 Matt Mackall <mpm@selenic.com>
5 #
5 #
6 # This software may be used and distributed according to the terms
6 # This software may be used and distributed according to the terms
7 # of the GNU General Public License, incorporated herein by reference.
7 # of the GNU General Public License, incorporated herein by reference.
8
8
9 import socket, cgi, errno
9 import socket, cgi, errno
10 from mercurial.i18n import gettext as _
10 from mercurial.i18n import gettext as _
11 from common import ErrorResponse, statusmessage
11 from common import ErrorResponse, statusmessage
12
12
13 class wsgirequest(object):
13 class wsgirequest(object):
14 def __init__(self, wsgienv, start_response):
14 def __init__(self, wsgienv, start_response):
15 version = wsgienv['wsgi.version']
15 version = wsgienv['wsgi.version']
16 if (version < (1, 0)) or (version >= (2, 0)):
16 if (version < (1, 0)) or (version >= (2, 0)):
17 raise RuntimeError("Unknown and unsupported WSGI version %d.%d"
17 raise RuntimeError("Unknown and unsupported WSGI version %d.%d"
18 % version)
18 % version)
19 self.inp = wsgienv['wsgi.input']
19 self.inp = wsgienv['wsgi.input']
20 self.server_write = None
20 self.server_write = None
21 self.err = wsgienv['wsgi.errors']
21 self.err = wsgienv['wsgi.errors']
22 self.threaded = wsgienv['wsgi.multithread']
22 self.threaded = wsgienv['wsgi.multithread']
23 self.multiprocess = wsgienv['wsgi.multiprocess']
23 self.multiprocess = wsgienv['wsgi.multiprocess']
24 self.run_once = wsgienv['wsgi.run_once']
24 self.run_once = wsgienv['wsgi.run_once']
25 self.env = wsgienv
25 self.env = wsgienv
26 self.form = cgi.parse(self.inp, self.env, keep_blank_values=1)
26 self.form = cgi.parse(self.inp, self.env, keep_blank_values=1)
27 self._start_response = start_response
27 self._start_response = start_response
28 self.headers = []
28 self.headers = []
29
29
30 def __iter__(self):
30 def __iter__(self):
31 return iter([])
31 return iter([])
32
32
33 def read(self, count=-1):
33 def read(self, count=-1):
34 return self.inp.read(count)
34 return self.inp.read(count)
35
35
36 def start_response(self, status):
36 def start_response(self, status):
37 if self._start_response is not None:
37 if self._start_response is not None:
38 if not self.headers:
38 if not self.headers:
39 raise RuntimeError("request.write called before headers sent")
39 raise RuntimeError("request.write called before headers sent")
40
40
41 for k, v in self.headers:
41 for k, v in self.headers:
42 if not isinstance(v, str):
42 if not isinstance(v, str):
43 raise TypeError('header value must be string: %r' % v)
43 raise TypeError('header value must be string: %r' % v)
44
44
45 if isinstance(status, ErrorResponse):
45 if isinstance(status, ErrorResponse):
46 status = statusmessage(status.code)
46 status = statusmessage(status.code)
47 elif isinstance(status, int):
47 elif isinstance(status, int):
48 status = statusmessage(status)
48 status = statusmessage(status)
49
49
50 self.server_write = self._start_response(status, self.headers)
50 self.server_write = self._start_response(status, self.headers)
51 self._start_response = None
51 self._start_response = None
52 self.headers = []
52 self.headers = []
53
53
54 def respond(self, status, *things):
54 def respond(self, status, *things):
55 if not things:
55 if not things:
56 self.start_response(status)
56 self.start_response(status)
57 for thing in things:
57 for thing in things:
58 if hasattr(thing, "__iter__"):
58 if hasattr(thing, "__iter__"):
59 for part in thing:
59 for part in thing:
60 self.respond(status, part)
60 self.respond(status, part)
61 else:
61 else:
62 thing = str(thing)
62 thing = str(thing)
63 self.start_response(status)
63 self.start_response(status)
64 try:
64 try:
65 self.server_write(thing)
65 self.server_write(thing)
66 except socket.error, inst:
66 except socket.error, inst:
67 if inst[0] != errno.ECONNRESET:
67 if inst[0] != errno.ECONNRESET:
68 raise
68 raise
69
69
70 def write(self, *things):
70 def write(self, *things):
71 self.respond('200 Script output follows', *things)
71 self.respond('200 Script output follows', *things)
72
72
73 def writelines(self, lines):
73 def writelines(self, lines):
74 for line in lines:
74 for line in lines:
75 self.write(line)
75 self.write(line)
76
76
77 def flush(self):
77 def flush(self):
78 return None
78 return None
79
79
80 def close(self):
80 def close(self):
81 return None
81 return None
82
82
83 def header(self, headers=[('Content-type','text/html')]):
83 def header(self, headers=[('Content-type','text/html')]):
84 self.headers.extend(headers)
84 self.headers.extend(headers)
85
85
86 def httphdr(self, type, filename=None, length=0, headers={}):
86 def httphdr(self, type, filename=None, length=0, headers={}):
87 headers = headers.items()
87 headers = headers.items()
88 headers.append(('Content-type', type))
88 headers.append(('Content-type', type))
89 if filename:
89 if filename:
90 headers.append(('Content-disposition', 'attachment; filename=%s' %
90 headers.append(('Content-disposition', 'inline; filename=%s' %
91 filename))
91 filename))
92 if length:
92 if length:
93 headers.append(('Content-length', str(length)))
93 headers.append(('Content-length', str(length)))
94 self.header(headers)
94 self.header(headers)
95
95
96 def wsgiapplication(app_maker):
96 def wsgiapplication(app_maker):
97 '''For compatibility with old CGI scripts. A plain hgweb() or hgwebdir()
97 '''For compatibility with old CGI scripts. A plain hgweb() or hgwebdir()
98 can and should now be used as a WSGI application.'''
98 can and should now be used as a WSGI application.'''
99 application = app_maker()
99 application = app_maker()
100 def run_wsgi(env, respond):
100 def run_wsgi(env, respond):
101 return application(env, respond)
101 return application(env, respond)
102 return run_wsgi
102 return run_wsgi
@@ -1,10 +1,10 b''
1 200 Script output follows
1 200 Script output follows
2 content-type: text/plain
2 content-type: text/plain
3 content-length: 157
3 content-length: 157
4 content-disposition: attachment; filename=sometext.txt
4 content-disposition: inline; filename=sometext.txt
5
5
6 This is just some random text
6 This is just some random text
7 that will go inside the file and take a few lines.
7 that will go inside the file and take a few lines.
8 It is very boring to read, but computers don't
8 It is very boring to read, but computers don't
9 care about things like that.
9 care about things like that.
10 host - - [date] "GET /?f=f165dc289438;file=sometext.txt;style=raw HTTP/1.1" 200 -
10 host - - [date] "GET /?f=f165dc289438;file=sometext.txt;style=raw HTTP/1.1" 200 -
General Comments 0
You need to be logged in to leave comments. Login now