package org.langke.common.server;
/*
* @copyright (c) langke 2011
* @author langke 2011-5-1
*/
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import org.jboss.netty.channel.MessageEvent;
import org.jboss.netty.handler.codec.http.HttpHeaders;
import org.jboss.netty.handler.codec.http.HttpMethod;
import java.nio.charset.Charset;
import java.nio.charset.UnsupportedCharsetException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Pattern;
import org.jboss.netty.handler.codec.http.HttpRequest;
public class NettyHttpRequest {
private final HttpRequest request;
private MessageEvent messageEvent;
private final Map<String, String> params;
private final String path;
private static final Pattern commaPattern = Pattern.compile(",");
public NettyHttpRequest(HttpRequest request) {
this.request = request;
this.params = new HashMap<String, String>();
String uri = request.getUri();
int pathEndPos = uri.indexOf('?');
if (pathEndPos < 0) {
this.path = uri;
} else {
this.path = uri.substring(0, pathEndPos);
decodeQueryString(uri, pathEndPos + 1, params);
}
}
public HttpMethod method() {
return this.request.getMethod();
}
public static void decodeQueryString(String queryString, int fromIndex,
Map<String, String> params) {
if (fromIndex < 0) {
return;
}
if (fromIndex >= queryString.length()) {
return;
}
int toIndex;
while ((toIndex = queryString.indexOf('&', fromIndex)) >= 0) {
int idx = queryString.indexOf('=', fromIndex);
if (idx < 0) {
continue;
}
params.put(decodeComponent(queryString.substring(fromIndex, idx)),
decodeComponent(queryString.substring(idx + 1, toIndex)));
fromIndex = toIndex + 1;
}
int idx = queryString.indexOf('=', fromIndex);
if (idx < 0) {
return;
}
params.put(decodeComponent(queryString.substring(fromIndex, idx)),
decodeComponent(queryString.substring(idx + 1)));
}
private static String decodeComponent(String s) {
if (s == null) {
return "";
}
try {
return URLDecoder.decode(s, "UTF8");
} catch (UnsupportedEncodingException e) {
throw new UnsupportedCharsetException("UTF8");
}
}
public float paramAsFloat(String key, float defaultValue) {
String sValue = param(key);
if (sValue == null) {
return defaultValue;
}
return Float.parseFloat(sValue);
}
public int paramAsInt(String key, int defaultValue) {
String sValue = param(key);
if (sValue == null) {
return defaultValue;
}
return Integer.parseInt(sValue);
}
public boolean paramAsBoolean(String key, boolean defaultValue) {
return Boolean.parseBoolean(param(key));
}
public Boolean paramAsBoolean(String key, Boolean defaultValue) {
String sValue = param(key);
if (sValue == null) {
return defaultValue;
}
return !(sValue.equals("false") || sValue.equals("0") || sValue
.equals("off"));
}
public String[] paramAsStringArray(String key, String[] defaultValue) {
String value = param(key);
if (value == null) {
return defaultValue;
}
return commaPattern.split(value);
}
public String uri() {
return request.getUri();
}
public String path() {
return path;
}
public Map<String, String> params() {
return params;
}
public boolean hasContent() {
return request.getContent().readableBytes() > 0;
}
public int contentLength() {
return request.getContent().readableBytes();
}
public boolean contentUnsafe() {
return request.getContent().hasArray();
}
public int contentByteArrayOffset() {
if (request.getContent().hasArray()) {
// get the array offset, and the reader index offset within it
return request.getContent().arrayOffset() + request.getContent().readerIndex();
}
return 0;
}
private static Charset UTF8 = Charset.forName("UTF-8");
public String contentAsString() {
return request.getContent().toString(UTF8);
}
public Set<String> headerNames() {
return request.getHeaderNames();
}
public String header(String name) {
return request.getHeader(name);
}
public List<String> headers(String name) {
return request.getHeaders(name);
}
public String cookie() {
return request.getHeader(HttpHeaders.Names.COOKIE);
}
public boolean hasParam(String key) {
return params.containsKey(key);
}
public String param(String key) {
return params.get(key);
}
public String param(String key, String defaultValue) {
String value = params.get(key);
if (value == null) {
return defaultValue;
}
return value;
}
public HttpRequest getRequest() {
return request;
}
public MessageEvent getMessageEvent() {
return messageEvent;
}
public void setMessageEvent(MessageEvent messageEvent) {
this.messageEvent = messageEvent;
}
}