1

我一直在用 python 编写一个透明的代理服务器来记录请求的去向。大多数页面会加载,例如 google.co.uk,但是,诸如 google.com 之类的页面会卡住加载,并且某些页面(例如本地 IP)会在浏览器中出现“连接重置”错误。

任何帮助将不胜感激。

#!/usr/bin/env python
import socket, optparse, thread

def proxy(url, port, connection, address, data):
    try:
        get = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        get.connect((url, port))
        get.send(data)
        while True:
            reply = get.recv(BUFFER)
            if len(reply) > 0:
                connection.send(reply)
                info = float(len(reply))
                info = float(info / 1024)
                info = "%.3s" %(str(info))
                info = "%s KB" %(info)
                print("[*] Request Complete: %s => %s <=" %(str(address[0]), str(info)))
            else:
                break
        get.close()
        connection.close()
    except Exception as e:
        get.close()
        connection.close()
def handle(connection, address, data):
    first = data.split("\n")[0]
    url = first.split(" ")[1]
    protocolPosition = url.find("://")
    if protocolPosition == -1:
        # No protocol so default
        temp = url
    else:
        temp = url[(protocolPosition + 3):]
    if ":" in temp:
        # Port other than 80 has been specified
        port = temp.split(":")[-1].strip("/")
        webserver = temp.split(":")[:-1]
        try:
            # Incase there is ':' in the URL
            webserver = "".join(webserver)
        except:
            pass
    else:
        port = 80
        webserver = temp.strip("/")
    print("[*] '%s' => '%s'" %(address[0], webserver))
    proxy(webserver, port, connection, address, data)

receive = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
    receive.bind(("0.0.0.0", PORT))
except socket.error as e:
    print("Failed to bind to 0.0.0.0:%d" %(PORT))
    print("Error: " + str(e))
    raise SystemExit
receive.listen(MAXCONNECTIONS)
print("Listening on 0.0.0.0:%d" %(PORT))

while True:
    try:
        connection, address = receive.accept()
        data = connection.recv(BUFFER)
        thread.start_new_thread(handle, (connection, address, data,))
    except KeyboardInterrupt:
        break
print("\nReleasing socket")
receive.close() 

编辑:经过一番挖掘和错误处理后,我将错误缩小到

[Errno -2] Name or service not known
4

0 回答 0