From ebb10d3267363958951e854718d963871b71a634 Mon Sep 17 00:00:00 2001 From: Trustin Lee Date: Tue, 17 Nov 2009 04:55:56 +0000 Subject: [PATCH] Related issue: NETTY-251 Add support for HTTP trailing headers * Added the preliminary support - the trailing headers are simply merged to the HttpMessage. The last chunk type should be added, too. --- .../codec/http/HttpMessageDecoder.java | 93 +++++++++++-------- 1 file changed, 54 insertions(+), 39 deletions(-) diff --git a/src/main/java/org/jboss/netty/handler/codec/http/HttpMessageDecoder.java b/src/main/java/org/jboss/netty/handler/codec/http/HttpMessageDecoder.java index 2b32a61189..eac3fae941 100644 --- a/src/main/java/org/jboss/netty/handler/codec/http/HttpMessageDecoder.java +++ b/src/main/java/org/jboss/netty/handler/codec/http/HttpMessageDecoder.java @@ -15,6 +15,7 @@ */ package org.jboss.netty.handler.codec.http; +import java.util.ArrayList; import java.util.List; import org.jboss.netty.buffer.ChannelBuffer; @@ -327,22 +328,15 @@ public abstract class HttpMessageDecoder extends ReplayingDecoder names = new ArrayList(4); + List values = new ArrayList(4); + do { + char firstChar = line.charAt(0); + if (lastHeader != null && (firstChar == ' ' || firstChar == '\t')) { + int lastPos = values.size() - 1; + String newString = values.get(lastPos) + line.trim(); + values.set(lastPos, newString); + } else { + String[] header = splitHeader(line); + names.add(header[0]); + values.add(header[1]); + lastHeader = header[0]; + } + + line = readHeader(buffer); + } while (line.length() != 0); + + // Merge the trailing headers into the message. + HttpMessage message = this.message; + for (int i = 0; i < names.size(); i ++) { + String name = names.get(i); + String value = values.get(i); + + // Discard the prohibited headers. + if (name.equalsIgnoreCase(HttpHeaders.Names.CONTENT_LENGTH)) { + continue; + } + if (name.equalsIgnoreCase(HttpHeaders.Names.TRANSFER_ENCODING)) { + continue; + } + if (name.equalsIgnoreCase(HttpHeaders.Names.TRAILER)) { + continue; + } + + message.addHeader(name, value); + } + } + } + private String readHeader(ChannelBuffer buffer) throws TooLongFrameException { StringBuilder sb = new StringBuilder(64); int headerSize = this.headerSize; @@ -518,30 +557,6 @@ public abstract class HttpMessageDecoder extends ReplayingDecoder