content: package zimu.util;
  
  import java.util.HashMap;
  import java.util.List;
  import java.util.Map;
  import java.util.Map.Entry;
  import java.util.Set;
  
  import cn.hutool.core.util.CharsetUtil;
  import cn.hutool.core.util.StrUtil;
  import cn.hutool.http.Header;
  import cn.hutool.http.HttpRequest;
  import cn.hutool.http.HttpResponse;
  import cn.hutool.log.Log;
  import cn.hutool.log.LogFactory;
  import zimu.util.regex.RegexUtil;
  
  /**
   * 使用jodd访问http页面
   */
  public class HtHttpUtil {
  	static final Log logger = LogFactory.get();
  
  	public boolean debug = false;
  
  	public String default_charset = "UTF-8";
  	public int _time_out = 50000;// 超时时间
  
  	public String _ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36";
  	public String _accept = "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
  	public String _accept_encoding = "gzip,deflate";
  	public String _accept_language = "zh-cn";
  	public String _accept_charset = "gb2312,utf-8;q=0.7,*;q=0.7";
  	public String _stream_media_type = "text/html";
  
  	public Map<String, String> _headers = new HashMap<String, String>();
  
  	/**
  	 * 静态实例
  	 */
  	public static HtHttpUtil http = newInstance();
  
  	public static HtHttpUtil newInstance() {
  		return new HtHttpUtil();
  	}
  
  	public HttpRequest addHeader(HttpRequest req) {
  		if (_headers.size() > 0) {
  			Set<String> keyset = _headers.keySet();
  			for (String key : keyset) {
  				req.header(key, _headers.get(key));
  			}
  		}
  		return req;
  	}
  
  	/**
  	 * 获取头部文件名配置 Content-Disposition=[attachment;
  	 * filename="Downsizing.2017.1080p.Bluray.MKV.x264.AC3.ass"]
  	 * 
  	 * @param resp
  	 * @return
  	 */
  	public static String getFileName(HttpResponse resp) {
  		String desp = new String(resp.header("Content-Disposition").getBytes(CharsetUtil.CHARSET_ISO_8859_1),
  				CharsetUtil.CHARSET_UTF_8);
  		if (desp == null || desp.indexOf("filename") == -1)
  			return null;
  		return RegexUtil.getMatchStr(desp, "filename=\"([^\"]+)\"");
  	}
  
  	/**
  	 * 读取网页
  	 * 
  	 * @param url
  	 *                = url地址
  	 * @param charset
  	 *                = 编码
  	 * 
  	 * @return 网页内容
  	 */
  	public String get(String url) {
  		return get(url, default_charset);
  	}
  
  	public String get(String url, String charset) {
  		return get(url, charset, _ua);
  	}
  
  	public String get(String url, String charset, String ua) {
  		return get(url, charset, ua, null);
  	}
  
  	public String get(String url, String charset, String ua, String refer) {
  		logger.info("get=" + url);
  
  		try {
  			HttpResponse response = addHeader(HttpRequest.get(url).header(Header.USER_AGENT, ua)
  					.header(Header.ACCEPT_CHARSET, charset).charset(charset)
  					.header(Header.ACCEPT, _accept).header(Header.ACCEPT_ENCODING, _accept_encoding)
  					.header(Header.REFERER, refer != null ? refer : url)
  					.header(Header.ACCEPT_LANGUAGE, _accept_language).timeout(_time_out)).execute();
  
  			if (debug) {
  				logger.info(response.toString());
  			}
  			int statusCode = response.getStatus();
  			if (statusCode == 301 || statusCode == 302) {
  				String location = response.header("Location");
  				if (!location.toLowerCase().startsWith("http")) {
  					location = StringUtil.getBaseUrl(url) + location;
  				}
  				return get(location, charset, ua, refer);
  			} else if (statusCode == 200) {
  				return response.body();
  			} else {
  				logger.error(url + ", failed: " + statusCode);
  				return null;
  			}
  		} catch (Exception e) {
  			logger.error(e);
  			return null;
  		} finally {
  		}
  	}
  
  	/**
  	 * 读取网页
  	 * 
  	 * @param url
  	 *                = url地址
  	 * @param charset
  	 *                = 编码
  	 * 
  	 * @return 网页内容
  	 */
  	public String post(String url) {
  		return post(url, null, default_charset);
  	}
  
  	public String post(String url, Map<String, Object> list) {
  		return post(url, list, default_charset, _ua);
  	}
  
  	public String post(String url, Map<String, Object> list, String charset) {
  		return post(url, list, charset, _ua);
  	}
  
  	public String post(String url, Map<String, Object> list, String charset, String ua) {
  		return post(url, list, charset, _ua, null);
  	}
  
  	public String post(String url, Map<String, Object> list, String charset, String ua, String refer) {
  		logger.info("post=" + url);
  		try {
  			HttpResponse response = addHeader(HttpRequest.post(url).form(list).header(Header.USER_AGENT, ua)
  					.header(Header.ACCEPT_CHARSET, charset).charset(charset)
  					.header(Header.ACCEPT, _accept).header(Header.ACCEPT_ENCODING, _accept_encoding)
  					.header(Header.REFERER, refer != null ? refer : url)
  					.header(Header.ACCEPT_LANGUAGE, _accept_language).timeout(_time_out)).execute();
  
  			if (debug) {
  				logger.info("response header:" + getRespHeaderStr(response));
  			}
  			int statusCode = response.getStatus();
  			if (statusCode == 301 || statusCode == 302) {
  				String location = response.header("Location");
  				if (!location.toLowerCase().startsWith("http")) {
  					location = StringUtil.getBaseUrl(url) + location;
  				}
  				return post(location, list, charset, ua, refer);
  			} else if (statusCode == 200) {
  				return response.body();
  			} else {
  				logger.error(url + ", failed: " + statusCode);
  				return null;
  			}
  		} catch (Exception e) {
  			logger.error(e);
  			return null;
  		} finally {
  		}
  	}
  
  	/**
  	 * post 流数据
  	 * 
  	 * @param url
  	 *                = url地址
  	 * @param encode
  	 *                = 编码
  	 * 
  	 * @return 网页内容
  	 */
  	public String postStream(String url) {
  		return postStream(url, null, default_charset);
  	}
  
  	public String postStream(String url, String data) {
  		return postStream(url, data, default_charset, _ua);
  	}
  
  	public String postStream(String url, String data, String charset) {
  		return postStream(url, data, charset, _ua);
  	}
  
  	public String postStream(String url, String data, String charset, String ua) {
  		return postStream(url, data, charset, _ua, null);
  	}
  
  	public String postStream(String url, String data, String charset, String ua, String refer) {
  		logger.info("postStream=" + url);
  		try {
  			HttpResponse response = addHeader(HttpRequest.post(url).body(data, _stream_media_type)
  					.header(Header.USER_AGENT, ua).header(Header.ACCEPT_CHARSET, charset)
  					.charset(charset).header(Header.ACCEPT, _accept)
  					.header(Header.ACCEPT_ENCODING, _accept_encoding)
  					.header(Header.REFERER, refer != null ? refer : url)
  					.header(Header.ACCEPT_LANGUAGE, _accept_language).timeout(_time_out)).execute();
  
  			if (debug) {
  				logger.info("response header:" + getRespHeaderStr(response));
  			}
  			int statusCode = response.getStatus();
  			if (statusCode == 301 || statusCode == 302) {
  				String location = response.header("Location");
  				if (!location.toLowerCase().startsWith("http")) {
  					location = StringUtil.getBaseUrl(url) + location;
  				}
  				return postStream(location, data, charset, ua, refer);
  			} else if (statusCode == 200) {
  				return response.body();
  			} else {
  				logger.error(url + ", failed: " + statusCode);
  				return null;
  			}
  		} catch (Exception e) {
  			logger.error(e);
  			return null;
  		} finally {
  		}
  
  	}
  
  	public String getRespHeaderStr(HttpResponse response) {
  		StringBuilder sb = StrUtil.builder();
  		sb.append("Response Headers: ").append(StrUtil.CRLF);
  		Map<String, List<String>> headers = response.headers();
  		for (Entry<String, List<String>> entry : headers.entrySet()) {
  			sb.append("\t").append(entry).append(StrUtil.CRLF);
  		}
  		return sb.toString();
  	}
  
  	/**
  	 * 返回HttpResponse
  	 * 
  	 * @param url
  	 *                = url地址
  	 * @return 网页内容
  	 */
  	public HttpResponse getResponse(String url) {
  		return getResponse(url, _ua);
  	}
  
  	public HttpResponse getResponse(String url, String ua) {
  		return getResponse(url, ua, null);
  	}
  
  	public HttpResponse getResponse(String url, String ua, String refer) {
  		logger.info("getResponse=" + url);
  
  		try {
  			HttpResponse response = addHeader(HttpRequest.get(url).header(Header.USER_AGENT, ua)
  					.header(Header.ACCEPT, _accept).header(Header.ACCEPT_ENCODING, _accept_encoding)
  					.header(Header.REFERER, refer != null ? refer : url)
  					.header(Header.ACCEPT_LANGUAGE, _accept_language).timeout(_time_out)).execute();
  
  			if (debug) {
  				logger.info("response header:" + getRespHeaderStr(response));
  			}
  			int statusCode = response.getStatus();
  			if (statusCode == 301 || statusCode == 302) {
  				String location = response.header("Location");
  				if (!location.toLowerCase().startsWith("http")) {
  					location = StringUtil.getBaseUrl(url) + location;
  				}
  				return getResponse(location, ua, refer);
  			} else if (statusCode == 200) {
  				return response;
  			} else {
  				logger.error(url + ", failed: " + statusCode);
  				return null;
  			}
  		} catch (Exception e) {
  			logger.error(e);
  			return null;
  		} finally {
  		}
  	}
  
  	/**
  	 * 读取2进制数据
  	 * 
  	 * @param url
  	 *                = url地址
  	 * @return 网页内容
  	 */
  	public byte[] getBytes(String url) {
  		return getBytes(url, _ua);
  	}
  
  	public byte[] getBytes(String url, String ua) {
  		return getBytes(url, ua, null);
  	}
  
  	public byte[] getBytes(String url, String ua, String refer) {
  		logger.info("getBytes=" + url);
  
  		try {
  			HttpResponse response = addHeader(HttpRequest.get(url).header(Header.USER_AGENT, ua)
  					.header(Header.ACCEPT, _accept).header(Header.ACCEPT_ENCODING, _accept_encoding)
  					.header(Header.REFERER, refer != null ? refer : url)
  					.header(Header.ACCEPT_LANGUAGE, _accept_language).timeout(_time_out)).execute();
  
  			if (debug) {
  				logger.info("response header:" + getRespHeaderStr(response));
  			}
  			int statusCode = response.getStatus();
  			if (statusCode == 301 || statusCode == 302) {
  				String location = response.header("Location");
  				if (!location.toLowerCase().startsWith("http")) {
  					location = StringUtil.getBaseUrl(url) + location;
  				}
  				return getBytes(location, ua, refer);
  			} else if (statusCode == 200) {
  				return response.bodyBytes();
  			} else {
  				logger.error(url + ", failed: " + statusCode);
  				return null;
  			}
  		} catch (Exception e) {
  			logger.error(e);
  			return null;
  		} finally {
  		}
  	}
  
  	public byte[] postBytes(String url) {
  		return postBytes(url, null, _ua, null);
  	}
  
  	public byte[] postBytes(String url, Map<String, Object> list) {
  		return postBytes(url, list, _ua, null);
  	}
  
  	public byte[] postBytes(String url, Map<String, Object> list, String ua) {
  		return postBytes(url, list, _ua, null);
  	}
  
  	public byte[] postBytes(String url, Map<String, Object> list, String ua, String refer) {
  		logger.info("postBytes=" + url);
  
  		try {
  			HttpResponse response = addHeader(HttpRequest.post(url).form(list).header(Header.USER_AGENT, ua)
  					.header(Header.ACCEPT, _accept).header(Header.ACCEPT_ENCODING, _accept_encoding)
  					.header(Header.REFERER, refer != null ? refer : url)
  					.header(Header.ACCEPT_LANGUAGE, _accept_language).timeout(_time_out)).execute();
  
  			if (debug) {
  				logger.info("response header:" + getRespHeaderStr(response));
  			}
  			int statusCode = response.getStatus();
  			if (statusCode == 301 || statusCode == 302) {
  				String location = response.header("Location");
  				if (!location.toLowerCase().startsWith("http")) {
  					location = StringUtil.getBaseUrl(url) + location;
  				}
  				return postBytes(location, list, ua, refer);
  			} else if (statusCode == 200) {
  				return response.bodyBytes();
  			} else {
  				logger.error(url + ", failed: " + statusCode);
  				return null;
  			}
  		} catch (Exception e) {
  			logger.error(e);
  			return null;
  		} finally {
  		}
  	}
  
  	/**
  	 * @param args
  	 */
  	public static void main(String[] args) {
  		String url = "http://www.test.com";
  		url = "http://localhost/print_r.php";
  		url = "http://localhost/print_r_utf8.php";
  		url = "https://subhd.tv/search0/downsizing.2017";
  
  		// System.out.println(inst.get(url));
  		HashMap<String, Object> data = new HashMap<String, Object>();
  		data.put("aaaa", "111");
  		System.out.println(http.post(url, data));
  
  		// byte[] bytes =
  		// http.getBytes("http://www.oschina.net/img/newindex-03.svg?t=1451961935000");
  		// System.out.println(inst.postStream(url, "asdsasa中文sfdasd"));
  
  	}
  
  }
  