Fixed NETTY-107 HttpMessageDecoder can not handle the content with no 'Content-Length' header.
* Added HttpMessage.getContentLength(int defaultValue) * Renamed state enum values
This commit is contained in:
parent
5faa7e9ea8
commit
2d682dc2a3
@ -82,11 +82,15 @@ public class DefaultHttpMessage implements HttpMessage {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public int getContentLength() {
|
public int getContentLength() {
|
||||||
|
return getContentLength(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getContentLength(int defaultValue) {
|
||||||
List<String> contentLength = headers.get(HttpHeaders.Names.CONTENT_LENGTH);
|
List<String> contentLength = headers.get(HttpHeaders.Names.CONTENT_LENGTH);
|
||||||
if (contentLength != null && contentLength.size() > 0) {
|
if (contentLength != null && contentLength.size() > 0) {
|
||||||
return Integer.parseInt(contentLength.get(0));
|
return Integer.parseInt(contentLength.get(0));
|
||||||
}
|
}
|
||||||
return 0;
|
return defaultValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isChunked() {
|
public boolean isChunked() {
|
||||||
|
@ -57,6 +57,8 @@ public interface HttpMessage {
|
|||||||
|
|
||||||
int getContentLength();
|
int getContentLength();
|
||||||
|
|
||||||
|
int getContentLength(int defaultValue);
|
||||||
|
|
||||||
void setContent(ChannelBuffer content);
|
void setContent(ChannelBuffer content);
|
||||||
|
|
||||||
boolean isChunked();
|
boolean isChunked();
|
||||||
|
@ -65,7 +65,7 @@ public abstract class HttpMessageDecoder extends ReplayingDecoder<HttpMessageDec
|
|||||||
SKIP_CONTROL_CHARS,
|
SKIP_CONTROL_CHARS,
|
||||||
READ_INITIAL,
|
READ_INITIAL,
|
||||||
READ_HEADER,
|
READ_HEADER,
|
||||||
READ_CONTENT,
|
READ_VARIABLE_LENGTH_CONTENT,
|
||||||
READ_FIXED_LENGTH_CONTENT,
|
READ_FIXED_LENGTH_CONTENT,
|
||||||
READ_CHUNK_SIZE,
|
READ_CHUNK_SIZE,
|
||||||
READ_CHUNKED_CONTENT,
|
READ_CHUNKED_CONTENT,
|
||||||
@ -103,18 +103,18 @@ public abstract class HttpMessageDecoder extends ReplayingDecoder<HttpMessageDec
|
|||||||
if (!mergeChunks) {
|
if (!mergeChunks) {
|
||||||
return message;
|
return message;
|
||||||
}
|
}
|
||||||
} else if (message.getContentLength() == 0) {
|
} else if (message.getContentLength(-1) == 0) {
|
||||||
content = ChannelBuffers.EMPTY_BUFFER;
|
content = ChannelBuffers.EMPTY_BUFFER;
|
||||||
return reset();
|
return reset();
|
||||||
}
|
}
|
||||||
//we return null here, this forces decode to be called again where we will decode the content
|
//we return null here, this forces decode to be called again where we will decode the content
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
case READ_CONTENT: {
|
case READ_VARIABLE_LENGTH_CONTENT: {
|
||||||
if (content == null) {
|
if (content == null) {
|
||||||
content = ChannelBuffers.dynamicBuffer(channel.getConfig().getBufferFactory());
|
content = ChannelBuffers.dynamicBuffer(channel.getConfig().getBufferFactory());
|
||||||
}
|
}
|
||||||
//this will cause a replay error until the channel is closed where this will read whats left in the buffer
|
//this will cause a replay error until the channel is closed where this will read what's left in the buffer
|
||||||
content.writeBytes(buffer.readBytes(buffer.readableBytes()));
|
content.writeBytes(buffer.readBytes(buffer.readableBytes()));
|
||||||
return reset();
|
return reset();
|
||||||
}
|
}
|
||||||
@ -207,7 +207,7 @@ public abstract class HttpMessageDecoder extends ReplayingDecoder<HttpMessageDec
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void readFixedLengthContent(ChannelBuffer buffer) {
|
private void readFixedLengthContent(ChannelBuffer buffer) {
|
||||||
int length = message.getContentLength();
|
int length = message.getContentLength(-1);
|
||||||
if (content == null) {
|
if (content == null) {
|
||||||
content = buffer.readBytes(length);
|
content = buffer.readBytes(length);
|
||||||
} else {
|
} else {
|
||||||
@ -238,10 +238,10 @@ public abstract class HttpMessageDecoder extends ReplayingDecoder<HttpMessageDec
|
|||||||
State nextState;
|
State nextState;
|
||||||
if (message.isChunked()) {
|
if (message.isChunked()) {
|
||||||
nextState = State.READ_CHUNK_SIZE;
|
nextState = State.READ_CHUNK_SIZE;
|
||||||
} else if (message.getContentLength() >= 0) {
|
} else if (message.getContentLength(-1) >= 0) {
|
||||||
nextState = State.READ_FIXED_LENGTH_CONTENT;
|
nextState = State.READ_FIXED_LENGTH_CONTENT;
|
||||||
} else {
|
} else {
|
||||||
nextState = State.READ_CONTENT;
|
nextState = State.READ_VARIABLE_LENGTH_CONTENT;
|
||||||
}
|
}
|
||||||
checkpoint(nextState);
|
checkpoint(nextState);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user