FiddlerCoreAPI開發(一)源碼分析
1.前言
前一段時間想利用fiddlercore截取本地HTTPS的流量做一些分析,按照樣例代碼的註釋學習了一下,沒搞清楚怎麽實現,後來又在網上查了些資料,對HTTPS的處理提及很少,都沒有解決我的問題,主要是HTTPS證書的問題,索性自己研究了一下,終於解決了問題。我會在下篇文章中分享下我的思路,本篇文章先簡單分析下fiddlercore自帶樣例的代碼,幫助剛接觸fiddlercore的人快速入門,如果有說的不對的地方,歡迎批評指正。
2.源碼分析
首先從官網下載FiddlerCoreAPI
https://www.telerik.com/purchase/fiddlercore
下載下來是一個安裝文件,解壓後有demo和FiddlerCoreAPI庫,打開樣例代碼工程,開始分析。
從主函數開始。
List<Fiddler.Session> oAllSessions = new List<Fiddler.Session>();
定義了一個fiddler的Session類的List,裏面存放的是客戶端和服務端的消息。
Fiddler.FiddlerApplication.SetAppDisplayName("FiddlerCoreDemoApp");
命名自己的應用程序。
Fiddler.FiddlerApplication.OnNotification += delegate(object sender, NotificationEventArgs oNEA) { Console.WriteLine("** NotifyUser: " + oNEA.NotifyString); }; Fiddler.FiddlerApplication.Log.OnLogString += delegate(object sender, LogEventArgs oLEA) { Console.WriteLine("** LogString: " + oLEA.LogString); };
這兩句,第一句綁定了用戶通知事件的函數,具體什麽時候觸發沒仔細研究,第二句綁定了FiddlerApplication.Log觸發的事件(FiddlerCore自己的日誌系統),後面打印內容都會用到,總之這兩句就是把內容打印在控制臺上。
Fiddler.FiddlerApplication.BeforeRequest += delegate(Fiddler.Session oS) { // Console.WriteLine("Before request for:\t" + oS.fullUrl); oS.bBufferResponse = false; Monitor.Enter(oAllSessions); oAllSessions.Add(oS); Monitor.Exit(oAllSessions); if ((oS.oRequest.pipeClient.LocalPort == iSecureEndpointPort) && (oS.hostname == sSecureEndpointHostname)) { oS.utilCreateResponseAndBypassServer(); oS.oResponse.headers.SetStatus(200, "Ok"); oS.oResponse["Content-Type"] = "text/html; charset=UTF-8"; oS.oResponse["Cache-Control"] = "private, max-age=0"; oS.utilSetResponseBody("<html><body>Request for httpS://" + sSecureEndpointHostname + ":" + iSecureEndpointPort.ToString() + " received. Your request was:<br /><plaintext>" + oS.oRequest.headers.ToString()); } };
BeforeRequest,顧名思義,就是在客戶端發送請求後攔截之,在此函數中可以獲取甚至修改請求的內容。
oS.fullUrl為請求的URL。
bBufferResponse這個屬性,要設置成true才可以修改服務器響應的內容。
接下來的if判斷,是一個例子,如果你訪問https://localhost:7777,他會攔截你的請求,並構造響應報文返回給你,服務端不會收到該請求。
Fiddler.FiddlerApplication.Startup(iPort, oFCSF);
開啟FiddlerCore在指定端口的監聽。
oSecureEndpoint = FiddlerApplication.CreateProxyEndpoint(iSecureEndpointPort, true, sSecureEndpointHostname);
建立在指定端口的HTTPS的監聽,這個函數下篇文章中還會說到。
至此,這個樣例的主要代碼就分析完了,它實現了簡單的http請求截獲和響應替換,剩余的代碼都是些與用戶的交互,這裏不再贅述。
3.註意
前面代碼執行完後,一定要調用Shutdown()函數關閉FiddlerCore應用,不然會導致瀏覽器還是通過Fiddler代理,上不了網。
Fiddler.FiddlerApplication.Shutdown();
在證書管理器中可以看到FiddlerCore安裝了自己的證書。
閱讀樣例代碼的註釋很有幫助,還有FiddlerCore的幫助文檔,裏面各個函數的功能說的很詳細。
FiddlerCoreAPI開發(一)源碼分析