1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.jboss.netty.handler.codec.http;
17
18 import org.jboss.netty.buffer.ChannelBuffer;
19 import org.jboss.netty.buffer.ChannelBuffers;
20 import org.jboss.netty.util.internal.StringUtil;
21
22 import java.util.List;
23 import java.util.Map;
24 import java.util.Set;
25
26
27
28
29 public class DefaultHttpChunkTrailer implements HttpChunkTrailer {
30
31 private final HttpHeaders trailingHeaders = new TrailingHeaders(true);
32
33 public boolean isLast() {
34 return true;
35 }
36
37 @Deprecated
38 public void addHeader(final String name, final Object value) {
39 trailingHeaders.add(name, value);
40 }
41
42 @Deprecated
43 public void setHeader(final String name, final Object value) {
44 trailingHeaders.set(name, value);
45 }
46
47 @Deprecated
48 public void setHeader(final String name, final Iterable<?> values) {
49 trailingHeaders.set(name, values);
50 }
51
52 @Deprecated
53 public void removeHeader(final String name) {
54 trailingHeaders.remove(name);
55 }
56
57 @Deprecated
58 public void clearHeaders() {
59 trailingHeaders.clear();
60 }
61
62 @Deprecated
63 public String getHeader(final String name) {
64 return trailingHeaders.get(name);
65 }
66
67 @Deprecated
68 public List<String> getHeaders(final String name) {
69 return trailingHeaders.getAll(name);
70 }
71
72 @Deprecated
73 public List<Map.Entry<String, String>> getHeaders() {
74 return trailingHeaders.entries();
75 }
76
77 @Deprecated
78 public boolean containsHeader(final String name) {
79 return trailingHeaders.contains(name);
80 }
81
82 @Deprecated
83 public Set<String> getHeaderNames() {
84 return trailingHeaders.names();
85 }
86
87 public ChannelBuffer getContent() {
88 return ChannelBuffers.EMPTY_BUFFER;
89 }
90
91 public void setContent(ChannelBuffer content) {
92 throw new IllegalStateException("read-only");
93 }
94
95 public HttpHeaders trailingHeaders() {
96 return trailingHeaders;
97 }
98
99 @Override
100 public String toString() {
101 StringBuilder buf = new StringBuilder(super.toString());
102 buf.append(StringUtil.NEWLINE);
103 appendHeaders(buf);
104
105
106 buf.setLength(buf.length() - StringUtil.NEWLINE.length());
107 return buf.toString();
108 }
109
110 private void appendHeaders(StringBuilder buf) {
111 for (Map.Entry<String, String> e: trailingHeaders()) {
112 buf.append(e.getKey());
113 buf.append(": ");
114 buf.append(e.getValue());
115 buf.append(StringUtil.NEWLINE);
116 }
117 }
118
119 private static final class TrailingHeaders extends DefaultHttpHeaders {
120
121 TrailingHeaders(boolean validateHeaders) {
122 super(validateHeaders);
123 }
124
125 @Override
126 public HttpHeaders add(String name, Object value) {
127 if (validate) {
128 validateName(name);
129 }
130 return super.add(name, value);
131 }
132
133 @Override
134 public HttpHeaders add(String name, Iterable<?> values) {
135 if (validate) {
136 validateName(name);
137 }
138 return super.add(name, values);
139 }
140
141 @Override
142 public HttpHeaders set(String name, Iterable<?> values) {
143 if (validate) {
144 validateName(name);
145 }
146 return super.set(name, values);
147 }
148
149 @Override
150 public HttpHeaders set(String name, Object value) {
151 if (validate) {
152 validateName(name);
153 }
154 return super.set(name, value);
155 }
156
157 private static void validateName(String name) {
158 if (name.equalsIgnoreCase(HttpHeaders.Names.CONTENT_LENGTH) ||
159 name.equalsIgnoreCase(HttpHeaders.Names.TRANSFER_ENCODING) ||
160 name.equalsIgnoreCase(HttpHeaders.Names.TRAILER)) {
161 throw new IllegalArgumentException(
162 "prohibited trailing header: " + name);
163 }
164 }
165 }
166 }