From c5d0582807a5a4bc015d6418fa633c3115133d1e Mon Sep 17 00:00:00 2001 From: Redkale <22250530@qq.com> Date: Thu, 2 Mar 2017 11:52:22 +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=E5=86=85=E5=AE=B9=E5=A4=9A?= =?UTF-8?q?=E4=BD=99=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 | 22 ++++++---------------- 2 files changed, 12 insertions(+), 20 deletions(-) diff --git a/src/org/redkale/net/http/HttpRequest.java b/src/org/redkale/net/http/HttpRequest.java index 33cc68a35..08bc4da00 100644 --- a/src/org/redkale/net/http/HttpRequest.java +++ b/src/org/redkale/net/http/HttpRequest.java @@ -92,6 +92,7 @@ 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(); @@ -102,10 +103,10 @@ public class HttpRequest extends Request { if (off > 0) offset = off; int qst = array.find(index, offset, (byte) '?'); if (qst > 0) { - this.requestURI = array.toDecodeString(index, qst - index, charset).trim(); + this.requestURI = array.toString(index, qst - index, charset).trim(); addParameter(array, qst + 1, offset - qst - 1); } else { - this.requestURI = array.toDecodeString(index, offset - index, charset).trim(); + this.requestURI = array.toString(index, offset - index, charset).trim(); } if (this.requestURI.contains("../")) return -1; index = ++offset; @@ -174,6 +175,7 @@ public class HttpRequest extends Request { private void parseBody() { if (this.boundary || bodyparsed) return; + array.urlDecode(); addParameter(array, 0, array.size()); bodyparsed = true; } @@ -188,10 +190,10 @@ public class HttpRequest extends Request { if (valpos > 0) addParameter(array, valpos + 1, limit - valpos - 1); return; } - String name = array.toDecodeString(offset, keypos - offset, charset); + String name = array.toString(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 ebf55d9bd..3178d6e2c 100644 --- a/src/org/redkale/util/ByteArray.java +++ b/src/org/redkale/util/ByteArray.java @@ -328,23 +328,19 @@ public final class ByteArray { } /** - * 将指定的起始位置和长度按指定字符集并转义后转成字符串 - * - * @param offset 起始位置 - * @param len 长度 - * @param charset 字符集 - * - * @return 字符串 + * 转义字符串 */ - public String toDecodeString(final int offset, int len, final Charset charset) { - int index = offset; - for (int i = offset; i < (offset + len); i++) { + 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]; @@ -352,12 +348,6 @@ public final class ByteArray { } index++; } - for (int i = index + 1; i < (offset + len); i++) { - content[i] = ' '; - } - len = index - offset; - if (charset == null) return new String(Utility.decodeUTF8(content, offset, len)); - return new String(content, offset, len, charset); } private static int hexBit(byte b) {