package org.nutz.http; import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.io.Writer; import java.net.HttpURLConnection; import java.nio.charset.Charset; import java.util.Map; import org.nutz.lang.Encoding; import org.nutz.lang.Lang; import org.nutz.lang.Streams; import org.nutz.lang.Strings; public class Response { private static final String DEF_PROTOCAL_VERSION = "HTTP/1.1"; public Response(HttpURLConnection conn, Map<String, String> reHeader) throws IOException { status = conn.getResponseCode(); detail = conn.getResponseMessage(); this.header = Header.create(reHeader); String s = header.get("Set-Cookie"); if (null != s) this.cookie = new Cookie(s); } private Header header; private InputStream stream; private Cookie cookie; private String protocal = DEF_PROTOCAL_VERSION; private int status; private String detail; public String getProtocal() { return protocal; } public int getStatus() { return status; } public String getDetail() { return detail; } public boolean isOK() { return status == 200; } public boolean isServerError() { return status >= 500 && status < 600; } public boolean isClientError() { return status >= 400 && status < 500; } void setStream(InputStream stream) { this.stream = stream; } public Header getHeader() { return header; } /** * 根据Http头的Content-Type获取网页的编码类型,如果没有设的话则返回null */ public String getEncodeType() { String contextType = header.get("Content-Type"); if (null != contextType) { int position = contextType.indexOf("charset="); if (position > 0) return Strings.trim(contextType.substring(position + 8)); } return null; } public InputStream getStream() { return new BufferedInputStream(stream); } public Reader getReader() { String encoding = this.getEncodeType(); if (null == encoding || "UTF-8".equalsIgnoreCase(encoding)) return getReader(Encoding.defaultEncoding()); else return getReader(encoding); } public Reader getReader(String charsetName) { return new InputStreamReader(getStream(), Charset.forName(charsetName)); } public Cookie getCookie() { return cookie; } public void printHeader(Writer writer) { try { writer.write(header.toString()); } catch (IOException e) { throw Lang.wrapThrow(e); } } public void print(Writer writer) { print(writer, null); } public void print(Writer writer, String charsetName) { Reader reader = null; try { if (null == charsetName) reader = getReader(); else reader = this.getReader(charsetName); int c; char[] buf = new char[8192]; while (-1 != (c = reader.read(buf))) { writer.write(buf, 0, c); } writer.flush(); } catch (IOException e) { throw Lang.wrapThrow(e); } } public String getContent() { return getContent(null); } public String getContent(String charsetName) { if (charsetName == null) return Streams.readAndClose(getReader()); return Streams.readAndClose(getReader(charsetName)); } }