No need to create temporary arrays

This commit is contained in:
Norman Maurer 2013-05-24 19:58:55 +02:00
parent f5dc482a59
commit aa96b4b286

View File

@ -206,19 +206,13 @@ public abstract class HttpObjectDecoder extends ReplayingDecoder<HttpObjectDecod
} }
if (nextState == State.SKIP_CONTROL_CHARS) { if (nextState == State.SKIP_CONTROL_CHARS) {
// No content is expected. // No content is expected.
HttpObject[] parts = reset(); reset(out);
for (HttpObject object: parts) {
out.add(object);
}
return; return;
} }
long contentLength = HttpHeaders.getContentLength(message, -1); long contentLength = HttpHeaders.getContentLength(message, -1);
if (contentLength == 0 || contentLength == -1 && isDecodingRequest()) { if (contentLength == 0 || contentLength == -1 && isDecodingRequest()) {
content = Unpooled.EMPTY_BUFFER; content = Unpooled.EMPTY_BUFFER;
HttpObject[] parts = reset(); reset(out);
for (HttpObject object: parts) {
out.add(object);
}
return; return;
} }
@ -276,10 +270,7 @@ public abstract class HttpObjectDecoder extends ReplayingDecoder<HttpObjectDecod
return; return;
} }
case READ_FIXED_LENGTH_CONTENT: { case READ_FIXED_LENGTH_CONTENT: {
HttpObject[] parts = readFixedLengthContent(buffer); readFixedLengthContent(buffer, out);
for (HttpObject part: parts) {
out.add(part);
}
return; return;
} }
case READ_FIXED_LENGTH_CONTENT_AS_CHUNKS: { case READ_FIXED_LENGTH_CONTENT_AS_CHUNKS: {
@ -406,10 +397,7 @@ public abstract class HttpObjectDecoder extends ReplayingDecoder<HttpObjectDecod
LastHttpContent trailer = readTrailingHeaders(buffer); LastHttpContent trailer = readTrailingHeaders(buffer);
if (maxChunkSize == 0) { if (maxChunkSize == 0) {
// Chunked encoding disabled. // Chunked encoding disabled.
HttpObject[] parts = reset(); reset(out);
for (HttpObject object: parts) {
out.add(object);
}
return; return;
} else { } else {
reset(); reset();
@ -458,23 +446,29 @@ public abstract class HttpObjectDecoder extends ReplayingDecoder<HttpObjectDecod
return false; return false;
} }
private HttpObject[] reset() { private void reset() {
HttpMessage message = this.message; reset(null);
ByteBuf content = this.content; }
LastHttpContent httpContent; private void reset(MessageBuf<Object> out) {
if (out != null) {
HttpMessage message = this.message;
ByteBuf content = this.content;
LastHttpContent httpContent;
if (content == null || !content.isReadable()) { if (content == null || !content.isReadable()) {
httpContent = LastHttpContent.EMPTY_LAST_CONTENT; httpContent = LastHttpContent.EMPTY_LAST_CONTENT;
} else { } else {
httpContent = new DefaultLastHttpContent(content); httpContent = new DefaultLastHttpContent(content);
}
out.add(message);
out.add(httpContent);
} }
HttpObject[] messages = { message, httpContent }; content = null;
this.content = null; message = null;
this.message = null;
checkpoint(State.SKIP_CONTROL_CHARS); checkpoint(State.SKIP_CONTROL_CHARS);
return messages;
} }
private HttpMessage invalidMessage(Exception cause) { private HttpMessage invalidMessage(Exception cause) {
@ -506,7 +500,7 @@ public abstract class HttpObjectDecoder extends ReplayingDecoder<HttpObjectDecod
} }
} }
private HttpObject[] readFixedLengthContent(ByteBuf buffer) { private void readFixedLengthContent(ByteBuf buffer, MessageBuf<Object> out) {
//we have a content-length so we just read the correct number of bytes //we have a content-length so we just read the correct number of bytes
long length = HttpHeaders.getContentLength(message, -1); long length = HttpHeaders.getContentLength(message, -1);
assert length <= Integer.MAX_VALUE; assert length <= Integer.MAX_VALUE;
@ -516,14 +510,16 @@ public abstract class HttpObjectDecoder extends ReplayingDecoder<HttpObjectDecod
} }
contentRead += toRead; contentRead += toRead;
if (length < contentRead) { if (length < contentRead) {
return new HttpObject[] {message, new DefaultHttpContent(buffer.readBytes(toRead))}; out.add(message);
out.add(new DefaultHttpContent(buffer.readBytes(toRead)));
return;
} }
if (content == null) { if (content == null) {
content = buffer.readBytes((int) length); content = buffer.readBytes((int) length);
} else { } else {
content.writeBytes(buffer, (int) length); content.writeBytes(buffer, (int) length);
} }
return reset(); reset(out);
} }
private State readHeaders(ByteBuf buffer) { private State readHeaders(ByteBuf buffer) {