mercurial/hgweb/request.py
changeset 5561 22713dce19f6
parent 4633 ff7253a0d1da
child 5563 d61fea133f2d
equal deleted inserted replaced
5560:e78c24011001 5561:22713dce19f6
     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
    11 
    12 
    12 class wsgiapplication(object):
    13 class wsgiapplication(object):
    13     def __init__(self, destmaker):
    14     def __init__(self, destmaker):
    14         self.destmaker = destmaker
    15         self.destmaker = destmaker
    15 
    16 
    40         return iter([])
    41         return iter([])
    41 
    42 
    42     def read(self, count=-1):
    43     def read(self, count=-1):
    43         return self.inp.read(count)
    44         return self.inp.read(count)
    44 
    45 
    45     def write(self, *things):
    46     def respond(self, status, *things):
    46         for thing in things:
    47         for thing in things:
    47             if hasattr(thing, "__iter__"):
    48             if hasattr(thing, "__iter__"):
    48                 for part in thing:
    49                 for part in thing:
    49                     self.write(part)
    50                     self.respond(status, part)
    50             else:
    51             else:
    51                 thing = str(thing)
    52                 thing = str(thing)
    52                 if self.server_write is None:
    53                 if self.server_write is None:
    53                     if not self.headers:
    54                     if not self.headers:
    54                         raise RuntimeError("request.write called before headers sent (%s)." % thing)
    55                         raise RuntimeError("request.write called before headers sent (%s)." % thing)
    55                     self.server_write = self.start_response('200 Script output follows',
    56                     code = None
       
    57                     if isinstance(status, ErrorResponse):
       
    58                         code = status.code
       
    59                     elif isinstance(status, int):
       
    60                         code = status
       
    61                     if code:
       
    62                         from httplib import responses
       
    63                         status = '%d %s' % (
       
    64                             code, responses.get(code, 'Error'))
       
    65                     self.server_write = self.start_response(status,
    56                                                             self.headers)
    66                                                             self.headers)
    57                     self.start_response = None
    67                     self.start_response = None
    58                     self.headers = None
    68                     self.headers = []
    59                 try:
    69                 try:
    60                     self.server_write(thing)
    70                     self.server_write(thing)
    61                 except socket.error, inst:
    71                 except socket.error, inst:
    62                     if inst[0] != errno.ECONNRESET:
    72                     if inst[0] != errno.ECONNRESET:
    63                         raise
    73                         raise
       
    74         
       
    75     def write(self, *things):
       
    76         self.respond('200 Script output follows', *things)
    64 
    77 
    65     def writelines(self, lines):
    78     def writelines(self, lines):
    66         for line in lines:
    79         for line in lines:
    67             self.write(line)
    80             self.write(line)
    68 
    81