#python #sockets #proxy
Вопрос:
Я новичок в python и пытаюсь написать прокси-сервер для пересылки запросов, сделанных из браузера firefox, на соответствующий веб-сервер. После выполнения приведенного ниже кода я получаю [Errno -2] Имя или неизвестную службу. Я не знаю, что я делаю не так. Кроме того, я хочу иметь возможность управлять прокси-сервером в двух режимах:
- Прямое перенаправление трафика и,
- Иметь возможность разделять запросы с использованием http-диапазона (как этого можно достичь?). Заранее спасибо.
import socket, sys from _thread import * # FORWARDER TO HOST ADDRESS FROM BROWSER REQUEST def begin(): try: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind(('127.0.0.1', 2555)) s.listen(5) except socket.error as e: print (e) while True: try: conn, addr = s.accept() data = conn.recv(1024) start_new_thread(conn_data (conn, data, addr)) except KeyboardInterrupt: s.close sys.exit() s.close() # Get host address and assign port 80 as default to the webserver def conn_data(conn, data, addr): try: d = data.split(b'n')[0] url = d.split(b' ')[1] url = url.decode() host = url.split(':')[0] ip = socket.gethostbyname(str(host)) webserver = ip ':' http_port = 80 forwarder(webserver, http_port, conn, addr, data) except socket.gaierror: print ("n[*] Error resolving the host...n") sys.exit() except KeyboardInterrupt: print("n[*] User terminated connectionn") conn.close sys.exit() def forwarder(webserver, http_port, conn, data, addr): try: # Connecting to the host s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((webserver, http_port)) s.send(data) while True: server_res = s.recv(1024) if (len(server_res) gt; 0): conn.send(server_res) else: break s.close() conn.close except socket.error as e: print (e) s.close() conn.close() sys.exit()
Комментарии:
1. Код неполон, т. е. не может быть использован для воспроизведения проблемы. Также неизвестно, как вы получаете доступ к прокси-серверу от клиента, т. е. как вы настраиваете его в клиенте. Кроме того, у вас, похоже, неправильные ожидания относительно того, как выглядит HTTP — запрос или что является подходящим аргументом для gethostbyname-я рекомендую распечатать то, что у вас есть,
host
и сверить с тем, что там должно быть. Кроме того, объем вашего вопроса слишком широк, пожалуйста, остановитесь на одной проблеме.