【问题标题】:use HttpObjectAggregator conditionally有条件地使用 HttpObjectAggregator
【发布时间】:2021-01-22 09:23:45
【问题描述】:

Netty 版本:4.0.37

我需要一个 netty 服务器来处理简单的 JSON 请求和大文件上传。 HttpObjectAggregator 的请求大小限制为 2 GB,因此我更愿意使用可用的 HttpUploadServer 示例here

因此,我希望管道根据传入的请求类型有条件地更改。如果是 POST 请求,并且是 Multipart 类型的请求,我希望该请求由 Upload 处理程序和 处理我想跳过所有其余的处理程序。如果没有,我希望它通过 HttpObjectAggregator,然后由 Default 处理程序处理。

我想创建一个如下所示的单个管道:

HttpRequestDecoder
HttpContentDecompressor
FileUploadHandler <--- My handler to handle file uploads
HttpObjectAggregator 
DefaultHandler <---- My handler to handle normal requests, without file body

在“FileUploadHandler”中,我添加了这样的 if else 逻辑:

private boolean uploadURL(HttpObject object) {
    HttpRequest request = (HttpRequest) object;
    boolean isMultipart = HttpPostRequestDecoder.isMultipart(request);
    if (request.getMethod().equals(HttpMethod.POST) && isMultipart) {
      // To be handled by file upload handler
      return true;
    }
    return false;
  }

public void channelRead0(ChannelHandlerContext channelHandlerContext,
    HttpObject object) throws Exception {

if (!uploadURL(object)) {
    ReferenceCountUtil.retain(object);
    channelHandlerContext.fireChannelRead(object);
} else {
// Handle the File Upload
....

我的目标是让 UploadHandler 将消息“传递”给 HttpObjectAggregator,如果它不是带有文件正文的 POST Multipart 请求。但是,这不适用于 GET 请求,因为请求在一段时间后由于缺少响应而超时。 我不完全明白为什么会这样,但我的猜测是 HttpObjectAggregator 根本没有从我的 UploadHandler 接收初始 HttpRequest 对象?反过来,也不会将其传递给默认处理程序。

  1. 我的方法有问题吗?在我的上传处理程序之外,是否有其他方法可以处理此条件路由?
  2. 我可以在 HttpObjectAggregator 之前有任何处理程序,还是应该所有自定义/用户处理程序都在 HttpObjectAggregator 之后?

【问题讨论】:

    标签: file-upload netty


    【解决方案1】:

    我通过在 HttpObjectAggregator 之前使用解码器来做到这一点。管道如下所示:

    HttpRequestDecoder
    HttpContentDecompressor
    RequestURLDecoder <--- New decoder to route requests.
    FileUploadHandler <--- My handler to handle file uploads
    HttpObjectAggregator 
    DefaultHandler <---- My handler to handle normal requests, without file body
    

    新的解码器查看请求,如果它是一个 POST 多部分,动态修改管道以删除对象聚合器和默认处理程序。如果不是,则删除文件上传处理程序。

    (list.add(ReferenceCountUtil.retain(object)) 很重要!)

    【讨论】:

    • 可以为这个解决方案添加一些细节吗?我正在尝试做类似的事情
    猜你喜欢
    • 2021-06-05
    • 2017-11-26
    • 2016-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-20
    相关资源
    最近更新 更多