예제 #1
0
    def parse_header(self, header_plus):
        """
        Parses the header_plus block of text (the headers plus the
        first line of the request).
        """
        index = header_plus.find(b'\n')
        if index >= 0:
            first_line = header_plus[:index].rstrip()
            header = header_plus[index + 1:]
        else:
            first_line = header_plus.rstrip()
            header = b''
        if PY3:
            first_line = first_line.decode('latin1')
            header = header.decode('latin1')
        self.first_line = first_line
        self.header = header

        lines = self.get_header_lines()
        headers = self.headers
        for line in lines:
            index = line.find(':')
            if index > 0:
                key = line[:index]
                value = line[index + 1:].strip()
                key1 = key.upper().replace('-', '_')
                # If a header already exists, we append subsequent values
                # seperated by a comma. Applications already need to handle
                # the comma seperated values, as HTTP front ends might do
                # the concatenation for you (behavior specified in RFC2616).
                try:
                    headers[key1] += ', %s' % value
                except KeyError:
                    headers[key1] = value
            # else there's garbage in the headers?

        assert isinstance(self.first_line, str)
        command, uri, version = self.crack_first_line()
        self.command = command or ''
        self.uri = uri or ''
        self.version = version
        self.split_uri()

        if version == '1.1':
            te = headers.get('TRANSFER_ENCODING', '')
            if te == 'chunked':
                from zope.server.http.chunking import ChunkedReceiver
                self.chunked = 1
                buf = OverflowableBuffer(self.adj.inbuf_overflow)
                self.body_rcv = ChunkedReceiver(buf)
        if not self.chunked:
            try:
                cl = int(headers.get('CONTENT_LENGTH', 0))
            except ValueError:
                cl = 0
            self.content_length = cl
            if cl > 0:
                buf = OverflowableBuffer(self.adj.inbuf_overflow)
                self.body_rcv = FixedStreamReceiver(cl, buf)
예제 #2
0
 def __init__(self, conn, addr, adj=None):
     self.addr = addr
     if adj is None:
         adj = default_adj
     self.adj = adj
     self.outbuf = OverflowableBuffer(adj.outbuf_overflow)
     self.creation_time = time()
     asyncore.dispatcher.__init__(self, conn)
예제 #3
0
 def __init__(self, control_channel, finish_args):
     self.finish_args = finish_args
     self.inbuf = OverflowableBuffer(control_channel.adj.inbuf_overflow)
     FTPDataChannel.__init__(self, control_channel)