eclipse-ee4j / metro-jax-ws

metro-jax-ws
https://eclipse-ee4j.github.io/metro-jax-ws/
BSD 3-Clause "New" or "Revised" License
70 stars 40 forks source link

com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe, BasicAuth, Wrong Encoding, webservice-client #593

Open Tomas-Kraus opened 2 years ago

Tomas-Kraus commented 2 years ago

FULL PRODUCT VERSION :

A DESCRIPTION OF THE PROBLEM : if the Plattform Encoding is not "ISO-8859-1", the class

com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe

do the wrong encoding to the Basic Auth header.

Normally the webservice client uses this code to send the credentials.

Map<String, Object> ctx = ((BindingProvider) port).getRequestContext(); ctx.put(BindingProvider.USERNAME_PROPERTY, "user"); ctx.put(BindingProvider.PASSWORD_PROPERTY, "üöä");

The Basic-Auth header must be encoded with "ISO-8859-1" but the impletation in class "com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe" does not doing this.

STEPS TO FOLLOW TO REPRODUCE THE PROBLEM : step into class

com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe

take a look where "BindingProvider.PASSWORD_PROPERTY" is used.

the getBytes()-Method is called without StandardCharset.ISO_8859_1

This issue was previously reported at: https://bugs.openjdk.java.net/browse/JDK-8154861 REPRODUCIBILITY : This bug can be reproduced always.

CUSTOMER SUBMITTED WORKAROUND : // creating the header externally

Map<String, Object> ctx = ((BindingProvider) port).getRequestContext();

Map<String, List> headers=new HashMap<String, List>();

headers.put("Authorization", Arrays.asList("Basic "+DatatypeConverter.printBase64Binary("user:üäö".getBytes(StandardCharsets.ISO_8859_1))));

ctx.put(MessageContext.HTTP_REQUEST_HEADERS, headers);

Source: https://github.com/javaee/metro-jax-ws/issues/1218 Author: LanceAndersen