Module: wine Branch: master Commit: a9829338694b27c893109070d0be8f4462a58961 URL: http://source.winehq.org/git/wine.git/?a=commit;h=a9829338694b27c893109070d0...
Author: Jacek Caban jacek@codeweavers.com Date: Thu Sep 13 12:29:30 2012 +0200
mshtml: Try using IWinInetHttpInfo if OnResponse was not called.
---
dlls/mshtml/binding.h | 1 + dlls/mshtml/navigate.c | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 0 deletions(-)
diff --git a/dlls/mshtml/binding.h b/dlls/mshtml/binding.h index eef6053..0053e75 100644 --- a/dlls/mshtml/binding.h +++ b/dlls/mshtml/binding.h @@ -87,6 +87,7 @@ struct nsChannelBSC { nsISupports *nscontext; BOOL is_js; BOOL is_doc_channel; + BOOL response_processed;
nsProtocolStream *nsstream; }; diff --git a/dlls/mshtml/navigate.c b/dlls/mshtml/navigate.c index 1046356..4bed605 100644 --- a/dlls/mshtml/navigate.c +++ b/dlls/mshtml/navigate.c @@ -754,6 +754,33 @@ static HRESULT process_response_headers(nsChannelBSC *This, const WCHAR *headers return S_OK; }
+static void query_http_info(nsChannelBSC *This, IWinInetHttpInfo *wininet_info) +{ + const WCHAR *ptr; + DWORD len = 0; + WCHAR *buf; + + IWinInetHttpInfo_QueryInfo(wininet_info, HTTP_QUERY_RAW_HEADERS_CRLF, NULL, &len, NULL, NULL); + if(!len) + return; + + buf = heap_alloc(len); + if(!buf) + return; + + IWinInetHttpInfo_QueryInfo(wininet_info, HTTP_QUERY_RAW_HEADERS_CRLF, buf, &len, NULL, NULL); + if(!len) + return; + + ptr = strchrW(buf, '\r'); + if(ptr && ptr[1] == '\n') { + ptr += 2; + process_response_headers(This, ptr); + } + + heap_free(buf); +} + HRESULT start_binding(HTMLInnerWindow *inner_window, BSCallback *bscallback, IBindCtx *bctx) { IStream *str = NULL; @@ -1111,6 +1138,19 @@ static HRESULT read_stream_data(nsChannelBSC *This, IStream *stream) nsresult nsres; HRESULT hres;
+ if(!This->response_processed) { + IWinInetHttpInfo *wininet_info; + + This->response_processed = TRUE; + if(This->bsc.binding) { + hres = IBinding_QueryInterface(This->bsc.binding, &IID_IWinInetHttpInfo, (void**)&wininet_info); + if(SUCCEEDED(hres)) { + query_http_info(This, wininet_info); + IWinInetHttpInfo_Release(wininet_info); + } + } + } + if(!This->nslistener) { BYTE buf[1024];
@@ -1601,6 +1641,7 @@ static HRESULT nsChannelBSC_on_response(BSCallback *bsc, DWORD response_code, nsChannelBSC *This = nsChannelBSC_from_BSCallback(bsc); HRESULT hres;
+ This->response_processed = TRUE; This->nschannel->response_status = response_code;
if(response_headers) {