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
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
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()
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}
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())