View Javadoc
1   /*
2    * Copyright 2016 The Lannister Project
3    * 
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    * 
8    *     http://www.apache.org/licenses/LICENSE-2.0
9    * 
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
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  		// Reset the cookies if necessary.
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 }