示例#1
0
 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)
示例#2
0
    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()
示例#3
0
 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
示例#4
0
 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
示例#5
0
 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
示例#6
0
文件: server.py 项目: amol-/vhostino
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