webservices: Don't write an empty header element for messages that have an action.

Signed-off-by: Hans Leidekker <hans@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Hans Leidekker 2016-09-28 12:38:03 +02:00 committed by Alexandre Julliard
parent c7b606ea9c
commit efcf63cc71
1 changed files with 60 additions and 29 deletions

View File

@ -71,6 +71,7 @@ struct msg
WS_ADDRESSING_VERSION version_addr;
BOOL is_addressed;
WS_STRING addr;
WS_STRING action;
WS_HEAP *heap;
WS_XML_BUFFER *buf;
WS_XML_WRITER *writer;
@ -118,6 +119,7 @@ static void free_msg( struct msg *msg )
WsFreeWriter( msg->writer );
WsFreeHeap( msg->heap );
heap_free( msg->addr.chars );
heap_free( msg->action.chars );
for (i = 0; i < msg->header_count; i++) free_header( msg->header[i] );
heap_free( msg->header );
heap_free( msg );
@ -404,45 +406,30 @@ static const WS_XML_STRING *get_header_name( WS_HEADER_TYPE type )
}
}
static HRESULT write_envelope_start( struct msg *msg, WS_XML_WRITER *writer )
static HRESULT write_headers( struct msg *msg, const WS_XML_STRING *ns_env, const WS_XML_STRING *ns_addr,
WS_XML_WRITER *writer )
{
static const char anonymous[] = "http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous";
static const WS_XML_STRING prefix_s = {1, (BYTE *)"s"}, prefix_a = {1, (BYTE *)"a"};
static const WS_XML_STRING envelope = {8, (BYTE *)"Envelope"}, header = {6, (BYTE *)"Header"};
static const WS_XML_STRING msgid = {9, (BYTE *)"MessageID"}, replyto = {7, (BYTE *)"ReplyTo"};
static const WS_XML_STRING address = {7, (BYTE *)"Address"}, body = {4, (BYTE *)"Body"};
WS_XML_STRING ns_env, ns_addr;
static const WS_XML_STRING address = {7, (BYTE *)"Address"}, header = {6, (BYTE *)"Header"};
WS_XML_UTF8_TEXT urn, addr;
HRESULT hr;
ULONG i;
if ((hr = get_env_namespace( msg->version_env, &ns_env )) != S_OK) return hr;
if ((hr = get_addr_namespace( msg->version_addr, &ns_addr )) != S_OK) return hr;
if ((hr = WsWriteXmlnsAttribute( writer, &prefix_a, ns_addr, FALSE, NULL )) != S_OK) return hr;
if ((hr = WsWriteStartElement( writer, &prefix_s, &header, ns_env, NULL )) != S_OK) return hr;
if ((hr = WsWriteStartElement( writer, &prefix_s, &envelope, &ns_env, NULL )) != S_OK) return hr;
if (msg->version_addr < WS_ADDRESSING_VERSION_TRANSPORT &&
(hr = WsWriteXmlnsAttribute( writer, &prefix_a, &ns_addr, FALSE, NULL )) != S_OK) return hr;
if ((hr = WsWriteStartElement( writer, &prefix_s, &header, &ns_env, NULL )) != S_OK) return hr;
if (msg->version_addr < WS_ADDRESSING_VERSION_TRANSPORT)
{
if ((hr = WsWriteStartElement( writer, &prefix_a, &msgid, &ns_addr, NULL )) != S_OK) return hr;
urn.text.textType = WS_XML_TEXT_TYPE_UNIQUE_ID;
memcpy( &urn.value, &msg->id, sizeof(msg->id) );
if ((hr = WsWriteText( writer, &urn.text, NULL )) != S_OK) return hr;
if ((hr = WsWriteEndElement( writer, NULL )) != S_OK) return hr; /* </a:MessageID> */
}
for (i = 0; i < msg->header_count; i++)
{
if (msg->header[i]->mapped) continue;
if ((hr = WsWriteXmlBuffer( writer, msg->header[i]->u.buf, NULL )) != S_OK) return hr;
}
if ((hr = WsWriteStartElement( writer, &prefix_a, &msgid, ns_addr, NULL )) != S_OK) return hr;
urn.text.textType = WS_XML_TEXT_TYPE_UNIQUE_ID;
memcpy( &urn.value, &msg->id, sizeof(msg->id) );
if ((hr = WsWriteText( writer, &urn.text, NULL )) != S_OK) return hr;
if ((hr = WsWriteEndElement( writer, NULL )) != S_OK) return hr; /* </a:MessageID> */
if (msg->version_addr == WS_ADDRESSING_VERSION_0_9)
{
if ((hr = WsWriteStartElement( writer, &prefix_a, &replyto, &ns_addr, NULL )) != S_OK) return hr;
if ((hr = WsWriteStartElement( writer, &prefix_a, &address, &ns_addr, NULL )) != S_OK) return hr;
if ((hr = WsWriteStartElement( writer, &prefix_a, &replyto, ns_addr, NULL )) != S_OK) return hr;
if ((hr = WsWriteStartElement( writer, &prefix_a, &address, ns_addr, NULL )) != S_OK) return hr;
addr.text.textType = WS_XML_TEXT_TYPE_UTF8;
addr.value.bytes = (BYTE *)anonymous;
@ -452,8 +439,52 @@ static HRESULT write_envelope_start( struct msg *msg, WS_XML_WRITER *writer )
if ((hr = WsWriteEndElement( writer, NULL )) != S_OK) return hr; /* </a:ReplyTo> */
}
if ((hr = WsWriteEndElement( writer, NULL )) != S_OK) return hr; /* </s:Header> */
return WsWriteStartElement( writer, &prefix_s, &body, &ns_env, NULL ); /* <s:Body> */
for (i = 0; i < msg->header_count; i++)
{
if (msg->header[i]->mapped) continue;
if ((hr = WsWriteXmlBuffer( writer, msg->header[i]->u.buf, NULL )) != S_OK) return hr;
}
return WsWriteEndElement( writer, NULL ); /* </s:Header> */
}
static HRESULT write_headers_transport( struct msg *msg, const WS_XML_STRING *ns_env, WS_XML_WRITER *writer )
{
static const WS_XML_STRING prefix = {1, (BYTE *)"s"}, header = {6, (BYTE *)"Header"};
HRESULT hr;
ULONG i;
if ((msg->header_count || !msg->action.length) &&
(hr = WsWriteStartElement( writer, &prefix, &header, ns_env, NULL )) != S_OK) return hr;
for (i = 0; i < msg->header_count; i++)
{
if (msg->header[i]->mapped) continue;
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> */
return hr;
}
static HRESULT write_envelope_start( struct msg *msg, WS_XML_WRITER *writer )
{
static const WS_XML_STRING envelope = {8, (BYTE *)"Envelope"}, body = {4, (BYTE *)"Body"};
static const WS_XML_STRING prefix = {1, (BYTE *)"s"};
WS_XML_STRING ns_env, ns_addr;
HRESULT hr;
if ((hr = get_env_namespace( msg->version_env, &ns_env )) != S_OK) return hr;
if ((hr = get_addr_namespace( msg->version_addr, &ns_addr )) != S_OK) return hr;
if ((hr = WsWriteStartElement( writer, &prefix, &envelope, &ns_env, NULL )) != S_OK) return hr;
if (msg->version_addr == WS_ADDRESSING_VERSION_TRANSPORT)
hr = write_headers_transport( msg, &ns_env, writer );
else
hr = write_headers( msg, &ns_env, &ns_addr, writer );
if (hr != S_OK) return hr;
return WsWriteStartElement( writer, &prefix, &body, &ns_env, NULL ); /* <s:Body> */
}
static HRESULT write_envelope_end( WS_XML_WRITER *writer )