【发布时间】: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 对象?反过来,也不会将其传递给默认处理程序。
- 我的方法有问题吗?在我的上传处理程序之外,是否有其他方法可以处理此条件路由?
- 我可以在 HttpObjectAggregator 之前有任何处理程序,还是应该所有自定义/用户处理程序都在 HttpObjectAggregator 之后?
【问题讨论】:
标签: file-upload netty