diff --git a/src/org/redkale/mq/HttpMessageContent.java b/src/org/redkale/mq/HttpMessageContent.java deleted file mode 100644 index 51ced5245..000000000 --- a/src/org/redkale/mq/HttpMessageContent.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package org.redkale.mq; - -import java.io.Serializable; -import org.redkale.convert.json.JsonConvert; - -/** - * - * - *

- * 详情见: https://redkale.org - * - * @author zhangjx - */ -public class HttpMessageContent implements Serializable { - - @Override - public String toString() { - return JsonConvert.root().convertTo(this); - } -} diff --git a/src/org/redkale/mq/HttpMessageRequest.java b/src/org/redkale/mq/HttpMessageRequest.java index a2956386e..68189e5b4 100644 --- a/src/org/redkale/mq/HttpMessageRequest.java +++ b/src/org/redkale/mq/HttpMessageRequest.java @@ -5,7 +5,6 @@ */ package org.redkale.mq; -import java.nio.ByteBuffer; import org.redkale.net.http.*; /** @@ -18,19 +17,8 @@ import org.redkale.net.http.*; */ public class HttpMessageRequest extends HttpRequest { - protected String remoteAddr; - - public HttpMessageRequest(HttpContext context) { - super(context, null); + public HttpMessageRequest(HttpContext context, HttpSimpleRequest req) { + super(context, req); } - @Override - public String getRemoteAddr() { - return remoteAddr; - } - - @Override - public int readHeader(ByteBuffer buffer) { - return super.readHeader(buffer); - } } diff --git a/src/org/redkale/net/http/HttpRequest.java b/src/org/redkale/net/http/HttpRequest.java index 42b837775..cd98a5fb9 100644 --- a/src/org/redkale/net/http/HttpRequest.java +++ b/src/org/redkale/net/http/HttpRequest.java @@ -1,5 +1,5 @@ /* - * To change this license header, choose License Headers in Project Properties. + * To change this license headers, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ @@ -17,7 +17,6 @@ import java.util.logging.Level; import org.redkale.convert.ConvertDisabled; import org.redkale.convert.json.JsonConvert; import org.redkale.net.*; -import org.redkale.util.AnyValue.DefaultAnyValue; import org.redkale.util.*; /** @@ -61,9 +60,10 @@ public class HttpRequest extends Request { protected String newsessionid; - protected final DefaultAnyValue header = new DefaultAnyValue(); + //protected final DefaultAnyValue headers = new DefaultAnyValue(); + protected final Map headers = new HashMap<>(); - protected final DefaultAnyValue params = new DefaultAnyValue(); + protected final Map params = new HashMap<>(); protected boolean boundary = false; @@ -77,6 +77,8 @@ public class HttpRequest extends Request { protected Object currentUser; + protected String remoteAddr; + private final ByteArray array = new ByteArray(); private boolean bodyparsed = false; @@ -90,6 +92,32 @@ public class HttpRequest extends Request { this.remoteAddrHeader = context.remoteAddrHeader; } + public HttpRequest(HttpContext context, HttpSimpleRequest req) { + super(context, null); + this.remoteAddrHeader = null; + if (req != null) { + if (req.getBody() != null) this.array.write(req.getBody()); + if (req.getHeaders() != null) this.headers.putAll(req.getHeaders()); + if (req.getParams() != null) this.params.putAll(req.getParams()); + this.remoteAddr = req.getRemoteAddr(); + this.requestURI = req.getRequestURI(); + if (req.getSessionid() != null && !req.getSessionid().isEmpty()) { + this.cookies = new HttpCookie[]{new HttpCookie(SESSIONID_NAME, req.getSessionid())}; + } + } + } + + public HttpSimpleRequest createSimpleRequest() { + HttpSimpleRequest req = new HttpSimpleRequest(); + req.setBody(array.size() == 0 ? null : array.getBytes()); + req.setHeaders(headers.isEmpty() ? null : headers); + req.setParams(params.isEmpty() ? null : params); + req.setRemoteAddr(getRemoteAddr()); + req.setRequestURI(this.requestURI); + req.setSessionid(getSessionid(false)); + return req; + } + protected boolean isWebSocket() { return connection != null && connection.contains("Upgrade") && "GET".equalsIgnoreCase(method) && "websocket".equalsIgnoreCase(getHeader("Upgrade")); } @@ -179,10 +207,10 @@ public class HttpRequest extends Request { } break; case "user-agent": - header.addValue("User-Agent", value); + headers.put("User-Agent", value); break; default: - header.addValue(name, value); + headers.put(name, value); } } if (this.contentType != null && this.contentType.contains("boundary=")) this.boundary = true; @@ -237,7 +265,7 @@ public class HttpRequest extends Request { if (name.charAt(0) == '<') return; //内容可能是xml格式; 如: = 0) { addParameter(array, valpos + 1, limit - valpos - 1); } @@ -421,14 +449,22 @@ public class HttpRequest extends Request { * @return 地址 */ public String getRemoteAddr() { + if (this.remoteAddr != null) return this.remoteAddr; if (remoteAddrHeader != null) { String val = getHeader(remoteAddrHeader); - if (val != null) return val; + if (val != null) { + this.remoteAddr = val; + return val; + } } SocketAddress addr = getRemoteAddress(); if (addr == null) return ""; - if (addr instanceof InetSocketAddress) return ((InetSocketAddress) addr).getAddress().getHostAddress(); - return String.valueOf(addr); + if (addr instanceof InetSocketAddress) { + this.remoteAddr = ((InetSocketAddress) addr).getAddress().getHostAddress(); + return this.remoteAddr; + } + this.remoteAddr = String.valueOf(addr); + return this.remoteAddr; } /** @@ -507,7 +543,20 @@ public class HttpRequest extends Request { + ", \r\n remoteAddr: " + this.getRemoteAddr() + ", \r\n cookies: " + this.cookie + ", \r\n contentType: " + this.contentType + ", \r\n connection: " + this.connection + ", \r\n protocol: " + this.protocol + ", \r\n host: " + this.host + ", \r\n contentLength: " + this.contentLength + ", \r\n bodyLength: " + this.array.size() + (this.boundary || this.array.isEmpty() ? "" : (", \r\n bodyContent: " + this.getBodyUTF8())) - + ", \r\n params: " + this.params.toString(4) + ", \r\n header: " + this.header.toString(4) + "\r\n}"; + + ", \r\n params: " + toMapString(this.params, 4) + ", \r\n header: " + toMapString(this.headers, 4) + "\r\n}"; //this.headers.toString(4) + } + + private static CharSequence toMapString(Map map, int indent) { + char[] chars = new char[indent]; + Arrays.fill(chars, ' '); + final String space = new String(chars); + StringBuilder sb = new StringBuilder(); + sb.append("{\r\n"); + for (Map.Entry en : map.entrySet()) { + sb.append(space).append(" '").append(en.getKey()).append("': '").append(en.getValue()).append("',\r\n"); + } + sb.append(space).append('}'); + return sb; } /** @@ -558,10 +607,11 @@ public class HttpRequest extends Request { this.annotations = null; this.currentUserid = null; this.currentUser = null; + this.remoteAddr = null; this.attachment = null; - this.header.clear(); + this.headers.clear(); this.params.clear(); this.array.clear(); super.recycle(); @@ -1094,8 +1144,8 @@ public class HttpRequest extends Request { * * @return AnyValue */ - public AnyValue getHeaders() { - return header; + public Map getHeaders() { + return headers; } /** @@ -1109,7 +1159,7 @@ public class HttpRequest extends Request { public Map getHeadersToMap(Map map) { if (map == null) map = new LinkedHashMap<>(); final Map map0 = map; - header.forEach((k, v) -> map0.put(k, v)); + headers.forEach((k, v) -> map0.put(k, v)); return map0; } @@ -1120,7 +1170,8 @@ public class HttpRequest extends Request { */ @ConvertDisabled public String[] getHeaderNames() { - return header.getNames(); + Set names = headers.keySet(); + return names.toArray(new String[names.size()]); } /** @@ -1131,7 +1182,7 @@ public class HttpRequest extends Request { * @return header值 */ public String getHeader(String name) { - return header.getValue(name); + return headers.get(name); } /** @@ -1143,7 +1194,7 @@ public class HttpRequest extends Request { * @return header值 */ public String getHeader(String name, String defaultValue) { - return header.getValue(name, defaultValue); + return headers.getOrDefault(name, defaultValue); } /** @@ -1184,7 +1235,9 @@ public class HttpRequest extends Request { * @return header值 */ public boolean getBooleanHeader(String name, boolean defaultValue) { - return header.getBoolValue(name, defaultValue); + //return headers.getBoolValue(name, defaultValue); + String value = headers.get(name); + return value == null || value.length() == 0 ? defaultValue : Boolean.parseBoolean(value); } /** @@ -1196,7 +1249,14 @@ public class HttpRequest extends Request { * @return header值 */ public short getShortHeader(String name, short defaultValue) { - return header.getShortValue(name, defaultValue); + //return headers.getShortValue(name, defaultValue); + String value = headers.get(name); + if (value == null || value.length() == 0) return defaultValue; + try { + return Short.decode(value); + } catch (NumberFormatException e) { + return defaultValue; + } } /** @@ -1209,7 +1269,14 @@ public class HttpRequest extends Request { * @return header值 */ public short getShortHeader(int radix, String name, short defaultValue) { - return header.getShortValue(name, defaultValue); + //return headers.getShortValue(name, defaultValue); + String value = headers.get(name); + if (value == null || value.length() == 0) return defaultValue; + try { + return (radix == 10 ? Short.decode(value) : Short.parseShort(value, radix)); + } catch (NumberFormatException e) { + return defaultValue; + } } /** @@ -1221,7 +1288,14 @@ public class HttpRequest extends Request { * @return header值 */ public short getShortHeader(String name, int defaultValue) { - return header.getShortValue(name, (short) defaultValue); + //return headers.getShortValue(name, (short) defaultValue); + String value = headers.get(name); + if (value == null || value.length() == 0) return (short) defaultValue; + try { + return Short.decode(value); + } catch (NumberFormatException e) { + return (short) defaultValue; + } } /** @@ -1234,7 +1308,14 @@ public class HttpRequest extends Request { * @return header值 */ public short getShortHeader(int radix, String name, int defaultValue) { - return header.getShortValue(radix, name, (short) defaultValue); + //return headers.getShortValue(radix, name, (short) defaultValue); + String value = headers.get(name); + if (value == null || value.length() == 0) return (short) defaultValue; + try { + return (radix == 10 ? Short.decode(value) : Short.parseShort(value, radix)); + } catch (NumberFormatException e) { + return (short) defaultValue; + } } /** @@ -1246,7 +1327,14 @@ public class HttpRequest extends Request { * @return header值 */ public int getIntHeader(String name, int defaultValue) { - return header.getIntValue(name, defaultValue); + //return headers.getIntValue(name, defaultValue); + String value = headers.get(name); + if (value == null || value.length() == 0) return defaultValue; + try { + return Integer.parseInt(value); + } catch (NumberFormatException e) { + return defaultValue; + } } /** @@ -1259,7 +1347,14 @@ public class HttpRequest extends Request { * @return header值 */ public int getIntHeader(int radix, String name, int defaultValue) { - return header.getIntValue(radix, name, defaultValue); + //return headers.getIntValue(radix, name, defaultValue); + String value = headers.get(name); + if (value == null || value.length() == 0) return defaultValue; + try { + return (radix == 10 ? Integer.decode(value) : Integer.parseInt(value, radix)); + } catch (NumberFormatException e) { + return defaultValue; + } } /** @@ -1271,7 +1366,14 @@ public class HttpRequest extends Request { * @return header值 */ public long getLongHeader(String name, long defaultValue) { - return header.getLongValue(name, defaultValue); + //return headers.getLongValue(name, defaultValue); + String value = headers.get(name); + if (value == null || value.length() == 0) return defaultValue; + try { + return Long.decode(value); + } catch (NumberFormatException e) { + return defaultValue; + } } /** @@ -1284,7 +1386,14 @@ public class HttpRequest extends Request { * @return header值 */ public long getLongHeader(int radix, String name, long defaultValue) { - return header.getLongValue(radix, name, defaultValue); + //return headers.getLongValue(radix, name, defaultValue); + String value = headers.get(name); + if (value == null || value.length() == 0) return defaultValue; + try { + return (radix == 10 ? Long.decode(value) : Long.parseLong(value, radix)); + } catch (NumberFormatException e) { + return defaultValue; + } } /** @@ -1296,7 +1405,14 @@ public class HttpRequest extends Request { * @return header值 */ public float getFloatHeader(String name, float defaultValue) { - return header.getFloatValue(name, defaultValue); + //return headers.getFloatValue(name, defaultValue); + String value = headers.get(name); + if (value == null || value.length() == 0) return defaultValue; + try { + return Float.parseFloat(value); + } catch (NumberFormatException e) { + return defaultValue; + } } /** @@ -1308,7 +1424,14 @@ public class HttpRequest extends Request { * @return header值 */ public double getDoubleHeader(String name, double defaultValue) { - return header.getDoubleValue(name, defaultValue); + //return headers.getDoubleValue(name, defaultValue); + String value = headers.get(name); + if (value == null || value.length() == 0) return defaultValue; + try { + return Double.parseDouble(value); + } catch (NumberFormatException e) { + return defaultValue; + } } //------------------------------------------------------------------------------ @@ -1317,7 +1440,7 @@ public class HttpRequest extends Request { * * @return AnyValue */ - public AnyValue getParameters() { + public Map getParameters() { parseBody(); return params; } @@ -1373,7 +1496,8 @@ public class HttpRequest extends Request { @ConvertDisabled public String[] getParameterNames() { parseBody(); - return params.getNames(); + Set names = params.keySet(); + return names.toArray(new String[names.size()]); } /** @@ -1385,7 +1509,7 @@ public class HttpRequest extends Request { */ public String getParameter(String name) { parseBody(); - return params.getValue(name); + return params.get(name); } /** @@ -1398,7 +1522,7 @@ public class HttpRequest extends Request { */ public String getParameter(String name, String defaultValue) { parseBody(); - return params.getValue(name, defaultValue); + return params.getOrDefault(name, defaultValue); } /** @@ -1440,7 +1564,8 @@ public class HttpRequest extends Request { */ public boolean getBooleanParameter(String name, boolean defaultValue) { parseBody(); - return params.getBoolValue(name, defaultValue); + String value = params.get(name); + return value == null || value.length() == 0 ? defaultValue : Boolean.parseBoolean(value); } /** @@ -1453,7 +1578,13 @@ public class HttpRequest extends Request { */ public short getShortParameter(String name, short defaultValue) { parseBody(); - return params.getShortValue(name, defaultValue); + String value = params.get(name); + if (value == null || value.length() == 0) return defaultValue; + try { + return Short.decode(value); + } catch (NumberFormatException e) { + return defaultValue; + } } /** @@ -1467,7 +1598,13 @@ public class HttpRequest extends Request { */ public short getShortParameter(int radix, String name, short defaultValue) { parseBody(); - return params.getShortValue(radix, name, defaultValue); + String value = params.get(name); + if (value == null || value.length() == 0) return defaultValue; + try { + return (radix == 10 ? Short.decode(value) : Short.parseShort(value, radix)); + } catch (NumberFormatException e) { + return defaultValue; + } } /** @@ -1480,7 +1617,13 @@ public class HttpRequest extends Request { */ public short getShortParameter(String name, int defaultValue) { parseBody(); - return params.getShortValue(name, (short) defaultValue); + String value = params.get(name); + if (value == null || value.length() == 0) return (short) defaultValue; + try { + return Short.decode(value); + } catch (NumberFormatException e) { + return (short) defaultValue; + } } /** @@ -1493,7 +1636,13 @@ public class HttpRequest extends Request { */ public int getIntParameter(String name, int defaultValue) { parseBody(); - return params.getIntValue(name, defaultValue); + String value = params.get(name); + if (value == null || value.length() == 0) return defaultValue; + try { + return Integer.decode(value); + } catch (NumberFormatException e) { + return defaultValue; + } } /** @@ -1507,7 +1656,13 @@ public class HttpRequest extends Request { */ public int getIntParameter(int radix, String name, int defaultValue) { parseBody(); - return params.getIntValue(radix, name, defaultValue); + String value = params.get(name); + if (value == null || value.length() == 0) return defaultValue; + try { + return (radix == 10 ? Integer.decode(value) : Integer.parseInt(value, radix)); + } catch (NumberFormatException e) { + return defaultValue; + } } /** @@ -1520,7 +1675,13 @@ public class HttpRequest extends Request { */ public long getLongParameter(String name, long defaultValue) { parseBody(); - return params.getLongValue(name, defaultValue); + String value = params.get(name); + if (value == null || value.length() == 0) return defaultValue; + try { + return Long.decode(value); + } catch (NumberFormatException e) { + return defaultValue; + } } /** @@ -1534,7 +1695,13 @@ public class HttpRequest extends Request { */ public long getLongParameter(int radix, String name, long defaultValue) { parseBody(); - return params.getLongValue(radix, name, defaultValue); + String value = params.get(name); + if (value == null || value.length() == 0) return defaultValue; + try { + return (radix == 10 ? Long.decode(value) : Long.parseLong(value, radix)); + } catch (NumberFormatException e) { + return defaultValue; + } } /** @@ -1547,7 +1714,13 @@ public class HttpRequest extends Request { */ public float getFloatParameter(String name, float defaultValue) { parseBody(); - return params.getFloatValue(name, defaultValue); + String value = params.get(name); + if (value == null || value.length() == 0) return defaultValue; + try { + return Float.parseFloat(value); + } catch (NumberFormatException e) { + return defaultValue; + } } /** @@ -1560,7 +1733,13 @@ public class HttpRequest extends Request { */ public double getDoubleParameter(String name, double defaultValue) { parseBody(); - return params.getDoubleValue(name, defaultValue); + String value = params.get(name); + if (value == null || value.length() == 0) return defaultValue; + try { + return Double.parseDouble(value); + } catch (NumberFormatException e) { + return defaultValue; + } } /** diff --git a/src/org/redkale/net/http/HttpSimpleRequest.java b/src/org/redkale/net/http/HttpSimpleRequest.java new file mode 100644 index 000000000..9c43f92dc --- /dev/null +++ b/src/org/redkale/net/http/HttpSimpleRequest.java @@ -0,0 +1,106 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.redkale.net.http; + +import java.util.*; +import org.redkale.convert.json.JsonConvert; + +/** + * HttpRequest的缩减版, 只提供部分字段 + * + *

+ * 详情见: https://redkale.org + * + * @author zhangjx + */ +public class HttpSimpleRequest implements java.io.Serializable { + + protected String requestURI; + + protected String sessionid; + + protected String remoteAddr; + + protected Map headers; + + protected Map params; + + protected byte[] body; //对应HttpRequest.array + + public HttpSimpleRequest clearParams() { + this.params = null; + return this; + } + + public HttpSimpleRequest clearHeaders() { + this.headers = null; + return this; + } + + public HttpSimpleRequest clearRemoteAddr() { + this.remoteAddr = null; + return this; + } + + public HttpSimpleRequest clearSessionid() { + this.sessionid = null; + return this; + } + + @Override + public String toString() { + return JsonConvert.root().convertTo(this); + } + + public String getRequestURI() { + return requestURI; + } + + public void setRequestURI(String requestURI) { + this.requestURI = requestURI; + } + + public String getSessionid() { + return sessionid; + } + + public void setSessionid(String sessionid) { + this.sessionid = sessionid; + } + + public String getRemoteAddr() { + return remoteAddr; + } + + public void setRemoteAddr(String remoteAddr) { + this.remoteAddr = remoteAddr; + } + + public Map getHeaders() { + return headers; + } + + public void setHeaders(Map headers) { + this.headers = headers; + } + + public Map getParams() { + return params; + } + + public void setParams(Map params) { + this.params = params; + } + + public byte[] getBody() { + return body; + } + + public void setBody(byte[] body) { + this.body = body; + } + +} diff --git a/src/org/redkale/net/http/MultiContext.java b/src/org/redkale/net/http/MultiContext.java index 85c8cca1b..b92d30b1b 100644 --- a/src/org/redkale/net/http/MultiContext.java +++ b/src/org/redkale/net/http/MultiContext.java @@ -12,7 +12,6 @@ import java.util.*; import java.util.concurrent.atomic.*; import java.util.logging.*; import java.util.regex.*; -import org.redkale.util.AnyValue.DefaultAnyValue; /** * HTTP的文件上传请求的上下文对象 @@ -38,7 +37,7 @@ public final class MultiContext { private final ByteArray buf = new ByteArray(64); - private final DefaultAnyValue parameters; + private final Map parameters; private final Pattern fielnamePattern; @@ -55,7 +54,7 @@ public final class MultiContext { } }; - public MultiContext(final Charset charsetName, final String contentType, final DefaultAnyValue params, final InputStream in, String fielnameRegex) { + public MultiContext(final Charset charsetName, final String contentType, final Map params, final InputStream in, String fielnameRegex) { this.charset = charsetName == null ? StandardCharsets.UTF_8 : charsetName; this.contentType = contentType == null ? "" : contentType.trim(); this.parameters = params; @@ -205,7 +204,7 @@ public final class MultiContext { final byte[] boundarray = ("\n" + boundarystr).getBytes(); final byte[] buffer = new byte[boundarray.length]; final InputStream input = this.in; - final DefaultAnyValue params = this.parameters; + final Map params = this.parameters; final AtomicBoolean finaled = new AtomicBoolean(false); return () -> new Iterator() { @@ -305,7 +304,7 @@ public final class MultiContext { return true; } else { //不是文件 readLine(); //读掉空白 - params.addValue(parseValue(disposition, "name"), readLine()); + params.put(parseValue(disposition, "name"), readLine()); this.boundaryline = null; this.lastentry = null; return this.hasNext(); diff --git a/src/org/redkale/util/AnyValue.java b/src/org/redkale/util/AnyValue.java index 7913e8f56..ae459469c 100644 --- a/src/org/redkale/util/AnyValue.java +++ b/src/org/redkale/util/AnyValue.java @@ -303,6 +303,19 @@ public abstract class AnyValue { return this; } + public DefaultAnyValue put(String name, boolean value) { + return addValue(name, String.valueOf(value)); + } + + public DefaultAnyValue put(String name, Number value) { + return addValue(name, String.valueOf(value)); + } + + public DefaultAnyValue put(String name, String value) { + this.stringEntrys = Utility.append(this.stringEntrys, new Entry(name, value)); + return this; + } + public DefaultAnyValue addValue(String name, boolean value) { return addValue(name, String.valueOf(value)); } @@ -344,6 +357,11 @@ public abstract class AnyValue { return null; } + @Override + public String get(String name) { + return getValue(name); + } + @Override public String getValue(String name) { for (Entry en : this.stringEntrys) { @@ -472,6 +490,8 @@ public abstract class AnyValue { public abstract String getValue(String name); + public abstract String get(String name); + public boolean getBoolValue(String name) { return Boolean.parseBoolean(getValue(name)); } @@ -619,6 +639,11 @@ public abstract class AnyValue { return value == null ? defaultValue : value; } + public String getOrDefault(String name, String defaultValue) { + String value = getValue(name); + return value == null ? defaultValue : value; + } + @Override public boolean equals(Object other) { if (!(other instanceof AnyValue)) return false;