예제 #1
0
 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)
예제 #2
0
 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)
예제 #3
0
 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"]
예제 #4
0
 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"]
예제 #5
0
    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
예제 #6
0
    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