Fiddler 修改返回內容 OnBeforeResponse 無效 沒用


Fiddler自定義腳本可以實現很強大的內容替換,包括很有意義的——修改返回內容。

具體的方法可以參考官網:http://docs.telerik.com/fiddler/KnowledgeBase/FiddlerScript/ModifyRequestOrResponse

 

而這里想說的是,官網的說明並不准確,可能舊版本Fiddler是沒問題的,但在4.X,我發現只修改OnBeforeResponse的腳本是無法實現效果的,雖然Fiddler的抓包看起來是成功修改了返回內容,但實際上,瀏覽器得到的數據還是跟服務器原來返回的一樣。

說這么多,遇到問題的同學自然懂,如果沒遇到問題的,就直接當我說廢話好了。

 

這里純屬分享,希望幫助到同樣遇到困難的人。翻了一圈google都沒發現類似的問題,最后遇到這個:http://www.telerik.com/forums/code-working-in-fiddler-but-not-working-in-fiddlercore,也是一個國人找到Fiddler作者的提問。

 

問題關鍵點是:必須在OnBeforeResponse前,設置oSession.bBufferResponse = true;

 

顧名思義,開啟了緩存模式來處理返回內容,才能最終反饋到瀏覽器上,否則,保持原有的流式模式的話,就會出現修改和返回同時進行,瀏覽器得到的還是原版的數據。

 

建議在OnPeekAtResponseHeaders中根據需要,設置bBufferResponse ,例如我的代碼:

    static function OnPeekAtResponseHeaders(oSession: Session) {
        //FiddlerApplication.Log.LogFormat("Session {0}: Response header peek shows status is {1}", oSession.id, oSession.responseCode);
        if (m_DisableCaching) {
            oSession.oResponse.headers.Remove("Expires");
            oSession.oResponse["Cache-Control"] = "no-cache";
        }

        if ((bpStatus>0) && (oSession.responseCode == bpStatus)) {
            oSession["x-breakresponse"]="status";
            oSession.bBufferResponse = true;
        }
        
        if ((null!=bpResponseURI) && oSession.uriContains(bpResponseURI)) {
            oSession["x-breakresponse"]="uri";
            oSession.bBufferResponse = true;
        }
        
        
        if (oSession.HostnameIs("cmshow.qq.com") && oSession.oResponse.headers.ExistsAndContains("Content-Type","text/html")){
            oSession.bBufferResponse = true;    //需要在返回頭這里就設置buffer處理,否則,后續無法在onBeforeResponse中修改body(修改的動作不會阻塞原來的返回)
        }

    }

    static function OnBeforeResponse(oSession: Session) {
        if (m_Hide304s && oSession.responseCode == 304) {
            oSession["ui-hide"] = "true";
        }if (oSession.HostnameIs("cmshow.qq.com") && oSession.oResponse.headers.ExistsAndContains("Content-Type","text/html")){
            oSession.utilDecodeResponse();
            if(NO_SSO){
                oSession.utilReplaceInResponse('</head>','<script>window.nosso = true;</script></head>');
            } 
            if(enable_LOG){
                oSession.utilReplaceInResponse('</head>','<script>window.debug = true;</script></head>');
            }
            oSession.utilReplaceInResponse('Content-Security-Policy','');

        }
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM