Commit 22679a24 authored by Jacek Caban's avatar Jacek Caban Committed by Alexandre Julliard

mshtml: Added support for custom post data type.

parent ac653688
...@@ -462,6 +462,7 @@ typedef struct { ...@@ -462,6 +462,7 @@ typedef struct {
nsWineURI *uri; nsWineURI *uri;
nsIInputStream *post_data_stream; nsIInputStream *post_data_stream;
BOOL parse_stream;
nsILoadGroup *load_group; nsILoadGroup *load_group;
nsIInterfaceRequestor *notif_callback; nsIInterfaceRequestor *notif_callback;
nsISupports *owner; nsISupports *owner;
......
/* /*
* Copyright 2006-2007 Jacek Caban for CodeWeavers * Copyright 2006-2010 Jacek Caban for CodeWeavers
* *
* This library is free software; you can redistribute it and/or * This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public * modify it under the terms of the GNU Lesser General Public
...@@ -679,20 +679,48 @@ static HRESULT parse_headers(const WCHAR *headers, struct list *headers_list) ...@@ -679,20 +679,48 @@ static HRESULT parse_headers(const WCHAR *headers, struct list *headers_list)
return S_OK; return S_OK;
} }
static HRESULT read_post_data_stream(nsIInputStream *stream, HGLOBAL *post_data,
ULONG *post_data_len)
{
PRUint32 data_len = 0, available = 0;
char *data;
nsresult nsres;
nsres = nsIInputStream_Available(stream, &available);
if(NS_FAILED(nsres))
return E_FAIL;
data = GlobalAlloc(0, available+1);
if(!data)
return E_OUTOFMEMORY;
nsres = nsIInputStream_Read(stream, data, available, &data_len);
if(NS_FAILED(nsres)) {
GlobalFree(data);
return E_FAIL;
}
data[data_len] = 0;
*post_data = data;
*post_data_len = data_len;
return S_OK;
}
static void parse_post_data(nsIInputStream *post_data_stream, LPWSTR *headers_ret, static void parse_post_data(nsIInputStream *post_data_stream, LPWSTR *headers_ret,
HGLOBAL *post_data_ret, ULONG *post_data_len_ret) HGLOBAL *post_data_ret, ULONG *post_data_len_ret)
{ {
PRUint32 post_data_len = 0, available = 0; ULONG post_data_len;
HGLOBAL post_data = NULL; HGLOBAL post_data = NULL;
LPWSTR headers = NULL; LPWSTR headers = NULL;
DWORD headers_len = 0, len; DWORD headers_len = 0, len;
const char *ptr, *ptr2, *post_data_end; const char *ptr, *ptr2, *post_data_end;
HRESULT hres;
nsIInputStream_Available(post_data_stream, &available); hres = read_post_data_stream(post_data_stream, &post_data, &post_data_len);
post_data = GlobalAlloc(0, available+1); if(FAILED(hres)) {
nsIInputStream_Read(post_data_stream, post_data, available, &post_data_len); FIXME("read_post_data_stream failed: %08x\n", hres);
return;
TRACE("post_data = %s\n", debugstr_an(post_data, post_data_len)); }
ptr = ptr2 = post_data; ptr = ptr2 = post_data;
post_data_end = (const char*)post_data+post_data_len; post_data_end = (const char*)post_data+post_data_len;
...@@ -1088,20 +1116,27 @@ static HRESULT nsChannelBSC_start_binding(BSCallback *bsc) ...@@ -1088,20 +1116,27 @@ static HRESULT nsChannelBSC_start_binding(BSCallback *bsc)
static HRESULT nsChannelBSC_init_bindinfo(BSCallback *bsc) static HRESULT nsChannelBSC_init_bindinfo(BSCallback *bsc)
{ {
nsChannelBSC *This = NSCHANNELBSC_THIS(bsc); nsChannelBSC *This = NSCHANNELBSC_THIS(bsc);
HRESULT hres;
if(This->nschannel && This->nschannel->post_data_stream) { if(This->nschannel && This->nschannel->post_data_stream) {
if(This->nschannel->parse_stream) {
WCHAR *headers; WCHAR *headers;
HRESULT hres;
parse_post_data(This->nschannel->post_data_stream, &headers, &This->bsc.post_data, &This->bsc.post_data_len);
TRACE("headers = %s post_data = %s\n", debugstr_w(headers), parse_post_data(This->nschannel->post_data_stream, &headers,
debugstr_an(This->bsc.post_data, This->bsc.post_data_len)); &This->bsc.post_data, &This->bsc.post_data_len);
hres = parse_headers(headers, &This->nschannel->request_headers); hres = parse_headers(headers, &This->nschannel->request_headers);
heap_free(headers); heap_free(headers);
if(FAILED(hres)) if(FAILED(hres))
return hres; return hres;
}else {
hres = read_post_data_stream(This->nschannel->post_data_stream,
&This->bsc.post_data, &This->bsc.post_data_len);
if(FAILED(hres))
return hres;
}
TRACE("post_data = %s\n", debugstr_an(This->bsc.post_data, This->bsc.post_data_len));
} }
return S_OK; return S_OK;
......
...@@ -1323,17 +1323,31 @@ static nsresult NSAPI nsUploadChannel_SetUploadStream(nsIUploadChannel *iface, ...@@ -1323,17 +1323,31 @@ static nsresult NSAPI nsUploadChannel_SetUploadStream(nsIUploadChannel *iface,
nsChannel *This = NSUPCHANNEL_THIS(iface); nsChannel *This = NSUPCHANNEL_THIS(iface);
const char *content_type; const char *content_type;
TRACE("(%p)->(%p %s %d)\n", This, aStream, debugstr_nsacstr(aContentType), aContentLength); static const WCHAR content_typeW[] =
{'C','o','n','t','e','n','t','-','T','y','p','e',0};
if(This->post_data_stream) TRACE("(%p)->(%p %s %d)\n", This, aStream, debugstr_nsacstr(aContentType), aContentLength);
nsIInputStream_Release(This->post_data_stream);
This->parse_stream = TRUE;
if(aContentType) { if(aContentType) {
nsACString_GetData(aContentType, &content_type); nsACString_GetData(aContentType, &content_type);
if(*content_type) if(*content_type) {
FIXME("Unsupported aContentType argument: %s\n", debugstr_a(content_type)); WCHAR *ct;
ct = heap_strdupAtoW(content_type);
if(!ct)
return NS_ERROR_UNEXPECTED;
set_http_header(&This->request_headers, content_typeW,
sizeof(content_typeW)/sizeof(WCHAR), ct, strlenW(ct));
heap_free(ct);
This->parse_stream = FALSE;
}
} }
if(This->post_data_stream)
nsIInputStream_Release(This->post_data_stream);
if(aContentLength != -1) if(aContentLength != -1)
FIXME("Unsupported acontentLength = %d\n", aContentLength); FIXME("Unsupported acontentLength = %d\n", aContentLength);
......
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