我很抱歉 - 我的問題最終要求比我在提問時意識到的更多細節。如果有人有興趣,我用這個奇怪的方法解決了這個問題:
拓撲: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);
}
...
正如我敢肯定有更簡單的或更好的方法做這個,歡迎任何反饋。
由於某種原因,我不理解這個答案。要清楚,在這裏我試圖從服務器'預取'一個頁面 - 所以我想從代理引入一個新的請求,而不是修改現有的請求。我意識到有更多的事情需要考慮'預取',但我現在保持簡單的問題。 – SheerSt
然後,您需要解釋當您說「將utilIssueRequest發出的請求路由回客戶機器時」的含義。 FiddlerCore從嵌套請求獲取響應,但它沒有任何方法可以將它「提供」給客戶端,因爲客戶端並沒有要求它開始。 – EricLaw
看起來我的問題比我第一次想到的更復雜 - 我在下面添加了一個適用於我的方法的答案。 – SheerSt