1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package net.anyflow.lannister.http;
18
19 import java.util.Set;
20
21 import org.slf4j.Logger;
22 import org.slf4j.LoggerFactory;
23
24 import com.google.common.base.Strings;
25
26 import io.netty.buffer.ByteBuf;
27 import io.netty.buffer.Unpooled;
28 import io.netty.channel.Channel;
29 import io.netty.handler.codec.http.DefaultFullHttpResponse;
30 import io.netty.handler.codec.http.FullHttpResponse;
31 import io.netty.handler.codec.http.HttpHeaderNames;
32 import io.netty.handler.codec.http.HttpResponseStatus;
33 import io.netty.handler.codec.http.HttpVersion;
34 import io.netty.handler.codec.http.cookie.ClientCookieEncoder;
35 import io.netty.handler.codec.http.cookie.Cookie;
36 import io.netty.handler.codec.http.cookie.ServerCookieDecoder;
37 import io.netty.util.CharsetUtil;
38 import net.anyflow.lannister.Settings;
39
40 public class HttpResponse extends DefaultFullHttpResponse {
41
42 private static final Logger logger = LoggerFactory.getLogger(HttpResponse.class);
43
44 public static HttpResponse createServerDefault(String requestCookie) {
45 HttpResponse ret = new HttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK, Unpooled.buffer());
46
47 ret.headers().set(HttpHeaderNames.CONTENT_TYPE, "application/json; charset=UTF-8");
48
49 if (requestCookie == null) { return ret; }
50
51 Set<Cookie> cookies = ServerCookieDecoder.STRICT.decode(requestCookie);
52 if (cookies.isEmpty()) { return ret; }
53
54
55 for (Cookie cookie : cookies) {
56 ret.headers().add(HttpHeaderNames.SET_COOKIE, ClientCookieEncoder.STRICT.encode(cookie));
57 }
58
59 return ret;
60 }
61
62 public static HttpResponse createFrom(FullHttpResponse source, Channel channel) {
63 HttpResponse ret = new HttpResponse(source.protocolVersion(), source.status(), source.content().copy());
64
65 ret.headers().set(source.headers());
66 ret.trailingHeaders().set(source.trailingHeaders());
67
68 return ret;
69 }
70
71 private HttpResponse(HttpVersion version, HttpResponseStatus status, ByteBuf content) {
72 super(version, status, content);
73 }
74
75 public void setContent(String content) {
76 content().writeBytes(Strings.nullToEmpty(content).getBytes(CharsetUtil.UTF_8));
77 logger.debug(content().toString(CharsetUtil.UTF_8));
78 }
79
80 @Override
81 public String toString() {
82 StringBuilder buf = new StringBuilder();
83
84 buf.append("\r\n");
85 buf.append("HTTP Status: " + this.status()).append("\r\n");
86 buf.append("Version: " + this.protocolVersion()).append("\r\n");
87 buf.append("Response Headers: ").append("\r\n");
88
89 if (!this.headers().isEmpty()) {
90 for (String name : this.headers().names()) {
91 for (String value : this.headers().getAll(name)) {
92 buf.append(" ").append(name).append(" = ").append(value).append("\r\n");
93 }
94 }
95 }
96
97 if (!Settings.INSTANCE.getBoolean("webserver.logging.logWebResourceHttpResponseContent", false)
98 && Settings.INSTANCE.webResourceExtensionToMimes()
99 .containsValue(headers().get(HttpHeaderNames.CONTENT_TYPE))) {
100 buf.append("Content: WEB RESOURCE CONTENT");
101 return buf.toString();
102 }
103
104 String content = this.content().toString(CharsetUtil.UTF_8);
105
106 int size = Settings.INSTANCE.getInt("webserver.logging.httpResponseContentSize", 100);
107
108 if (size < 0) {
109 buf.append("Content:\r\n ").append(content);
110 }
111 else {
112 int index = content.length() < size ? content.length() : size - 1;
113 buf.append("The first " + size + " character(s) of response content:\r\n ")
114 .append(content.substring(0, index));
115 }
116
117 return buf.toString();
118 }
119 }