Hi Vyacheslav,
Please open an issue here: https://issues.apache.org/jira/browse/CMIS
I'll look into it.
- Florian
> Hello,
>
> I have a custom authentication provider that extends
> org.apache.chemistry.opencmis.client.bindings.spi.StandardAuthenticationProvider.
> The provider modifies Security header in outgoing SOAP message in order to
> implement a proprietary authentication. On the server side authentication
> data is parsed, client is authenticated, request is processed and a new
> Security header is attached to the reply message. The client extract
> authentication data from the response and uses it for sequential calls. That
> worked well in implementations based on Chemistry 0.10 and 0.13. While trying
> to port to Chemistry 0.14 the code started to fail with
> java.lang.UnsupportedOperationException. Using debugger I found the cause of
> the failure:
>
>
> 1. When message is being prepared to be sent Chemistry framework calls
> a custom authentication provider. The provide prepares Security header and
> returns it to framework
>
> 2. Framework in
> org.apache.chemistry.opencmis.client.bindings.spi.webservices.CXFPortProvider.
> createPortObject(...) creates a new header list and adds it to request
> context at line 120:
>
>
>
> portObject.getRequestContext().put(
>
> Header.HEADER_LIST,
>
> Collections.singletonList(new Header(new
> QName(soapHeader.getNamespaceURI(), soapHeader
>
> .getLocalName()), soapHeader)));
>
>
>
> 3. Request is sent to server, server processes it and replies with a
> message containing another Security header
>
> 4. Response is being processed on client by Apache CXF making bunch of
> calls to interceptors. One of the interceptors,
> org.apache.cxf.binding.soap.saaj.AAJInInterceptor.replaceHeaders(...),
> attempts to replaces old headers in context if the response has headers with
> matching names (line 310):
>
>
>
> Header oldHdr = message.getHeader(
>
> new QName(elem.getNamespaceURI(), elem.getLocalName()));
>
> if (oldHdr != null) {
>
> message.getHeaders().remove(oldHdr);
>
> }
>
> message.getHeaders().add(shead);
>
>
> The problem is that the header list created by CXFPortProvider in step#2 is
> read-only, but AAJInInterceptor in step #4 expects it to be read-write.
>
> Not sure where the fix has to be done, but I would expect that having the
> same header in the request and response is acceptable.
>
> Regards,
>
> Vyacheslav Pascarel
>
>