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

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

具體的方法能夠參考官網: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做者的提問。ide

 

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

 

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

 

建議在OnPeekAtResponseHeaders中根據須要,設置bBufferResponse ,例如個人代碼:spa

    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','');

        }
    }
相關文章
相關標籤/搜索