httplib模塊,測試cdn節點文件同步

httplib模塊是一個專門用於http的模塊,urllib和urllib2也都是基於對它進行了更上層次的封裝javascript

我記得剛開始的時候,公司用的cdn有段時間抽風,全球40多個節點老是有那麼幾個節點
不一樣步,致使玩家加載的是老的活動圖片,玩家在論壇抱怨,國外的玩家抱怨,那可
不像國內的(客服MM萬篇一概:您的狀況我已經收到,已經在處理了請稍後)。
國外的要是不立馬趕忙立刻處理好,玩家會直接撤款,搞很差還告你。。
論壇一旦接到這樣的狀況立刻就得打電話給咱們,管尼碼半夜幾點。(運維的悲哀)
剛開始時候只能寫host綁域名而後打開瀏覽器一個一個去測。40多個地址啊,手工去弄起碼20分鐘之後才能查出來是哪一個節點不一樣步
後來就直接寫腳本完成了,40多個節點測完也頂多一分把鐘的事情
原理:通常CDN都是按照地區智能DNS解析的。每一個地區ping出來的地址都不同。按照本地鏈接連接域名的方式是無法遍歷那些節點的,你只能得到離你最近的那個節點(要麼就像我寫host那樣弄)。
後來想到一個辦法HTTP是基於TCP/IP的,凡是基於TCP/IP的都是能夠用IP地址通訊的,而web服務器,都是識別主機名的(就是域名),因而就寫了相似下面這個腳本的用來測試。。
源腳本在之前公司的服務器上,這個我是用58的cdn測的(他們用的網宿的)html

 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()  #連接關閉

執行結果java

 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():覺得列表嵌元組的方式獲取響應headernode

相關文章
相關標籤/搜索