forked from pool/java-1_8_0-openjdk
240 lines
9.1 KiB
Diff
240 lines
9.1 KiB
Diff
--- icedtea-3.8.0/openjdk/jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/output/XMLStreamWriterOutput.java 2018-09-18 09:50:10.008533991 +0200
|
|
+++ icedtea-3.8.0/openjdk/jaxws/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/output/XMLStreamWriterOutput.java 2018-09-18 09:50:56.928788967 +0200
|
|
@@ -33,6 +33,7 @@
|
|
import javax.xml.stream.XMLStreamWriter;
|
|
|
|
import com.sun.xml.internal.bind.marshaller.CharacterEscapeHandler;
|
|
+import com.sun.xml.internal.bind.marshaller.NoEscapeHandler;
|
|
import com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl;
|
|
import com.sun.xml.internal.bind.v2.runtime.XMLSerializer;
|
|
|
|
@@ -71,7 +72,7 @@
|
|
}
|
|
|
|
CharacterEscapeHandler xmlStreamEscapeHandler = escapeHandler != null ?
|
|
- escapeHandler : NewLineEscapeHandler.theInstance;
|
|
+ escapeHandler : NoEscapeHandler.theInstance;
|
|
|
|
// otherwise the normal writer.
|
|
return new XMLStreamWriterOutput(out, xmlStreamEscapeHandler);
|
|
@@ -217,45 +218,6 @@
|
|
}
|
|
}
|
|
|
|
-
|
|
- /**
|
|
- * Performs character escaping only for new lines.
|
|
- */
|
|
- private static class NewLineEscapeHandler implements CharacterEscapeHandler {
|
|
-
|
|
- public static final NewLineEscapeHandler theInstance = new NewLineEscapeHandler();
|
|
-
|
|
- @Override
|
|
- public void escape(char[] ch, int start, int length, boolean isAttVal, Writer out) throws IOException {
|
|
- int limit = start+length;
|
|
- int lastEscaped = start;
|
|
-
|
|
- for (int i = start; i < limit; i++) {
|
|
- char c = ch[i];
|
|
- if (c == '\r' || c == '\n') {
|
|
- if (i != lastEscaped) {
|
|
- out.write(ch, lastEscaped, i - lastEscaped);
|
|
- }
|
|
- lastEscaped = i + 1;
|
|
- if (out instanceof XmlStreamOutWriterAdapter) {
|
|
- try {
|
|
- ((XmlStreamOutWriterAdapter)out).writeEntityRef("#x" + Integer.toHexString(c));
|
|
- } catch (XMLStreamException e) {
|
|
- throw new IOException("Error writing xml stream", e);
|
|
- }
|
|
- } else {
|
|
- out.write("&#x");
|
|
- out.write(Integer.toHexString(c));
|
|
- out.write(';');
|
|
- }
|
|
- }
|
|
- }
|
|
- if (lastEscaped != limit) {
|
|
- out.write(ch, lastEscaped, length - lastEscaped);
|
|
- }
|
|
- }
|
|
- }
|
|
-
|
|
private static final class XmlStreamOutWriterAdapter extends Writer {
|
|
|
|
private final XMLStreamWriter writer;
|
|
--- icedtea-3.8.0/openjdk/jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/api/streaming/XMLStreamWriterFactory.java 2018-09-18 09:50:10.028534099 +0200
|
|
+++ icedtea-3.8.0/openjdk/jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/api/streaming/XMLStreamWriterFactory.java 2018-09-18 09:50:56.928788967 +0200
|
|
@@ -386,7 +386,7 @@
|
|
|
|
}
|
|
|
|
- private static class HasEncodingWriter extends XMLStreamWriterFilter implements HasEncoding {
|
|
+ public static class HasEncodingWriter extends XMLStreamWriterFilter implements HasEncoding {
|
|
private final String encoding;
|
|
|
|
HasEncodingWriter(XMLStreamWriter writer, String encoding) {
|
|
@@ -399,7 +399,7 @@
|
|
return encoding;
|
|
}
|
|
|
|
- XMLStreamWriter getWriter() {
|
|
+ public XMLStreamWriter getWriter() {
|
|
return writer;
|
|
}
|
|
}
|
|
--- icedtea-3.8.0/openjdk/jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/streaming/XMLStreamWriterUtil.java 2018-09-18 09:50:10.044534187 +0200
|
|
+++ icedtea-3.8.0/openjdk/jaxws/src/share/jaxws_classes/com/sun/xml/internal/ws/streaming/XMLStreamWriterUtil.java 2018-09-18 09:50:56.928788967 +0200
|
|
@@ -26,6 +26,7 @@
|
|
package com.sun.xml.internal.ws.streaming;
|
|
|
|
import com.sun.istack.internal.Nullable;
|
|
+import com.sun.xml.internal.ws.api.streaming.XMLStreamWriterFactory;
|
|
import com.sun.xml.internal.ws.encoding.HasEncoding;
|
|
import com.sun.xml.internal.ws.encoding.SOAPBindingCodec;
|
|
|
|
@@ -57,9 +58,15 @@
|
|
public static @Nullable OutputStream getOutputStream(XMLStreamWriter writer) throws XMLStreamException {
|
|
Object obj = null;
|
|
|
|
+ XMLStreamWriter xmlStreamWriter =
|
|
+ writer instanceof XMLStreamWriterFactory.HasEncodingWriter ?
|
|
+ ((XMLStreamWriterFactory.HasEncodingWriter) writer).getWriter()
|
|
+ : writer;
|
|
+
|
|
+
|
|
// Hack for JDK6's SJSXP
|
|
- if (writer instanceof Map) {
|
|
- obj = ((Map) writer).get("sjsxp-outputstream");
|
|
+ if (xmlStreamWriter instanceof Map) {
|
|
+ obj = ((Map) xmlStreamWriter).get("sjsxp-outputstream");
|
|
}
|
|
|
|
// woodstox
|
|
--- icedtea-3.8.0/openjdk/jdk/test/javax/xml/ws/8172297/Main.java 2018-09-18 09:50:09.468531057 +0200
|
|
+++ icedtea-3.8.0/openjdk/jdk/test/javax/xml/ws/8172297/Main.java 2018-09-18 09:51:20.328916131 +0200
|
|
@@ -23,7 +23,7 @@
|
|
|
|
/*
|
|
* @test
|
|
- * @bug 8172297
|
|
+ * @bug 8172297 8196491
|
|
* @summary Test that carriage-return and new-line characters
|
|
* are preserved in webservice parameters
|
|
* @compile ws/HelloWorld.java ws/HelloWorldImpl.java Main.java
|
|
@@ -33,13 +33,21 @@
|
|
import java.io.IOException;
|
|
import java.net.ServerSocket;
|
|
import java.net.URL;
|
|
+import java.util.Collections;
|
|
+import java.util.Set;
|
|
import java.util.concurrent.CountDownLatch;
|
|
|
|
import javax.xml.namespace.QName;
|
|
+import javax.xml.soap.SOAPMessage;
|
|
import javax.xml.ws.Endpoint;
|
|
import javax.xml.ws.Service;
|
|
+import javax.xml.ws.handler.Handler;
|
|
+import javax.xml.ws.handler.MessageContext;
|
|
+import javax.xml.ws.handler.soap.SOAPHandler;
|
|
+import javax.xml.ws.handler.soap.SOAPMessageContext;
|
|
|
|
import org.testng.Assert;
|
|
+import org.testng.annotations.DataProvider;
|
|
import org.testng.annotations.Test;
|
|
|
|
import ws.HelloWorld;
|
|
@@ -47,9 +55,8 @@
|
|
|
|
public class Main {
|
|
|
|
- @Test
|
|
- public void runTest() throws Exception {
|
|
- //
|
|
+ @Test(dataProvider="callHandlerDataProvider")
|
|
+ public void runTest(boolean callGetMessageInHandler) throws Exception {
|
|
CountDownLatch serverInitSignal = new CountDownLatch(1);
|
|
CountDownLatch testDoneSignal = new CountDownLatch(1);
|
|
|
|
@@ -58,23 +65,31 @@
|
|
|
|
serverInitSignal.await();
|
|
|
|
- boolean paramModified = runClientCode(serverThread.getPort());
|
|
+ boolean paramModified = runClientCode(serverThread.getPort(), callGetMessageInHandler);
|
|
|
|
testDoneSignal.countDown();
|
|
|
|
- Assert.assertFalse(paramModified, "WS parameter was modified during round trip.");
|
|
+ Assert.assertEquals(callGetMessageInHandler, paramModified,
|
|
+ "WS parameter has not been processed as expected");
|
|
+ }
|
|
+
|
|
+ @DataProvider
|
|
+ public Object[][] callHandlerDataProvider() {
|
|
+ return new Object[][]{{true}, {false}};
|
|
}
|
|
|
|
/*
|
|
* Connects to launched web service endpoint, sends message with CR/NL symbols and
|
|
* checks if it was modified during the round trip client/server communication.
|
|
*/
|
|
- private boolean runClientCode(int port) throws Exception {
|
|
+ private boolean runClientCode(int port, boolean callGetMessage) throws Exception {
|
|
System.out.println("Launching WS client connection on " + port + " port");
|
|
URL url = new URL("http://localhost:" + port + "/ws/hello?wsdl");
|
|
QName qname = new QName("http://ws/", "HelloWorldImplService");
|
|
Service service = Service.create(url, qname);
|
|
|
|
+ registerHandler(service, callGetMessage);
|
|
+
|
|
HelloWorld hello = (HelloWorld) service.getPort(HelloWorld.class);
|
|
|
|
logStringContent("Client input parameter", WS_PARAM_VALUE);
|
|
@@ -86,6 +101,45 @@
|
|
}
|
|
|
|
/*
|
|
+ * Register message handler and call SOAPMessageContext.getMessage
|
|
+ * to emulate issue reported in JDK-8196491
|
|
+ */
|
|
+ private void registerHandler(Service service, final boolean callGetMessage) {
|
|
+ System.out.printf( "Client %s call getMessage inside message handler%n",
|
|
+ callGetMessage ? "will" : "will not" );
|
|
+ // Set custom SOAP message handler resolver
|
|
+ service.setHandlerResolver(portInfo -> {
|
|
+ Handler h = new SOAPHandler<SOAPMessageContext>() {
|
|
+
|
|
+ @Override
|
|
+ public boolean handleMessage(SOAPMessageContext context) {
|
|
+ if (callGetMessage) {
|
|
+ // Trigger exception from JDK-8196491
|
|
+ SOAPMessage msg = context.getMessage();
|
|
+ }
|
|
+ return true;
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public boolean handleFault(SOAPMessageContext context) {
|
|
+ return true;
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public void close(MessageContext context) {
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public Set<QName> getHeaders() {
|
|
+ return null;
|
|
+ }
|
|
+
|
|
+ };
|
|
+ return Collections.singletonList(h);
|
|
+ });
|
|
+ }
|
|
+
|
|
+ /*
|
|
* Outputs the parameter value with newline and carriage-return symbols
|
|
* replaced with #CR and #NL text abbreviations.
|
|
*/
|