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); } }