Ejemplo n.º 1
0
    def get_response(self, request, connection):
        """ return final respons, it is only accessible via peform
        method """
        if log.isEnabledFor(logging.DEBUG):
            log.debug("Start to parse response")

        p = HttpStream(SocketReader(connection.socket()), kind=1,
                decompress=self.decompress)

        if log.isEnabledFor(logging.DEBUG):
            log.debug("Got response: %s %s" % (p.version(), p.status()))
            log.debug("headers: [%s]" % p.headers())

        location = p.headers().get('location')

        if self.follow_redirect:
            should_close = not p.should_keep_alive()
            if p.status_code() in (301, 302, 307,):

                # read full body and release the connection
                p.body_file().read()
                connection.release(should_close)

                if request.method in ('GET', 'HEAD',) or \
                        self.force_follow_redirect:
                    if hasattr(self.body, 'read'):
                        try:
                            self.body.seek(0)
                        except AttributeError:
                            raise RequestError("Can't redirect %s to %s "
                                    "because body has already been read"
                                    % (self.url, location))
                    return self.redirect(location, request)

            elif p.status_code() == 303 and self.method == "POST":
                # read full body and release the connection
                p.body_file().read()
                connection.release(should_close)

                request.method = "GET"
                request.body = None
                return self.redirect(location, request)

        # create response object
        resp = self.response_class(connection, request, p)

        # apply response filters
        for f in self.response_filters:
            f.on_response(resp, request)

        if log.isEnabledFor(logging.DEBUG):
            log.debug("return response class")

        # return final response
        return resp
Ejemplo n.º 2
0
    def get_response(self, request, connection):
        """ return final respons, it is only accessible via peform
        method """
        if log.isEnabledFor(logging.DEBUG):
            log.debug("Start to parse response")

        p = HttpStream(SocketReader(connection.socket()), kind=1,
                decompress=self.decompress)

        if log.isEnabledFor(logging.DEBUG):
            log.debug("Got response: %s %s" % (p.version(), p.status()))
            log.debug("headers: [%s]" % p.headers())

        location = p.headers().get('location')

        if self.follow_redirect:
            should_close = not p.should_keep_alive()
            if p.status_code() in (301, 302, 307,):

                # read full body and release the connection
                p.body_file().read()
                connection.release(should_close)

                if request.method in ('GET', 'HEAD',) or \
                        self.force_follow_redirect:
                    if hasattr(self.body, 'read'):
                        try:
                            self.body.seek(0)
                        except AttributeError:
                            raise RequestError("Can't redirect %s to %s "
                                    "because body has already been read"
                                    % (self.url, location))
                    return self.redirect(location, request)

            elif p.status_code() == 303 and self.method == "POST":
                # read full body and release the connection
                p.body_file().read()
                connection.release(should_close)

                request.method = "GET"
                request.body = None
                return self.redirect(location, request)

        # create response object
        resp = self.response_class(connection, request, p)

        # apply response filters
        for f in self.response_filters:
            f.on_response(resp, request)

        if log.isEnabledFor(logging.DEBUG):
            log.debug("return response class")

        # return final response
        return resp
Ejemplo n.º 3
0
    def get_response(self, request, connection):
        """ return final respons, it is only accessible via peform
        method """
        if log.isEnabledFor(logging.DEBUG):
            log.debug("Start to parse response")

        p = HttpStream(SocketReader(connection.socket()), kind=1, decompress=self.decompress)

        if log.isEnabledFor(logging.DEBUG):
            log.debug("Got response: %s" % p.status())
            log.debug("headers: [%s]" % p.headers())

        location = p.headers().get("location")

        if self.follow_redirect:
            if p.status_code() in (301, 302, 307):
                if request.method in ("GET", "HEAD") or self.force_follow_redirect:
                    if hasattr(self.body, "read"):
                        try:
                            self.body.seek(0)
                        except AttributeError:
                            connection.release()
                            raise RequestError(
                                "Can't redirect %s to %s " "because body has already been read" % (self.url, location)
                            )
                    connection.release()
                    return self.redirect(p, location, request)

            elif p.status_code() == 303 and self.method == "POST":
                connection.release()
                request.method = "GET"
                request.body = None
                return self.redirect(p, location, request)

        # create response object
        resp = self.response_class(connection, request, p)

        # apply response filters
        for f in self.response_filters:
            f.on_response(resp, request)

        if log.isEnabledFor(logging.DEBUG):
            log.debug("return response class")

        # return final response
        return resp
Ejemplo n.º 4
0
    def handle(self):
        self.logger = logging.getLogger("proxy")
        self.session = Session()
        try:
            request = HttpStream(SocketReader(self.request))
            _ = request.status()
        except http_parser.http.BadStatusLine:
            return

        self.logger.warning(request.path())

        if 'CONNECT' == request.method():
            self.https_proxy(request)
        else:
            self.http_proxy(request)

        self.session.close()
Ejemplo n.º 5
0
    def send(self, protocol ,host, header):
        h = Http()
        h.build_header()
        data = header
        str_response_body=""
        str_response_header=""

        if protocol == "http":
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            s.connect((host,80))
            s.send(data.encode('utf-8'))
            """
            response = b""
            while True:
                d = client.recv(1024)
                response = response + d
                if not d:
                    break
            #print(response)
            """
            p = HttpStream(SocketReader(s))

        elif protocol == "https":
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            s.connect((host, 443))
            s = ssl.wrap_socket(s, keyfile=None, certfile=None, server_side=False, cert_reqs=ssl.CERT_NONE, ssl_version=ssl.PROTOCOL_SSLv23)
            s.sendall(data.encode('utf-8'))
            """
            response = b""
            while True:
                d = s.recv(4096)
                response = response + d
                if not d:
                    break
            """
            p = HttpStream(SocketReader(s))
        #return html.escape(str(response, errors='replace'))
        # Transfer-Encoding: chunked の対処をする。
        
        str_response_header += p.status()+"\n"
        for h in p.headers():
            str_response_header += h+": "+p.headers()[h]+"\n"
        str_response_body += str(p.body_file().read(),  errors='replace')
        return {"body":str_response_body, "header":str_response_header}
Ejemplo n.º 6
0
 def send_downstream(self, p, rhost, rport, method, url, upsock):
     with self.connect_downstream(rhost, rport) as downsock:
         request = '{method} {url} HTTP/{version[0]}.{version[1]}\r\n{headers}\r\n\r\n'.format(method=method.decode(), url=url, version=p.version(), headers='\r\n'.join(['{0}: {1}'.format(name, value) for name, value in p.headers().items()]))
         self.logger.debug('sending request {0!r}'.format(request))
         downsock.send(request.encode())
         downstream = HttpStream(SocketReader(downsock))
         self.logger.debug('response: header={0}'.format(downstream.headers()))
         upsock.send('HTTP/{version[0]}.{version[1]} {code} {status}\r\n{headers}\r\n\r\n'.format(version=downstream.version(), code=downstream.status_code(), status=downstream.status(), headers='\r\n'.join(['{0}: {1}'.format(name, value) for name, value in downstream.headers().items()])).encode())
         upsock.send(downstream.body_string())