diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/server/support/WebSocketHttpRequestHandler.java b/spring-websocket/src/main/java/org/springframework/web/socket/server/support/WebSocketHttpRequestHandler.java index 89974399891..c3caa213d84 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/server/support/WebSocketHttpRequestHandler.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/server/support/WebSocketHttpRequestHandler.java @@ -87,13 +87,8 @@ public class WebSocketHttpRequestHandler implements HttpRequestHandler { ServerHttpRequest httpRequest = new ServletServerHttpRequest(request); ServerHttpResponse httpResponse = new ServletServerHttpResponse(response); - try { - this.handshakeHandler.doHandshake(httpRequest, httpResponse, this.webSocketHandler); - httpResponse.flush(); - } - catch (IOException ex) { - throw ex; - } + this.handshakeHandler.doHandshake(httpRequest, httpResponse, this.webSocketHandler); + httpResponse.flush(); } } diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/handler/DefaultSockJsService.java b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/handler/DefaultSockJsService.java index a1f708c7874..a64ff7c6a69 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/handler/DefaultSockJsService.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/handler/DefaultSockJsService.java @@ -46,6 +46,7 @@ import org.springframework.web.socket.sockjs.SockJsException; import org.springframework.web.socket.sockjs.SockJsService; import org.springframework.web.socket.sockjs.support.AbstractSockJsService; import org.springframework.web.socket.sockjs.support.frame.Jackson2SockJsMessageCodec; +import org.springframework.web.socket.sockjs.support.frame.JacksonSockJsMessageCodec; import org.springframework.web.socket.sockjs.support.frame.SockJsMessageCodec; import org.springframework.web.socket.sockjs.transport.TransportHandler; import org.springframework.web.socket.sockjs.transport.TransportType; @@ -88,18 +89,7 @@ public class DefaultSockJsService extends AbstractSockJsService { * application stops. */ public DefaultSockJsService(TaskScheduler taskScheduler) { - super(taskScheduler); - addTransportHandlers(getDefaultTransportHandlers()); - initMessageCodec(); - } - - protected void initMessageCodec() { - if (jackson2Present) { - this.messageCodec = new Jackson2SockJsMessageCodec(); - } - else if (jacksonPresent) { - this.messageCodec = new Jackson2SockJsMessageCodec(); - } + this(taskScheduler, null); } /** @@ -111,7 +101,7 @@ public class DefaultSockJsService extends AbstractSockJsService { * Spring bean to ensure it is initialized at start up and shut down when the * application stops. * @param transportHandlers the transport handlers to use (replaces the default ones); - * can be {@code null}. + * can be {@code null} if you don't want to install the default ones. * @param transportHandlerOverrides zero or more overrides to the default transport * handler types. */ @@ -122,9 +112,13 @@ public class DefaultSockJsService extends AbstractSockJsService { initMessageCodec(); - if (!CollectionUtils.isEmpty(transportHandlers)) { + if (CollectionUtils.isEmpty(transportHandlers)) { + addTransportHandlers(getDefaultTransportHandlers()); + } + else { addTransportHandlers(transportHandlers); } + if (!ObjectUtils.isEmpty(transportHandlerOverrides)) { addTransportHandlers(Arrays.asList(transportHandlerOverrides)); } @@ -134,13 +128,21 @@ public class DefaultSockJsService extends AbstractSockJsService { } } + private void initMessageCodec() { + if (jackson2Present) { + this.messageCodec = new Jackson2SockJsMessageCodec(); + } + else if (jacksonPresent) { + this.messageCodec = new JacksonSockJsMessageCodec(); + } + } protected final Set getDefaultTransportHandlers() { Set result = new HashSet(); result.add(new XhrPollingTransportHandler()); - result.add(new XhrTransportHandler()); + result.add(new XhrReceivingTransportHandler()); result.add(new JsonpPollingTransportHandler()); - result.add(new JsonpTransportHandler()); + result.add(new JsonpReceivingTransportHandler()); result.add(new XhrStreamingTransportHandler()); result.add(new EventSourceTransportHandler()); result.add(new HtmlFileTransportHandler()); diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/handler/JsonpTransportHandler.java b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/handler/JsonpReceivingTransportHandler.java similarity index 96% rename from spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/handler/JsonpTransportHandler.java rename to spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/handler/JsonpReceivingTransportHandler.java index 6709c460274..d124830e81d 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/handler/JsonpTransportHandler.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/handler/JsonpReceivingTransportHandler.java @@ -37,7 +37,7 @@ import org.springframework.web.socket.sockjs.transport.session.AbstractHttpSockJ * * @author Rossen Stoyanchev */ -public class JsonpTransportHandler extends AbstractHttpReceivingTransportHandler { +public class JsonpReceivingTransportHandler extends AbstractHttpReceivingTransportHandler { private final FormHttpMessageConverter formConverter = new FormHttpMessageConverter(); diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/handler/XhrTransportHandler.java b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/handler/XhrReceivingTransportHandler.java similarity index 94% rename from spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/handler/XhrTransportHandler.java rename to spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/handler/XhrReceivingTransportHandler.java index 6965dee9618..d3e1300a340 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/handler/XhrTransportHandler.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/handler/XhrReceivingTransportHandler.java @@ -28,7 +28,7 @@ import org.springframework.web.socket.sockjs.transport.TransportType; * * @author Rossen Stoyanchev */ -public class XhrTransportHandler extends AbstractHttpReceivingTransportHandler { +public class XhrReceivingTransportHandler extends AbstractHttpReceivingTransportHandler { @Override diff --git a/spring-websocket/src/test/java/org/springframework/web/socket/sockjs/transport/handler/DefaultSockJsServiceTests.java b/spring-websocket/src/test/java/org/springframework/web/socket/sockjs/transport/handler/DefaultSockJsServiceTests.java index 0115f51266b..85c3540e393 100644 --- a/spring-websocket/src/test/java/org/springframework/web/socket/sockjs/transport/handler/DefaultSockJsServiceTests.java +++ b/spring-websocket/src/test/java/org/springframework/web/socket/sockjs/transport/handler/DefaultSockJsServiceTests.java @@ -17,6 +17,7 @@ package org.springframework.web.socket.sockjs.transport.handler; import java.util.Arrays; +import java.util.List; import java.util.Map; import org.junit.Before; @@ -97,6 +98,30 @@ public class DefaultSockJsServiceTests extends AbstractHttpRequestTests { assertNotNull(handlers.get(TransportType.EVENT_SOURCE)); } + @Test + public void defaultTransportHandlersWithOverride() { + + XhrReceivingTransportHandler xhrHandler = new XhrReceivingTransportHandler(); + + DefaultSockJsService service = new DefaultSockJsService(mock(TaskScheduler.class), null, xhrHandler); + Map handlers = service.getTransportHandlers(); + + assertEquals(8, handlers.size()); + assertSame(xhrHandler, handlers.get(xhrHandler.getTransportType())); + } + + @Test + public void customizedTransportHandlerList() { + + List handlers = Arrays.asList( + new XhrPollingTransportHandler(), new XhrReceivingTransportHandler()); + + DefaultSockJsService service = new DefaultSockJsService(mock(TaskScheduler.class), handlers); + Map actualHandlers = service.getTransportHandlers(); + + assertEquals(handlers.size(), actualHandlers.size()); + } + @Test public void handleTransportRequestXhr() throws Exception { diff --git a/spring-websocket/src/test/java/org/springframework/web/socket/sockjs/transport/handler/HttpReceivingTransportHandlerTests.java b/spring-websocket/src/test/java/org/springframework/web/socket/sockjs/transport/handler/HttpReceivingTransportHandlerTests.java index ac52e08728d..0f3f54ce2e7 100644 --- a/spring-websocket/src/test/java/org/springframework/web/socket/sockjs/transport/handler/HttpReceivingTransportHandlerTests.java +++ b/spring-websocket/src/test/java/org/springframework/web/socket/sockjs/transport/handler/HttpReceivingTransportHandlerTests.java @@ -32,7 +32,7 @@ import static org.mockito.Mockito.*; /** * Test fixture for {@link AbstractHttpReceivingTransportHandler} and sub-classes - * {@link XhrTransportHandler} and {@link JsonpTransportHandler}. + * {@link XhrReceivingTransportHandler} and {@link JsonpReceivingTransportHandler}. * * @author Rossen Stoyanchev */ @@ -48,7 +48,7 @@ public class HttpReceivingTransportHandlerTests extends AbstractHttpRequestTest @Test public void readMessagesXhr() throws Exception { this.servletRequest.setContent("[\"x\"]".getBytes("UTF-8")); - handleRequest(new XhrTransportHandler()); + handleRequest(new XhrReceivingTransportHandler()); assertEquals(204, this.servletResponse.getStatus()); } @@ -56,7 +56,7 @@ public class HttpReceivingTransportHandlerTests extends AbstractHttpRequestTest @Test public void readMessagesJsonp() throws Exception { this.servletRequest.setContent("[\"x\"]".getBytes("UTF-8")); - handleRequest(new JsonpTransportHandler()); + handleRequest(new JsonpReceivingTransportHandler()); assertEquals(200, this.servletResponse.getStatus()); assertEquals("ok", this.servletResponse.getContentAsString()); @@ -66,7 +66,7 @@ public class HttpReceivingTransportHandlerTests extends AbstractHttpRequestTest public void readMessagesJsonpFormEncoded() throws Exception { this.servletRequest.setContent("d=[\"x\"]".getBytes("UTF-8")); this.servletRequest.setContentType(MediaType.APPLICATION_FORM_URLENCODED_VALUE); - handleRequest(new JsonpTransportHandler()); + handleRequest(new JsonpReceivingTransportHandler()); assertEquals(200, this.servletResponse.getStatus()); assertEquals("ok", this.servletResponse.getContentAsString()); @@ -78,7 +78,7 @@ public class HttpReceivingTransportHandlerTests extends AbstractHttpRequestTest public void readMessagesJsonpFormEncodedWithEncoding() throws Exception { this.servletRequest.setContent("d=[\"x\"]".getBytes("UTF-8")); this.servletRequest.setContentType("application/x-www-form-urlencoded;charset=UTF-8"); - handleRequest(new JsonpTransportHandler()); + handleRequest(new JsonpReceivingTransportHandler()); assertEquals(200, this.servletResponse.getStatus()); assertEquals("ok", this.servletResponse.getContentAsString()); @@ -96,7 +96,7 @@ public class HttpReceivingTransportHandlerTests extends AbstractHttpRequestTest @Test(expected=IllegalArgumentException.class) public void readMessagesNoSession() throws Exception { WebSocketHandler webSocketHandler = mock(WebSocketHandler.class); - new XhrTransportHandler().handleRequest(this.request, this.response, webSocketHandler, null); + new XhrReceivingTransportHandler().handleRequest(this.request, this.response, webSocketHandler, null); } @Test @@ -113,7 +113,7 @@ public class HttpReceivingTransportHandlerTests extends AbstractHttpRequestTest doThrow(new Exception()).when(wsHandler).handleMessage(session, new TextMessage("x")); try { - XhrTransportHandler transportHandler = new XhrTransportHandler(); + XhrReceivingTransportHandler transportHandler = new XhrReceivingTransportHandler(); transportHandler.setSockJsServiceConfiguration(sockJsConfig); transportHandler.handleRequest(this.request, this.response, wsHandler, session); fail("Expected exception"); @@ -143,7 +143,7 @@ public class HttpReceivingTransportHandlerTests extends AbstractHttpRequestTest WebSocketHandler wsHandler = mock(WebSocketHandler.class); AbstractSockJsSession session = new TestHttpSockJsSession("1", new StubSockJsServiceConfig(), wsHandler); - new XhrTransportHandler().handleRequest(this.request, this.response, wsHandler, session); + new XhrReceivingTransportHandler().handleRequest(this.request, this.response, wsHandler, session); assertEquals(500, this.servletResponse.getStatus()); verifyNoMoreInteractions(wsHandler);