FiddlerCore, декодирующий ответ sdch
Я получаю странный ответ от сайта, который я искал для анализа с FiddlerCore. В инструментах разработчика chrome, если я проверяю ответ, он выглядит совершенно нормально, в fiddler - нет. Фрагмент кода следующим образом (который работал нормально)
String html = oSession.GetResponseBodyAsString();
Возвращает следующее, которое не является html, обратите внимание, что это образец, а не полная огромная строка.
JRHwJNeR\0���\0\0\u0001��D\0�2�\b\0�\u0016�7]<!DOCTYPE html>\n win\">
Это также завалено "\n" и HTML, как это
\n\n\n\n\n \n <meta name=\"treeID\" content=\"dwedxE+pgRQAWIHiFSsAAA==\">\n
Заголовки ответа:
Cache-Control:no-cache, no-store
Connection:keep-alive
Content-Encoding:sdch, gzip
Content-Language:en-US
Content-Type:text/html;charset=UTF-8
Date:Fri, 28 Oct 2016 10:17:02 GMT
Expires:Thu, 01 Jan 1970 00:00:00 GMT
Pragma:no-cache
Server:Apache-Coyote/1.1
Set-Cookie:lidc="b=VB87:g=518:u=60:i=1477649823:t=1477731496:s=AQG-LTdly5mcIjAtiRHIOrKE1TiRWW-l"; Expires=Sat, 29 Oct 2016 08:58:16 GMT; domain=.thedomain.com; Path=/
Set-Cookie:_lipt=deleteMe; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Path=/
Strict-Transport-Security:max-age=0
Transfer-Encoding:chunked
Vary:Accept-Encoding, Avail-Dictionary
X-Content-Type-Options:nosniff
X-Frame-Options:sameorigin
X-FS-UUID:882b3366afaa811400a04937a92b0000
X-Li-Fabric:prod-lva1
X-Li-Pop:prod-tln1-scalable
X-LI-UUID:iCszZq+qgRQAoEk3qSsAAA==
X-XSS-Protection:1; mode=block
Код запуска Fiddler:
Fiddler.FiddlerApplication.AfterSessionComplete += FiddlerApplication_OnAfterSessionComplete;
Fiddler.FiddlerApplication.BeforeResponse += delegate(Fiddler.Session oS) {
oS.utilDecodeResponse();
};
Fiddler.FiddlerApplication.Startup(0, FiddlerCoreStartupFlags.Default);
}
Первоначально я предполагал, что это было chunked/gzipped, поэтому я добавил utilDecodeResponse(); на onBeforeResponse, который не имел никакого эффекта!
Просто, чтобы охватить все базы, которые я также пытался вручную декодировать responseBodyBytes в UTF-8, Unicode, Bigendian и т. Д., Просто на случай, если тип содержимого ответа был неправильным, И отключил JavaScript и загрузил страницу, чтобы доказать, что это не было какой-то напуганной шаблонизацией вещь, которая также не имела никакого значения.
Есть идеи?
ОБНОВИТЬ:
В соответствии с информацией, предоставленной Developer & NineBerry ниже, решение выглядит следующим образом:
Чтобы предотвратить кодирование ответа SDCH, вы можете добавить такой обработчик:
Fiddler.FiddlerApplication.BeforeRequest += delegate (Fiddler.Session oS)
{
oS.oRequest["Accept-Encoding"] = "gzip, deflate, br";
};
Следует отметить, что это не подходит для всего, так как вы вручную устанавливаете заголовки, а не проверяете наличие SDCH, а затем удаляете его, для моих целей это работает нормально, но для использования общих функций прокси-сервера fiddler вы хотелось бы больше логики здесь.
1 ответ
Кодировка содержимого отображается как SDCH - сжатие общего словаря; поэтому ручное декодирование responseBodyBytes в UTF-8, Unicode, Bigendian и т. д. не будет работать в этом случае.
Вы можете найти более подробную информацию о SDCH здесь - SDCH Ref 1 & SDCH Ref 2
Выдержки из вышеуказанного сайта:
Сжатие общего словаря - это метод кодирования контента, который был предложен еще в 2008 году Google и реализован в Chrome и поддерживается рядом серверов Google. Полное предложение можно получить здесь - https://lists.w3.org/Archives/Public/ietf-http-wg/2008JulSep/att-0441/Shared_Dictionary_Compression_over_HTTP.pdf. Вместо того, чтобы копировать содержимое документа в этом сообщении в блоге, я постараюсь обобщить как можно более кратко:
Вся идея протокола заключается в уменьшении избыточности через HTTP-соединения. Количество "общих данных" в ответах HTTP, очевидно, является значительным - например, вы часто будете видеть, как веб-сайт использует общие колонтитулы на нескольких страницах HTML. Если бы клиент должен был хранить эти общие данные локально в "словаре", серверу нужно было бы только указать клиенту, как реконструировать страницу с использованием этого словаря.