package foundation.handler; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.Enumeration; import javax.servlet.http.HttpServletRequest; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import foundation.json.JObjectReader; import foundation.route.Operation; import foundation.token.IOnlineUser; import foundation.util.MapList; import foundation.util.Util; public class DataPool implements IDataPool { protected static Logger logger; public static String ProviderName = "dataPool"; private IOnlineUser user; private HttpServletRequest request; private MapList params; private DataPoolType type; private Operation operation; private JObjectReader jObjectReader; private String token; private String body; static { logger = LogManager.getLogger(); } public DataPool(HttpServletRequest request) throws Exception { params = new MapList(); this.request = request; loadParams(); parseType(request); } private void parseType(HttpServletRequest request) { String method = request.getMethod(); method = method.toLowerCase(); String contentCount = request.getContentType(); if (contentCount == null) { contentCount = ""; } contentCount = contentCount.toLowerCase(); if (contentCount.indexOf("multipart") >= 0) { type = DataPoolType.MultiPart; } else if ("get".equals(method)) { type = DataPoolType.Get; } else if ("options".equals(method)) { type = DataPoolType.Options; } else { type = DataPoolType.Post; } } public String getToken() throws IOException { //1. read from URL parameters token = params.get("token"); if (!Util.isEmpty(token)) { return token; } //2. read from body getJObjectReader(); if (jObjectReader == null) { return null; } token = jObjectReader.getString("token"); return token; } private void loadParams() throws Exception { Enumeration paramNames = request.getParameterNames(); while (paramNames.hasMoreElements()) { String paramName = (String) paramNames.nextElement(); String value = request.getParameter(paramName); loadOneParam(paramName, value); } } public void loadOneParam(String name, String value) { if (Util.isEmpty(name)) { return; } params.add(name, value); } private void loadBody() throws IOException { if (body != null) { return; } InputStream inputStream = request.getInputStream(); //1. read stream StringBuilder result = new StringBuilder(); String line; BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "utf-8")); while ((line = reader.readLine()) != null) { result.append(line); } body = result.toString(); logger.debug("request: {}", body); jObjectReader = new JObjectReader(body); } public String getParam(String name) { return params.get(name); } public HttpServletRequest getRequest() { return request; } public String getRemoteIP() { return request.getRemoteAddr(); } public Operation getOperation() { return operation; } public void setOperation(Operation operation) { this.operation = operation; } public String getBody() throws IOException { if (body == null) { loadBody(); } return body; } @Override public synchronized JObjectReader getJObjectReader() throws IOException { if (jObjectReader == null && (DataPoolType.MultiPart != type)) { loadBody(); } return jObjectReader; } public MapList getParams() { return params; } public DataPoolType getType() { return type; } public IOnlineUser getUser() { return user; } public void setUser(IOnlineUser user) { this.user = user; } }