package com.g4m.admin.conf;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import org.apache.commons.io.IOUtils;
public class HttpRequestWrapper extends HttpServletRequestWrapper {
private String body;
private ServletInputStream inputStream;
private BufferedReader reader;
private String requestURI;
private StringBuilder requestURL;
private String servletPath;
private Map
params;
public HttpRequestWrapper(HttpServletRequest request) throws IOException {
super(request);
if (!isMultipart()) {
preLoadBody(request);
}
}
private void preLoadBody(HttpServletRequest request) throws IOException {
Charset charset = Charset.forName(getCharacterEncoding());
byte[] bodyBytes= IOUtils.toByteArray(request.getInputStream());
body =new String(bodyBytes, charset);
inputStream =new RequestCachingInputStream(body.getBytes(getCharacterEncoding()));
}
public final boolean isMultipart() {
String contentType = getContentType();
return contentType !=null && contentType.toLowerCase().startsWith("multipart/");
}
@Override
public final String getContentType() {
String _contentType =getParameter("_contentType");
if (_contentType !=null) {
return _contentType;
}
return super.getContentType();
}
public String getBody() {
if (isMultipart()) {
throw new IllegalStateException("multipart request does not support preloaded body");
}
return body;
}
@Override
public String getMethod() {
String _method =getParameter("_method");
if (_method !=null) {
return _method;
}
return super.getMethod();
}
@Override
public ServletInputStream getInputStream() throws IOException {
if (inputStream !=null) {
return inputStream;
}
return super.getInputStream();
}
@Override
public BufferedReader getReader() throws IOException {
if (reader==null) {
reader =new BufferedReader(new InputStreamReader(inputStream, getCharacterEncoding()));
}
return reader;
}
@Override
public final String getCharacterEncoding() {
String defaultEncoding =super.getCharacterEncoding();
return defaultEncoding !=null ? defaultEncoding : "UTF-8";
}
public void setParams(Map
params) {
this.params= params;
}
private static class RequestCachingInputStream extends ServletInputStream {
private final ByteArrayInputStream inputStream;
public RequestCachingInputStream(byte[] bytes) {
inputStream =new ByteArrayInputStream(bytes);
}
@Override
public int read() throws IOException {
return inputStream.read();
}
@Override
public boolean isFinished() {
return false;
}
@Override
public boolean isReady() {
return false;
}
@Override
public void setReadListener(ReadListener readListener) {
}
}
@Override
public String getRequestURI() {
if (this.requestURI==null) {
return super.getRequestURI();
}
return super.getRequestURI();
}
@Override
public StringBuffer getRequestURL() {
if (this.requestURL==null) {
return super.getRequestURL();
}
return new StringBuffer(this.requestURL.toString());
}
@Override
public String getServletPath() {
if (servletPath==null) {
return super.getServletPath();
}
return this.servletPath;
}
public void setRequestURI(String requestURI, HttpServletRequest request) {
this.servletPath= requestURI;
this.requestURI=request.getContextPath() + requestURI;
this.requestURL=new StringBuilder().append(request.getProtocol())
.append("://")
.append(request.getLocalAddr())
.append("/")
.append(servletPath);
}
@Override
public String[] getParameterValues(String name) {
if (params !=null) {
Object v = params.get(name);
if (v==null) {
return null;
} else if (v instanceof String[]) {
return (String[]) v;
} else if (v instanceof String) {
return new String[]{(String) v};
} else {
return new String[]{v.toString()};
}
}
return super.getParameterValues(name);
}
@Override
public String getParameter(String name) {
if (params !=null) {
Object v = params.get(name);
if (v==null) {
return null;
} else if (v instanceof String[]) {
String[] strArr = (String[]) v;
if (strArr.length > 0) {
return strArr[0];
} else {
return null;
}
} else if (v instanceof String) {
return (String) v;
} else {
return v.toString();
}
}
return super.getParameter(name);
}
@Override
public Map
getParameterMap() {
if (params !=null) {
Map
map=new HashMap
();
for (Object key : params.keySet()) {
Object v = params.get((String) key);
String[] strArr =null;
if (v==null) {
return null;
} else if (v instanceof String[]) {
strArr = (String[]) v;
} else if (v instanceof String) {
strArr =new String[1];
strArr[0]= (String) v;
} else {
strArr =new String[1];
strArr[0]= v.toString();
}
map.put((String) key, strArr);
}
return map;
}
return super.getParameterMap();
}
}