使用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 个选择:

  1. 无论发生什么都消耗所有数据并忽略这些内容,然后发送响应:不方便,你必须等待所有数据进来

  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部分...但这取决于你的实现。