首页 > 代码库 > python 实现简单 http 代理

python 实现简单 http 代理

有台 openwrt 路由器,16M flash存储 + 64M 内存 ,可以装 python 。因为没有自带 url 网站访问记录,想手写一个。

原理:

http 1.1 也就是 tcp 连接,有 header 和 body

使用 python  listen 8000 端口

设置浏览器,使用 localhost 8000 http 代理方式

技术分享

源码 py2.7:

 1 #coding:utf-8 2 import socket 3 import sys 4 import re 5 import os 6 import time 7  8 host = 0.0.0.0 9 port = 800010 11 #创建socket对象12 proxy_sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)13 try:14     proxy_sock.bind((host,port))15 except:16     sys.exit("python proxy bind error ")17 18 print "python proxy open"19 20 proxy_sock.listen(1024)21 while True:22     conn,addr = proxy_sock.accept()23     os.fork()24     print "client connent:{0}:{1}".format(addr[0], addr[1])25 26     #接收数据27     client_data = http://www.mamicode.com/conn.recv(1024)28 29     #分析得到 header 信息30     header = client_data.split("\r\n")31     host = header[1].split(":")[1].strip()32     url  = header[0].split(" ")[1].strip()33 34     #统计访问记录35     print time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time()))36     print host 37     print url38 39     #建立连接40     http_sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)41     http_sock.connect((host, 80))42     http_sock.sendall(client_data)43     while(True):44         http_data = http://www.mamicode.com/http_sock.recv(1024)45         if http_data:46             conn.send(http_data)47         else:48             break49     http_sock.close()50 51 #关闭所有连接52 proxy_sock.close()53 print "python proxy close"

 

从 header 中 可以提取到,访问的网址, cookie 等信息,理论上 非 https 也可以提取到 post 的信息。

缺点是,性能不好,没有实现 Connection : keep-alive

因为使用了 fork() win 中 应该是不能用。

看来,还是要加在网卡驱动中比较好。

 

python 实现简单 http 代理