From: Hans Leidekker Subject: [5/8] webservices: Don't write an empty header element for messages that have an action. Message-Id: <1475059086-6011-5-git-send-email-hans@codeweavers.com> Date: Wed, 28 Sep 2016 12:38:03 +0200 Signed-off-by: Hans Leidekker --- dlls/webservices/msg.c | 87 ++++++++++++++++++++++++++++++++++---------------- 1 file changed, 59 insertions(+), 28 deletions(-) diff --git a/dlls/webservices/msg.c b/dlls/webservices/msg.c index 52f4c0e..d6cae08 100644 --- a/dlls/webservices/msg.c +++ b/dlls/webservices/msg.c @@ -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,33 +406,37 @@ 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 ((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; /* */ - if (msg->version_addr < WS_ADDRESSING_VERSION_TRANSPORT) + if (msg->version_addr == WS_ADDRESSING_VERSION_0_9) { - 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; /* */ + 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; + addr.value.length = sizeof(anonymous) - 1; + if ((hr = WsWriteText( writer, &addr.text, NULL )) != S_OK) return hr; + if ((hr = WsWriteEndElement( writer, NULL )) != S_OK) return hr; /* */ + if ((hr = WsWriteEndElement( writer, NULL )) != S_OK) return hr; /* */ } for (i = 0; i < msg->header_count; i++) @@ -439,21 +445,46 @@ static HRESULT write_envelope_start( struct msg *msg, WS_XML_WRITER *writer ) if ((hr = WsWriteXmlBuffer( writer, msg->header[i]->u.buf, NULL )) != S_OK) return hr; } - 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; + return WsWriteEndElement( writer, NULL ); /* */ +} - addr.text.textType = WS_XML_TEXT_TYPE_UTF8; - addr.value.bytes = (BYTE *)anonymous; - addr.value.length = sizeof(anonymous) - 1; - if ((hr = WsWriteText( writer, &addr.text, NULL )) != S_OK) return hr; - if ((hr = WsWriteEndElement( writer, NULL )) != S_OK) return hr; /* */ - if ((hr = WsWriteEndElement( writer, NULL )) != S_OK) return hr; /* */ +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 ((hr = WsWriteEndElement( writer, NULL )) != S_OK) return hr; /* */ - return WsWriteStartElement( writer, &prefix_s, &body, &ns_env, NULL ); /* */ + if (msg->header_count || !msg->action.length) hr = WsWriteEndElement( writer, NULL ); /* */ + 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 ); /* */ } static HRESULT write_envelope_end( WS_XML_WRITER *writer ) -- 2.1.4