request.py
62 lines
| 2.2 KiB
| text/x-python
|
PythonLexer
Eric Hopper
|
r2391 | # hgweb/request.py - An http request from either CGI or the standalone server. | ||
Eric Hopper
|
r2355 | # | ||
# Copyright 21 May 2005 - (c) 2005 Jake Edge <jake@edge2.net> | ||||
# Copyright 2005 Matt Mackall <mpm@selenic.com> | ||||
# | ||||
# This software may be used and distributed according to the terms | ||||
# of the GNU General Public License, incorporated herein by reference. | ||||
from mercurial.demandload import demandload | ||||
Benoit Boissinot
|
r2394 | demandload(globals(), "socket sys cgi os errno") | ||
Eric Hopper
|
r2355 | from mercurial.i18n import gettext as _ | ||
class hgrequest(object): | ||||
def __init__(self, inp=None, out=None, env=None): | ||||
self.inp = inp or sys.stdin | ||||
self.out = out or sys.stdout | ||||
self.env = env or os.environ | ||||
self.form = cgi.parse(self.inp, self.env, keep_blank_values=1) | ||||
Vadim Gelfer
|
r2434 | self.will_close = True | ||
Eric Hopper
|
r2355 | |||
Vadim Gelfer
|
r2464 | def read(self, count=-1): | ||
return self.inp.read(count) | ||||
Eric Hopper
|
r2355 | def write(self, *things): | ||
for thing in things: | ||||
if hasattr(thing, "__iter__"): | ||||
for part in thing: | ||||
self.write(part) | ||||
else: | ||||
try: | ||||
self.out.write(str(thing)) | ||||
except socket.error, inst: | ||||
if inst[0] != errno.ECONNRESET: | ||||
raise | ||||
Vadim Gelfer
|
r2434 | def done(self): | ||
if self.will_close: | ||||
self.inp.close() | ||||
self.out.close() | ||||
else: | ||||
self.out.flush() | ||||
Eric Hopper
|
r2355 | def header(self, headers=[('Content-type','text/html')]): | ||
for header in headers: | ||||
self.out.write("%s: %s\r\n" % header) | ||||
self.out.write("\r\n") | ||||
Vadim Gelfer
|
r2466 | def httphdr(self, type, filename=None, length=0, headers={}): | ||
headers = headers.items() | ||||
headers.append(('Content-type', type)) | ||||
Vadim Gelfer
|
r2434 | if filename: | ||
headers.append(('Content-disposition', 'attachment; filename=%s' % | ||||
filename)) | ||||
# we do not yet support http 1.1 chunked transfer, so we have | ||||
# to force connection to close if content-length not known | ||||
if length: | ||||
headers.append(('Content-length', str(length))) | ||||
self.will_close = False | ||||
else: | ||||
headers.append(('Connection', 'close')) | ||||
self.will_close = True | ||||
Eric Hopper
|
r2355 | self.header(headers) | ||