在IE中挂钩http/https协议会导致GET请求顺序

wat*_*nmw 5 com internet-explorer microsoft.mshtml http iwebbrowser2

我正在使用PassthruAPP方法挂钩IE所做的HTTP/HTTPS请求.

它在大多数情况下都运行良好,但我注意到了一个问题.一次只有一个下载线程是活动的,通常IE使用两个下载线程.我可以看到两个IInternetProtocol对象被创建,但IE一次只使用一个.

IE7正在发生这种情况,我还没有尝试过其他版本.

问题似乎是当IE IInternetSession::RegisterNameSpace被调用任何默认处理程序时,IE会一次回退一个项目.即使我正在注册HTTPS处理程序,下面的代码也会导致HTTP下载顺序.注册'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)
Run Code Online (Sandbox Code Playgroud)

这总是发生在页面上的前几个项目中,但似乎在发布文档完成后,可以再次发生并发下载.例如,在页面加载完成后执行的Javascript代码可以同时加载图像.

wat*_*nmw 3

可以通过修补InternetProtocolRootEx::StartEx()已注册的 HTTP/HTTPS 协议上的 COM VTable 来解决此问题。由于这不会直接替换协议处理程序,因此 IE 不会回退到单线程模型。

该技术描述如下:

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