8244652: Add test for non utf-8 response handling by websocket
The test java.net.httpclient.websocket.WSHandshakeExceptionTest.java checks that the websocket client handles invalid utf-8 sent by the websocket server
Reviewed-by: dfuchs
diff --git a/test/jdk/java/net/httpclient/websocket/WSHandshakeExceptionTest.java b/test/jdk/java/net/httpclient/websocket/WSHandshakeExceptionTest.java
index d25d6c8..44620f6 100644
--- a/test/jdk/java/net/httpclient/websocket/WSHandshakeExceptionTest.java
+++ b/test/jdk/java/net/httpclient/websocket/WSHandshakeExceptionTest.java
@@ -32,10 +32,17 @@
* @run testng/othervm -Djdk.internal.httpclient.debug=true WSHandshakeExceptionTest
*/
+import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;
import com.sun.net.httpserver.HttpsConfigurator;
import com.sun.net.httpserver.HttpsServer;
+import com.sun.net.httpserver.HttpExchange;
+
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
import java.net.InetAddress;
import java.net.http.HttpClient;
import java.net.http.WebSocket;
@@ -67,6 +74,8 @@
HttpsServer httpsTestServer; // HTTPS/1.1
String httpURI;
String httpsURI;
+ String httpNonUtf8URI;
+ String httpsNonUtf8URI;
static final int ITERATION_COUNT = 10;
// a shared executor helps reduce the amount of threads created by the test
@@ -75,10 +84,15 @@
@DataProvider(name = "variants")
public Object[][] variants() {
return new Object[][]{
- { httpURI, false },
- { httpsURI, false },
- { httpURI, true },
- { httpsURI, true },
+ { httpURI, false },
+ { httpsURI, false },
+ { httpURI, true },
+ { httpsURI, true },
+
+ { httpNonUtf8URI, true },
+ { httpsNonUtf8URI, true },
+ { httpNonUtf8URI, false },
+ { httpsNonUtf8URI, false }
};
}
@@ -110,9 +124,20 @@
}
WebSocketHandshakeException wse = (WebSocketHandshakeException) t;
assertNotNull(wse.getResponse());
+ assertNotNull(wse.getResponse().body());
+ assertEquals(wse.getResponse().body().getClass(), String.class);
+ String body = (String)wse.getResponse().body();
out.println("Status code is " + wse.getResponse().statusCode());
- out.println("Response is " + wse.getResponse().body());
- assertTrue(((String)wse.getResponse().body()).contains("404"));
+ out.println("Response is " + body);
+ if(uri.contains("/nonutf8body")) {
+ // the invalid sequence 0xFF should have been replaced
+ // by the replacement character (U+FFFD)
+ assertTrue(body.equals("\ufffd"));
+ }
+ else {
+ // default HttpServer 404 body expected
+ assertTrue(body.contains("404"));
+ }
assertEquals(wse.getResponse().statusCode(), 404);
}
}
@@ -128,10 +153,14 @@
InetSocketAddress sa = new InetSocketAddress(InetAddress.getLoopbackAddress(), 0);
httpTestServer = HttpServer.create(sa, 0);
httpURI = "ws://localhost:" + httpTestServer.getAddress().getPort() + "/";
+ httpNonUtf8URI = "ws://localhost:" + httpTestServer.getAddress().getPort() + "/nonutf8body";
+ httpTestServer.createContext("/nonutf8body", new BodyHandler());
httpsTestServer = HttpsServer.create(sa, 0);
httpsTestServer.setHttpsConfigurator(new HttpsConfigurator(sslContext));
httpsURI = "wss://localhost:" + httpsTestServer.getAddress().getPort() + "/";
+ httpsNonUtf8URI = "wss://localhost:" + httpsTestServer.getAddress().getPort() + "/nonutf8body";
+ httpsTestServer.createContext("/nonutf8body", new BodyHandler());
httpTestServer.start();
httpsTestServer.start();
@@ -153,4 +182,17 @@
}
return cause;
}
+
+ static class BodyHandler implements HttpHandler {
+
+ @Override
+ public void handle(HttpExchange e) throws IOException {
+ try(InputStream is = e.getRequestBody();
+ OutputStream os = e.getResponseBody()) {
+ byte[] invalidUtf8 = {(byte)0xFF}; //Invalid utf-8 byte
+ e.sendResponseHeaders(404, invalidUtf8.length);
+ os.write(invalidUtf8);
+ }
+ }
+ }
}