[5/8] webservices: Don't write an empty header element for messages that have an action.

Hans Leidekker hans at codeweavers.com
Wed Sep 28 05:38:03 CDT 2016


Signed-off-by: Hans Leidekker <hans at codeweavers.com>
---
 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; /* </a:MessageID> */
 
-    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; /* </a:MessageID> */
+        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; /* </a:Address> */
+        if ((hr = WsWriteEndElement( writer, NULL )) != S_OK) return hr; /* </a:ReplyTo> */
     }
 
     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 ); /* </s:Header> */
+}
 
-        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; /* </a:Address> */
-        if ((hr = WsWriteEndElement( writer, NULL )) != S_OK) return hr; /* </a:ReplyTo> */
+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; /* </s:Header> */
-    return WsWriteStartElement( writer, &prefix_s, &body, &ns_env, NULL ); /* <s:Body> */
+    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 )
-- 
2.1.4




More information about the wine-patches mailing list