Commit 95d8f6fc authored by Nikolay Sivov's avatar Nikolay Sivov Committed by Alexandre Julliard

msxml3: Implemented IXMLHttpRequest::get_statusText().

parent 3935124d
...@@ -98,6 +98,7 @@ typedef struct ...@@ -98,6 +98,7 @@ typedef struct
/* bind callback */ /* bind callback */
BindStatusCallback *bsc; BindStatusCallback *bsc;
LONG status; LONG status;
BSTR status_text;
/* IObjectWithSite*/ /* IObjectWithSite*/
IUnknown *site; IUnknown *site;
...@@ -517,8 +518,10 @@ static HRESULT WINAPI BSCHttpNegotiate_OnResponse(IHttpNegotiate *iface, DWORD c ...@@ -517,8 +518,10 @@ static HRESULT WINAPI BSCHttpNegotiate_OnResponse(IHttpNegotiate *iface, DWORD c
debugstr_w(req_headers), add_reqheaders); debugstr_w(req_headers), add_reqheaders);
This->request->status = code; This->request->status = code;
/* store headers */ /* store headers and status text */
free_response_headers(This->request); free_response_headers(This->request);
SysFreeString(This->request->status_text);
This->request->status_text = NULL;
if (resp_headers) if (resp_headers)
{ {
const WCHAR *ptr, *line; const WCHAR *ptr, *line;
...@@ -530,7 +533,19 @@ static HRESULT WINAPI BSCHttpNegotiate_OnResponse(IHttpNegotiate *iface, DWORD c ...@@ -530,7 +533,19 @@ static HRESULT WINAPI BSCHttpNegotiate_OnResponse(IHttpNegotiate *iface, DWORD c
{ {
if (*ptr == '\r' && *(ptr+1) == '\n') if (*ptr == '\r' && *(ptr+1) == '\n')
{ {
line = ++ptr+1; const WCHAR *end = ptr-1;
line = ptr + 2;
/* scan back to get status phrase */
while (ptr > resp_headers)
{
if (*ptr == ' ')
{
This->request->status_text = SysAllocStringLen(ptr+1, end-ptr);
TRACE("status text %s\n", debugstr_w(This->request->status_text));
break;
}
ptr--;
}
break; break;
} }
ptr++; ptr++;
...@@ -789,6 +804,7 @@ static ULONG WINAPI httprequest_Release(IXMLHTTPRequest *iface) ...@@ -789,6 +804,7 @@ static ULONG WINAPI httprequest_Release(IXMLHTTPRequest *iface)
} }
/* response headers */ /* response headers */
free_response_headers(This); free_response_headers(This);
SysFreeString(This->status_text);
/* detach callback object */ /* detach callback object */
BindStatusCallback_Detach(This->bsc); BindStatusCallback_Detach(This->bsc);
...@@ -1093,13 +1109,18 @@ static HRESULT WINAPI httprequest_get_status(IXMLHTTPRequest *iface, LONG *statu ...@@ -1093,13 +1109,18 @@ static HRESULT WINAPI httprequest_get_status(IXMLHTTPRequest *iface, LONG *statu
return S_OK; return S_OK;
} }
static HRESULT WINAPI httprequest_get_statusText(IXMLHTTPRequest *iface, BSTR *pbstrStatus) static HRESULT WINAPI httprequest_get_statusText(IXMLHTTPRequest *iface, BSTR *status)
{ {
httprequest *This = impl_from_IXMLHTTPRequest( iface ); httprequest *This = impl_from_IXMLHTTPRequest( iface );
FIXME("stub %p %p\n", This, pbstrStatus); TRACE("(%p)->(%p)\n", This, status);
return E_NOTIMPL; if (!status) return E_INVALIDARG;
if (This->state != READYSTATE_COMPLETE) return E_FAIL;
*status = SysAllocString(This->status_text);
return S_OK;
} }
static HRESULT WINAPI httprequest_get_responseXML(IXMLHTTPRequest *iface, IDispatch **body) static HRESULT WINAPI httprequest_get_responseXML(IXMLHTTPRequest *iface, IDispatch **body)
...@@ -1475,6 +1496,7 @@ HRESULT XMLHTTPRequest_create(IUnknown *pUnkOuter, void **ppObj) ...@@ -1475,6 +1496,7 @@ HRESULT XMLHTTPRequest_create(IUnknown *pUnkOuter, void **ppObj)
req->bsc = NULL; req->bsc = NULL;
req->status = 0; req->status = 0;
req->status_text = NULL;
req->reqheader_size = 0; req->reqheader_size = 0;
req->raw_respheaders = NULL; req->raw_respheaders = NULL;
req->use_utf8_content = FALSE; req->use_utf8_content = FALSE;
......
...@@ -4744,6 +4744,9 @@ static void test_XMLHTTP(void) ...@@ -4744,6 +4744,9 @@ static void test_XMLHTTP(void)
ok(hr == E_FAIL || broken(hr == E_UNEXPECTED) /* win2k */, "got 0x%08x\n", hr); ok(hr == E_FAIL || broken(hr == E_UNEXPECTED) /* win2k */, "got 0x%08x\n", hr);
ok(status == 0xdeadbeef, "got %d\n", status); ok(status == 0xdeadbeef, "got %d\n", status);
hr = IXMLHttpRequest_get_statusText(xhr, &str);
ok(hr == E_FAIL, "got 0x%08x\n", hr);
/* invalid parameters */ /* invalid parameters */
hr = IXMLHttpRequest_open(xhr, NULL, NULL, async, dummy, dummy); hr = IXMLHttpRequest_open(xhr, NULL, NULL, async, dummy, dummy);
EXPECT_HR(hr, E_INVALIDARG); EXPECT_HR(hr, E_INVALIDARG);
...@@ -4862,6 +4865,14 @@ static void test_XMLHTTP(void) ...@@ -4862,6 +4865,14 @@ static void test_XMLHTTP(void)
EXPECT_HR(hr, S_OK); EXPECT_HR(hr, S_OK);
ok(status == 200, "got %d\n", status); ok(status == 200, "got %d\n", status);
hr = IXMLHttpRequest_get_statusText(xhr, NULL);
EXPECT_HR(hr, E_INVALIDARG);
hr = IXMLHttpRequest_get_statusText(xhr, &str);
EXPECT_HR(hr, S_OK);
ok(!lstrcmpW(str, _bstr_("OK")), "got status %s\n", wine_dbgstr_w(str));
SysFreeString(str);
/* another ::send() after completed request */ /* another ::send() after completed request */
V_VT(&varbody) = VT_BSTR; V_VT(&varbody) = VT_BSTR;
V_BSTR(&varbody) = _bstr_(bodyA); V_BSTR(&varbody) = _bstr_(bodyA);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment