diff --git a/dlls/mshtml/navigate.c b/dlls/mshtml/navigate.c index fe0d4c66a10..2d8bcd8e21e 100644 --- a/dlls/mshtml/navigate.c +++ b/dlls/mshtml/navigate.c @@ -626,6 +626,57 @@ static void call_docview_84(HTMLDocumentObj *doc) FIXME("handle result\n"); } +static void parse_content_type(nsChannelBSC *This, const WCHAR *value) +{ + const WCHAR *ptr; + size_t len; + + static const WCHAR charsetW[] = {'c','h','a','r','s','e','t','='}; + + ptr = strchrW(value, ';'); + if(!ptr) + return; + + ptr++; + while(*ptr && isspaceW(*ptr)) + ptr++; + + len = strlenW(value); + if(ptr + sizeof(charsetW)/sizeof(WCHAR) < value+len && !memicmpW(ptr, charsetW, sizeof(charsetW)/sizeof(WCHAR))) { + size_t charset_len, lena; + nsACString charset_str; + const WCHAR *charset; + char *charseta; + + ptr += sizeof(charsetW)/sizeof(WCHAR); + + if(*ptr == '\'') { + FIXME("Quoted value\n"); + return; + }else { + charset = ptr; + while(*ptr && *ptr != ',') + ptr++; + charset_len = ptr-charset; + } + + lena = WideCharToMultiByte(CP_ACP, 0, charset, charset_len, NULL, 0, NULL, NULL); + charseta = heap_alloc(lena+1); + if(!charseta) + return; + + WideCharToMultiByte(CP_ACP, 0, charset, charset_len, charseta, lena, NULL, NULL); + charseta[lena] = 0; + + nsACString_InitDepend(&charset_str, charseta); + nsIHttpChannel_SetContentCharset(&This->nschannel->nsIHttpChannel_iface, &charset_str); + nsACString_Finish(&charset_str); + heap_free(charseta); + }else { + FIXME("unhandled: %s\n", debugstr_wn(ptr, len - (ptr-value))); + } +} + static HRESULT parse_headers(const WCHAR *headers, struct list *headers_list) { const WCHAR *header, *header_end, *colon, *value; @@ -659,6 +710,25 @@ static HRESULT parse_headers(const WCHAR *headers, struct list *headers_list) return S_OK; } +static HRESULT process_response_headers(nsChannelBSC *This, const WCHAR *headers) +{ + http_header_t *iter; + HRESULT hres; + + static const WCHAR content_typeW[] = {'c','o','n','t','e','n','t','-','t','y','p','e',0}; + + hres = parse_headers(headers, &This->nschannel->response_headers); + if(FAILED(hres)) + return hres; + + LIST_FOR_EACH_ENTRY(iter, &This->nschannel->response_headers, http_header_t, entry) { + if(!strcmpiW(iter->header, content_typeW)) + parse_content_type(This, iter->data); + } + + return S_OK; +} + HRESULT start_binding(HTMLWindow *window, HTMLDocumentNode *doc, BSCallback *bscallback, IBindCtx *bctx) { IStream *str = NULL; @@ -1471,7 +1541,7 @@ static HRESULT nsChannelBSC_on_response(BSCallback *bsc, DWORD response_code, headers = strchrW(response_headers, '\r'); if(headers && headers[1] == '\n') { headers += 2; - hres = parse_headers(headers, &This->nschannel->response_headers); + hres = process_response_headers(This, headers); if(FAILED(hres)) { WARN("parsing headers failed: %08x\n", hres); return hres;