Browse Source

Fix configuration issues in DefaultSockJsService

pull/333/merge
Rossen Stoyanchev 13 years ago
parent
commit
9925d8385f
  1. 9
      spring-websocket/src/main/java/org/springframework/web/socket/server/support/WebSocketHttpRequestHandler.java
  2. 34
      spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/handler/DefaultSockJsService.java
  3. 2
      spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/handler/JsonpReceivingTransportHandler.java
  4. 2
      spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/handler/XhrReceivingTransportHandler.java
  5. 25
      spring-websocket/src/test/java/org/springframework/web/socket/sockjs/transport/handler/DefaultSockJsServiceTests.java
  6. 16
      spring-websocket/src/test/java/org/springframework/web/socket/sockjs/transport/handler/HttpReceivingTransportHandlerTests.java

9
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); ServerHttpRequest httpRequest = new ServletServerHttpRequest(request);
ServerHttpResponse httpResponse = new ServletServerHttpResponse(response); ServerHttpResponse httpResponse = new ServletServerHttpResponse(response);
try { this.handshakeHandler.doHandshake(httpRequest, httpResponse, this.webSocketHandler);
this.handshakeHandler.doHandshake(httpRequest, httpResponse, this.webSocketHandler); httpResponse.flush();
httpResponse.flush();
}
catch (IOException ex) {
throw ex;
}
} }
} }

34
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.SockJsService;
import org.springframework.web.socket.sockjs.support.AbstractSockJsService; 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.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.support.frame.SockJsMessageCodec;
import org.springframework.web.socket.sockjs.transport.TransportHandler; import org.springframework.web.socket.sockjs.transport.TransportHandler;
import org.springframework.web.socket.sockjs.transport.TransportType; import org.springframework.web.socket.sockjs.transport.TransportType;
@ -88,18 +89,7 @@ public class DefaultSockJsService extends AbstractSockJsService {
* application stops. * application stops.
*/ */
public DefaultSockJsService(TaskScheduler taskScheduler) { public DefaultSockJsService(TaskScheduler taskScheduler) {
super(taskScheduler); this(taskScheduler, null);
addTransportHandlers(getDefaultTransportHandlers());
initMessageCodec();
}
protected void initMessageCodec() {
if (jackson2Present) {
this.messageCodec = new Jackson2SockJsMessageCodec();
}
else if (jacksonPresent) {
this.messageCodec = new Jackson2SockJsMessageCodec();
}
} }
/** /**
@ -111,7 +101,7 @@ public class DefaultSockJsService extends AbstractSockJsService {
* Spring bean to ensure it is initialized at start up and shut down when the * Spring bean to ensure it is initialized at start up and shut down when the
* application stops. * application stops.
* @param transportHandlers the transport handlers to use (replaces the default ones); * @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 * @param transportHandlerOverrides zero or more overrides to the default transport
* handler types. * handler types.
*/ */
@ -122,9 +112,13 @@ public class DefaultSockJsService extends AbstractSockJsService {
initMessageCodec(); initMessageCodec();
if (!CollectionUtils.isEmpty(transportHandlers)) { if (CollectionUtils.isEmpty(transportHandlers)) {
addTransportHandlers(getDefaultTransportHandlers());
}
else {
addTransportHandlers(transportHandlers); addTransportHandlers(transportHandlers);
} }
if (!ObjectUtils.isEmpty(transportHandlerOverrides)) { if (!ObjectUtils.isEmpty(transportHandlerOverrides)) {
addTransportHandlers(Arrays.asList(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<TransportHandler> getDefaultTransportHandlers() { protected final Set<TransportHandler> getDefaultTransportHandlers() {
Set<TransportHandler> result = new HashSet<TransportHandler>(); Set<TransportHandler> result = new HashSet<TransportHandler>();
result.add(new XhrPollingTransportHandler()); result.add(new XhrPollingTransportHandler());
result.add(new XhrTransportHandler()); result.add(new XhrReceivingTransportHandler());
result.add(new JsonpPollingTransportHandler()); result.add(new JsonpPollingTransportHandler());
result.add(new JsonpTransportHandler()); result.add(new JsonpReceivingTransportHandler());
result.add(new XhrStreamingTransportHandler()); result.add(new XhrStreamingTransportHandler());
result.add(new EventSourceTransportHandler()); result.add(new EventSourceTransportHandler());
result.add(new HtmlFileTransportHandler()); result.add(new HtmlFileTransportHandler());

2
spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/handler/JsonpTransportHandler.java → 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 * @author Rossen Stoyanchev
*/ */
public class JsonpTransportHandler extends AbstractHttpReceivingTransportHandler { public class JsonpReceivingTransportHandler extends AbstractHttpReceivingTransportHandler {
private final FormHttpMessageConverter formConverter = new FormHttpMessageConverter(); private final FormHttpMessageConverter formConverter = new FormHttpMessageConverter();

2
spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/handler/XhrTransportHandler.java → 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 * @author Rossen Stoyanchev
*/ */
public class XhrTransportHandler extends AbstractHttpReceivingTransportHandler { public class XhrReceivingTransportHandler extends AbstractHttpReceivingTransportHandler {
@Override @Override

25
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; package org.springframework.web.socket.sockjs.transport.handler;
import java.util.Arrays; import java.util.Arrays;
import java.util.List;
import java.util.Map; import java.util.Map;
import org.junit.Before; import org.junit.Before;
@ -97,6 +98,30 @@ public class DefaultSockJsServiceTests extends AbstractHttpRequestTests {
assertNotNull(handlers.get(TransportType.EVENT_SOURCE)); assertNotNull(handlers.get(TransportType.EVENT_SOURCE));
} }
@Test
public void defaultTransportHandlersWithOverride() {
XhrReceivingTransportHandler xhrHandler = new XhrReceivingTransportHandler();
DefaultSockJsService service = new DefaultSockJsService(mock(TaskScheduler.class), null, xhrHandler);
Map<TransportType, TransportHandler> handlers = service.getTransportHandlers();
assertEquals(8, handlers.size());
assertSame(xhrHandler, handlers.get(xhrHandler.getTransportType()));
}
@Test
public void customizedTransportHandlerList() {
List<TransportHandler> handlers = Arrays.<TransportHandler>asList(
new XhrPollingTransportHandler(), new XhrReceivingTransportHandler());
DefaultSockJsService service = new DefaultSockJsService(mock(TaskScheduler.class), handlers);
Map<TransportType, TransportHandler> actualHandlers = service.getTransportHandlers();
assertEquals(handlers.size(), actualHandlers.size());
}
@Test @Test
public void handleTransportRequestXhr() throws Exception { public void handleTransportRequestXhr() throws Exception {

16
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 * Test fixture for {@link AbstractHttpReceivingTransportHandler} and sub-classes
* {@link XhrTransportHandler} and {@link JsonpTransportHandler}. * {@link XhrReceivingTransportHandler} and {@link JsonpReceivingTransportHandler}.
* *
* @author Rossen Stoyanchev * @author Rossen Stoyanchev
*/ */
@ -48,7 +48,7 @@ public class HttpReceivingTransportHandlerTests extends AbstractHttpRequestTest
@Test @Test
public void readMessagesXhr() throws Exception { public void readMessagesXhr() throws Exception {
this.servletRequest.setContent("[\"x\"]".getBytes("UTF-8")); this.servletRequest.setContent("[\"x\"]".getBytes("UTF-8"));
handleRequest(new XhrTransportHandler()); handleRequest(new XhrReceivingTransportHandler());
assertEquals(204, this.servletResponse.getStatus()); assertEquals(204, this.servletResponse.getStatus());
} }
@ -56,7 +56,7 @@ public class HttpReceivingTransportHandlerTests extends AbstractHttpRequestTest
@Test @Test
public void readMessagesJsonp() throws Exception { public void readMessagesJsonp() throws Exception {
this.servletRequest.setContent("[\"x\"]".getBytes("UTF-8")); this.servletRequest.setContent("[\"x\"]".getBytes("UTF-8"));
handleRequest(new JsonpTransportHandler()); handleRequest(new JsonpReceivingTransportHandler());
assertEquals(200, this.servletResponse.getStatus()); assertEquals(200, this.servletResponse.getStatus());
assertEquals("ok", this.servletResponse.getContentAsString()); assertEquals("ok", this.servletResponse.getContentAsString());
@ -66,7 +66,7 @@ public class HttpReceivingTransportHandlerTests extends AbstractHttpRequestTest
public void readMessagesJsonpFormEncoded() throws Exception { public void readMessagesJsonpFormEncoded() throws Exception {
this.servletRequest.setContent("d=[\"x\"]".getBytes("UTF-8")); this.servletRequest.setContent("d=[\"x\"]".getBytes("UTF-8"));
this.servletRequest.setContentType(MediaType.APPLICATION_FORM_URLENCODED_VALUE); this.servletRequest.setContentType(MediaType.APPLICATION_FORM_URLENCODED_VALUE);
handleRequest(new JsonpTransportHandler()); handleRequest(new JsonpReceivingTransportHandler());
assertEquals(200, this.servletResponse.getStatus()); assertEquals(200, this.servletResponse.getStatus());
assertEquals("ok", this.servletResponse.getContentAsString()); assertEquals("ok", this.servletResponse.getContentAsString());
@ -78,7 +78,7 @@ public class HttpReceivingTransportHandlerTests extends AbstractHttpRequestTest
public void readMessagesJsonpFormEncodedWithEncoding() throws Exception { public void readMessagesJsonpFormEncodedWithEncoding() throws Exception {
this.servletRequest.setContent("d=[\"x\"]".getBytes("UTF-8")); this.servletRequest.setContent("d=[\"x\"]".getBytes("UTF-8"));
this.servletRequest.setContentType("application/x-www-form-urlencoded;charset=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(200, this.servletResponse.getStatus());
assertEquals("ok", this.servletResponse.getContentAsString()); assertEquals("ok", this.servletResponse.getContentAsString());
@ -96,7 +96,7 @@ public class HttpReceivingTransportHandlerTests extends AbstractHttpRequestTest
@Test(expected=IllegalArgumentException.class) @Test(expected=IllegalArgumentException.class)
public void readMessagesNoSession() throws Exception { public void readMessagesNoSession() throws Exception {
WebSocketHandler webSocketHandler = mock(WebSocketHandler.class); WebSocketHandler webSocketHandler = mock(WebSocketHandler.class);
new XhrTransportHandler().handleRequest(this.request, this.response, webSocketHandler, null); new XhrReceivingTransportHandler().handleRequest(this.request, this.response, webSocketHandler, null);
} }
@Test @Test
@ -113,7 +113,7 @@ public class HttpReceivingTransportHandlerTests extends AbstractHttpRequestTest
doThrow(new Exception()).when(wsHandler).handleMessage(session, new TextMessage("x")); doThrow(new Exception()).when(wsHandler).handleMessage(session, new TextMessage("x"));
try { try {
XhrTransportHandler transportHandler = new XhrTransportHandler(); XhrReceivingTransportHandler transportHandler = new XhrReceivingTransportHandler();
transportHandler.setSockJsServiceConfiguration(sockJsConfig); transportHandler.setSockJsServiceConfiguration(sockJsConfig);
transportHandler.handleRequest(this.request, this.response, wsHandler, session); transportHandler.handleRequest(this.request, this.response, wsHandler, session);
fail("Expected exception"); fail("Expected exception");
@ -143,7 +143,7 @@ public class HttpReceivingTransportHandlerTests extends AbstractHttpRequestTest
WebSocketHandler wsHandler = mock(WebSocketHandler.class); WebSocketHandler wsHandler = mock(WebSocketHandler.class);
AbstractSockJsSession session = new TestHttpSockJsSession("1", new StubSockJsServiceConfig(), wsHandler); 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()); assertEquals(500, this.servletResponse.getStatus());
verifyNoMoreInteractions(wsHandler); verifyNoMoreInteractions(wsHandler);

Loading…
Cancel
Save