2017-03-24 4 views
0

私は本当にシンプルなWebプロキシをPythonで作成していますが、今はHTTPS CONNECTリクエストを処理しているので、HTTPS Webサイトを開くことができます。私はSSLトンネルを設定しようとしていますが、私のコードはあまり正しくありません。私は近くにいると思うが、もし誰かが見て、正しい方向に私を押してくれれば素晴らしいだろう。私が行うことになってるものの私の現在の理解はHTTPS CONNECTリクエストを処理する

  • 要求がCONNECT要求
  • 私は私のコードで変数connect_reqで定義されているようブラウザにメッセージを送信していることを認識され
  • それは
  • それについて

のは、ここに私のコードです:

def ProxyThread(conn, client_addr): 
    request = conn.recv(MAX_BUFFER) 
    #print request 
    # Parsing 
    method, webserver, port = ParseReq(request) 
    print 'Request = ' + method + ' ' + webserver + ':' + str(port) + '\n' 

    try: 
     serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     serverSocket.connect((webserver, port)) 

     if method == 'CONNECT': 
      connect_req = 'HTTP/1.1 200 Connection established\r\n' 
      connect_req += 'Proxy-agent: localhost\r\n\r\n' 

      conn.send(connect_req.encode()) 

     serverSocket.send(connect_req) 

     while 1: 
      data = serverSocket.recv(MAX_BUFFER) 

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

      else: 
       break 

     serverSocket.close() 
     conn.close() 

    except socket.error, (message): 
     print message 

     if conn: 
      conn.close() 

     if serverSocket: 
      serverSocket.close() 
     return 

編集1:で開始するには、更新されたコードHREAD私はHTTPS REQを取得

def ProxyThread(conn, client_addr): 
    request = conn.recv(MAX_BUFFER) 
    method, webserver, port = ParseReq(request) 

    #Handle index out of range exception - Throw out the request 
    if method is None or webserver is None or port is -1: 
     return 

    print 'Request = ' + method + ' ' + webserver + ':' + str(port) + ' START\n' 

    serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

    try: 
     if method == 'CONNECT': 
      connect_req = 'HTTP/1.0 200 Connection established\r\n' 
      connect_req += 'Proxy-agent: ProxyServer/1.0\r\n' 
      connect_req += '\r\n' 
      print connect_req 
      conn.send(connect_req) 
      thread = threading.Thread(target=HTTPSProxyThread, args=(conn, serverSocket)) 
      thread.start() 

     serverSocket.connect((webserver, port)) 
     serverSocket.send(request) 

     while 1: 
      data = serverSocket.recv(MAX_BUFFER) 

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

      else: 
       break 

     print 'Request = ' + method + ' ' + webserver + ':' + str(port) + ' FINISH\n' 
     serverSocket.close() 

     conn.close() 


def HTTPSProxyThread(conn, serverSocket): 
    while 1: 
     request = conn.recv(MAX_BUFFER) 
     print request 
     method, webserver, port = ParseReq(request) 
     serverSocket.connect((webserver, port)) 
     serverSocket.send(request) 

     while 1: 
      data = serverSocket.recv(MAX_BUFFER) 

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

      else: 
       break 

Terminal Output Firefox

答えて

0

多くの人々は、これらの日のPython、またはNode.jsの中で、独自のWebプロキシを構築しているようです。

私は過去22年間、Webプロキシを作ってきた人物として、なぜ人々がそれをやっているのだろうと思っています。特に、誰かが既に後で対処する必要がありますこれらのいくつか)

  • HTTP認証
  • サーバーとクライアントの驚くべき数からファンキーな非準拠の動作をチャンク

    • トンネリング(CONNECT)
    • パフォーマンス
    • スケーラビリティ
    • ログ
    • キャッシング
    • 政策の枠組み及び執行
    • など

    それはしばらく時間を渡すための楽しい方法、これらの多くはである一方でそこにプロキシがある場合、より一般的なトラフィックに純粋な実装を使用すると、Web全体がより壊れてしまいます。独自の展開要件でこれを使用している場合は、このコメントは無視してください。

    私が作ろうとしているのは、よく振る舞う(実演者だけでなく)ウェブプロキシを作ることは、自明ではないということです。

  • +0

    大学の割り当て... –

    +0

    クール - イエスは、これらのことについて学ぶことも教育的だと言いました。 CONNECTを理解するには、まずそれが実際にHTTPメッセージであると考える必要があります。クライアントはHTTPメッセージをサーバーに送信し、サーバーはHTTP応答を送信する必要があります。 CONNECTの場合、応答メッセージは上流接続が成功したかどうかを示します(上流に接続する必要のあるプロキシー、成功した場合は200応答を送信してからパイプライン・モードにする必要があります)。 – Adrien

    +0

    HTTP CONNECT応答を処理する方法の詳細を少し詳しく説明してください。私の現在の理解は、「HTTP/1.0 200 Connection established \ r \ nProxy-agent:ProxyServer/1.0 \ r \ n \ r \ n」というメッセージをクライアントに送り返すことです。そこから何が起こるかについて。現在のところ、クライアントが安全な接続が確立された後にGETリクエストを送信することを予期して実行しているスレッドがあるだけですが、ハングして何もしません。 –

    関連する問題