2016-09-22 98 views
0

我有提琴手配置爲反向代理,以充當一個人在客戶端和服務器之間的中間。我有一個自定義規則,將發送給予一定的響應URI來自代理的請求:提琴手 - 發送代理客戶端請求

static function OnBeforeResponse(oSession: Session) { 
    ... 
    if (oSession.uriContains("something.aspx")) { 

     var request = "..." 
     FiddlerObject.utilIssueRequest(request); 
    } 
... 
} 

有什麼辦法來路由通過utilIssueRequest發出返回給客戶機的請求?

回答

1

你可以,但這樣做非常複雜。通常情況下,您只需修改OnBeforeRequest處理程序中的請求,以便URL/Host頭指向新的目標服務器。

+0

由於某種原因,我不理解這個答案。要清楚,在這裏我試圖從服務器'預取'一個頁面 - 所以我想從代理引入一個新的請求,而不是修改現有的請求。我意識到有更多的事情需要考慮'預取',但我現在保持簡單的問題。 – SheerSt

+0

然後,您需要解釋當您說「將utilIssueRequest發出的請求路由回客戶機器時」的含義。 FiddlerCore從嵌套請求獲取響應,但它沒有任何方法可以將它「提供」給客戶端,因爲客戶端並沒有要求它開始。 – EricLaw

+0

看起來我的問題比我第一次想到的更復雜 - 我在下面添加了一個適用於我的方法的答案。 – SheerSt

0

我很抱歉 - 我的問題最終要求比我在提問時意識到的更多細節。如果有人有興趣,我用這個奇怪的方法解決了這個問題:

拓撲:Windows客戶端 - > Fiddler代理在Windows客戶端 - > Fiddler反向代理中間人 - > Windows服務器

代碼在Windows客戶端CustomRules.js:

static function OnBeforeRequest(oSession: Session) { 

    //detect prefetch response 
    if (oSession.oRequest.headers.Exists("X-FiddlerPrefetch")) { 
     //dump response into a variable 
     oSession.utilDecodeRequest(); 
     prefetchResponse = System.Text.Encoding.UTF8.GetString(oSession.requestBodyBytes); 
    } 

    //detect uri that was prefetched 
    if (oSession.uriContains("/some_uri")) { 
     //wait for prefetch - cant find any docs for how to 'sleep' here 
     // while (prefetchResponse === "") { 
      // Sleep(1); 
     // } 

     //use cached response 
     oSession.utilCreateResponseAndBypassServer(); 
     oSession.utilSetResponseBody(prefetchResponse); 

    } 

    //redirect traffic to man-in-the-middle 
    if (oSession.HostnameIs("some_server")) { 
     oSession["x-overrideHost"] = "man-in-the-middle:443"; 
    } 
... 

守則人在這方面的中間人CustomRules.js:

static function OnBeforeResponse(oSession: Session) { 

    //intercept response containing prefetch material 
    if (oSession.uriContains("some_response")) { 

     //parse response body for some prefetch info 
     ... 

     //compose request 
     var request = "POST " + uri + " HTTP/1.1" + "\n" + 
     "X-FiddlerOpt: test\n" + 
     ... 

     //send off to server 
     FiddlerObject.utilIssueRequest(request); 
    } 


    //detect the prefetch response, send to client 
    if (oSession.oRequest.headers.Exists("X-FiddlerOpt")) { 

     oSession.utilDecodeResponse(); 
     var payload = System.Text.Encoding.UTF8.GetString(oSession.responseBodyBytes);; 

     //compose request 
     var request = "GET " + "http://windows_client:8888/ HTTP/1.1" + "\n" + 
     "Content-Length: " + payload.length + "\n" + 
     "X-FiddlerPrefetch: test\n" + 
     "\n" + 
     payload 

     //send request 
     FiddlerObject.utilIssueRequest(request); 
    } 
... 

正如我敢肯定有更簡單的或更好的方法做這個,歡迎任何反饋。

+0

因此,這裏的目標是讓Fiddler充當「投機饋送」緩存,在那裏獲取資源供以後使用?這通常是可以的,但是你失去了所有的HTTP標頭(這可能非常糟糕),並且你認爲響應體是UTF8(這可能非常糟糕)。考慮使用'oSession.GetResponseBodyAsString()'方法。 'utilSetResponseBody'後面一定要'return' – EricLaw

+0

@EricLaw感謝您的關注!我非常同意,丟失響應頭是不好的 - 我目前還沒有意識到保留它們的方法。我需要一些方法來將初始響應頭文件編碼爲一個字符串,並在客戶端設置該字符串的請求頭文件(找不到相關文檔中的任何內容,只有utilDecodeResponse()和utilSetResponseBody()) – SheerSt

+0

HTTPResponseHeaders是一個對象,你只需克隆它們,例如\t'var cachedHeaders:HTTPResponseHeaders = oSession.ResponseHeaders.Clone();'。當你說「設置請求頭文件」時,我不確定你的意思 - 這些是RESPONSE頭文件,你可以在你通過utilCreateResponseAndBypassServer()創建的對象上設置它們。 – EricLaw

相關問題