diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index 6ab70f2df21..6f722713804 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -377,6 +377,7 @@ typedef struct {
nsIURI *original_uri;
char *content_type;
char *charset;
+ PRUint32 response_status;
} nsChannel;
typedef struct {
diff --git a/dlls/mshtml/navigate.c b/dlls/mshtml/navigate.c
index 8b1b27e770a..ad3abc54d04 100644
--- a/dlls/mshtml/navigate.c
+++ b/dlls/mshtml/navigate.c
@@ -58,6 +58,7 @@ typedef struct {
HRESULT (*stop_binding)(BSCallback*,HRESULT);
HRESULT (*read_data)(BSCallback*,IStream*);
HRESULT (*on_progress)(BSCallback*,ULONG,LPCWSTR);
+ HRESULT (*on_response)(BSCallback*,DWORD);
} BSCallbackVtbl;
struct BSCallback {
@@ -473,9 +474,11 @@ static HRESULT WINAPI HttpNegotiate_OnResponse(IHttpNegotiate2 *iface, DWORD dwR
LPCWSTR szResponseHeaders, LPCWSTR szRequestHeaders, LPWSTR *pszAdditionalRequestHeaders)
{
BSCallback *This = HTTPNEG_THIS(iface);
- FIXME("(%p)->(%d %s %s %p)\n", This, dwResponseCode, debugstr_w(szResponseHeaders),
+
+ TRACE("(%p)->(%d %s %s %p)\n", This, dwResponseCode, debugstr_w(szResponseHeaders),
debugstr_w(szRequestHeaders), pszAdditionalRequestHeaders);
- return E_NOTIMPL;
+
+ return This->vtbl->on_response(This, dwResponseCode);
}
static HRESULT WINAPI HttpNegotiate_GetRootSecurityId(IHttpNegotiate2 *iface,
@@ -798,6 +801,11 @@ static HRESULT BufferBSC_on_progress(BSCallback *bsc, ULONG status_code, LPCWSTR
return S_OK;
}
+static HRESULT BufferBSC_on_response(BSCallback *bsc, DWORD response_code)
+{
+ return S_OK;
+}
+
#undef BUFFERBSC_THIS
static const BSCallbackVtbl BufferBSCVtbl = {
@@ -806,6 +814,7 @@ static const BSCallbackVtbl BufferBSCVtbl = {
BufferBSC_stop_binding,
BufferBSC_read_data,
BufferBSC_on_progress,
+ BufferBSC_on_response
};
@@ -887,6 +896,10 @@ static HRESULT read_stream_data(nsChannelBSC *This, IStream *stream)
&& (BYTE)This->nsstream->buf[1] == 0xfe)
This->nschannel->charset = heap_strdupA(UTF16_STR);
+ /* FIXME: it's needed for http connections from BindToObject. */
+ if(!This->nschannel->response_status)
+ This->nschannel->response_status = 200;
+
nsres = nsIStreamListener_OnStartRequest(This->nslistener,
(nsIRequest*)NSCHANNEL(This->nschannel), This->nscontext);
if(NS_FAILED(nsres))
@@ -1009,6 +1022,14 @@ static HRESULT nsChannelBSC_on_progress(BSCallback *bsc, ULONG status_code, LPCW
return S_OK;
}
+static HRESULT nsChannelBSC_on_response(BSCallback *bsc, DWORD response_code)
+{
+ nsChannelBSC *This = NSCHANNELBSC_THIS(bsc);
+
+ This->nschannel->response_status = response_code;
+ return S_OK;
+}
+
#undef NSCHANNELBSC_THIS
static const BSCallbackVtbl nsChannelBSCVtbl = {
@@ -1017,6 +1038,7 @@ static const BSCallbackVtbl nsChannelBSCVtbl = {
nsChannelBSC_stop_binding,
nsChannelBSC_read_data,
nsChannelBSC_on_progress,
+ nsChannelBSC_on_response
};
nsChannelBSC *create_channelbsc(IMoniker *mon)
diff --git a/dlls/mshtml/nsio.c b/dlls/mshtml/nsio.c
index 7c402b295a9..087afdf0830 100644
--- a/dlls/mshtml/nsio.c
+++ b/dlls/mshtml/nsio.c
@@ -980,10 +980,15 @@ static nsresult NSAPI nsChannel_GetResponseStatus(nsIHttpChannel *iface, PRUint3
TRACE("(%p)->(%p)\n", This, aResponseStatus);
+ if(This->response_status) {
+ *aResponseStatus = This->response_status;
+ return NS_OK;
+ }
+
if(This->http_channel)
return nsIHttpChannel_GetResponseStatus(This->http_channel, aResponseStatus);
- return NS_ERROR_NOT_IMPLEMENTED;
+ return NS_ERROR_UNEXPECTED;
}
static nsresult NSAPI nsChannel_GetResponseStatusText(nsIHttpChannel *iface,