2016-09-22 10 views
0

У меня есть Fiddler, настроенный как обратный прокси, чтобы действовать как человек посередине между клиентом и сервером. У меня есть пользовательское правило, которое будет посылать запрос от прокси дал определенный ответ URI:Fiddler - отправить запрос для прокси-клиента

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

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

Есть ли способ, чтобы направить запрос, выданный utilIssueRequest обратно на клиентской машине?

ответ

1

Вы могли бы, но это очень сложно сделать так. Обычно вы просто изменяете запрос внутри обработчика OnBeforeRequest, чтобы заголовок URL/хоста указывал на новый целевой сервер.

+0

По какой-то причине я не понимаю этот ответ. Чтобы быть ясным, здесь я пытаюсь «предварительно выбрать» страницу с сервера, поэтому я хочу ввести новый запрос от прокси, не изменяя существующий запрос. Я понимаю, что есть много вещей, которые следует учитывать при «предварительной выборке», но сейчас я сохраняю проблему простой. – SheerSt

+0

Затем вам нужно объяснить, что вы имеете в виду, когда говорите «направить запрос, полученный утилитой utilIssueRequest, обратно на клиентскую машину». FiddlerCore получает ответ от вложенного запроса, но на самом деле у него нет никакого способа «дать» его клиенту, потому что клиент не просил его начать. – EricLaw

+0

Кажется, что мой вопрос сложнее, чем я сначала подумал - я добавил ответ ниже о подходе, который работал для меня. – SheerSt

0

Прошу прощения - мой вопрос в конечном итоге потребовал больше деталей, чем я знал во время запроса. Если кто-то заинтересован, я решил эту проблему, используя этот странный метод:

Топология: клиент Windows -> прокси-сервер Fiddler на клиенте Windows -> обратный прокси-сервер Fiddler на человеке-в-середине -> сервер Windows

кода в Windows Client 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()'. Также убедитесь, что 'return' после' utilSetResponseBody' – EricLaw

+0

@ EricLaw благодарит вас за продолжение! Я очень согласен с тем, что потеря заголовков ответов плоха - я в настоящее время не знаю, как их сохранить. Мне нужно каким-то образом закодировать начальные заголовки ответов в строке, а также установить заголовки запросов из этой строки на стороне клиента (не удалось найти что-либо в документах, относящихся к этому, только utilDecodeResponse() и utilSetResponseBody()) – SheerSt

+0

HTTPResponseHeaders - это объект, вы просто клонируете их, например \t 'var cachedHeaders: HTTPResponseHeaders = oSession.ResponseHeaders.Clone();'. Я не уверен, что вы имеете в виду, когда говорите «установите заголовки запроса» - это заголовки RESPONSE, и вы можете установить их на объект, созданный с помощью 'utilCreateResponseAndBypassServer()' – EricLaw