您的位置:首页 > 理论基础 > 计算机网络

Python入门:python实现http透明代理(三)

2016-09-02 10:47 155 查看
import socket
import threading
import re
import select
import queue

class Proxy(threading.Thread):
def __init__(self,ser):
self.conn,self.clientAdd = ser.accept()
self.BUFSIZE = 1024
self.host = None
self.method = None
self.r_host = None
self.port = None
threading.Thread.__init__(self)
self.q = []

def getRequest(self):
data = self.conn.recv(self.BUFSIZE)
#print('---------' + data.decode())
if data.decode() != '':
s = data.decode().find('\r\n')
firstLine = data[:s]
#print('>>>>' + firstLine.decode())
self.method,self.r_host,p = firstLine.split()
print(self.r_host)

self.q.append(self.r_host.decode())
print(len(self.q))
net = self.r_host.decode().split('/')[0] + '//' + self.r_host.decode().split('/')[2]
targetAddr = self.getTargetInfo(self.r_host.decode().split('/')[2])
newRequest = data.decode().replace(net,'')
#print(newRequest)
self.target = socket.socket()
self.target.connect(targetAddr)
self.target.send(newRequest.encode())
self.noblocking()
else:
return None

def noblocking(self):
inputs = [self.conn,self.target]
while True:
readable,writeable,err = select.select(inputs,[],inputs,3)
if err:
break
'''
if readable[0] is self.conn:
d = readable[0].recv(self.BUFSIZE)
self.target.send(d)
elif readable[1] is self.target:
d = readable[1].recv(self.BUFSIZE)
self.conn.send(d)
'''
try:
for r in readable:
#print(r)
d = r.recv(self.BUFSIZE)
if d:
if r is self.conn:
self.target.send(d)
elif r is self.target:
self.conn.send(d)
else:
break
except:
break
self.conn.close()
self.target.close()

def getTargetInfo(self,host):
port = 0
site = None
if ':' in host:
tmp = host.split(':')
site = tmp[0]
port = int(tmp[1])
else:
site = host
port = 80
return site,port

def run(self):
self.getRequest()

def serSocket():
HOST = ''
PORT = 8088
ser = socket.socket()
ser.bind((HOST,PORT))  #启动代理
ser.listen(5)
return ser

if __name__ == '__main__':
ser = serSocket()
while True:
Proxy(ser).start()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  socket python