package com.mossle.core.http;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class HttpConnectionInfo {
private static Logger logger = LoggerFactory
.getLogger(HttpConnectionInfo.class);
public static final int DEFAULT_BUFFER_SIZE = 1024;
private String url;
private String processedMethod;
private Map<String, String> processedQueryParams;
private Map<String, String> processedFormParams;
private Map<String, String> processedHeadParams;
public HttpConnectionInfo(String url) {
this.url = url;
}
public String getUrl() {
return url;
}
public HttpConnectionResult process(String method,
Map<String, String> queryParams, Map<String, String> formParams,
Map<String, String> headParams) {
this.processedMethod = method;
this.processedQueryParams = queryParams;
this.processedFormParams = formParams;
this.processedHeadParams = headParams;
HttpConnectionResult httpConnectionResult = null;
try {
String clientUrl = this.appendQueryParams(queryParams);
HttpURLConnection conn = (HttpURLConnection) new URL(clientUrl)
.openConnection();
conn.setRequestMethod(method);
this.appendHeadParams(conn, headParams);
if (!formParams.isEmpty()) {
conn.setDoOutput(true);
String data = constructFormParams(formParams);
conn.getOutputStream().write(data.getBytes("UTF-8"));
}
InputStream is = conn.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] b = new byte[DEFAULT_BUFFER_SIZE];
int len = 0;
while ((len = is.read(b, 0, DEFAULT_BUFFER_SIZE)) != -1) {
baos.write(b, 0, len);
}
is.close();
baos.flush();
baos.close();
String content = new String(baos.toByteArray(), "UTF-8");
httpConnectionResult = new HttpConnectionResult(true, content);
} catch (Exception ex) {
logger.error(ex.getMessage(), ex);
httpConnectionResult = new HttpConnectionResult(false, null);
}
return httpConnectionResult;
}
private String appendQueryParams(Map<String, String> queryParams) {
StringBuilder buff = new StringBuilder(url);
for (Map.Entry<String, String> entry : queryParams.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
if (notContains(url, key)) {
if (buff.indexOf("?") != -1) {
buff.append("&");
} else {
buff.append("?");
}
buff.append(key).append("=").append(value);
}
}
return buff.toString();
}
private boolean notContains(String buff, String key) {
return (buff.indexOf("?" + key + "=") == -1)
&& (buff.indexOf("&" + key + "=") == -1);
}
private void appendHeadParams(HttpURLConnection conn,
Map<String, String> headParams) {
for (Map.Entry<String, String> entry : headParams.entrySet()) {
conn.addRequestProperty(entry.getKey(), entry.getValue());
}
}
private String constructFormParams(Map<String, String> formParams) {
StringBuilder buff = new StringBuilder();
for (Map.Entry<String, String> entry : formParams.entrySet()) {
buff.append("&").append(entry.getKey()).append("=")
.append(entry.getValue());
}
buff.deleteCharAt(0);
return buff.toString();
}
public boolean check() {
return process(processedMethod, processedQueryParams,
processedFormParams, processedHeadParams).isSuccess();
}
}