Skip to content

Commit 61c0401

Browse files
committed
Fixes #2503
1 parent bdc7c87 commit 61c0401

File tree

4 files changed

+50
-8
lines changed

4 files changed

+50
-8
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
@@ -2664,12 +2664,14 @@ public LinkedList<AtmosphereInterceptor> interceptors() {
26642664
return interceptors;
26652665
}
26662666

2667-
/**
2668-
* Set the {@link AnnotationProcessor} class name.
2669-
*
2670-
* @param annotationProcessorClassName the {@link AnnotationProcessor} class name.
2671-
* @return this
2672-
*/
2667+
public <T extends AtmosphereInterceptor> T interceptor(Class<T> c) {
2668+
for (AtmosphereInterceptor i : interceptors) {
2669+
if (c.isInstance(i)) {
2670+
return c.cast(i);
2671+
}
2672+
}
2673+
return null;
2674+
}
26732675
public AtmosphereFramework annotationProcessorClassName(String annotationProcessorClassName) {
26742676
this.annotationProcessorClassName = annotationProcessorClassName;
26752677
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-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333
import java.util.Enumeration;
3434
import java.util.HashMap;
3535
import java.util.Map;
36-
import java.util.stream.IntStream;
3736

3837
import static org.mockito.Mockito.mock;
3938
import static org.testng.Assert.assertEquals;
@@ -115,6 +114,16 @@ public void testTrackMessageSizeB64Disabled() throws Exception {
115114
testTrackMessageSize(false, new TrackMessageSizeB64Interceptor(), "yoCometyoWebSocket");
116115
}
117116

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

0 commit comments

Comments
 (0)