diff --git a/dlls/mshtml/tests/xmlhttprequest.c b/dlls/mshtml/tests/xmlhttprequest.c
index 5d11ec000a8..a16dad1e6bc 100644
--- a/dlls/mshtml/tests/xmlhttprequest.c
+++ b/dlls/mshtml/tests/xmlhttprequest.c
@@ -524,6 +524,19 @@ static void test_illegal_xml(IXMLDOMDocument *xmldom)
ok(last == NULL, "last != NULL\n");
}
+#define set_request_header(a,b,c) _set_request_header(__LINE__,a,b,c)
+static void _set_request_header(unsigned line, IHTMLXMLHttpRequest *xhr, const char *header_a, const char *value_a)
+{
+ BSTR header = a2bstr(header_a), value = a2bstr(value_a);
+ HRESULT hres;
+
+ hres = IHTMLXMLHttpRequest_setRequestHeader(xhr, header, value);
+ ok_(__FILE__,line)(hres == S_OK, "setRequestHeader failed: %08x\n", hres);
+
+ SysFreeString(header);
+ SysFreeString(value);
+}
+
static void test_responseXML(const char *expect_text)
{
IDispatch *disp;
@@ -673,6 +686,8 @@ static void test_sync_xhr(IHTMLDocument2 *doc, const char *xml_url, const char *
ok(hres == S_OK, "get_readyState failed: %08x\n", hres);
ok(val == 1, "Expect OPENED, got %d\n", val);
+ set_request_header(xhr, "x-wine-test", "sync-test");
+
SET_EXPECT(xmlhttprequest_onreadystatechange_opened);
SET_EXPECT(xmlhttprequest_onreadystatechange_headers_received);
SET_EXPECT(xmlhttprequest_onreadystatechange_loading);
@@ -835,6 +850,8 @@ static void test_async_xhr(IHTMLDocument2 *doc, const char *xml_url, const char
ok(hres == S_OK, "get_readyState failed: %08x\n", hres);
ok(val == 1, "Expect OPENED, got %d\n", val);
+ set_request_header(xhr, "x-wine-test", "async-test");
+
SET_EXPECT(xmlhttprequest_onreadystatechange_opened);
SET_EXPECT(xmlhttprequest_onreadystatechange_headers_received);
SET_EXPECT(xmlhttprequest_onreadystatechange_loading);
diff --git a/dlls/mshtml/xmlhttprequest.c b/dlls/mshtml/xmlhttprequest.c
index ba6dc0506be..d55570cb0be 100644
--- a/dlls/mshtml/xmlhttprequest.c
+++ b/dlls/mshtml/xmlhttprequest.c
@@ -613,8 +613,35 @@ static HRESULT WINAPI HTMLXMLHttpRequest_getResponseHeader(IHTMLXMLHttpRequest *
static HRESULT WINAPI HTMLXMLHttpRequest_setRequestHeader(IHTMLXMLHttpRequest *iface, BSTR bstrHeader, BSTR bstrValue)
{
HTMLXMLHttpRequest *This = impl_from_IHTMLXMLHttpRequest(iface);
- FIXME("(%p)->(%s %s)\n", This, debugstr_w(bstrHeader), debugstr_w(bstrValue));
- return E_NOTIMPL;
+ char *header_u, *value_u;
+ nsACString header, value;
+ nsresult nsres;
+
+ TRACE("(%p)->(%s %s)\n", This, debugstr_w(bstrHeader), debugstr_w(bstrValue));
+
+ header_u = heap_strdupWtoU(bstrHeader);
+ if(bstrHeader && !header_u)
+ return E_OUTOFMEMORY;
+
+ value_u = heap_strdupWtoU(bstrValue);
+ if(bstrValue && !value_u) {
+ heap_free(header_u);
+ return E_OUTOFMEMORY;
+ }
+
+ nsACString_InitDepend(&header, header_u);
+ nsACString_InitDepend(&value, value_u);
+ nsres = nsIXMLHttpRequest_SetRequestHeader(This->nsxhr, &header, &value);
+ nsACString_Finish(&header);
+ nsACString_Finish(&value);
+ heap_free(header_u);
+ heap_free(value_u);
+ if(NS_FAILED(nsres)) {
+ ERR("SetRequestHeader failed: %08x\n", nsres);
+ return E_FAIL;
+ }
+
+ return S_OK;
}
static const IHTMLXMLHttpRequestVtbl HTMLXMLHttpRequestVtbl = {