저는 파이썬으로 정말 간단한 웹 프록시를 작성하고 있습니다. 현재 HTTPS 웹 사이트를 열 수 있도록 HTTPS CONNECT 요청을 처리하고 있습니다. 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 나는
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 요청을 보낼 것이라는 기대로 돌아가는 스레드를 가지고 있지만 단지 멈추고 아무것도하지 않습니다. –