Python socket module. Connecting to an HTTP proxy then performing a GET request on an external resource

后端 未结 2 694
梦毁少年i
梦毁少年i 2021-01-07 06:36

To begin with, I understand there are other modules such as Requests that would be better suited and simpler to use, but I want to use the socket module to better understand

相关标签:
2条回答
  • 2021-01-07 07:14

    To make a HTTP request to a proxy open a connection to the proxy server and then send a HTTP-proxy request. This request is mostly the same as the normal HTTP request, but contains the absolute URL instead of the relative URL, e.g.

     > GET http://www.google.com HTTP/1.1
     > Host: www.google.com
     > ...
    
     < HTTP response
    

    To make a HTTPS request open a tunnel using the CONNECT method and then proceed inside this tunnel normally, that is do the SSL handshake and then a normal non-proxy request inside the tunnel, e.g.

     > CONNECT www.google.com:443 HTTP/1.1
     >
     < .. read response to CONNECT request, must be 200 ...
    
     .. establish the TLS connection inside the tunnel
    
     > GET / HTTP/1.1
     > Host: www.google.com
    
    0 讨论(0)
  • 2021-01-07 07:17

    Python 3 requires the request to be encoded. Thus, expanding on David's original code, combined with Steffens answer, here is the solution written for Python 3:

    def connectThroughProxy():
        headers = """GET http://www.example.org HTTP/1.1
                    Host: www.example.org\r\n\r\n"""
    
        host = "192.97.215.348" #proxy server IP
        port = 8080              #proxy server port
    
        try:
            s = socket.socket()
            s.connect((host,port))
            s.send(headers.encode('utf-8'))
            response = s.recv(3000)
            print (response)
            s.close()
        except socket.error as m:
           print (str(m))
           s.close()
           sys.exit(1) 
    

    This allows me to connect to the example.org host through my corporate proxy (at least for non SSL/TLS connections).

    0 讨论(0)
提交回复
热议问题