package org.fastcatsearch.http.action; import java.net.URLDecoder; import java.util.HashMap; import java.util.Map; import org.jboss.netty.buffer.ChannelBuffer; import org.jboss.netty.handler.codec.http.HttpHeaders; import org.jboss.netty.handler.codec.http.HttpMethod; import org.jboss.netty.handler.codec.http.HttpRequest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class ActionRequest { private static final Logger logger = LoggerFactory.getLogger(ActionRequest.class); private static final String DEFAULT_CHARSET = "utf-8"; private HttpRequest request; private String uri; private String queryString; private Map<String, String> parameterMap; public ActionRequest(String uri, HttpRequest request) { this.uri = uri; this.request = request; if (request != null) { if (request.getMethod() == HttpMethod.GET) { // logger.debug("URI:{} , {}, {}", request.getUri(), request.getUri().length(), uri.length()); if (request.getUri().length() > uri.length()) { queryString = request.getUri().substring(uri.length() + 1); // 맨앞의 ?를 제거하기 위해 +1 } } else if (request.getMethod() == HttpMethod.POST) { long len = HttpHeaders.getContentLength(request); ChannelBuffer buffer = request.getContent(); queryString = new String(buffer.toByteBuffer().array(), 0, (int) len); } else { } if(logger.isDebugEnabled()) { String debugQueryString = null; if(queryString != null) { debugQueryString = queryString.length() > 100 ? queryString.substring(0, 100) + "..." : queryString; } logger.debug("action {}, param={}", uri, debugQueryString); } parameterMap = new HashMap<String, String>(); if (queryString != null) { parse(); } } } public boolean isMethodGet() { return request.getMethod() == HttpMethod.GET; } public boolean isMethodPost() { return request.getMethod() == HttpMethod.POST; } public HttpRequest request() { return request; } public String uri() { return uri; } public Map<String, String> getParameterMap() { return parameterMap; } public String getParameter(String key) { return getParameter(key, null); } public String getParameter(String key, String defaultValue) { if (parameterMap.containsKey(key)) { return parameterMap.get(key); } else { return defaultValue; } } public int getIntParameter(String key) { return getIntParameter(key, 0); } public int getIntParameter(String key, int defaultValue) { String value = getParameter(key); if (value != null) { try { return Integer.parseInt(value); } catch (NumberFormatException e) { } } return defaultValue; } public boolean getBooleanParameter(String key) { return getBooleanParameter(key, false); } public boolean getBooleanParameter(String key, boolean defaultValue) { String value = getParameter(key); if (value != null) { return "true".equalsIgnoreCase(value); } else { return defaultValue; } } public String getParameterString() { return queryString; } private void prepareParameterMap() { if (parameterMap == null) { parameterMap = new HashMap<String, String>(); if (queryString != null) { parse(); } } } private void parse() { parse(DEFAULT_CHARSET); } private void parse(String charset) { for (String pair : queryString.split("&")) { int eq = pair.indexOf("="); if (eq < 0) { // key with no value // parameterMap.put(pair.toUpperCase(), ""); parameterMap.put(pair, ""); } else { // key=value String key = pair.substring(0, eq); String value = pair.substring(eq + 1); try { String decodedValue = URLDecoder.decode(value, charset); // logger.debug("DECODE {} > {}", value, decodedValue); parameterMap.put(key, decodedValue); } catch (Exception e) { // 디코드 에러시 디코드하지 않음. '100%보증'과 같은 문자가 들어올수 있음. parameterMap.put(key, value); } } } // logger.debug("parameterMap >> {}", parameterMap); } }