Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 18, 2009 02:02:56

$m1t
От:
Зарегистрирован: 2006-12-31
Сообщения: 104
Репутация: +  0  -
Профиль   Отправить e-mail  

Авторизация в самописном прокси.

Играюсь с кодом от TinyHttpProxy и хочу добавить в него авторизацию по логину и паролю.

__version__ = "0.2.1"

import BaseHTTPServer, select, socket, SocketServer, urlparse

class ProxyHandler (BaseHTTPServer.BaseHTTPRequestHandler):
__base = BaseHTTPServer.BaseHTTPRequestHandler
#__base_handle = __base.handle

server_version = "TinyHTTPProxy/" + __version__
rbufsize = 0 # self.rfile Be unbuffered

#def handle(self):
# (ip, port) = self.client_address
# if hasattr(self, 'allowed_clients') and ip not in self.allowed_clients:
# self.raw_requestline = self.rfile.readline()
# if self.parse_request(): self.send_error(403)
# else:
# self.__base_handle()

def _connect_to(self, netloc, soc):
print self.headers
i = netloc.find(':')
if i >= 0:
host_port = netloc[:i], int(netloc[i+1:])
else:
host_port = netloc, 80
print "\t" "connect to %s:%d" % host_port
try: soc.connect(host_port)
except socket.error, arg:
try: msg = arg[1]
except: msg = arg
self.send_error(404, msg)
return 0
return 1

def do_GET(self):
print self.headers
print "command: "
print self.command
(scm, netloc, path, params, query, fragment) = urlparse.urlparse(
self.path, 'http')
if scm != 'http' or fragment or not netloc:
self.send_error(400, "bad url %s" % self.path)
return
soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
if self._connect_to(netloc, soc):
self.log_request()
soc.send("%s %s %s\r\n" % (
self.command,
urlparse.urlunparse(('', '', path, params, query, '')),
self.request_version))
self.headers['Connection'] = 'close'
del self.headers['Proxy-Connection']
for key_val in self.headers.items():
soc.send("%s: %s\r\n" % key_val)
soc.send("\r\n")
self._read_write(soc)
finally:
print "\t" "bye"
soc.close()
self.connection.close()

def _read_write(self, soc, max_idling=20):
iw = [self.connection, soc]
ow = []
count = 0
while 1:
count += 1
(ins, _, exs) = select.select(iw, ow, iw, 3)
if exs: break
if ins:
for i in ins:
if i is soc:
out = self.connection
else:
out = soc
data = i.recv(8192)
if data:
out.send(data)
count = 0
else:
print "\t" "idle", count
if count == max_idling: break

do_HEAD = do_GET
do_POST = do_GET
do_PUT = do_GET
do_DELETE=do_GET

class ThreadingHTTPServer (SocketServer.ThreadingMixIn,
BaseHTTPServer.HTTPServer): pass
Кажется, что логин и пароль должны приходить на прокси в заголовках, но print self.headers показывает обратное – логин и пароль таким образом не отсылаются. Хотя например здесь http://www.freesoft.org/CIE/RFC/2068/195.htm написано, что в заголовках запроса должна приходить аутенфикационная информация.

Второй вопрос. На сервере есть два интерфейса eth0 и eth1. Как сделать, что бы прокси работала только через eth1? Надо подать какие-то параметры питону?
Прокси стартуется через python proxy.py



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version