Как сделать простой прокси в python? - PullRequest
7 голосов
/ 24 марта 2012

Я хотел сделать очень простой прокси с использованием 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. Если я смотрю с wireshark, я вижу, что запрос полностью понят сервером, и я получаю ответ, однако я никогда не получаю ответ в telnet. (тестирование с простым GET / на Google) Я чувствую, что проблема связана с «блокирующим» / «неблокирующим» сокетом, но я не могу понять, где он находится.

Ответы [ 2 ]

8 голосов
/ 09 мая 2013

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

4 голосов
/ 24 марта 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...