def forward_hosts_tcp(self, addrs, req): self.remoteconn = create_connection_hosts(addrs, req.dstport, self.timeout) self.track_sock(self.remoteconn) addrtype, bndaddr, bndport = sock_addr_info(self.remoteconn) request_success(self.socksconn, addrtype, bndaddr, bndport) data = self.socksconn.recv(65536) if data[:3] == 'GET': request, rest = data.split('\r\n', 1) method, path, version = request.split() headers = mimetools.Message(StringIO(rest)) host = headers.getheader("host", "") if self.matcher.need_redirect(method, host): response = [ "%s 301 Moved Permanently" % version, "Location: https://%s" % "".join([host, path]), "Connection: close", "", "" ] self.socksconn.sendall("\r\n".join(response)) else: self.remoteconn.sendall(data) pipe_tcp(self.socksconn, self.remoteconn, self.timeout, self.timeout) else: self.remoteconn.sendall(data) pipe_tcp(self.socksconn, self.remoteconn, self.timeout, self.timeout)
def forward_hosts_tcp(self, addrs, req): self.remoteconn = create_connection_hosts(addrs, req.dstport, self.timeout) self.track_sock(self.remoteconn) addrtype, bndaddr, bndport = sock_addr_info(self.remoteconn) request_success(self.socksconn, addrtype, bndaddr, bndport) data = self.socksconn.recv(65536) if data[:3] == "GET": request, rest = data.split("\r\n", 1) method, path, version = request.split() headers = mimetools.Message(StringIO(rest)) host = headers.getheader("host", "") if self.matcher.need_redirect(method, host): response = [ "%s 301 Moved Permanently" % version, "Location: https://%s" % "".join([host, path]), "Connection: close", "", "", ] self.socksconn.sendall("\r\n".join(response)) else: self.remoteconn.sendall(data) pipe_tcp(self.socksconn, self.remoteconn, self.timeout, self.timeout) else: self.remoteconn.sendall(data) pipe_tcp(self.socksconn, self.remoteconn, self.timeout, self.timeout)
def forward_hosts_tunnel(self, addrs, host, port, environ, start_response): try: tunnel_conn = create_connection_hosts(addrs, port, self.timeout) environ["TUNNEL_CONN"] = tunnel_conn start_response("200 Connection established", []) return [] except socket.timeout: # @UndefinedVariable start_response("504 Gateway Timeout", [("Content-Type", "text/plain; charset=utf-8")]) return ["Gateway Timeout"] except: start_response("500 Internal Server Error", [("Content-Type", "text/plain; charset=utf-8")]) return ["Internal Server Error"]
def forward_hosts_tunnel(self, addrs, host, port, environ, start_response): try: tunnel_conn = create_connection_hosts(addrs, port, self.timeout) environ['TUNNEL_CONN'] = tunnel_conn start_response("200 Connection established", []) return [] except socket.timeout: # @UndefinedVariable start_response("504 Gateway Timeout", [("Content-Type", "text/plain; charset=utf-8")]) return ["Gateway Timeout"] except: start_response("500 Internal Server Error", [("Content-Type", "text/plain; charset=utf-8")]) return ["Internal Server Error"]
def forward_hosts_http(self, addrs, host, port, environ, start_response): try: method, url, body, headers = copy_request(environ) except: start_response("400 Bad Request", [("Content-Type", "text/plain; charset=utf-8")]) yield "Bad Request" return try: u = urlparse.urlsplit(url) if self.matcher.need_redirect(method, host): start_response( "%d %s" % (301, "Moved Permanently"), [ ("Location", urlparse.urlunsplit(("https", u.netloc, u.path, u.query, u.fragment))), ("Connection", "close"), ], ) yield "" return set_forwarded_for(environ, headers) http_conn = create_connection_hosts(addrs, port, self.timeout) conn = HTTPConnection(host, port=port) conn.sock = http_conn path = urlparse.urlunsplit(("", "", u.path, u.query, "")) conn.request(method, path, body, headers) resp = conn.getresponse() start_response("%d %s" % (resp.status, resp.reason), resp.getheaders()) while True: data = resp.read(CHUNKSIZE) if not data: break yield data conn.close() except Exception, e: log.error( "[Exception][FireflyHTTPApplication.forward_hosts_http]: %s" % str(e)) start_response("500 Internal Server Error", [("Content-Type", "text/plain; charset=utf-8")]) yield "Internal Server Error" return
def forward_hosts_http(self, addrs, host, port, environ, start_response): try: method, url, body, headers = copy_request(environ) except: start_response("400 Bad Request", [("Content-Type", "text/plain; charset=utf-8")]) yield "Bad Request" return try: u = urlparse.urlsplit(url) if self.matcher.need_redirect(method, host): start_response( "%d %s" % (301, "Moved Permanently"), [ ("Location", urlparse.urlunsplit(("https", u.netloc, u.path, u.query, u.fragment))), ("Connection", "close"), ], ) yield "" return set_forwarded_for(environ, headers) http_conn = create_connection_hosts(addrs, port, self.timeout) conn = HTTPConnection(host, port=port) conn.sock = http_conn path = urlparse.urlunsplit(("", "", u.path, u.query, "")) conn.request(method, path, body, headers) resp = conn.getresponse() start_response("%d %s" % (resp.status, resp.reason), resp.getheaders()) while True: data = resp.read(CHUNKSIZE) if not data: break yield data conn.close() except Exception, e: log.error("[Exception][FireflyHTTPApplication.forward_hosts_http]: %s" % str(e)) start_response("500 Internal Server Error", [("Content-Type", "text/plain; charset=utf-8")]) yield "Internal Server Error" return