码迷,mamicode.com
首页 > 编程语言 > 详细

python 实现简单 http 代理

时间:2016-10-07 18:05:16      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:

有台 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 = 8000
10 
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 = 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 url
38 
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_sock.recv(1024)
45         if http_data:
46             conn.send(http_data)
47         else:
48             break
49     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 代理

标签:

原文地址:http://www.cnblogs.com/ningci/p/5936222.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!