如何閱讀goagent的代碼?

作為一個剛剛學習完了python語法的新手,已經嘗試用urllib和bs4寫了小爬蟲,然後看到知乎上面很多大神推薦閱讀goagent 的代碼,但大段代碼應當按照什麼順序由淺入深才能看懂呢?goagent/goagent · GitHub


如果你明白什麼是socket、http,啥叫代理,最好看過Google App Engine的文檔,goagent的代碼簡直不能再直白。

問題是似乎很多人覺得會寫代碼搬包搬模塊就夠了,以上這些東西似乎根本不需要……


推薦閱讀 tornado 的代碼。Facebook 出品,代碼規範,文檔齊全,作者也非常友好。而且讀完之後還可以用來做各種網路相關的事情~


利益相關:http://github.com/zszszsz/xx-net.js,因為受不了goagent的bug和設計,正在用nodejs重寫goagent的client side……然後我發現和goagent的server side保持兼容好麻煩啊,自我感覺mitm proxy部分的設計比xx-net要好一些……雖然沒寫完呢,畢竟每天要上課寫作業還要/*lol拿首勝*/背單詞什麼的……我的代碼里絕大部分是沒填的坑

其實goagent寫得不太好吧,畢竟goagent手動實現了tls,而且針對google app engine有一些不那麼優雅的hack…………而且個人感覺goagent的代碼比較混亂不好看,最新的goagent包含在xx-net/xx-net下面,goagent本身已經全刪了

首先是goagent的代碼是分server side和client side,然後client這邊分三部分,mitm proxy,ip scanner和https client

首先看mitm proxy吧,相關代碼分布在好幾個文件中,首先是在入口點proxy.py中

proxy_daemon = simple_http_server.HTTPServer((config.LISTEN_IP, config.LISTEN_PORT), proxy_handler.GAEProxyHandler)

好我們繼續去proxy_handler.py的GAEProxyHandler,大部分的細節已經在do_METHOD和後續裡面了,不過既然是https mitm,少不了https相關的代碼,所以我們去看http connect的處理函數do_CONNECT,http的部分是調用do_METHOD,然後調用do_AGENT,這個do_AGENT是前後端的交接層

do_CONNECT這個函數做了一些檢查然後根據設置調用do_CONNECT_AGENT和do_CONNECT_DIRECT,後面的DIRECT方法是用來直連google系域名的,我們不管它,然後看do_CONNECT_AGENT,這個函數調用了證書生成CertUtil.get_cert(host)並且建立mitm ssl連接,這是https mitm代理最有技術含量的部分,在建立了mitm連接獲得請求內容之後就去調用do_AGENT,proxy部分大概就是這些

然後do_AGENT完了以後就去調用和server side通信的https client代碼了,這裡的實現充滿了hack和看起來毫無卵用的東西,總之……就是把請求胡搞一番然後壓縮一下,再添加一些請求頭部讓server side可以工作,然後再把response胡搞一番返回……都是很gae specific的東西

然後就到了喜聞樂見的ip scanner,當然這是xx-net後來加入的goagent本身並沒有,這個就相當於一個專用於探測google ip的小號nmap……沒啥意思


推薦閱讀:

Python中Turtle模塊的基本指令都有哪些?
如何在同一程序中調用分別用python 2和python 3寫的多個第三方模塊?
為什麼C++讀取文件會比Python慢?
Python3 str在內存中的存儲方式?
自己寫的Python函數,如何調用?

TAG:Python | 編程 | 代碼 | GitHub |