Fiddler實踐心得

weixin_34208283發表於2017-09-13

本文章轉載於搜狗測試

一、打斷點和AutoResponder返回404/502等狀態碼的不同

之前一直以為這兩種方式沒有區別,都是阻斷了請求,改變了返回結果。但是今天在測一個問題時,恍然間明白了兩者的不同。

1、打斷點,是阻塞了請求,一直沒有結果返回,請求將線上程中一直存在,直到超時被踢出來。

2、AutoResponder返回404/502,這種情況是有結果返回的,代表請求也結束了,不會線上程中一直存在。

執行緒,細心的朋友可能發現了,執行緒,是的,在遇到執行緒相關的問題時,兩者就明顯的不同了。

其實在發現兩者線上程上的不同之後,再仔細思考這個問題,兩者本質上是伺服器是否響應的問題,是否有狀態碼的問題。打斷點阻塞,沒有狀態碼,伺服器是沒有響應。404/502是伺服器有響應的。體現中執行緒中的不同,只是一個症狀體現而已。

二、修改Response資料時要注意超時的問題

通過設定Rules -> Automatic Breakpoints ->After Response,之後再修改響應回來的資料,來實現修改response的內容。但是這樣修改資料很容易造成另外一個問題,那就是請求超時導致客戶端不對請求做處理。

怎麼理解呢? 就是客戶端傳送一個請求出去,如果在指定的時間內請求沒有返回,則認為該請求超時了,就算以後這個請求返回資料,則客戶端也不再對請求做出響應。

如果,修改內容的操作能夠很快的進行,放行斷點,在超時時間之內完成,那麼修改之後的內容將會被客戶端處理。

如果,修改內容的操作大於超時時間,就算之後將斷點放行,請求返回200,這個時候客戶端是不做任何處理的,也可以理解為修改的內容沒有產生效果。

綜合上述,一定要注意修改內容的操作時間和超時時間的關係。

其實在修改資料的時候,不太容易去把控時間的長短,也很容易造成修改資料失誤,那麼怎麼樣才能很好的解決這個問題呢?

可以用AutoResponder自動響應資料,用本地檔案替換伺服器的返回資料。這樣就不用在打斷點之後急忙的修改資料,也不怕一不小心把資料修改錯了。AutoResponder功能替換是一瞬間的事兒,也不用擔心超時的問題,真的是一舉兩得啊。

三、重新認識Decode

在之前的認識中,知道有這樣的Decode在工具欄中,也知道是解密的,但是在實踐中並沒有涉及到這塊,今天就被我碰到了,而且自己也跳到坑裡了,還好還好最後終於明白了。

Decode在平時預設是被選中的,我不知道什麼時候就給取消了。

5432903-0f5d65087285c7d1

今天的情況是這個樣子的:

客戶端請求一個介面的資料是加密的,通過save -> response -> response body ,將返回結果儲存下來,之後用這個本地檔案替換伺服器返回的資料。結果客戶端接到資料之後,在後臺報了一個錯誤,提示資料格式不對。

正常的業務流程是客戶端在接到資料之後,需要對資料進行解密。現在是在對資料解密的時候發現資料格式不對。

儲存下來的response body,如下所示:

5432903-1b1e1ef3836d7439

服務端一陣排查問題,客戶端一陣排查問題,沒毛病啊!!!最後問我,你的本地檔案內容是什麼?我把內容貼出去之後,大家都是很疑問 6 、0 是怎麼回事?

服務端說不是我們返回的,客戶端說不是我們新增的。

OH MY GOD ! 我也急了,怎麼可能是我這裡的問題,平時都是這樣用本地檔案替換伺服器檔案的,沒毛病啊!

後來仔細瞅了瞅,發現了 Response body is encoded ,Click to decode . 點了一下,哦~~~頓時豁然開朗。

第一行和最後一行是數字,其實是對資料failed加的密,雖然看起來是明文,6是資料failed的長度。

應該也看到Response body is encoded. Click to decode. understand ? 點選一下就可以解密了。

解密之後的資料,如下所示:

5432903-e5c608fcaa41ecf5

這個時候再save -> response -> response body ,將返回結果儲存下來,AutoResponder替換伺服器檔案,客戶端就可以正常的解密執行了。

問題雖然是解決了,但是得找到真正的原因啊?

提到解密,當然是第一時間想到了Decode,一看,居然沒有被選中,突然間就明白了Decode的作用,如果返回的資料時加密的,就自動解密。

為了驗證,選中Decode,又重新請求了一次,結果你猜怎麼著,還真的是這個道理。

細節決定成敗啊,任何一個小功能都不能被忽視啊!盆友們啊,都要慎重啊,慎重!

四、bpu 阻塞多個請求

背景:

今天同事問我,bpu怎麼同時阻塞多個請求呢?

同事 :

我是這樣寫的 bpu a b ,我這樣寫怎麼實現不了同時阻塞a 和 b 請求呢?

我:

我沒有這樣阻塞過,但是在我的理解裡應該這樣寫,bpu a enter執行,bpu b enter執行,分開執行(因為我之前沒有這樣阻塞過,只是按照自己的理解這樣認為的,接下來就打臉了,不都是你以為的就是你以為的啊,淚奔啊)。

同事:

我按照你說的方式做了,但是還是不可以啊。

額~,好尷尬啊

我只有默默的開啟Fiddler,ctr+R開啟指令碼,ctr+F 輸入關鍵字 bpu,找到bpu命令所在的核心程式碼

case "bpu":

var len = sParams.Length ;

if(sParams.Length<2){

bpRequestURI=null; FiddlerObject.StatusText="bpRequestURI breakpoint cleared";

return false;

}

var len = sParams.Length ;

bpRequestURI= sParams[1];

FiddlerObject.StatusText="RequestURI breakpoint for "+sParams[1];

return true;

核心: bpRequestURI= sParams[1]; 只取了一個引數值。

場景1解析(也就是同事的執行方法): bpu /sdk /zwf ,

使用空格隔開的,那麼

sParams[0] = “bpu”

sParams[1] = “/sdk”

sParams[2] = “/zwf”

只取了sParams[1] = “/sdk”,所以只會阻塞包含/sdk的請求

場景2解析(也就是我認為的方法,允許我哭一會):

bpu /sdk

bpu /zwf

每次執行bpRequestURI,都會被賦新值,所以我阻塞包含/zwf 的請求

我們怎麼樣才可以實現,阻塞多個請求呢?

讓我沿著核心程式碼,順藤抹瓜,ctr+F 輸入關鍵字 bpRequestURI 查詢,找到引數定義的地方

這個是定義變數的地方,是全域性變數

//在main()方法中

// These static variables are used for simple breakpointing & other QuickExec rules

BindPref("fiddlerscript.ephemeral.bpRequestURI")

publicstaticvarbpRequestURI:String=null;

找到使用此引數,bpRequestURI 不為null,並且 請求的uri 包含bpRequestURI ,則阻斷該請求

if((null!=bpRequestURI) && oSession.uriContains(bpRequestURI)) {

oSession["x-breakrequest"]="uri";

}

這樣捋下來,就搞明白了,阻塞請求是怎麼個原理了,是不是也很簡單呢?!

接下來就是改造它來實現bpu 阻塞多個請求了。

第一步:

//在main()新增如下程式碼

BindPref(“fiddlerscript.ephemeral.bpRequestURI”)

//陣列的長度10,10個阻塞的命令,內容為空格,和bpu命令用空格分割保持一致

public static var bpRequestURIs:String[] = [” “,” “,” “,” “,” “,” “,” “,” “,” “,” “] ;

第二步:

case"bpu":

varlen1 = sParams.Length ;

varlen2 = bpRequestURIs.Length;

//每次賦值之前先恢復原始值

for(vari =0; i< len2; i++){

bpRequestURIs[i]=" ";

}

if(len1 <2) {bpRequestURI=null; FiddlerObject.StatusText="RequestURI breakpoint cleared";returnfalse;}

vartext ="";

for(vari =1; i < len1; i++){

bpRequestURIs[i-1] = sParams[i];

text += sParams[i] +" ";

}

FiddlerObject.StatusText="RequestURI breakpoint for "+ text;

returntrue;

第三步:

// 在OnBeforeRequest() 方法中

// 註釋掉之前的方法

//  if ((null!=bpRequestURI) && oSession.uriContains(bpRequestURI)) {

//      oSession["x-breakrequest"]="uri";

//  }

varlen= bpRequestURIs.Length;

for(vari =0; i

if(bpRequestURIs[i]!=null && bpRequestURIs[i]!=" "&& oSession.uriContains(bpRequestURIs[i]) ){

oSession["x-breakrequest"]="uri";

}

}

完成,這樣就完成了bpu同時阻塞多個請求了!

相關文章