修复WebSocket.readPending问题

This commit is contained in:
redkale
2024-10-09 18:07:55 +08:00
parent 76623e9c6b
commit 71cec55f1c
5 changed files with 41 additions and 29 deletions

View File

@@ -162,6 +162,8 @@ public abstract class Response<C extends Context, R extends Request<C>> {
}
this.responseSupplier = null;
this.responseConsumer = null;
this.recycleListener = null;
this.afterFinishListeners = null;
this.inited = false;
return true;
}
@@ -180,6 +182,7 @@ public abstract class Response<C extends Context, R extends Request<C>> {
protected void refuseAlive() {
this.request.keepAlive = false;
this.readRegistered = true;
}
protected void init(AsyncConnection channel) {

View File

@@ -401,7 +401,7 @@ public class HttpRequest extends Request<HttpContext> {
this.keepAlive = false;
}
// readCompleted=true时ProtocolCodec会继续读下一个request
this.readCompleted = !this.boundary && !maybews;
this.readCompleted = !this.boundary;
this.bodyBytes.clear();
this.readState = READ_STATE_BODY;
}

View File

@@ -1032,6 +1032,15 @@ public class HttpResponse extends Response<HttpContext, HttpRequest> {
super.finish(false, data.content(), 0, data.length());
}
void kill() {
refuseAlive();
this.responseConsumer.accept(this);
}
void skipReadRegistered() {
this.readRegistered = true;
}
/** 以304状态码输出 */
public void finish304() {
skipHeader();

View File

@@ -5,8 +5,6 @@
*/
package org.redkale.net.http;
import static org.redkale.net.http.WebSocket.*;
import java.nio.ByteBuffer;
import java.nio.channels.CompletionHandler;
import java.nio.charset.StandardCharsets;
@@ -16,6 +14,7 @@ import java.util.function.BiConsumer;
import java.util.logging.*;
import org.redkale.convert.Convert;
import org.redkale.net.AsyncIOThread;
import static org.redkale.net.http.WebSocket.*;
import org.redkale.net.http.WebSocketPacket.FrameType;
import org.redkale.util.*;
@@ -131,7 +130,7 @@ public class WebSocketReadHandler implements CompletionHandler<Integer, ByteBuff
if (lengthCode <= 0x7D) { // 125 长度<=125
length = lengthCode;
} else if (lengthCode == 0x7E) { // 0x7E=126 长度:126~65535
length = (int) realbuf.getChar();
length = realbuf.getChar();
} else if (lengthCode == 0x7F) { // 0x7E=127 长度>65535
length = (int) realbuf.getLong();
} else {
@@ -188,7 +187,7 @@ public class WebSocketReadHandler implements CompletionHandler<Integer, ByteBuff
if (lengthCode <= 0x7D) { // 125 长度<=125
length = lengthCode;
} else if (lengthCode == 0x7E) { // 0x7E=126 长度:126~65535
length = (int) realbuf.getChar();
length = realbuf.getChar();
} else if (lengthCode == 0x7F) { // 0x7E=127 长度>65535
length = (int) realbuf.getLong();
} else {

View File

@@ -244,32 +244,32 @@ public abstract class WebSocketServlet extends HttpServlet implements Resourcabl
@Override // 在IOThread中执行
@NonBlocking
public final void execute(final HttpRequest request, final HttpResponse response) throws IOException {
final boolean debug = logger.isLoggable(Level.FINEST);
final boolean debug = logger.isLoggable(Level.FINER);
final boolean fine = logger.isLoggable(Level.FINE);
if (!request.isWebSocket()) {
if (debug) {
if (fine) {
logger.log(
Level.FINEST,
Level.FINE,
"WebSocket connect abort, (Not GET Method)/(Connection!=Upgrade)/(Upgrade!=websocket). request="
+ request);
}
response.finish(true);
response.kill();
return;
}
final String key = request.getHeader("Sec-WebSocket-Key");
if (key == null) {
if (debug) {
if (fine) {
logger.log(
Level.FINEST,
"WebSocket connect abort, Not found Sec-WebSocket-Key header. request=" + request);
Level.FINE, "WebSocket connect abort, Not found Sec-WebSocket-Key header. request=" + request);
}
response.finish(true);
response.kill();
return;
}
if (this.webSocketNode.localEngine.isLocalConnLimited()) {
logger.log(
Level.WARNING,
"WebSocket connections limit, wsmaxconns=" + this.webSocketNode.localEngine.getLocalWsMaxConns());
response.finish(true);
response.kill();
return;
}
final WebSocket webSocket = this.createWebSocket();
@@ -287,24 +287,25 @@ public abstract class WebSocketServlet extends HttpServlet implements Resourcabl
webSocket.deflater = new Deflater(Deflater.DEFAULT_COMPRESSION, true);
webSocket.inflater = new Inflater(true);
}
response.skipReadRegistered();
initRestWebSocket(webSocket);
CompletableFuture<String> sessionFuture = webSocket.onOpen(request);
if (sessionFuture == null) {
if (debug) {
logger.log(Level.FINEST, "WebSocket connect abort, Not found sessionid. request=" + request);
logger.log(Level.FINER, "WebSocket connect abort, Not found sessionid. request=" + request);
}
response.finish(true);
response.kill();
return;
}
BiConsumer<String, Throwable> sessionConsumer = (sessionid, ex) -> {
if ((sessionid == null && webSocket.delayPackets == null) || ex != null) {
if (debug || ex != null) {
logger.log(
ex == null ? Level.FINEST : Level.FINE,
ex == null ? Level.FINER : Level.FINE,
"WebSocket connect abort, Not found sessionid or occur error. request=" + request,
ex);
}
response.finish(true);
response.kill();
return;
}
// onOpen成功或者存在delayPackets
@@ -338,7 +339,7 @@ public abstract class WebSocketServlet extends HttpServlet implements Resourcabl
Level.FINEST,
"WebSocket connect abort, Create userid abort. request = " + request);
}
response.finish(true);
response.kill();
return;
}
userFuture.whenComplete((userid, ex2) -> {
@@ -350,7 +351,7 @@ public abstract class WebSocketServlet extends HttpServlet implements Resourcabl
"WebSocket connect abort, Create userid abort. request = " + request,
ex2);
}
response.finish(true);
response.kill();
return;
}
Runnable runHandler = () -> {
@@ -360,14 +361,14 @@ public abstract class WebSocketServlet extends HttpServlet implements Resourcabl
Traces.currentTraceid(request.getTraceid());
if (rs) {
CompletableFuture<Boolean> rcFuture = webSocket.onSingleRepeatConnect();
Consumer<Boolean> task = (oldkilled) -> {
Consumer<Boolean> task = oldkilled -> {
if (oldkilled) {
webSocketNode.localEngine.addLocal(webSocket);
response.removeChannel();
webSocket._readHandler.startRead();
response.finish(true);
response.kill();
} else { // 关闭新连接
response.finish(true);
response.kill();
}
};
if (rcFuture == null) {
@@ -375,7 +376,7 @@ public abstract class WebSocketServlet extends HttpServlet implements Resourcabl
} else {
rcFuture.whenComplete((r, e) -> {
if (e != null) {
response.finish(true);
response.kill();
} else {
task.accept(r);
}
@@ -385,14 +386,14 @@ public abstract class WebSocketServlet extends HttpServlet implements Resourcabl
webSocketNode.localEngine.addLocal(webSocket);
response.removeChannel();
webSocket._readHandler.startRead();
response.finish(true);
response.kill();
}
});
} else {
webSocketNode.localEngine.addLocal(webSocket);
response.removeChannel();
webSocket._readHandler.startRead();
response.finish(true);
response.kill();
}
};
if (webSocket.delayPackets != null) { // 存在待发送的消息
@@ -412,7 +413,7 @@ public abstract class WebSocketServlet extends HttpServlet implements Resourcabl
+ request,
t);
}
response.finish(true);
response.kill();
} else {
runHandler.run();
}
@@ -439,7 +440,7 @@ public abstract class WebSocketServlet extends HttpServlet implements Resourcabl
+ request,
t);
}
response.finish(true);
response.kill();
} else {
createUseridHandler.run();
}
@@ -452,7 +453,7 @@ public abstract class WebSocketServlet extends HttpServlet implements Resourcabl
@Override
public void failed(Throwable exc, Void attachment) {
logger.log(Level.FINEST, "WebSocket connect abort, Response send abort. request = " + request, exc);
response.finish(true);
response.kill();
}
});
};