Перехват протокола http / https в IE приводит к тому, что запросы GET становятся последовательными - PullRequest
5 голосов
/ 03 апреля 2010

Я использую метод PassthruAPP для подключения к HTTP / HTTPS-запросам, сделанным IE.

По большей части работает хорошо, но я заметил проблему. Одновременно активен только один поток загрузки, обычно IE использует два потока загрузки. Я вижу, как создаются два объекта IInternetProtocol, но IE использует только один объект за раз.

Это происходит с IE7, я еще не пробовал с другими версиями.

Проблема, похоже, заключается в том, что IE возвращается к загрузке элементов по одному, когда IInternetSession::RegisterNameSpace вызывается для любого из его обработчиков по умолчанию. Приведенный ниже код приводит к последовательной загрузке HTTP , хотя я регистрирую обработчик HTTPS . Регистрация для file: // вызывает ту же проблему.

CComPtr<IInternetSession> spSession;
CoInternetGetSession(0, &spSession, 0);

MetaFactory::CreateInstance(CLSID_HttpSProtocol, &m_spCFHTTPS);
spSession->RegisterNameSpace(m_spCFHTTPS, CLSID_NULL, L"https", 0, 0, 0)

Это всегда происходит с первыми несколькими элементами на странице, но кажется, что после выдачи завершенного документа одновременные загрузки могут происходить снова. Например, код Javascript, который выполняется после завершения загрузки страницы, может одновременно нормально загружать изображения.

Ответы [ 2 ]

3 голосов
/ 05 апреля 2010

Эту проблему можно обойти, исправив COM VTable для InternetProtocolRootEx::StartEx() в зарегистрированных протоколах HTTP / HTTPS. Поскольку это не заменяет обработчик протокола напрямую, IE не откатится к однопоточной модели.

Техника описана здесь:

http://web.archive.org/web/20130313164317/http://www.blackfishsoftware.com/blog/don/passthroughapp_bho_toolbar_intercepting_requests_responses

2 голосов
/ 08 апреля 2010

Да, это известно, разработано и задокументировано в разных местах. (Это сделано потому, что мы не можем делать предположения о безопасности потоков обработчиков протоколов)

Это одна из многих причин, по которой вы не пытаетесь обернуть протоколы HTTP / HTTPS.

...