From bf80d822c045d4c27b9b8be5a860402dadab6114 Mon Sep 17 00:00:00 2001 From: Joakim Erdfelt Date: Tue, 27 Dec 2016 14:06:33 -0700 Subject: [PATCH] Issue #1202 - Adding testcase and fix for NPE in Sec-WebSocket-Extensions use --- .../jetty/websocket/jsr356/JsrSession.java | 11 +++----- .../jsr356/server/ConfiguratorTest.java | 25 ++++++++++++++++--- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JsrSession.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JsrSession.java index 82db0bd93b2..4dd6ca91751 100644 --- a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JsrSession.java +++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JsrSession.java @@ -21,7 +21,6 @@ package org.eclipse.jetty.websocket.jsr356; import java.io.IOException; import java.net.URI; import java.security.Principal; -import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; @@ -29,6 +28,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Set; +import java.util.stream.Collectors; import javax.websocket.CloseReason; import javax.websocket.EndpointConfig; @@ -42,7 +42,6 @@ import javax.websocket.WebSocketContainer; import org.eclipse.jetty.util.log.Log; import org.eclipse.jetty.util.log.Logger; import org.eclipse.jetty.websocket.api.BatchMode; -import org.eclipse.jetty.websocket.api.extensions.ExtensionConfig; import org.eclipse.jetty.websocket.common.LogicalConnection; import org.eclipse.jetty.websocket.common.WebSocketSession; import org.eclipse.jetty.websocket.common.events.EventDriver; @@ -241,13 +240,9 @@ public class JsrSession extends WebSocketSession implements javax.websocket.Sess @Override public List getNegotiatedExtensions() { - if (negotiatedExtensions == null) + if ((negotiatedExtensions == null) && getUpgradeResponse().getExtensions() != null) { - negotiatedExtensions = new ArrayList(); - for (ExtensionConfig cfg : getUpgradeResponse().getExtensions()) - { - negotiatedExtensions.add(new JsrExtension(cfg)); - } + negotiatedExtensions = getUpgradeResponse().getExtensions().stream().map(JsrExtension::new).collect(Collectors.toList()); } return negotiatedExtensions; } diff --git a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/ConfiguratorTest.java b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/ConfiguratorTest.java index bda0b552833..99daeb73382 100644 --- a/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/ConfiguratorTest.java +++ b/jetty-websocket/javax-websocket-server-impl/src/test/java/org/eclipse/jetty/websocket/jsr356/server/ConfiguratorTest.java @@ -20,6 +20,7 @@ package org.eclipse.jetty.websocket.jsr356.server; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.nullValue; +import static org.junit.Assert.assertThat; import java.io.PrintWriter; import java.io.StringWriter; @@ -36,6 +37,7 @@ import java.util.TimeZone; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; +import java.util.stream.Collectors; import javax.websocket.DecodeException; import javax.websocket.Decoder; @@ -97,9 +99,19 @@ public class ConfiguratorTest public static class NoExtensionsSocket { @OnMessage - public String echo(String message) + public String echo(Session session, String message) { - return message; + List negotiatedExtensions = session.getNegotiatedExtensions(); + if (negotiatedExtensions == null) + { + return "negotiatedExtensions=null"; + } + else + { + return "negotiatedExtensions=" + negotiatedExtensions.stream() + .map((ext) -> ext.getName()) + .collect(Collectors.joining(",", "[", "]")); + } } } @@ -420,8 +432,13 @@ public class ConfiguratorTest client.addExtensions("identity"); client.connect(); client.sendStandardRequest(); - HttpResponse response = client.readResponseHeader(); - Assert.assertThat("response.extensions", response.getExtensionsHeader(), nullValue()); + HttpResponse response = client.expectUpgradeResponse(); + assertThat("response.extensions", response.getExtensionsHeader(), nullValue()); + + client.write(new TextFrame().setPayload("NegoExts")); + EventQueue frames = client.readFrames(1, 1, TimeUnit.SECONDS); + WebSocketFrame frame = frames.poll(); + assertThat("Frame Response", frame.getPayloadAsUTF8(), is("negotiatedExtensions=[]")); } }