StompDecoder handles partial headers correctly
Issue: SPR-13416
This commit is contained in:
parent
54d3d782a9
commit
daa49c9bcd
|
@ -208,10 +208,15 @@ public class StompDecoder {
|
||||||
private void readHeaders(ByteBuffer buffer, StompHeaderAccessor headerAccessor) {
|
private void readHeaders(ByteBuffer buffer, StompHeaderAccessor headerAccessor) {
|
||||||
while (true) {
|
while (true) {
|
||||||
ByteArrayOutputStream headerStream = new ByteArrayOutputStream(256);
|
ByteArrayOutputStream headerStream = new ByteArrayOutputStream(256);
|
||||||
while (buffer.remaining() > 0 && !tryConsumeEndOfLine(buffer)) {
|
boolean headerComplete = false;
|
||||||
|
while (buffer.hasRemaining()) {
|
||||||
|
if (tryConsumeEndOfLine(buffer)) {
|
||||||
|
headerComplete = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
headerStream.write(buffer.get());
|
headerStream.write(buffer.get());
|
||||||
}
|
}
|
||||||
if (headerStream.size() > 0) {
|
if (headerStream.size() > 0 && headerComplete) {
|
||||||
String header = new String(headerStream.toByteArray(), UTF8_CHARSET);
|
String header = new String(headerStream.toByteArray(), UTF8_CHARSET);
|
||||||
int colonIndex = header.indexOf(':');
|
int colonIndex = header.indexOf(':');
|
||||||
if (colonIndex <= 0) {
|
if (colonIndex <= 0) {
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2002-2014 the original author or authors.
|
* Copyright 2002-2015 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -25,7 +25,9 @@ import org.junit.Test;
|
||||||
|
|
||||||
import org.springframework.messaging.Message;
|
import org.springframework.messaging.Message;
|
||||||
|
|
||||||
import static org.junit.Assert.*;
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertNull;
|
||||||
|
import static org.junit.Assert.fail;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Unit tests for {@link BufferingStompDecoder}.
|
* Unit tests for {@link BufferingStompDecoder}.
|
||||||
|
@ -177,14 +179,31 @@ public class BufferingStompDecoderTests {
|
||||||
assertEquals(0, messages.size());
|
assertEquals(0, messages.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(expected = StompConversionException.class) // SPR-12418
|
// SPR-13416
|
||||||
public void endingBackslashHeaderValueCheck() {
|
|
||||||
|
@Test
|
||||||
|
public void incompleteHeaderWithPartialEscapeSequence() throws Exception {
|
||||||
|
BufferingStompDecoder stompDecoder = new BufferingStompDecoder(STOMP_DECODER, 128);
|
||||||
|
String chunk = "SEND\na:long\\";
|
||||||
|
|
||||||
|
List<Message<byte[]>> messages = stompDecoder.decode(toByteBuffer(chunk));
|
||||||
|
assertEquals(0, messages.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = StompConversionException.class)
|
||||||
|
public void invalidEscapeSequence() {
|
||||||
|
BufferingStompDecoder stompDecoder = new BufferingStompDecoder(STOMP_DECODER, 128);
|
||||||
|
String payload = "SEND\na:alpha\\x\\n\nMessage body\0";
|
||||||
|
stompDecoder.decode(toByteBuffer(payload));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = StompConversionException.class)
|
||||||
|
public void invalidEscapeSequenceWithSingleSlashAtEndOfHeaderValue() {
|
||||||
BufferingStompDecoder stompDecoder = new BufferingStompDecoder(STOMP_DECODER, 128);
|
BufferingStompDecoder stompDecoder = new BufferingStompDecoder(STOMP_DECODER, 128);
|
||||||
String payload = "SEND\na:alpha\\\n\nMessage body\0";
|
String payload = "SEND\na:alpha\\\n\nMessage body\0";
|
||||||
stompDecoder.decode(toByteBuffer(payload));
|
stompDecoder.decode(toByteBuffer(payload));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private ByteBuffer toByteBuffer(String chunk) {
|
private ByteBuffer toByteBuffer(String chunk) {
|
||||||
return ByteBuffer.wrap(chunk.getBytes(Charset.forName("UTF-8")));
|
return ByteBuffer.wrap(chunk.getBytes(Charset.forName("UTF-8")));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue