All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.star.net.http.HttpResponse Maven / Gradle / Ivy

package com.star.net.http;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.util.List;
import java.util.Map.Entry;
import java.util.zip.GZIPInputStream;

import com.star.exception.pojo.ToolException;
import com.star.io.CharsetUtil;
import com.star.io.FastByteArrayOutputStream;
import com.star.io.IoUtil;
import com.star.string.StringUtil;

/**
 * http相应类
 * 
 * @author http://git.oschina.net/loolly/hutool
 *
 */
public class HttpResponse extends AbstractHttpBase {

	/**
	 * 读取服务器返回的流保存至内存
	 */
	private transient FastByteArrayOutputStream output;

	/**
	 * 响应码
	 */
	private transient int status;

	/**
	 * 读取http连接中的响应内容
	 */
	public static HttpResponse readResponse(final HttpConnection httpConnection) {
		final HttpResponse httpResponse = new HttpResponse();

		httpResponse.status = httpConnection.responseCode();
		httpResponse.headers = httpConnection.headers();
		httpResponse.charset = httpConnection.charset();

		InputStream input;
		if (httpResponse.status < HttpURLConnection.HTTP_BAD_REQUEST) {
			input = httpConnection.getInputStream();
		} else {
			input = httpConnection.getErrorStream();
		}

		httpResponse.readBody(input);

		return httpResponse;
	}

	/**
	 * 获得响应码
	 */
	public int getStatus() {
		return status;
	}

	/**
	 * 获取内容编码
	 */
	public String contentEncoding() {
		return getHeader(HttpHeader.CONTENT_ENCODING);
	}

	/**
	 * 获得相应的字节数组
	 */
	public byte[] bodyBytes() {
		byte[] bytes;
		if (null == this.output) {
			bytes = new byte[0];
		} else {
			bytes = this.output.toByteArray();
		}
		return bytes;
	}

	/**
	 * 获得响应体
	 * 
	 * @return
	 */
	public String getBody() {
		return IoUtil.read(bodyStream()).toString(CharsetUtil.charset(charset));
	}

	/**
	 * 获得服务区响应流
	 */
	public InputStream bodyStream() {
		return new ByteArrayInputStream(this.output.toByteArray());
	}

	/**
	 * 这都要注解嘛
	 */
	@Override
	public String toString() {
		final StringBuilder stringBuilder = new StringBuilder(50);
		stringBuilder.append("Request Headers: ").append(StringUtil.CRLF);
		for (final Entry> entry : this.headers.entrySet()) {
			stringBuilder.append("    ").append(entry).append(StringUtil.CRLF);
		}

		stringBuilder.append("Request Body: ").append(StringUtil.CRLF).append("    ").append(this.getBody())
				.append(StringUtil.CRLF);

		return stringBuilder.toString();
	}

	/**
	 * 
	 * 是否为gzip压缩过的内容
	 * 
	 */
	public boolean isGzip() {
		final String contentEncoding = contentEncoding();
		return contentEncoding != null && contentEncoding.equalsIgnoreCase("gzip");
	}

	private void readBody(final InputStream inputStream) {
		InputStream input;
		try {
			input = isGzip() ? new GZIPInputStream(inputStream) : inputStream;
		} catch (IOException e) {
			throw new ToolException(
					StringUtil.format("read response's stream failure,the reason is: {}", e.getMessage()), e);
		}

		final String length = getHeader(HttpHeader.CONTENT_LENGTH);
		final int contentLength = StringUtil.isBlank(length) ? 0 : Integer.valueOf(length);
		this.output = contentLength > 0 ? new FastByteArrayOutputStream(contentLength)
				: new FastByteArrayOutputStream();
		IoUtil.copy(input, output, 0);
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy