webservices: Store the action header as WS_XML_STRING.
Signed-off-by: Hans Leidekker <hans@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
1a28e34a91
commit
7727e00178
@ -68,7 +68,7 @@ struct msg
|
|||||||
WS_ADDRESSING_VERSION version_addr;
|
WS_ADDRESSING_VERSION version_addr;
|
||||||
BOOL is_addressed;
|
BOOL is_addressed;
|
||||||
WS_STRING addr;
|
WS_STRING addr;
|
||||||
WS_STRING action;
|
WS_XML_STRING *action;
|
||||||
WS_HEAP *heap;
|
WS_HEAP *heap;
|
||||||
WS_XML_BUFFER *buf;
|
WS_XML_BUFFER *buf;
|
||||||
WS_XML_WRITER *writer;
|
WS_XML_WRITER *writer;
|
||||||
@ -131,9 +131,8 @@ static void reset_msg( struct msg *msg )
|
|||||||
msg->addr.chars = NULL;
|
msg->addr.chars = NULL;
|
||||||
msg->addr.length = 0;
|
msg->addr.length = 0;
|
||||||
|
|
||||||
heap_free( msg->action.chars );
|
free_xml_string( msg->action );
|
||||||
msg->action.chars = NULL;
|
msg->action = NULL;
|
||||||
msg->action.length = 0;
|
|
||||||
|
|
||||||
WsResetHeap( msg->heap, NULL );
|
WsResetHeap( msg->heap, NULL );
|
||||||
msg->buf = NULL; /* allocated on msg->heap */
|
msg->buf = NULL; /* allocated on msg->heap */
|
||||||
@ -546,13 +545,12 @@ static HRESULT write_headers( struct msg *msg, WS_XML_WRITER *writer, const WS_X
|
|||||||
if ((hr = WsWriteXmlnsAttribute( writer, prefix_addr, ns_addr, FALSE, NULL )) != S_OK) return hr;
|
if ((hr = WsWriteXmlnsAttribute( writer, prefix_addr, ns_addr, FALSE, NULL )) != S_OK) return hr;
|
||||||
if ((hr = WsWriteStartElement( writer, prefix_env, &header, ns_env, NULL )) != S_OK) return hr;
|
if ((hr = WsWriteStartElement( writer, prefix_env, &header, ns_env, NULL )) != S_OK) return hr;
|
||||||
|
|
||||||
if (msg->action.length)
|
if (msg->action)
|
||||||
{
|
{
|
||||||
WS_XML_UTF16_TEXT utf16 = {{WS_XML_TEXT_TYPE_UTF16}, (BYTE *)msg->action.chars,
|
WS_XML_UTF8_TEXT utf8 = {{WS_XML_TEXT_TYPE_UTF8}, {msg->action->length, msg->action->bytes}};
|
||||||
msg->action.length * sizeof(WCHAR)};
|
|
||||||
if ((hr = WsWriteStartElement( writer, prefix_addr, action, ns_addr, NULL )) != S_OK) return hr;
|
if ((hr = WsWriteStartElement( writer, prefix_addr, action, ns_addr, NULL )) != S_OK) return hr;
|
||||||
if ((hr = write_must_understand( writer, prefix_env, ns_env )) != S_OK) return hr;
|
if ((hr = write_must_understand( writer, prefix_env, ns_env )) != S_OK) return hr;
|
||||||
if ((hr = WsWriteText( writer, &utf16.text, NULL )) != S_OK) return hr;
|
if ((hr = WsWriteText( writer, &utf8.text, NULL )) != S_OK) return hr;
|
||||||
if ((hr = WsWriteEndElement( writer, NULL )) != S_OK) return hr; /* </a:Action> */
|
if ((hr = WsWriteEndElement( writer, NULL )) != S_OK) return hr; /* </a:Action> */
|
||||||
}
|
}
|
||||||
if (msg->addr.length)
|
if (msg->addr.length)
|
||||||
@ -600,7 +598,7 @@ static HRESULT write_headers_transport( struct msg *msg, WS_XML_WRITER *writer,
|
|||||||
HRESULT hr = S_OK;
|
HRESULT hr = S_OK;
|
||||||
ULONG i;
|
ULONG i;
|
||||||
|
|
||||||
if ((msg->header_count || !msg->action.length) &&
|
if ((msg->header_count || !msg->action) &&
|
||||||
(hr = WsWriteStartElement( writer, prefix, &header, ns, NULL )) != S_OK) return hr;
|
(hr = WsWriteStartElement( writer, prefix, &header, ns, NULL )) != S_OK) return hr;
|
||||||
|
|
||||||
for (i = 0; i < msg->header_count; i++)
|
for (i = 0; i < msg->header_count; i++)
|
||||||
@ -609,7 +607,7 @@ static HRESULT write_headers_transport( struct msg *msg, WS_XML_WRITER *writer,
|
|||||||
if ((hr = WsWriteXmlBuffer( writer, msg->header[i]->u.buf, NULL )) != S_OK) return hr;
|
if ((hr = WsWriteXmlBuffer( writer, msg->header[i]->u.buf, NULL )) != S_OK) return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (msg->header_count || !msg->action.length) hr = WsWriteEndElement( writer, NULL ); /* </s:Header> */
|
if (msg->header_count || !msg->action) hr = WsWriteEndElement( writer, NULL ); /* </s:Header> */
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1681,12 +1679,13 @@ HRESULT message_insert_http_headers( WS_MESSAGE *handle, HINTERNET req )
|
|||||||
{
|
{
|
||||||
static const WCHAR soapactionW[] = {'S','O','A','P','A','c','t','i','o','n',':',' ',0};
|
static const WCHAR soapactionW[] = {'S','O','A','P','A','c','t','i','o','n',':',' ',0};
|
||||||
|
|
||||||
if (!(len = msg->action.length)) break;
|
if (!(len = MultiByteToWideChar( CP_UTF8, 0, (char *)msg->action->bytes, msg->action->length, NULL, 0 )))
|
||||||
|
break;
|
||||||
|
|
||||||
hr = E_OUTOFMEMORY;
|
hr = E_OUTOFMEMORY;
|
||||||
if (!(buf = heap_alloc( (len + 3) * sizeof(WCHAR) ))) goto done;
|
if (!(buf = heap_alloc( (len + 3) * sizeof(WCHAR) ))) goto done;
|
||||||
buf[0] = '"';
|
buf[0] = '"';
|
||||||
memcpy( buf + 1, msg->action.chars, len * sizeof(WCHAR) );
|
MultiByteToWideChar( CP_UTF8, 0, (char *)msg->action->bytes, msg->action->length, buf + 1, len );
|
||||||
buf[len + 1] = '"';
|
buf[len + 1] = '"';
|
||||||
buf[len + 2] = 0;
|
buf[len + 2] = 0;
|
||||||
|
|
||||||
@ -1702,12 +1701,13 @@ HRESULT message_insert_http_headers( WS_MESSAGE *handle, HINTERNET req )
|
|||||||
static const WCHAR actionW[] = {'a','c','t','i','o','n','=','"'};
|
static const WCHAR actionW[] = {'a','c','t','i','o','n','=','"'};
|
||||||
ULONG len_action = sizeof(actionW)/sizeof(actionW[0]);
|
ULONG len_action = sizeof(actionW)/sizeof(actionW[0]);
|
||||||
|
|
||||||
if (!(len = msg->action.length)) break;
|
if (!(len = MultiByteToWideChar( CP_UTF8, 0, (char *)msg->action->bytes, msg->action->length, NULL, 0 )))
|
||||||
|
break;
|
||||||
|
|
||||||
hr = E_OUTOFMEMORY;
|
hr = E_OUTOFMEMORY;
|
||||||
if (!(buf = heap_alloc( (len + len_action + 2) * sizeof(WCHAR) ))) goto done;
|
if (!(buf = heap_alloc( (len + len_action + 2) * sizeof(WCHAR) ))) goto done;
|
||||||
memcpy( buf, actionW, len_action * sizeof(WCHAR) );
|
memcpy( buf, actionW, len_action * sizeof(WCHAR) );
|
||||||
memcpy( buf + len_action, msg->action.chars, len * sizeof(WCHAR) );
|
MultiByteToWideChar( CP_UTF8, 0, (char *)msg->action->bytes, msg->action->length, buf + len_action, len );
|
||||||
len += len_action;
|
len += len_action;
|
||||||
buf[len++] = '"';
|
buf[len++] = '"';
|
||||||
buf[len] = 0;
|
buf[len] = 0;
|
||||||
@ -1827,21 +1827,17 @@ HRESULT message_set_action( WS_MESSAGE *handle, const WS_XML_STRING *action )
|
|||||||
|
|
||||||
if (!action || !action->length)
|
if (!action || !action->length)
|
||||||
{
|
{
|
||||||
heap_free( msg->action.chars );
|
free_xml_string( msg->action );
|
||||||
msg->action.chars = NULL;
|
msg->action = NULL;
|
||||||
msg->action.length = 0;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
WCHAR *chars;
|
WS_XML_STRING *str;
|
||||||
int len = MultiByteToWideChar( CP_UTF8, 0, (char *)action->bytes, action->length, NULL, 0 );
|
if (!(str = dup_xml_string( action ))) hr = E_OUTOFMEMORY;
|
||||||
if (!(chars = heap_alloc( len * sizeof(WCHAR) ))) hr = E_OUTOFMEMORY;
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
MultiByteToWideChar( CP_UTF8, 0, (char *)action->bytes, action->length, chars, len );
|
free_xml_string( msg->action );
|
||||||
heap_free( msg->action.chars );
|
msg->action = str;
|
||||||
msg->action.chars = chars;
|
|
||||||
msg->action.length = len;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user