def parse_body(self, file, boundary): total_bytes = 0 # total bytes read from 'file' done = 0 while not done: headers = Message(file) cdisp = headers.get('content-disposition') if not cdisp: raise RequestError("expected Content-Disposition header " "in body sub-part") (name, filename) = self.parse_content_disposition(cdisp) if filename: content_type = headers.get('content-type') done = self.handle_upload(name, filename, file, boundary, content_type) else: done = self.handle_regular_var(name, file, boundary)
def get_client_data(self, request): buflen = 8072 rfile = StringIO() # get header buf = request.recv(buflen) rfile.write(buf) rfile.seek(0) headers = Message(rfile,1) rfile.seek(0, os.SEEK_END) if headers.get('content_length'): clen = int(headers.get('content_length')) buf = request.recv(clen) rfile.write(buf) return rfile.getvalue()
def parse(self): f = open(self.filename, 'r') headers = Message(f) c = f.read() f.close() if not c.strip(): c = headers.get_payload() if not headers.keys(): raise Exception("File %s has no headers" % self.filename) self.description = headers['Description'] self.expect = headers.get('Expect', '') self.ignore = headers.get('Ignore') self.options = [ o.strip() for o in headers.get('Options', '').split(',') if o.strip() ] parts = bar_re.split(c) self.input = parts[0].rstrip() + '\n' if parts[1:]: self.expect = parts[1].rstrip() + '\n' else: self.expect = None
def parse(self): f = open(self.filename, "r") headers = Message(f) c = f.read() f.close() if not c.strip(): c = headers.get_payload() if not headers.keys(): raise Exception("File %s has no headers" % self.filename) self.description = headers["Description"] self.expect = headers.get("Expect", "") self.ignore = headers.get("Ignore") self.options = [ o.strip() for o in headers.get("Options", "").split(",") if o.strip() ] parts = bar_re.split(c) self.input = parts[0].rstrip() + "\n" if parts[1:]: self.expect = parts[1].rstrip() + "\n" else: self.expect = None
def parse(self): f = open(self.filename, 'r') headers = Message(f) c = f.read() f.close() if not c.strip(): c = headers.get_payload() if not headers.keys(): raise Exception( "File %s has no headers" % self.filename) self.description = headers['Description'] self.expect = headers.get('Expect', '') self.ignore = headers.get('Ignore') self.options = [ o.strip() for o in headers.get('Options', '').split(',') if o.strip()] parts = bar_re.split(c) self.input = parts[0].rstrip() + '\n' if parts[1:]: self.expect = parts[1].rstrip() + '\n' else: self.expect = None
class RequestRouter(object): MAX_REQUEST_LINE = 8192 REQUEST_TOO_LONG_RESPONSE = "HTTP/1.0 414 Request URI Too Long\r\nConnection: close\r\nContent-length: 0\r\n\r\n" BAD_REQUEST_RESPONSE = "HTTP/1.0 400 Bad Request\r\nConnection: close\r\nContent-length: 0\r\n\r\n" NOT_FOUND_RESPONSE = "HTTP/1.1 404 Not Found\r\n\r\n" def __init__(self, config, socket): self.config = config self.socket = gevent.socket.socket(_sock=socket) self.rfile = self.socket.makefile('rb', -1) self.message = None def close(self): self.rfile.close() self.socket.close() if self.message is not None: self.message.fp.close() def handle(self): try: raw_requestline = self.rfile.readline(self.MAX_REQUEST_LINE) except SocketError: # "Connection reset by peer" or other socket errors aren't interesting here return False if not raw_requestline: return False if len(raw_requestline) >= self.MAX_REQUEST_LINE: self.socket.sendall(self.REQUEST_TOO_LONG_RESPONSE) return False if not self._request_check(raw_requestline): self.socket.sendall(self.BAD_REQUEST_RESPONSE) return False # TODO: move self.rfile to FileObjectThread when available, otherwise is blocking self.message = Message(self.rfile, 0) host = self.message.get('Host', '') if ':' in host: host, port = host.split(':', 1) host = host.strip() proxy_to = self.config.get_vhost(host) if not proxy_to: self.socket.sendall(self.NOT_FOUND_RESPONSE) self.message.fp.close() return False ProxyStream(raw_requestline, self.message, self.socket, proxy_to).start() def _request_check(self, reqline): try: command, path, version = reqline.split() if version.strip() not in ('HTTP/1.0', 'HTTP/1.1'): return False return True except: return False