First Class Headers - Proposed Resolution for LC76d

Lets begin with a simple example. The following example shows the WSDL definition of a simple service providing stock
quotes. This service supports a single operation called GetLastTradePrice, which is deployed using the SOAP 1.2 protocol
over HTTP. I added 3 statements to turn on WS-Security header support. Again, just 3 statements - import schema
statement, header in input message reference component and header in output message reference component.

(1) Introduce a NEW Header Component

Header Component

An Header Component describes an abstract piece of header that is associated with the exchange of messages between
the communicating parties. The presence of an Header Component in a WSDL description indicates that the service supports
the header and may require a Web Service consumer/client that interacts with the service to use that header. Zero or
more such headers may be used.

Header Component has 5 properties:

{namespace name} REQUIRED. An xs:anyURI. This URI MUST be absolute as defined by [IETF RFC 2396].

{local name} REQUIRED. An xs:NCName.

{element} REQUIRED. A reference to an XML element declaration in the {element declarations} property of The
Definitions Component. This element represents a header.

{required} REQUIRED. An xs:boolean. If the value of this property is true, then the Web Service consumer/client
MUST use the Header that is identified by the {element declaration}.

{mustUnderstand} OPTIONAL. An xs:boolean. If the property is true, then the bindings that support expression of
mandatory data should mark them as mandatory in an appropriate way.

Header Component's XML Representation is,

Header Component's mapping is,

{element} = The element declaration from the {element declarations} property of The Definitions Component resolved
to by the value of the element attribute information item if present, otherwise empty. It is an error for the element
attribute information item to have a value and that value does not resolve to a global element declaration from the {element
declarations} property of The Definitions Component.

Add the property {disable headers} to Binding Fault Component

{disable headers} OPTIONAL. An xs:boolean. If this property exists and is true, then header construction is turned off.
Scope of {disable headers} is limited to the WSDL Header components defined for the Interface Fault Component in {fault
reference}. This property does not interact with any other WSDL feature, Bindings, Extensions or Feature and Properties
framework.

{disable headers} = The actual value of the disableHeaders attribute information item, if present. If not, the actual
value of the disableHeadersDefault attribute information item of the parent wsdl:binding element information item, if
present. If not the value as defined by the concrete binding, if applicable.

{disable headers} OPTIONAL. An xs:boolean. If this property exists and is true, then header construction is turned off.
Scope of {disable headers} is limited to the WSDL Header components defined for the Interface Operation component being
bound by the containing Binding Operation component. This property does not interact with any other WSDL feature,
Bindings, Extensions or Feature and Properties framework.

{disable headers} = The actual value of the disableHeaders attribute information
item, if present. If not, the actual value of the disableHeadersDefault attribute information item of the ancestor
wsdl:binding element information item, if present. If not the value as defined by the concrete binding, if applicable.

(7) Add to SOAP Binding's Default Binding Rules

SOAP Header block construction

If the {headers} property exists and non empty, and {disable headers} is false,
element information item conforming to an Header Component's {element} property in the {headers} property MUST be turned
into a SOAP Header block.

These elements are serialized according to their schemas, and if the Header
Component's {mustUnderstand} property exists with the value "true", that particular SOAP header should be marked as
"mustUnderstand='true'" or "mustUnderstand='1'" as per the SOAP specification.

(8) Add to HTTP Binding's Default Binding Rules

HTTP Header construction

If the {headers} property exists and non empty, and {disable headers} is false,
element information item conforming to an Header component's {element} property in the {headers} property MUST be turned
into HTTP header if possible.

Only element information items of type "xs:string" or "xs:anyURI" may be
serialized. All complex data types are ignored. Attributes on data elements are ignored.

Each such element information item is serialized as follows:

The HTTP header name used is the element information item local name. The element
information item local name MUST follow the field-name production rules as specified in section 4.2 of [IETF RFC 2616];
if not, the element information item MUST be ignored. If an HTTP header corresponding to the element information item
local name is set by a different mechanism other than the HTTP Binding, such as the HTTP stack or another feature, then
an error MUST be raised.

The HTTP header content is serialized from the corresponding element information
item value in UTF-8. If this serialization is NOT possible, then the element information item MUST be ignored.