Skip to content

Commit c9f992c

Browse files
committed
Fixes #2503
1 parent 24a1456 commit c9f992c

File tree

4 files changed

+50
-9
lines changed

4 files changed

+50
-9
lines changed

modules/cpr/src/main/java/org/atmosphere/client/TrackMessageSizeInterceptor.java

+15-1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.atmosphere.cpr.AtmosphereResponse;
2727
import org.atmosphere.cpr.AtmosphereResponseImpl;
2828
import org.atmosphere.cpr.HeaderConfig;
29+
import org.atmosphere.interceptor.HeartbeatInterceptor;
2930
import org.atmosphere.interceptor.InvokationOrder;
3031
import org.atmosphere.util.IOUtils;
3132
import org.atmosphere.util.Utils;
@@ -43,7 +44,6 @@
4344

4445
import static org.atmosphere.cpr.ApplicationConfig.EXCLUDED_CONTENT_TYPES;
4546
import static org.atmosphere.cpr.ApplicationConfig.MESSAGE_DELIMITER;
46-
4747
/**
4848
* An {@link org.atmosphere.cpr.AtmosphereInterceptor} that add a message size and delimiter.
4949
* <p/>
@@ -66,6 +66,8 @@ public class TrackMessageSizeInterceptor extends AtmosphereInterceptorAdapter {
6666

6767
private final Interceptor interceptor = new Interceptor();
6868

69+
private HeartbeatInterceptor heartbeatInterceptor;
70+
6971
@Override
7072
public void configure(AtmosphereConfig config) {
7173
String s = config.getInitParameter(MESSAGE_DELIMITER);
@@ -76,6 +78,7 @@ public void configure(AtmosphereConfig config) {
7678
if (s != null) {
7779
excludedContentTypes.addAll(Arrays.asList(s.split(",")));
7880
}
81+
heartbeatInterceptor = config.framework().interceptor(HeartbeatInterceptor.class);
7982
}
8083

8184
/**
@@ -150,6 +153,8 @@ public byte[] transformPayload(AtmosphereResponse response, byte[] responseDraft
150153
// This is likely padding written by PaddingAtmosphereInterceptor
151154
return responseDraft;
152155
}
156+
} else if (isMessageAlreadyEncoded(cb.toString())) {
157+
return responseDraft;
153158
}
154159

155160
AtmosphereResource r = response.resource();
@@ -180,6 +185,15 @@ public byte[] transformPayload(AtmosphereResponse response, byte[] responseDraft
180185
}
181186
}
182187

188+
private boolean isMessageAlreadyEncoded(String message) {
189+
190+
if (heartbeatInterceptor != null &&
191+
message.endsWith(endString + new String(heartbeatInterceptor.getPaddingBytes()))) {
192+
return true;
193+
}
194+
return false;
195+
}
196+
183197
@Override
184198
public PRIORITY priority() {
185199
return InvokationOrder.BEFORE_DEFAULT;

modules/cpr/src/main/java/org/atmosphere/cpr/AtmosphereFramework.java

+8-6
Original file line numberDiff line numberDiff line change
@@ -2691,12 +2691,14 @@ public LinkedList<AtmosphereInterceptor> interceptors() {
26912691
return interceptors;
26922692
}
26932693

2694-
/**
2695-
* Set the {@link AnnotationProcessor} class name.
2696-
*
2697-
* @param annotationProcessorClassName the {@link AnnotationProcessor} class name.
2698-
* @return this
2699-
*/
2694+
public <T extends AtmosphereInterceptor> T interceptor(Class<T> c) {
2695+
for (AtmosphereInterceptor i : interceptors) {
2696+
if (c.isInstance(i)) {
2697+
return c.cast(i);
2698+
}
2699+
}
2700+
return null;
2701+
}
27002702
public AtmosphereFramework annotationProcessorClassName(String annotationProcessorClassName) {
27012703
this.annotationProcessorClassName = annotationProcessorClassName;
27022704
return this;

modules/cpr/src/main/java/org/atmosphere/interceptor/TrackMessageSizeB64Interceptor.java

+17
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,15 @@ public class TrackMessageSizeB64Interceptor extends AtmosphereInterceptorAdapter
4747

4848
private final Interceptor interceptor = new Interceptor();
4949

50+
private HeartbeatInterceptor heartbeatInterceptor;
51+
5052
@Override
5153
public void configure(AtmosphereConfig config) {
5254
String s = config.getInitParameter(EXCLUDED_CONTENT_TYPES);
5355
if (s != null) {
5456
excludedContentTypes.addAll(Arrays.asList(s.split(",")));
5557
}
58+
heartbeatInterceptor = config.framework().interceptor(HeartbeatInterceptor.class);
5659
}
5760

5861
/**
@@ -99,11 +102,25 @@ public byte[] transformPayload(AtmosphereResponse response, byte[] responseDraft
99102
|| !excludedContentTypes.contains(response.getContentType().toLowerCase()))) {
100103
response.setCharacterEncoding(OUT_ENCODING);
101104
String s = Base64.getEncoder().encodeToString(responseDraft);
105+
106+
if (isMessageAlreadyEncoded(new String(data))) {
107+
logger.trace("Message already encoded {}", s);
108+
return responseDraft;
109+
}
110+
102111
return (s.length() + DELIMITER + s).getBytes(OUT_ENCODING);
103112
} else {
104113
return responseDraft;
105114
}
115+
}
116+
}
117+
118+
public boolean isMessageAlreadyEncoded(String message) {
106119

120+
if (heartbeatInterceptor != null &&
121+
message.endsWith(DELIMITER + new String(heartbeatInterceptor.getPaddingBytes()))) {
122+
return true;
107123
}
124+
return false;
108125
}
109126
}

modules/cpr/src/test/java/org/atmosphere/cpr/TrackMessageSizeInterceptorTest.java

+10-2
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,12 @@
2626
import javax.servlet.ServletConfig;
2727
import javax.servlet.ServletContext;
2828
import javax.servlet.ServletException;
29-
3029
import java.io.ByteArrayOutputStream;
3130
import java.io.IOException;
3231
import java.io.OutputStream;
3332
import java.util.Enumeration;
3433
import java.util.HashMap;
3534
import java.util.Map;
36-
import java.util.stream.IntStream;
3735

3836
import static org.mockito.Mockito.mock;
3937
import static org.testng.Assert.assertEquals;
@@ -115,6 +113,16 @@ public void testTrackMessageSizeB64Disabled() throws Exception {
115113
testTrackMessageSize(false, new TrackMessageSizeB64Interceptor(), "yoCometyoWebSocket");
116114
}
117115

116+
@Test
117+
public void testTrackMessageB64AlreadyEncoded() throws Exception {
118+
testTrackMessageSize(true, new TrackMessageSizeB64Interceptor(), "1|X", "", "1|X");
119+
}
120+
121+
@Test
122+
public void testTrackMessageAlreadyEncoded() throws Exception {
123+
testTrackMessageSize(true, new TrackMessageSizeInterceptor(), "1|X", "", "1|X");
124+
}
125+
118126
private void testTrackMessageSize(boolean enabled, AtmosphereInterceptor icp, String expected) throws Exception {
119127
testTrackMessageSize(enabled, icp, "yoComet", "yoWebSocket", expected);
120128
}

0 commit comments

Comments
 (0)