package com.app.mvc.http;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Multimap;
import com.google.common.io.CharStreams;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HttpMethodBase;
import org.apache.commons.httpclient.URIException;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Collection;
import java.util.Map;
import java.util.zip.GZIPInputStream;
import static com.google.common.base.Preconditions.checkNotNull;
/**
* Created by jimin on 16/03/10.
*/
@ToString(exclude = { "bytes" })
public class ResponseWrapper {
@Setter
@Getter
private String uri;
@Setter
@Getter
private Integer status;
@Setter
@Getter
private String charset;
/**
* 目前支持 10M = 10 * 1024 * 1024B
*/
@Setter
@Getter
private byte[] bytes;
@Setter
@Getter
private String content;
@Setter
@Getter
private Map<String, Collection<String>> headers;
ResponseWrapper() {
}
static ResponseWrapper of(HttpMethodBase httpMethod) {
checkNotNull(httpMethod);
ResponseWrapper wrapper = new ResponseWrapper();
try {
wrapUri(wrapper, httpMethod);
wrapStatus(wrapper, httpMethod);
wrapCharset(wrapper, httpMethod);
wrapBytes(wrapper, httpMethod);
wrapContent(wrapper, httpMethod);
wrapHeaders(wrapper, httpMethod);
} catch (URIException e) {
//ignored
} catch (IOException e) {
//ignored
}
return wrapper;
}
static void wrapUri(ResponseWrapper wrapper, HttpMethodBase httpMethod) throws URIException {
wrapper.uri = httpMethod.getURI().getURI();
}
static void wrapStatus(ResponseWrapper wrapper, HttpMethodBase httpMethod) {
wrapper.status = httpMethod.getStatusCode();
}
static void wrapCharset(ResponseWrapper wrapper, HttpMethodBase httpMethod) {
wrapper.charset = httpMethod.getResponseCharSet();
}
static void wrapBytes(ResponseWrapper wrapper, HttpMethodBase httpMethod) throws IOException {
wrapper.bytes = httpMethod.getResponseBody(10 * 1024 * 1024);
}
static void wrapContent(ResponseWrapper wrapper, HttpMethodBase httpMethod) throws IOException {
checkNotNull(wrapper.getBytes());
Header encodingHeader = httpMethod.getResponseHeader("Content-Encoding");
InputStream inputStream = new ByteArrayInputStream(wrapper.getBytes());
if (encodingHeader != null && "gzip".equals(encodingHeader.getValue())) {
wrapper.content = CharStreams.toString(new InputStreamReader(new GZIPInputStream(inputStream)));
} else {
wrapper.content = wrapStream(inputStream, httpMethod.getResponseCharSet());
}
}
static String wrapStream(InputStream inputStream, String charSet) throws IOException {
checkNotNull(inputStream);
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, charSet));
StringBuilder builder = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
builder.append(line + "\n");
}
return builder.toString();
}
static void wrapHeaders(ResponseWrapper wrapper, HttpMethodBase httpMethod) {
Header[] headers = httpMethod.getResponseHeaders();
Multimap<String, String> headerMap;
if (headers.length > 0) {
headerMap = ArrayListMultimap.create();
for (Header header : headers) {
headerMap.put(header.getName(), header.getValue());
}
} else {
headerMap = ArrayListMultimap.create(2, 2);
}
wrapper.headers = headerMap.asMap();
}
}