From 159c7f9e1b5957e7d0342490c1009031617ccc6b Mon Sep 17 00:00:00 2001 From: Redkale Date: Fri, 6 Jan 2023 16:05:48 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96HttpRequest?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/redkale/net/AsyncNioConnection.java | 4 +-- .../org/redkale/net/client/ClientAddress.java | 7 ++-- .../org/redkale/net/http/HttpRequest.java | 35 +++++++++++++------ 3 files changed, 29 insertions(+), 17 deletions(-) diff --git a/src/main/java/org/redkale/net/AsyncNioConnection.java b/src/main/java/org/redkale/net/AsyncNioConnection.java index 6d4c4479c..a30c299c0 100644 --- a/src/main/java/org/redkale/net/AsyncNioConnection.java +++ b/src/main/java/org/redkale/net/AsyncNioConnection.java @@ -14,7 +14,7 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.LongAdder; import java.util.function.Consumer; import javax.net.ssl.SSLContext; -import org.redkale.util.ByteBufferWriter; +import org.redkale.util.*; /** * @@ -27,7 +27,7 @@ import org.redkale.util.ByteBufferWriter; */ abstract class AsyncNioConnection extends AsyncConnection { - protected static final int MAX_INVOKER_ONSTACK = Integer.getInteger("redkale.net.invoker.max.onstack", 8); + protected static final int MAX_INVOKER_ONSTACK = Integer.getInteger("redkale.net.invoker.max.onstack", Utility.cpus()); final AsyncIOThread connectThread; diff --git a/src/main/java/org/redkale/net/client/ClientAddress.java b/src/main/java/org/redkale/net/client/ClientAddress.java index d719730b4..a75713603 100644 --- a/src/main/java/org/redkale/net/client/ClientAddress.java +++ b/src/main/java/org/redkale/net/client/ClientAddress.java @@ -79,7 +79,9 @@ public class ClientAddress implements java.io.Serializable { private static SocketAddress[] createAddressArray(List ws) { int min = 0; + int size = 0; //20,35,45去掉最大公约数,数组长度为:4+7+9=20 for (WeightAddress w : ws) { + size += w.getWeight(); if (min == 0 || w.getWeight() < min) { min = w.getWeight(); } @@ -97,10 +99,7 @@ public class ClientAddress implements java.io.Serializable { divisor = i; } } - int size = 0; //20,35,45去掉最大公约数,数组长度为:4+7+9=20 - for (WeightAddress w : ws) { - size += w.getWeight() / divisor; - } + size /= divisor; SocketAddress[] newAddrs = new SocketAddress[size]; int index = -1; for (int i = 0; i < ws.size(); i++) { diff --git a/src/main/java/org/redkale/net/http/HttpRequest.java b/src/main/java/org/redkale/net/http/HttpRequest.java index 47d84e5de..83db96a34 100644 --- a/src/main/java/org/redkale/net/http/HttpRequest.java +++ b/src/main/java/org/redkale/net/http/HttpRequest.java @@ -484,14 +484,26 @@ public class HttpRequest extends Request { } size = bytes.length(); byte[] content = bytes.content(); - if (size == 3 && content[0] == 'G' && content[1] == 'E' && content[2] == 'T') { - this.method = KEY_GET; - this.getmethod = true; - } else if (size == 4 && content[0] == 'P' && content[1] == 'O' && content[2] == 'S' && content[3] == 'T') { - this.method = KEY_POST; + if (size == 3) { + if (content[0] == 'G' && content[1] == 'E' && content[2] == 'T') { + this.method = KEY_GET; + this.getmethod = true; + } else if (content[0] == 'P' && content[1] == 'U' && content[2] == 'T') { + this.method = "PUT"; + this.getmethod = false; + } else { + this.method = bytes.toString(true, charset); + this.getmethod = false; + } + } else if (size == 4) { this.getmethod = false; + if (content[0] == 'P' && content[1] == 'O' && content[2] == 'S' && content[3] == 'T') { + this.method = KEY_POST; + } else { + this.method = bytes.toString(true, charset); + } } else { - this.method = bytes.toString(charset); + this.method = bytes.toString(true, charset); this.getmethod = false; } bytes.clear(); @@ -522,11 +534,12 @@ public class HttpRequest extends Request { size = bytes.length(); if (qst > 0) { this.requestURI = decodeable ? toDecodeString(bytes, 0, qst, charset) : bytes.toString(latin1, 0, qst, charset); - this.queryBytes = bytes.getBytes(qst + 1, size - qst - 1); + int qlen = size - qst - 1; + this.queryBytes = bytes.getBytes(qst + 1, qlen); this.lastRequestURIString = null; this.lastRequestURIBytes = null; try { - addParameter(bytes, qst + 1, size - qst - 1); + addParameter(bytes, qst + 1, qlen); } catch (Exception e) { this.context.getLogger().log(Level.WARNING, "HttpRequest.addParameter error: " + bytes.toString(), e); } @@ -582,7 +595,7 @@ public class HttpRequest extends Request { } else if (size == 8 && content[0] == 'H' && content[5] == '2' && content[7] == '0') { this.protocol = KEY_HTTP_2_0; } else { - this.protocol = bytes.toString(charset); + this.protocol = bytes.toString(true, charset); } bytes.clear(); return 0; @@ -985,9 +998,9 @@ public class HttpRequest extends Request { byte[] content = array.content(); if (len == 1) { return Character.toString(content[offset]); - } else if (len == 2 && content[offset] >= '0' && content[offset] <= '9') { + } else if (len == 2 && content[offset] >= 0x20 && content[offset] < 0x80) { return new String(content, 0, offset, len); - } else if (len == 3 && content[offset + 1] >= '0' && content[offset + 1] <= '9') { + } else if (len == 3 && content[offset + 1] >= 0x20 && content[offset + 1] < 0x80) { return new String(content, 0, offset, len); } int start = offset;