私は本当にシンプルな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
大学の割り当て... –
クール - イエスは、これらのことについて学ぶことも教育的だと言いました。 CONNECTを理解するには、まずそれが実際にHTTPメッセージであると考える必要があります。クライアントはHTTPメッセージをサーバーに送信し、サーバーはHTTP応答を送信する必要があります。 CONNECTの場合、応答メッセージは上流接続が成功したかどうかを示します(上流に接続する必要のあるプロキシー、成功した場合は200応答を送信してからパイプライン・モードにする必要があります)。 – Adrien
HTTP CONNECT応答を処理する方法の詳細を少し詳しく説明してください。私の現在の理解は、「HTTP/1.0 200 Connection established \ r \ nProxy-agent:ProxyServer/1.0 \ r \ n \ r \ n」というメッセージをクライアントに送り返すことです。そこから何が起こるかについて。現在のところ、クライアントが安全な接続が確立された後にGETリクエストを送信することを予期して実行しているスレッドがあるだけですが、ハングして何もしません。 –