From 5bc9f77b7b136268678886228d0c5a64f7b2d5f6 Mon Sep 17 00:00:00 2001 From: Redkale <22250530@qq.com> Date: Thu, 2 Mar 2017 12:35:14 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8DHttpRequest.getBody=E7=94=B1?= =?UTF-8?q?=E4=BA=8EURLDecode=E5=AF=BC=E8=87=B4=E7=9A=84BUG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/org/redkale/net/http/HttpRequest.java | 10 ++--- src/org/redkale/util/ByteArray.java | 55 ++++++++++++++++------- 2 files changed, 42 insertions(+), 23 deletions(-) diff --git a/src/org/redkale/net/http/HttpRequest.java b/src/org/redkale/net/http/HttpRequest.java index 08bc4da00..33cc68a35 100644 --- a/src/org/redkale/net/http/HttpRequest.java +++ b/src/org/redkale/net/http/HttpRequest.java @@ -92,7 +92,6 @@ public class HttpRequest extends Request { if (!readLine(buffer, array)) return -1; Charset charset = this.context.getCharset(); int index = 0; - array.urlDecode(); int offset = array.find(index, ' '); if (offset <= 0) return -1; this.method = array.toString(index, offset, charset).trim(); @@ -103,10 +102,10 @@ public class HttpRequest extends Request { if (off > 0) offset = off; int qst = array.find(index, offset, (byte) '?'); if (qst > 0) { - this.requestURI = array.toString(index, qst - index, charset).trim(); + this.requestURI = array.toDecodeString(index, qst - index, charset).trim(); addParameter(array, qst + 1, offset - qst - 1); } else { - this.requestURI = array.toString(index, offset - index, charset).trim(); + this.requestURI = array.toDecodeString(index, offset - index, charset).trim(); } if (this.requestURI.contains("../")) return -1; index = ++offset; @@ -175,7 +174,6 @@ public class HttpRequest extends Request { private void parseBody() { if (this.boundary || bodyparsed) return; - array.urlDecode(); addParameter(array, 0, array.size()); bodyparsed = true; } @@ -190,10 +188,10 @@ public class HttpRequest extends Request { if (valpos > 0) addParameter(array, valpos + 1, limit - valpos - 1); return; } - String name = array.toString(offset, keypos - offset, charset); + String name = array.toDecodeString(offset, keypos - offset, charset); if (name.charAt(0) == '<') return; //内容可能是xml格式; 如: = 0) { addParameter(array, valpos + 1, limit - valpos - 1); diff --git a/src/org/redkale/util/ByteArray.java b/src/org/redkale/util/ByteArray.java index 3178d6e2c..d0684245e 100644 --- a/src/org/redkale/util/ByteArray.java +++ b/src/org/redkale/util/ByteArray.java @@ -328,26 +328,47 @@ public final class ByteArray { } /** - * 转义字符串 + * 将指定的起始位置和长度按指定字符集并转义后转成字符串 + * + * @param offset 起始位置 + * @param len 长度 + * @param charset 字符集 + * + * @return 字符串 */ - public void urlDecode() { - int len = this.count; - int index = 0; - for (int i = 0; i < len; i++) { - switch (content[i]) { - case '+': - content[index] = ' '; - break; - case '%': - content[index] = (byte) ((hexBit(content[++i]) * 16 + hexBit(content[++i]))); - this.count -= 2; - break; - default: - content[index] = content[i]; - break; + public String toDecodeString(final int offset, int len, final Charset charset) { + int start = offset; + final int end = offset + len; + boolean flag = false; //是否需要转义 + byte[] bs = content; + for (int i = offset; i < end; i++) { + if (content[i] == '+' || content[i] == '%') { + flag = true; + break; } - index++; } + if (flag) { + int index = 0; + bs = new byte[len]; + for (int i = offset; i < end; i++) { + switch (content[i]) { + case '+': + bs[index] = ' '; + break; + case '%': + bs[index] = (byte) ((hexBit(content[++i]) * 16 + hexBit(content[++i]))); + break; + default: + bs[index] = content[i]; + break; + } + index++; + } + start = 0; + len = index; + } + if (charset == null) return new String(Utility.decodeUTF8(bs, start, len)); + return new String(bs, start, len, charset); } private static int hexBit(byte b) {