使用auth上传netty文件,如果auth失败,我该如何丢弃左边的httpConent?
netty file upload with auth ,if the auth failed ,how can i discard the left httpConent?
我正在使用 netty 开发文件上传服务器,当客户端上传文件时,它需要包含授权信息,如令牌,放在任何文件之前的表单主体中。如果令牌不匹配,服务器 return 错误代码并关闭通道,我的问题是如何丢弃剩余的 HttpConent 数据?我看过 netty 文件上传演示,但我无法获取回答。
你可以想到 2 个选择:
无论发生什么都消耗所有数据并忽略这些内容,然后发送响应:不方便,你必须等待所有数据进来
当您知道它结束(身份验证失败)时立即发送响应,例如:
final ChannelFuture f = ctx.writeAndFlush(response); // (1)
f.addListener(ChannelFutureListener.CLOSE); // (2)
(1) 刷新您的回答(错误)
(2) answear发送后,关闭context,关闭channel,关闭connexion。
优点:这会立即停止接收操作
缺点:但是你可能必须在这个连接的会话中存储这个连接是错误的,因为更多的缓冲区可能已经到达或正在等待,并且channelRead
即使在 (2) 之前的 (1) 之后也可以调用。因此,在这种情况下,您将不得不默默地忽略那些新缓冲区。
类似于:
private boolean inError = false;
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
ByteBuf m = (ByteBuf) msg;
if (inError) {
msg.release();
return;
}
...
if (!isTokenOk(token)) {
inError = true;
... build your response in error
final ChannelFuture f = ctx.writeAndFlush(response);
f.addListener(ChannelFutureListener.CLOSE);
return;
}
... continue with other part of buffers
}
请注意,从客户端的角度来看,如果它没有发送所有数据,如果它在结束发送自己的正文之前没有处理接收应答,它可能会以“太早关闭连接”结束。
另请注意,Token一般在Header部分,而不是body部分...但这取决于你的实现。
我正在使用 netty 开发文件上传服务器,当客户端上传文件时,它需要包含授权信息,如令牌,放在任何文件之前的表单主体中。如果令牌不匹配,服务器 return 错误代码并关闭通道,我的问题是如何丢弃剩余的 HttpConent 数据?我看过 netty 文件上传演示,但我无法获取回答。
你可以想到 2 个选择:
无论发生什么都消耗所有数据并忽略这些内容,然后发送响应:不方便,你必须等待所有数据进来
当您知道它结束(身份验证失败)时立即发送响应,例如:
final ChannelFuture f = ctx.writeAndFlush(response); // (1) f.addListener(ChannelFutureListener.CLOSE); // (2)
(1) 刷新您的回答(错误)
(2) answear发送后,关闭context,关闭channel,关闭connexion。
优点:这会立即停止接收操作
缺点:但是你可能必须在这个连接的会话中存储这个连接是错误的,因为更多的缓冲区可能已经到达或正在等待,并且
channelRead
即使在 (2) 之前的 (1) 之后也可以调用。因此,在这种情况下,您将不得不默默地忽略那些新缓冲区。
类似于:
private boolean inError = false;
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
ByteBuf m = (ByteBuf) msg;
if (inError) {
msg.release();
return;
}
...
if (!isTokenOk(token)) {
inError = true;
... build your response in error
final ChannelFuture f = ctx.writeAndFlush(response);
f.addListener(ChannelFutureListener.CLOSE);
return;
}
... continue with other part of buffers
}
请注意,从客户端的角度来看,如果它没有发送所有数据,如果它在结束发送自己的正文之前没有处理接收应答,它可能会以“太早关闭连接”结束。
另请注意,Token一般在Header部分,而不是body部分...但这取决于你的实现。