Как сделать простой прокси-сервер в python?

Я хотел сделать очень простой прокси с помощью python (в основном, чтобы понять, как он работает). Я говорю о родовом прокси-сервере TCP, а не только о http. Я построил следующий код, однако, похоже, он работает только одним способом: т. Е. Запрос отправляется, но я никогда не получаю ответа. Вот код:

import socket import argparse #Args parser = argparse.ArgumentParser(description='ProxyDescription') parser.add_argument('-l', '--listen', action='store', help='Listening port', default=80, type=int) parser.add_argument('destination', action='store', help='Destination host') parser.add_argument('port', action='store', help='Destination port', type=int) args = parser.parse_args() #Server s1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s1.bind(('', args.listen)) s1.listen(1) conn1, addr1 = s1.accept() #Client s2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s2.connect((args.destination, args.port)) s2.setblocking(0) print "Connected by ", addr1 while 1: datato = conn1.recv(1024) if not datato: print "breaking to" break s2.send(datato) print "data send : " + datato try: datafrom = s2.recv(1024) print "reveived data : " + datafrom if not datafrom: print "breakinf from" break print "datafrom: " + datafrom conn1.send(datafrom) except socket.error, msg: print "error rcving: " + str(socket.error) + " || " + str(msg) continue print "the end ... closing" conn1.close() s2.close() 

Мой тест просто запускает этот скрипт и telnet через него. Если я посмотрю с wirehark, я вижу, что запрос полностью понимается сервером, и я получаю ответ, однако, я никогда не получаю ответа в telnet. (тестирование с помощью простого GET / on google) Я чувствую, что проблема связана с «блокировкой» / «неблокирующим» сокетом, но я не могу понять, где он находится.

    2 Solutions collect form web for “Как сделать простой прокси-сервер в python?”

    Я написал небольшую статью о создании прокси-сервера в python, он работает асинхронно и может обрабатывать большое количество соединений. Вот ссылка: http://voorloopnul.com/blog/a-python-proxy-in-less-than-100-lines-of-code/ (для этого используются только библиотеки по умолчанию).

    Вероятно, этот рецепт может помочь вам http://code.activestate.com/recipes/114642/

    Python - лучший язык программирования в мире.