From a4b277e875fdb8c7c31cbf15dbbfffce85a7509d Mon Sep 17 00:00:00 2001 From: redkale Date: Wed, 29 Nov 2023 22:59:13 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96ProtocolCodec=E7=9A=84?= =?UTF-8?q?=E7=BB=AD=E8=AF=BB=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/org/redkale/net/ProtocolCodec.java | 8 ++++++++ src/main/java/org/redkale/net/Request.java | 5 +++++ src/main/java/org/redkale/net/Response.java | 5 ++++- src/main/java/org/redkale/net/http/HttpRequest.java | 2 ++ src/main/java/org/redkale/net/sncp/SncpRequest.java | 1 + src/test/java/org/redkale/test/sncp/SncpSleepTest.java | 2 +- 6 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/redkale/net/ProtocolCodec.java b/src/main/java/org/redkale/net/ProtocolCodec.java index 57e8c561e..77566ad4d 100644 --- a/src/main/java/org/redkale/net/ProtocolCodec.java +++ b/src/main/java/org/redkale/net/ProtocolCodec.java @@ -159,6 +159,8 @@ class ProtocolCodec implements CompletionHandler { context.dispatcher.incrExecuteCounter(); int pindex = pipelineIndex; boolean pipeline = false; + boolean seted = false; + boolean completed = request.completed; Request hreq = lastReq; if (buffer.hasRemaining()) { pipeline = true; @@ -176,6 +178,7 @@ class ProtocolCodec implements CompletionHandler { request.pipeline(pindex, pindex); } channel.setReadBuffer(buffer.clear()); + seted = true; } context.executeDispatch(request, response); if (pipeline) { @@ -186,6 +189,11 @@ class ProtocolCodec implements CompletionHandler { context.logger.log(Level.WARNING, "dispatch pipeline servlet abort, force to close channel ", t); pipelineResponse.codecError(t); } + } else if (completed) { + if (!seted) { + channel.setReadBuffer(buffer.clear()); + } + channel.readRegister(this); } } else { channel.setReadBuffer(buffer); diff --git a/src/main/java/org/redkale/net/Request.java b/src/main/java/org/redkale/net/Request.java index bbe5c698e..ec6a46836 100644 --- a/src/main/java/org/redkale/net/Request.java +++ b/src/main/java/org/redkale/net/Request.java @@ -33,6 +33,10 @@ public abstract class Request { protected boolean keepAlive; + //请求包是否完成读取完毕,用于ProtocolCodec继续读的判断条件 + //需要在readHeader方法中设置 + protected boolean completed; + protected int pipelineIndex; protected int pipelineCount; @@ -103,6 +107,7 @@ public abstract class Request { pipelineIndex = 0; pipelineCount = 0; pipelineCompleted = false; + completed = false; keepAlive = false; attributes.clear(); channel = null; // close it by response diff --git a/src/main/java/org/redkale/net/Response.java b/src/main/java/org/redkale/net/Response.java index 15b51e2c2..107549c2f 100644 --- a/src/main/java/org/redkale/net/Response.java +++ b/src/main/java/org/redkale/net/Response.java @@ -329,11 +329,14 @@ public abstract class Response> { } this.recycleListener = null; } + boolean completed = request.completed; if (request.keepAlive && (request.pipelineIndex == 0 || request.pipelineCompleted)) { AsyncConnection conn = removeChannel(); if (conn != null && conn.protocolCodec != null) { this.responseConsumer.accept(this); - conn.readRegister(conn.protocolCodec); + if (!completed) { + conn.readRegister(conn.protocolCodec); + } } else { Supplier poolSupplier = this.responseSupplier; Consumer poolConsumer = this.responseConsumer; diff --git a/src/main/java/org/redkale/net/http/HttpRequest.java b/src/main/java/org/redkale/net/http/HttpRequest.java index 303d0cc4c..c9be7ebc5 100644 --- a/src/main/java/org/redkale/net/http/HttpRequest.java +++ b/src/main/java/org/redkale/net/http/HttpRequest.java @@ -295,6 +295,7 @@ public class HttpRequest extends Request { this.readState = READ_STATE_HEADER; } if (this.readState == READ_STATE_HEADER) { + this.completed = true; if (last != null && ((HttpRequest) last).headerLength > 0) { final HttpRequest httplast = (HttpRequest) last; int bufremain = buffer.remaining(); @@ -350,6 +351,7 @@ public class HttpRequest extends Request { this.boundary = true; } if (this.boundary) { + this.completed = false; //completed=true时ProtocolCodec会继续读下一个request this.keepAlive = false; //文件上传必须设置keepAlive为false,因为文件过大时用户不一定会skip掉多余的数据 } this.readState = READ_STATE_BODY; diff --git a/src/main/java/org/redkale/net/sncp/SncpRequest.java b/src/main/java/org/redkale/net/sncp/SncpRequest.java index 3fb743b75..061627967 100644 --- a/src/main/java/org/redkale/net/sncp/SncpRequest.java +++ b/src/main/java/org/redkale/net/sncp/SncpRequest.java @@ -83,6 +83,7 @@ public class SncpRequest extends Request { } //---------------------head---------------------------------- if (this.readState == READ_STATE_HEADER) { + this.completed = true; int remain = buffer.remaining(); int expect = halfArray == null ? this.headerSize - 2 : this.headerSize - 2 - halfArray.length(); if (remain < expect) { diff --git a/src/test/java/org/redkale/test/sncp/SncpSleepTest.java b/src/test/java/org/redkale/test/sncp/SncpSleepTest.java index d2155f39d..e730c6c81 100644 --- a/src/test/java/org/redkale/test/sncp/SncpSleepTest.java +++ b/src/test/java/org/redkale/test/sncp/SncpSleepTest.java @@ -66,6 +66,6 @@ public class SncpSleepTest { System.out.println("耗时: " + e + " ms"); server.shutdown(); workExecutor.shutdown(); - Assertions.assertTrue(e < 900); + Assertions.assertTrue(e < 600); } }