mirror of
git://source.winehq.org/git/wine.git
synced 2024-10-05 06:27:06 +00:00
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:
parent
c7b606ea9c
commit
efcf63cc71
|
@ -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 )
|
||||
|
|
Loading…
Reference in a new issue