python實戰--Http代理服務器

  1. import socket  
  2. import thread  
  3. import urlparse  
  4. import select  
  5.   
  6. BUFLEN=8192  
  7.   
  8.   
  9. class Proxy(object):  
  10.     def __init__(self,conn,addr):  
  11.         self.source=conn  
  12.         self.request=""  
  13.         self.headers={}  
  14.         self.destnation=socket.socket(socket.AF_INET,socket.SOCK_STREAM)  
  15.         self.run()  
  16.   
  17.     def get_headers(self):  
  18.         header=''  
  19.         while True:  
  20.             header+=self.source.recv(BUFLEN)  
  21.             index=header.find('\n')  
  22.             if index >0:  
  23.                 break  
  24.         #firstLine,self.request=header.split('\r\n',1)  
  25.         firstLine=header[:index]  
  26.         self.request=header[index+1:]  
  27.         self.headers['method'],self.headers['path'],self.headers['protocol']=firstLine.split()  
  28.   
  29.     def conn_destnation(self):  
  30.         url=urlparse.urlparse(self.headers['path'])  
  31.         hostname=url[1]  
  32.         port="80"  
  33.         if hostname.find(':') >0:  
  34.             addr,port=hostname.split(':')  
  35.         else:  
  36.             addr=hostname  
  37.         port=int(port)  
  38.         ip=socket.gethostbyname(addr)  
  39.         print ip,port  
  40.         self.destnation.connect((ip,port))  
  41.         data="%s %s %s\r\n" %(self.headers['method'],self.headers['path'],self.headers['protocol'])  
  42.         self.destnation.send(data+self.request)  
  43.         print data+self.request  
  44.   
  45.   
  46.     def renderto(self):  
  47.         readsocket=[self.destnation]  
  48.         while True:  
  49.             data=''  
  50.             (rlist,wlist,elist)=select.select(readsocket,[],[],3)  
  51.             if rlist:  
  52.                 data=rlist[0].recv(BUFLEN)  
  53.                 if len(data)>0:  
  54.                     self.source.send(data)  
  55.                 else:  
  56.                     break  
  57.     def run(self):  
  58.         self.get_headers()  
  59.         self.conn_destnation()  
  60.         self.renderto()  
  61.   
  62.   
  63.   
  64. class Server(object):  
  65.   
  66.     def __init__(self,host,port,handler=Proxy):  
  67.         self.host=host  
  68.         self.port=port  
  69.         self.server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)  
  70.         self.server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)  
  71.         self.server.bind((host,port))  
  72.         self.server.listen(5)  
  73.         self.handler=handler  
  74.   
  75.     def start(self):  
  76.         while True:  
  77.             try:  
  78.                 conn,addr=self.server.accept()  
  79.                 thread.start_new_thread(self.handler,(conn,addr))  
  80.             except:  
  81.                 pass  
  82.   
  83.   
  84. if __name__=='__main__':  
  85.     s=Server('127.0.0.1',8080)  
  86.     s.start()  
相關文章
相關標籤/搜索