From 59e02e63c427659e701cc371d210faf1a85c1d42 Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Wed, 2 Jul 2014 13:47:48 -0400 Subject: [PATCH] Synchronize request init in AbstractHttpSockJsSession Although unlikely in practice (but not impossible), the SockJS integration tests write a message while the request is initializing. This change adds synchronization around request intiailization for the SockJS HTTP sesion. Issue: SPR-11916 --- .../session/AbstractHttpSockJsSession.java | 28 ++++++++++--------- 1 file changed, 15 insertions(+), 13 deletions(-) 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 c2b9c9a0e3c..b98fd3d8cca 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 @@ -201,18 +201,20 @@ public abstract class AbstractHttpSockJsSession extends AbstractSockJsSession { this.frameFormat = frameFormat; this.asyncRequestControl = request.getAsyncRequestControl(response); - try { - // Let "our" handler know before sending the open frame to the remote handler - delegateConnectionEstablished(); - writePrelude(request, response); - writeFrame(SockJsFrame.openFrame()); - if (isStreaming() && !isClosed()) { - startAsyncRequest(); + synchronized (this.responseLock) { + try { + // Let "our" handler know before sending the open frame to the remote handler + delegateConnectionEstablished(); + writePrelude(request, response); + writeFrame(SockJsFrame.openFrame()); + if (isStreaming() && !isClosed()) { + startAsyncRequest(); + } + } + catch (Throwable ex) { + tryCloseWithSockJsTransportError(ex, CloseStatus.SERVER_ERROR); + throw new SockJsTransportFailureException("Failed to open session", getId(), ex); } - } - catch (Throwable ex) { - tryCloseWithSockJsTransportError(ex, CloseStatus.SERVER_ERROR); - throw new SockJsTransportFailureException("Failed to open session", getId(), ex); } } @@ -244,8 +246,8 @@ public abstract class AbstractHttpSockJsSession extends AbstractSockJsSession { * @param response the current response * @param frameFormat the transport-specific SocksJS frame format to use */ - public void handleSuccessiveRequest(ServerHttpRequest request, - ServerHttpResponse response, SockJsFrameFormat frameFormat) throws SockJsException { + public void handleSuccessiveRequest(ServerHttpRequest request, ServerHttpResponse response, + SockJsFrameFormat frameFormat) throws SockJsException { synchronized (this.responseLock) { try {