• httplib模块,测试cdn节点文件同步


    httplib模块是一个专门用于http的模块,urllib和urllib2也都是基于对它进行了更上层次的封装

    我记得刚开始的时候,公司用的cdn有段时间抽风,全球40多个节点总是有那么几个节点
    不同步,导致玩家加载的是老的活动图片,玩家在论坛抱怨,国外的玩家抱怨,那可
    不像国内的(客服MM万篇一律:您的情况我已经收到,已经在处理了请稍后)。
    国外的要是不立马赶紧马上处理好,玩家会直接撤款,搞不好还告你。。
    论坛一旦接到这样的情况马上就得打电话给我们,管尼码半夜几点。(运维的悲哀)
    刚开始时候只能写host绑域名然后打开浏览器一个一个去测。40多个地址啊,手工去弄起码20分钟以后才能查出来是哪个节点不同步
    后来就直接写脚本完成了,40多个节点测完也顶多一分把钟的事情
    原理:一般CDN都是按照地区智能DNS解析的。每个地区ping出来的地址都不一样。按照本地连接链接域名的方式是没法遍历那些节点的,你只能获得离你最近的那个节点(要么就像我写host那样弄)。
    后来想到一个办法HTTP是基于TCP/IP的,凡是基于TCP/IP的都是可以用IP地址通信的,而web服务器,都是识别主机名的(就是域名),于是就写了类似下面这个脚本的用来测试。。
    源脚本在以前公司的服务器上,这个我是用58的cdn测的(他们用的网宿的)

     1 coding:utf-8
     2 import httplib
     3 import hashlib
     4 uri="/js/v7/hp/19h_79463675356567.js" #url路径
     5 #CDN节点的IP列表,第一个是本地虚拟机,web目录下没文件的
     6 cdnnode=["192.168.1.90","58.221.56.5","117.21.189.108","182.140.147.57","113.107.56.96","58.51.95.157","113.107.236.12","198.47.104.131","209.170.78.73"]
     7 Host="pic2.58.com" #CDN用的域名
     8 for i in cdnnode:
     9     conn=httplib.HTTPConnection(i)  #先链接上IP
    10     conn.request(method="GET",    #以GET的方式发送请求
    11                  url=uri,            #请求的web路径
    12                  headers={'Host':Host,  #请求头里面的主机名,
    13                                  "User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, lik    e Gecko) Chrome/33.0.1750.152 Safari/537.36",#这个是我模拟的浏览器信息
    14                  "Referer":"im is test"})#请求来源(那些防盗链的基本上就是检查这个字段),本来就测试用的
    15     response=conn.getresponse()  #获取CDN的回应内容信息 
    16     print i,response.status      #打印IP和http状态码
    17     print response.getheaders()  #打印回应头信息,以列表嵌元组的方式表示
    18     print hashlib.md5(response.read()).hexdigest() #读取回应的内容信息,然后再计算出他的MD5值
    19     print
    20     conn.close()  #链接关闭

    执行结果

     1 root@zing:~/Desktop# python h.py 
     2 192.168.1.90 404  #本地虚拟主机里面没有那个文件,所以饭或404页面
     3 [('date', 'Thu, 03 Apr 2014 02:12:42 GMT'), ('content-length', '571'), ('content-type', 'text/html'), ('connection', 'keep-alive'), ('server', 'nginx/1.0.15')]
     4 d0ad532febcf12aa3559ce2a3f8324b8   #这是404页面的MD5值
     5  
     6 #下面的是cdn的测试数据,从x-via的最后一部分可以看出他们使用的是不同的节点
     7 58.221.56.5 200  
     8 [('content-length', '14803'), ('accept-ranges', 'bytes'), ('x-via', '1.1 jszjsx20:88 (Cdn Cache Server V2.0), 1.1 zjjhdx36:8104 (Cdn Cache Server V2.0), 1.1 nt42:0 (Cdn Cache Server V2.0)'), ('server', 'nginx/1.4.2'), ('last-modified', 'Mon, 03 Mar 2014 07:28:52 GMT'), ('connection', 'keep-alive'), ('etag', '"53142f34-39d3"'), ('date', 'Wed, 02 Apr 2014 14:14:43 GMT'), ('content-type', 'application/x-javascript')]
     9 10f96bdb2285851ee5b553dcd3bdd5e1
    10  
    11 117.21.189.108 200
    12 [('content-length', '14803'), ('accept-ranges', 'bytes'), ('x-via', '1.1 jszjsx20:88 (Cdn Cache Server V2.0), 1.1 zjjhdx36:8104 (Cdn Cache Server V2.0), 1.1 jxjj111:10 (Cdn Cache Server V2.0)'), ('server', 'nginx/1.4.2'), ('last-modified', 'Mon, 03 Mar 2014 07:28:52 GMT'), ('connection', 'keep-alive'), ('etag', '"53142f34-39d3"'), ('date', 'Wed, 02 Apr 2014 14:14:43 GMT'), ('content-type', 'application/x-javascript')]
    13 10f96bdb2285851ee5b553dcd3bdd5e1
    14  
    15 182.140.147.57 200
    16 [('content-length', '14803'), ('accept-ranges', 'bytes'), ('x-via', '1.1 jszjsx20:88 (Cdn Cache Server V2.0), 1.1 zjjhdx36:8104 (Cdn Cache Server V2.0), 1.1 cdxx61:6 (Cdn Cache Server V2.0)'), ('server', 'nginx/1.4.2'), ('last-modified', 'Mon, 03 Mar 2014 07:28:52 GMT'), ('connection', 'keep-alive'), ('etag', '"53142f34-39d3"'), ('date', 'Wed, 02 Apr 2014 14:14:43 GMT'), ('content-type', 'application/x-javascript')]
    17 10f96bdb2285851ee5b553dcd3bdd5e1
    18  
    19 113.107.56.96 200
    20 [('content-length', '14803'), ('accept-ranges', 'bytes'), ('x-via', '1.1 jszjsx20:88 (Cdn Cache Server V2.0), 1.1 zjjhdx36:8104 (Cdn Cache Server V2.0), 1.1 jydx39:0 (Cdn Cache Server V2.0)'), ('server', 'nginx/1.4.2'), ('last-modified', 'Mon, 03 Mar 2014 07:28:52 GMT'), ('connection', 'keep-alive'), ('etag', '"53142f34-39d3"'), ('date', 'Wed, 02 Apr 2014 14:14:43 GMT'), ('content-type', 'application/x-javascript')]
    21 10f96bdb2285851ee5b553dcd3bdd5e1
    22  
    23 58.51.95.157 200
    24 [('content-length', '14803'), ('accept-ranges', 'bytes'), ('x-via', '1.1 jszjsx20:88 (Cdn Cache Server V2.0), 1.1 zjjhdx36:8104 (Cdn Cache Server V2.0), 1.1 hbxf145:2 (Cdn Cache Server V2.0)'), ('server', 'nginx/1.4.2'), ('last-modified', 'Mon, 03 Mar 2014 07:28:52 GMT'), ('connection', 'keep-alive'), ('etag', '"53142f34-39d3"'), ('date', 'Wed, 02 Apr 2014 14:14:44 GMT'), ('content-type', 'application/x-javascript')]
    25 10f96bdb2285851ee5b553dcd3bdd5e1
    26  
    27 113.107.236.12 200
    28 [('content-length', '14803'), ('accept-ranges', 'bytes'), ('x-via', '1.1 jszjsx20:88 (Cdn Cache Server V2.0), 1.1 zjjhdx36:8104 (Cdn Cache Server V2.0), 1.1 gdyf15:1 (Cdn Cache Server V2.0)'), ('server', 'nginx/1.4.2'), ('last-modified', 'Mon, 03 Mar 2014 07:28:52 GMT'), ('connection', 'keep-alive'), ('etag', '"53142f34-39d3"'), ('date', 'Wed, 02 Apr 2014 14:14:44 GMT'), ('content-type', 'application/x-javascript')]
    29 10f96bdb2285851ee5b553dcd3bdd5e1
    30  
    31 198.47.104.131 200
    32 [('content-length', '14803'), ('accept-ranges', 'bytes'), ('x-via', '1.1 jszjsx22:8104 (Cdn Cache Server V2.0), 1.1 hdwt37:8107 (Cdn Cache Server V2.0), 1.1 mgdls130:3 (Cdn Cache Server V2.0)'), ('server', 'nginx/1.4.2'), ('last-modified', 'Mon, 03 Mar 2014 07:28:52 GMT'), ('connection', 'keep-alive'), ('etag', '"53142f34-39d3"'), ('date', 'Wed, 02 Apr 2014 14:14:45 GMT'), ('content-type', 'application/x-javascript')]
    33 10f96bdb2285851ee5b553dcd3bdd5e1
    34  
    35 209.170.78.73 200
    36 [('content-length', '14803'), ('accept-ranges', 'bytes'), ('x-via', '1.1 jszjsx22:8104 (Cdn Cache Server V2.0), 1.1 hdwt37:8107 (Cdn Cache Server V2.0), 1.1 fra72:1 (Cdn Cache Server V2.0)'), ('server', 'nginx/1.4.2'), ('last-modified', 'Mon, 03 Mar 2014 07:28:52 GMT'), ('connection', 'keep-alive'), ('etag', '"53142f34-39d3"'), ('date', 'Wed, 02 Apr 2014 14:14:33 GMT'), ('content-type', 'application/x-javascript'), ('age', '1')]
    37 10f96bdb2285851ee5b553dcd3bdd5e1

     一些常用的方法函数
    request(method,url,body,head):
    method:请求的方式,一般是post和get
    url:请求的资源路径
    body:需要提交到服务器上的数据,一般需要用urllib.urlencode(date) 编码一次才行,如果提交的是json数据的话需要调用json模块
    header:请求头
    response.read():读取响应消息内容
    response.getheader('name'):name为指定的头
    response.getheaders():以为列表嵌元组的方式获取响应header

  • 相关阅读:
    XML解析
    资源管理
    Android中的动态字符串的处理
    消息提示的三种方式
    程序调控和监视(Logcat,Debug)
    选择改变事件OnCheckedChange
    递归和非递归分别实现求n的阶乘
    递归和非递归分别实现strlen
    编写一个函数 reverse_string(char * string)实现:将参数字符串中的字符反向排列 。(递归实现)
    写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和
  • 原文地址:https://www.cnblogs.com/z-ping/p/3840666.html
Copyright © 2020-2023  润新知