package org.fastcatsearch.util; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import org.apache.http.HttpResponse; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.CookieStore; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.client.protocol.ClientContext; import org.apache.http.cookie.Cookie; import org.apache.http.entity.BufferedHttpEntity; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.protocol.BasicHttpContext; import org.apache.http.protocol.HttpContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class WebPageGather { private final static Logger logger = LoggerFactory.getLogger(WebPageGather.class); private static String LINK_METHOD_GET = "GET"; private static String LINK_METHOD_POST = "POST"; private HttpClient httpClient; private static String newLine = System.getProperty("line.separator"); private Map<String, HttpContext> contextMap; public WebPageGather(){ this.contextMap = new ConcurrentHashMap<String, HttpContext>(); this.httpClient = HttpClientWrapper.wrapClient(new DefaultHttpClient()); } public String getLinkPageContent(String strUrl, String encoding, String method) { logger.debug("Link Page url={}, encoding={}, method={}", new Object[]{strUrl, encoding, method}); HttpUriRequest request = null; HttpContext httpContext = null; int startPos = strUrl.indexOf("//") + 2; int pos = strUrl.indexOf('/', startPos); String domain = null; if (pos < 0) { domain = strUrl.substring(0); } else { domain = strUrl.substring(0, pos); } httpContext = contextMap.get(domain); if (httpContext == null) { httpContext = new BasicHttpContext(); contextMap.put(domain, httpContext); } if (LINK_METHOD_POST.equalsIgnoreCase(method)) { request = new HttpPost(getEncodedUrl(strUrl, encoding)); } else if (LINK_METHOD_GET.equalsIgnoreCase(method)){ request = new HttpGet(getEncodedUrl(strUrl, encoding)); } BufferedReader br = null; InputStream is = null; try { CookieStore cookieStore = (CookieStore)httpContext.getAttribute(ClientContext.COOKIE_STORE); List<Cookie> cookieList = null; if(cookieStore != null) cookieList = cookieStore.getCookies(); if(cookieList != null){ logger.trace("LinkPage Cookie size : {}", cookieList.size()); for(Cookie c : cookieList){ logger.trace("Cookie : {}", c.toString()); } } HttpResponse response = httpClient.execute(request, httpContext); logger.debug("Link Status >> {}", response.getStatusLine()); if(response.getStatusLine().getStatusCode() >= 400){ //문제발생. logger.error("링크페이지에서 에러가 발생하였습니다. status={}", response.getStatusLine()); response.getEntity().getContent().close(); return ""; } is = new BufferedHttpEntity(response.getEntity()).getContent(); br = new BufferedReader(new InputStreamReader(is,encoding)); String s = ""; StringBuffer sb = new StringBuffer(); while ((s = br.readLine()) != null) { sb.append(s); sb.append(newLine); } br.close(); is.close(); return sb.toString(); } catch (ClientProtocolException e) { logger.error("",e); try { if(br != null) br.close(); if(is != null) is.close(); } catch (IOException e1) { } } catch (IOException e) { logger.error("",e); try { if(br != null) br.close(); if(is != null) is.close(); } catch (IOException e1) { } } return ""; } private String getEncodedUrl(String urlString, String encoding){ int p = urlString.indexOf("?"); if(p < 0){ return urlString; }else{ StringBuffer urlBuffer = new StringBuffer(); String frontUrl = urlString.substring(0, p); urlBuffer.append(frontUrl); String paramString = urlString.substring(p + 1); String[] params = paramString.split("&"); int i = 0; for (String param : params) { int p2 = param.indexOf("="); String name = null; String value = null; if(p2 < 0){ continue; }else{ name = param.substring(0, p2).trim(); value = param.substring(p2 + 1).trim(); } if(value.length() > 0){ try { value = URLEncoder.encode(value, encoding); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } if(i == 0){ urlBuffer.append("?"); }else{ urlBuffer.append("&"); } urlBuffer.append(name); urlBuffer.append("="); urlBuffer.append(value); i++; } } return urlBuffer.toString(); } } }