def set_receiver(self): """Once the headers have been read, decide how to read the body. We use the standard library's email package to parse the headers. The receiver is stored on self so it persists across calls to our own self.received, since it actually holds data between such calls. Later on we will add the request body to self.message. """ content_length = int(self.headers.get('Content-Length', 0)) transfer_encoding = self.headers.get('Transfer-Encoding', '').lower() if not content_length and not transfer_encoding: self._receiver = None elif content_length and not transfer_encoding: buffer_ = OverflowableBuffer(self.adj.inbuf_overflow) self._receiver = FixedStreamReceiver(content_length, buffer_) elif transfer_encoding == 'chunked': buffer_ = OverflowableBuffer(self.adj.inbuf_overflow) self._receiver = ChunkedReceiver(buffer_) else: self._receiver = None
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('\n') if index >= 0: first_line = header_plus[:index].rstrip() header = header_plus[index + 1:] else: first_line = header_plus.rstrip() header = '' 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? command, uri, version = self.crack_first_line() self.command = str(command) self.uri = str(uri) self.version = version self.split_uri() if version == '1.1': te = headers.get('TRANSFER_ENCODING', '') if te == 'chunked': from httpy._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)
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)