클라이언트 (예 : 웹 브라우저)가 localhost:8080
을 가리킬 때 해당 요청은 SERVER_ADDR
(예 : http://www.yahoo.com
)으로 정의 된 주소로 보내야합니다. 그것은 프록시보다 라우터 나로드 밸런서와 같습니다.Twisted 및 Python을 사용하여 라우터 만들기
문제점 : 웹 브라우저가 localhost:8080
일 때 아무 것도 반환되지 않습니다. 파이썬 콘솔에서 HTTP 요청 헤더가 Twisted 앱에 도달 한 것으로 볼 수 있습니다. 브라우저의 요청을 리디렉션하는 데 사용할 수 없습니까?
from twisted.internet import protocol, reactor
LISTEN_PORT = 8080
SERVER_PORT = 80
SERVER_ADDR = 'http://www.yahoo.com'
class ServerProtocol(protocol.Protocol):
def __init__(self):
self.buffer = None
self.client = None
def connectionMade(self):
factory = protocol.ClientFactory()
factory.protocol = ClientProtocol
factory.server = self
reactor.connectTCP(SERVER_ADDR, SERVER_PORT, factory)
# Client => Proxy
def dataReceived(self, data):
print 'Data received from Client:'
if self.client:
self.client.write(data)
else:
data = data.replace('localhost:8080', SERVER_ADDR)
print data
self.buffer = data
# Proxy => Client
def write(self, data):
self.transport.write(data)
class ClientProtocol(protocol.Protocol):
def connectionMade(self):
self.factory.server.client = self
self.write(self.factory.server.buffer)
self.factory.server.buffer = ''
# Server => Proxy
def dataReceived(self, data):
print 'Data received from Server: '
print data
self.factory.server.write(data)
# Proxy => Server
def write(self, data):
if data:
self.transport.write(data)
def main():
factory = protocol.ServerFactory()
factory.protocol = ServerProtocol
reactor.listenTCP(LISTEN_PORT, factory)
reactor.run()
if __name__ == '__main__':
main()
이것은 HTTP 프록시가 아닙니다. 오히려 평범한 구형 TCP 프록시 또는 "포트 전달자 (Port Forwarder)"입니다. HTTP를 가로채는 경우 HTTP를 구현해야합니다. –
@JamesMills TCP 프록시/전달자를 만들려고합니다. 그러나 작동하는 것을 쉽게 테스트 할 수있는 방법은 무엇입니까? 웹 브라우저가 작동한다고 생각했지만 분명히 그럴 생각이 없습니다. – Nyxynyx
텔넷으로 테스트하십시오. 웹 브라우저는 HTTP를 말합니다. HTTP 트래픽을 리다이렉트/인터셉트하려면 웹 프록시 (HTTP 프록시)를 사용해야합니다. 그렇지 않으면 TCP 레벨에서 투명하게 "'GET http : // www.google.com /''이 다시 연결됩니다. 야후 웹 서버는 아마도 404 또는 일부 다른 오류를 반환하므로 yahoo.com은 작동하지 않습니다. –