From ab629a0e26d892404e8d29e74c13f97b8d0b4d34 Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Tue, 13 Jan 2015 10:26:59 -0500 Subject: [PATCH] Deprecate writePrelude in AbstractHttpSockJsSession A logical follow-up on commit 43d937, this change also removes (or rather deprecates for now) writePrelude that is only of concern to streaming SockJS session implementations. Issue: SPR-12427 --- .../handler/EventSourceTransportHandler.java | 8 ++------ .../handler/HtmlFileTransportHandler.java | 11 ++-------- .../handler/XhrStreamingTransportHandler.java | 20 +++++++++++-------- .../session/AbstractHttpSockJsSession.java | 7 ++++++- .../session/PollingSockJsSession.java | 2 +- .../session/StreamingSockJsSession.java | 18 ++++++++++++++--- .../session/HttpSockJsSessionTests.java | 9 ++------- .../session/TestHttpSockJsSession.java | 5 ++--- 8 files changed, 42 insertions(+), 38 deletions(-) diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/handler/EventSourceTransportHandler.java b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/handler/EventSourceTransportHandler.java index 2009450821..5648468c8e 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/handler/EventSourceTransportHandler.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/handler/EventSourceTransportHandler.java @@ -16,12 +16,10 @@ package org.springframework.web.socket.sockjs.transport.handler; -import java.io.IOException; import java.util.Map; import org.springframework.http.MediaType; import org.springframework.http.server.ServerHttpRequest; -import org.springframework.http.server.ServerHttpResponse; import org.springframework.web.socket.WebSocketHandler; import org.springframework.web.socket.sockjs.frame.DefaultSockJsFrameFormat; import org.springframework.web.socket.sockjs.frame.SockJsFrameFormat; @@ -70,10 +68,8 @@ public class EventSourceTransportHandler extends AbstractHttpSendingTransportHan } @Override - protected void writePrelude(ServerHttpRequest request, ServerHttpResponse response) throws IOException { - response.getBody().write('\r'); - response.getBody().write('\n'); - response.flush(); + protected byte[] getPrelude(ServerHttpRequest request) { + return new byte[] { '\r', '\n' }; } } diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/handler/HtmlFileTransportHandler.java b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/handler/HtmlFileTransportHandler.java index 9382c895c8..951175fb2a 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/handler/HtmlFileTransportHandler.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/handler/HtmlFileTransportHandler.java @@ -134,18 +134,11 @@ public class HtmlFileTransportHandler extends AbstractHttpSendingTransportHandle } @Override - protected void writePrelude(ServerHttpRequest request, ServerHttpResponse response) { + protected byte[] getPrelude(ServerHttpRequest request) { // We already validated the parameter above... String callback = getCallbackParam(request); String html = String.format(PARTIAL_HTML_CONTENT, callback); - try { - response.getBody().write(html.getBytes(UTF8_CHARSET)); - response.flush(); - } - catch (IOException ex) { - tryCloseWithSockJsTransportError(ex, CloseStatus.SERVER_ERROR); - throw new SockJsTransportFailureException("Failed to write HTML content", getId(), ex); - } + return html.getBytes(UTF8_CHARSET); } } diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/handler/XhrStreamingTransportHandler.java b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/handler/XhrStreamingTransportHandler.java index 5bb1350a79..30799a5cf4 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/handler/XhrStreamingTransportHandler.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/handler/XhrStreamingTransportHandler.java @@ -16,12 +16,10 @@ package org.springframework.web.socket.sockjs.transport.handler; -import java.io.IOException; import java.util.Map; import org.springframework.http.MediaType; import org.springframework.http.server.ServerHttpRequest; -import org.springframework.http.server.ServerHttpResponse; import org.springframework.web.socket.WebSocketHandler; import org.springframework.web.socket.sockjs.frame.DefaultSockJsFrameFormat; import org.springframework.web.socket.sockjs.frame.SockJsFrameFormat; @@ -38,6 +36,16 @@ import org.springframework.web.socket.sockjs.transport.session.StreamingSockJsSe */ public class XhrStreamingTransportHandler extends AbstractHttpSendingTransportHandler { + private static final byte[] PRELUDE = new byte[2049]; + + static { + for (int i = 0; i < 2048; i++) { + PRELUDE[i] = 'h'; + } + PRELUDE[2048] = '\n'; + } + + @Override public TransportType getTransportType() { return TransportType.XHR_STREAMING; @@ -70,12 +78,8 @@ public class XhrStreamingTransportHandler extends AbstractHttpSendingTransportHa } @Override - protected void writePrelude(ServerHttpRequest request, ServerHttpResponse response) throws IOException { - for (int i = 0; i < 2048; i++) { - response.getBody().write('h'); - } - response.getBody().write('\n'); - response.flush(); + protected byte[] getPrelude(ServerHttpRequest request) { + return PRELUDE; } } diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/session/AbstractHttpSockJsSession.java b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/session/AbstractHttpSockJsSession.java index 3e1d939ed5..8f2bba1660 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/session/AbstractHttpSockJsSession.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/session/AbstractHttpSockJsSession.java @@ -168,7 +168,7 @@ public abstract class AbstractHttpSockJsSession extends AbstractSockJsSession { } /** - * @deprecated as of 4.2 this method is no longer used for anything + * @deprecated as of 4.2 this method is no longer used. */ @Deprecated protected abstract boolean isStreaming(); @@ -292,6 +292,11 @@ public abstract class AbstractHttpSockJsSession extends AbstractSockJsSession { protected abstract void flushCache() throws SockJsTransportFailureException; + /** + * @deprecated as of 4.2 this method is deprecated since the prelude is written + * in {@link #handleRequestInternal} of the StreamingSockJsSession subclass. + */ + @Deprecated protected void writePrelude(ServerHttpRequest request, ServerHttpResponse response) throws IOException { } diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/session/PollingSockJsSession.java b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/session/PollingSockJsSession.java index 0ece43cf68..5bf23b006e 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/session/PollingSockJsSession.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/session/PollingSockJsSession.java @@ -44,7 +44,7 @@ public class PollingSockJsSession extends AbstractHttpSockJsSession { /** - * @deprecated as of 4.2 this method is no longer used for anything + * @deprecated as of 4.2 this method is no longer used. */ @Override @Deprecated diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/session/StreamingSockJsSession.java b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/session/StreamingSockJsSession.java index a63f1898b3..cffd305e9a 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/session/StreamingSockJsSession.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/session/StreamingSockJsSession.java @@ -21,6 +21,8 @@ import java.util.Map; import org.springframework.http.server.ServerHttpRequest; import org.springframework.http.server.ServerHttpResponse; +import org.springframework.util.Assert; +import org.springframework.web.socket.CloseStatus; import org.springframework.web.socket.WebSocketHandler; import org.springframework.web.socket.sockjs.SockJsTransportFailureException; import org.springframework.web.socket.sockjs.frame.SockJsFrame; @@ -33,7 +35,7 @@ import org.springframework.web.socket.sockjs.transport.SockJsServiceConfig; * @author Rossen Stoyanchev * @since 4.0 */ -public class StreamingSockJsSession extends AbstractHttpSockJsSession { +public abstract class StreamingSockJsSession extends AbstractHttpSockJsSession { private int byteCount; @@ -46,7 +48,7 @@ public class StreamingSockJsSession extends AbstractHttpSockJsSession { /** - * @deprecated as of 4.2 this method is no longer used for anything + * @deprecated as of 4.2 this method is no longer used. */ @Override @Deprecated @@ -54,11 +56,21 @@ public class StreamingSockJsSession extends AbstractHttpSockJsSession { return true; } + /** + * Get the prelude to write to the response before any other data. + * @since 4.2 + */ + protected abstract byte[] getPrelude(ServerHttpRequest request); + @Override protected void handleRequestInternal(ServerHttpRequest request, ServerHttpResponse response, boolean initialRequest) throws IOException { - writePrelude(request, response); + byte[] prelude = getPrelude(request); + Assert.notNull(prelude); + response.getBody().write(prelude); + response.flush(); + if (initialRequest) { writeFrame(SockJsFrame.openFrame()); } diff --git a/spring-websocket/src/test/java/org/springframework/web/socket/sockjs/transport/session/HttpSockJsSessionTests.java b/spring-websocket/src/test/java/org/springframework/web/socket/sockjs/transport/session/HttpSockJsSessionTests.java index 4427db6637..a482b5a83b 100644 --- a/spring-websocket/src/test/java/org/springframework/web/socket/sockjs/transport/session/HttpSockJsSessionTests.java +++ b/spring-websocket/src/test/java/org/springframework/web/socket/sockjs/transport/session/HttpSockJsSessionTests.java @@ -118,13 +118,8 @@ public class HttpSockJsSessionTests extends AbstractSockJsSessionTests