Python基于BaseHTTPRequestHandler的HTTP代理V1.0
2017-03-14 00:00
399 查看
proxyHandler.py
#coding=utf8 from BaseHTTPServer import BaseHTTPRequestHandler,HTTPServer import socket import urllib from zipdeal import GzipClass class proxyHandler(BaseHTTPRequestHandler): def do_POST(self): #服务响应的链接uri #类似http://xdcs-collector.ximalaya.com/api/v1/statistics uri = self.path #根据协议把url分成两部分,一部分是协议,例如http; #另一部分是服务和接口:xdcs-collector.ximalaya.com/api/v1/statistics #把另一部分内容放入到: hostAndInterface hostAndInterface = urllib.splittype(uri)[-1] #根据服务器拆分成两个部分,一部分是服务器:xdcs-collector.ximalaya.com #另一部分是接口:/api/v1/statistics host, interface = urllib.splithost(hostAndInterface) #根据/拆分成几个部分,获取最后一个元素的值,例如:statistics lastOfInterface=interface.split("/")[-1] #判断接口最后一个字符是否是:statistics,如果是则执行if之后的语句 if lastOfInterface=='statistics': #根据端口号拆分成两个部分:host、port host, port = urllib.splitnport(host) #如果端口号小于80,把端口号设置为80 if port < 0: port = 80 #把服务域名转换为服务IP host_ip = socket.gethostbyname(host) #从headers中删除headers['Proxy-Connection']的引用 # 然后把headers['Connection']设置为'keep-alive' del self.headers['Proxy-Connection'] self.headers['Connection'] = 'keep-alive' #请求的第一行,把该行数据赋值给send_data变量 #requestline的格式如:POST http://xdcs-collector.ximalaya.com/api/v1/statistics HTTP/1.1 send_data = self.requestline #重新创建个head用来保存新的heads值 head = '' for key, val in self.headers.items(): head = head + "%s: %s\r\n" % (key, val) #给请求的数据加上head和请求参数 send_data = send_data + head+'\r\n' #创建一个客户端套接字链接 client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #客户端发送连接请求 client.connect((host_ip, port)) #客户端发送请求数据 client.sendall(send_data) #保存服务端返回的字段 data = '' while True: #把客户端从服务中接收的数据保存到一个临时变量tmp中 tmp = client.recv(8192) #判断接收的数据是否为空,如果为空跳出循环 if not tmp: break #不为空,把tmp中的数据传递给data data = data + tmp #断开链接 client.close() #把接收到的数据data写入到文件wfile中 self.wfile.write(data) #self.rfile存放的是请求数据而且数据还被gzip #通过print打印到屏幕的都是乱码 GzipClass().GZFile(self.rfile.read()) else: pass #do_CONNECT = do_POST #do_GET=do_POST def test(): host='192.168.62.33' port=8888 try: server = HTTPServer((host, port), proxyHandler) print 'Welcome to the Server HTTP On %s Port %d...' %(host,port) server.serve_forever() except KeyboardInterrupt: print '^C received, shutting down server' server.socket.close() if __name__ == '__main__': test()
zipdeal.py
#coding=utf8 import os import gzip ''' 创建一个全局变量FILE_PATH 并给变量赋值:gz文件所在路径 ''' class GzipClass(): def __init__(self): self.FILE_PATH = 'D:\\DataProxy\\Pro_2.0\\GZfile\\request.gz' #读取gz文件中的内容 def read_file(self,path): try: #判断路径是否存在,如果存在打开gz文件并读取 #不存在给出相应的提示信息 if os.path.exists(path): with gzip.open(path, 'rb') as pf: return pf.read() else: print 'the path % is not exist!' %(path) finally: pf.close() #把内容写入gz文件 def write_file(self,path, content): try: #判断路径是否存在,如果存在打开gz文件并读取 #不存在给出相应的提示信息 if os.path.exists(path): with gzip.open(path, 'wb') as f: f.write(content) else: print 'the path % is not exist!' %(path) finally: f.close() def GZFile(self,content): self.write_file(self.FILE_PATH, content) con =self.read_file(self.FILE_PATH) print '#' * 50 print con if __name__ == '__main__': GzipClass().GZFile("hellO")
相关文章推荐
- Python基于BaseHTTPRequestHandler的HTTP代理V1.0
- python的BaseHTTPRequestHandler的bug
- BaseHTTPRequestHandler
- BaseHTTPRequestHandler,HTTPServer
- [C#]基于HttpWebRequest和HttpWebResponse的自动登录采集
- [C#]基于HttpWebRequest和HttpWebResponse的HttpHelper
- 基于c++ socket的httprequest
- python基于http协议编程:httplib,urllib和urllib2
- JavaScript基于XMLHttpRequest的Ajax请求
- Android 多线程之 Handler、Looper、Message 在基于 HTTP 系统中的应用
- [C#]基于HttpWebRequest和HttpWebResponse的HttpHelper
- 二:理解ASP.NET的运行机制(例:基于HttpHandler的URL重写)
- python基于http协议编程:httplib,urllib和urllib2
- Android多线程之Handler、Looper、Message在基于HTTP系统中的应用
- 用 ASP.NET MVC 实现基于 XMLHttpRequest long polling(长轮询) 的 Comet
- 基于HttpWebRequest和HttpWebResponse的HttpHelper
- 一个基于jQuery ajax和.net httphandler 的超轻异步框架,千行代码完成。
- dhl:httpHandler.ProcessRequest(HttpContext.Current);传入的请求不与任何路由匹配-解决方案 默认规则被修改
- jquey ajax request httphandler
- 基于ASIHttpRequest的POST数据的实现