0

我正在用 Python 编写一个非常基本的 Web 代理。在当前状态下,我想要它做的就是从客户端获取请求并将其直接传递到网络,没有缓存或类似的东西。当我尝试接受来自网络服务器的响应时,我的问题就出现了。我解析客户端 HTTP 请求以获取 Web 服务器的主机名,我转到请求的第二行并从那里提取名称。我的程序崩溃并显示错误消息[Errno -5] No address associated with hostname

我从 Github 中提取了一些类似的代码并运行了该代码,它们似乎解析了 HTTP 请求的第一行并从 url 中挖掘出主机名,在我看来,这似乎过于复杂,但它们的代码相对较好。我是否通过从第二行中获取换行符或类似的东西?

import sys, socket

# Constants
PORT = 8080
MAX_BUFFER = 4096
HOST = 'localhost'

def main():
# Start socket
    try:
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.bind((HOST, PORT))
        s.listen(0)
        print ('Proxy running on %s:%d' % (HOST, PORT))

    except socket.error, (message):
        print(message)
        s.close()
        sys.exit(1)

# Listen for requests
    while 1:
    # conn is the socket we can send and receive to/from the client
        conn, client_addr = s.accept()
        print('Got call from client')

        request = conn.recv(MAX_BUFFER)
        print(str(request))

    # Parsing
        first_line = request.split('\n')[0]
        second_line = request.split('\n')[1]
        url = first_line.split(' ')[1]
        webserver = second_line.split(' ')[1]
        print(webserver)

    # Heard from client, now forward to server
        try:
            c = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            c.connect((webserver, 80))
            c.send(request)
            print('Sent request to webserver')

            while 1:
                data = c.recv(MAX_BUFFER)
                print('Received some data')

            # while there is data to receive from server
                if len(data) > 0:
                    conn.send(data)
                    print('Send data to client')

                else:
                    print('break')
                    break

            c.close()
            conn.close()

        except socket.error, (message):
            print(message)
            if c:
                c.close()

            if conn:
                conn.close()

            sys.exit(1)

    print('Goodbye')
#******************End of main*********************

if __name__ == '__main__':
    main()

以下是来自 Github 的代码摘录:

# Listen for requests
    while 1:
    # conn is the socket we can send and receive to/from the client
        conn, client_addr = s.accept()
        print('Got call from client')

        request = conn.recv(MAX_BUFFER)
        print(str(request))

    # Parsing
        first_line = request.split('\n')[0]
        url = first_line.split(' ')[1]
        http_pos = url.find('://')
        if http_pos == -1:
            temp = url
        else:
            temp = url[(http_pos + 3):]

        port_pos = temp.find(':')

        webserver_pos = temp.find('/')
        if webserver_pos == -1:
            webserver_pos = len(temp)
        webserver = ''
        port = -1

        if port_pos == -1 or webserver_pos < port_pos:
            port = 80
            webserver = temp[:webserver_pos]

        else:
            port = int((temp[(port_pos + 1):])[:webserver_pos - port_pos -1])
            webserver = temp[:port_pos]

        print(webserver)

    # Heard from client, now forward to server

学分:https ://github.com/luugiathuy/WebProxyPython/blob/master/proxy.py

4

0 回答 0