1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.mina.http;
21
22 import java.nio.ByteBuffer;
23 import java.nio.charset.Charset;
24 import java.util.Map;
25
26 import org.apache.mina.codec.StatelessProtocolEncoder;
27 import org.apache.mina.http.api.HttpContentChunk;
28 import org.apache.mina.http.api.HttpEndOfContent;
29 import org.apache.mina.http.api.HttpPdu;
30 import org.apache.mina.http.api.HttpPduEncodingVisitor;
31 import org.apache.mina.http.api.HttpRequest;
32 import org.apache.mina.http.api.HttpResponse;
33
34
35
36
37
38
39 public class HttpServerEncoder implements StatelessProtocolEncoder<HttpPdu, ByteBuffer> {
40
41
42
43
44 @Override
45 public Void createEncoderState() {
46
47 return null;
48 }
49
50
51
52
53 @Override
54 public ByteBuffer encode(HttpPdu message, Void context) {
55 return message.encode(visitor);
56 }
57
58 private HttpPduEncodingVisitor visitor = new HttpPduEncodingVisitor() {
59
60
61
62
63 @Override
64 public ByteBuffer visit(HttpResponse msg) {
65 StringBuilder sb = new StringBuilder(msg.getStatus().line());
66
67 for (Map.Entry<String, String> header : msg.getHeaders().entrySet()) {
68 sb.append(header.getKey());
69 sb.append(": ");
70 sb.append(header.getValue());
71 sb.append("\r\n");
72 }
73 sb.append("\r\n");
74 byte[] bytes = sb.toString().getBytes(Charset.forName("UTF-8"));
75 return ByteBuffer.wrap(bytes);
76 }
77
78 @Override
79 public ByteBuffer visit(HttpContentChunk msg) {
80 return msg.getContent();
81 }
82
83 @Override
84 public ByteBuffer visit(HttpEndOfContent msg) {
85 return null;
86 }
87
88 @Override
89 public ByteBuffer visit(HttpRequest msg) {
90 throw new IllegalStateException("cannot encode that on server side");
91 }
92 };
93 }