使Netty 4中的HTTP内容压缩工作

Netty确实是一个很棒的框架,提供了构建高性能HTTP服务器所需的所有功能。 令人高兴的是,几乎所有东西都是开箱即用的,只是必须以正确的方式组合在一起。 内容压缩 (gzip或deflate)也不例外。 但是,在压缩静态内容时,我跌跌撞撞了好几次,然后一切才能按预期进行:

基于netty提供的http / file示例,我习惯于采用以下方法来提供静态文件(与netty 3.6.6中使用的相同):

RandomAccessFile raf = new RandomAccessFile(file, "r");
HttpResponse response = new DefaultHttpResponse(HTTP_1_1, OK); 
ctx.write(response);if (useSendFile) {ctx.write(new DefaultFileRegion(raf.getChannel(), 0, fileLength));
} else {ctx.write(new ChunkedFile(raf, 0, fileLength, 8192));
}

但是,一旦我将HttpContentCompressor添加到管道中,Firefox就会失败,并显示诸如“无效的内容编码”之类的消息。

事实证明, HttpContentCompressor希望将HttpContent对象作为输入块进行压缩。 但是, ChunkedWriteHandler直接将ByteBufs发送到下游。 同时发送FileRegion (useSendFile = true)会使内容压缩程序不受影响。

为了克服此问题,我创建了一个名为ChunkedInputAdapter的类,该类采用ChunkedInput <ByteBuf>并表示ChunkedInput <HttpContent> 。 但是,两件事仍然不能令人满意:第一,仍然不能使用FileRegions零复制功能 ,第二,已经压缩的文件(如JPEG)将再次被压缩。 因此,我使用名为SmartContentCompressor的类对HttpContentCompressor进行了子处理。 此类检查是否存在标头“ Content-Encoding:Identity ”或特定的内容类型小于1 kB内容长度 。 在这种情况下,将绕过内容压缩。

使用此组合可以同时使用内容压缩(如果有用)和零复制功能(如果文件已经压缩)。

上面提到的所有资源都是根据MIT许可和S IRIUS框架的一部分开源的 。

参考: Andy的软件工程专栏博客中的JCG合作伙伴 Andreas Haufler从netty 4中实现了HTTP内容压缩 。

翻译自: https://www.javacodegeeks.com/2014/01/making-http-content-compression-work-in-netty-4.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/365498.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sap生产工单报工_【案例】MES系统助力亨通电缆车间生产效率提升25%

一、企业简介江苏亨通电力电缆有限公司是亨通集团旗下的一家重点高新技术企业&#xff0c;于2003年在上交所成功上市&#xff0c;属于上市公司的电力传输板块。公司目前已拥有超高压电力电缆、超高压海缆、中低压电力电缆、电气装备用电缆、特高压导线、电力光缆以及铜铝加工等…

mysql 二叉树表设计_mysql---B+tree索引的设计原理

1.什么是数据库的索引每种查找算法都只能应用于特定的数据结构之上&#xff0c;例如二分查找要求被检索数据有序&#xff0c;而二叉树查找只能应用于二叉查找树上&#xff0c;但是数据本身的组织结构不可能完全满足各种数据结构(例如&#xff0c;理论上不可能同时将两列都按顺序…

JS_单个或多个文件上传_不支持单独修改

A-From表单直接填写提交地址&#xff0c;不过干预&#xff1a; 1. 单文件上传 最简单的文件上传&#xff0c;是单文件上传&#xff0c;form标签中加入enctype"multipart/form-data"&#xff0c;form表单中有一个input[type"file"]项 <form name"…

一些算法学习的推荐博文阅读(数论居多,图论没有)

上面是自己的学习笔记&#xff0c;下面是推荐博文阅读 关于每个知识点的阅读顺序若不加序号一般是并列的&#xff0c;有序号的话一般是推荐看&#xff08;当然一知半解的话可以从头看起也可以从中间开始&#xff09; 另外&#xff0c;有的链接放在推荐的下面了 另另外&#xff…

scipy是python下的什么_SciPy是什么

SciPy是一个开源的Python算法库和数学工具包。 SciPy包含的模块有最优化、线性代数、积分、插值、特殊函数、快速傅里叶变换、信号处理和图像处理、常微分方程求解和其他科学与工程中常用的计算。SciPy 是一个开源的 Python 算法库和数学工具包。 SciPy 包含的模块有最优化、线…

解码Java.Lang.OutOfMemoryError:PermGen空间

Java开发人员最不了解的领域之一是垃圾收集。 Java开发人员认为JVM负责垃圾收集&#xff0c;因此他们不必担心内存分配&#xff0c;释放等问题。但是&#xff0c;随着应用程序变得越来越复杂&#xff0c;垃圾收集也会变得越来越复杂&#xff0c;一旦性能变得复杂&#xff0c;性…

Python_报错:IndexError: list assignment index out of range

今天发现一个报错&#xff0c;卡了好几个点&#xff0c;后来发现原因后&#xff0c;脸上三条黑线&#xff0c;尴尬啊&#xff01;&#xff01;&#xff01; 报错&#xff1a;IndexError: list assignment index out of range 原因&#xff1a;split()写法转成列表就会认作一个整…

mysql跨服务器查询插入_Oracle跨服务器查询插入数据

想实现insert into 当前库表 select 远程库中的表数据这种方式的数据同步&#xff0c;于是配置了一下oracle服务&#xff0c;远程和本地服务都是oracle 一、在当前库中插入数据 1 2 create public database link remotedb connect to username identified by password using db…

angular-JS模仿Form表单提交

直接上示例代码&#xff0c;有不懂的欢迎留言&#xff1a; $http({url: "http://localhost:10086/yuanxin/Conference/ImportExcelDataForBusRoute",method: Post,headers: {Content-Type: multipart/form-data },data: { BusRoute: file, ConferenceID: "1&…

想要更快地使用AtomicLong? 等待它。

我经常听到Java原子类型&#xff08;java.util.concurrent.atomic&#xff09;超级快&#xff0c;可以很好地与高度并发的代码一起使用。 在大多数情况下&#xff0c;原子以健壮和高效的方式发挥作用。 但是&#xff0c;在某些情况下&#xff0c;原子类型上非托管争用的隐藏成本…

994. 腐烂的橘子

994. 腐烂的橘子 在给定的网格中&#xff0c;每个单元格可以有以下三个值之一&#xff1a; 值 0 代表空单元格&#xff1b;值 1 代表新鲜橘子&#xff1b;值 2 代表腐烂的橘子。每分钟&#xff0c;任何与腐烂的橘子&#xff08;在 4 个正方向上&#xff09;相邻的新鲜橘子都会腐…

python爬虫简历范文_爬虫数据解析,简历模板下载!想收我Q,不存在的!

目标网址代码基础代码&#xff1a;第一页模板下载import requestsfrom lxml import etreeif __name__ __main__:headers {User-Agent: Mozilla / 5.0(Windows NT 6.1; Win64; x64) AppleWebKit / 537.36(KHTML, like Gecko) Chrome / 86.0.4240.198 Safari / 537.36}# 免费下…

java获取页面标签_java获取网页源代码后,提取标签内容……

java获取网页源代码后&#xff0c;提取标签内容……关注:245 答案:2 mip版解决时间 2021-02-01 09:11提问者咏b琂败2021-01-31 13:49import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.ne…

C#数字,日期格式化:String.Format

C#:String.Format数字格式化输出 int a 12345678; //格式为sring输出// Label1.Text string.Format("asdfadsf{0}adsfasdf",a);// Label2.Text "asdfadsf"a.ToString()"adsfasdf";// Label1.Text string.Format("asdfadsf{0:C}adsfasdf…

jquery中点击切换的实现

项目中经常会遇到一种情况&#xff0c;就是点击切换&#xff0c;比如点击按钮&#xff0c;div样式为1&#xff0c;再点击一下按钮&#xff0c;div样式为2&#xff0c;再点击一下按钮&#xff0c;div样式为1。需要自定义jQuery方法toggle。 // toggle方法$.fn.toggle function(…

Spring Data MongoDB级联保存在DBRef对象上

默认情况下&#xff0c; Spring Data MongoDB不支持对带有DBRef注释的引用对象的级联操作&#xff0c;如引用所述 &#xff1a; 映射框架不处理级联保存 。 如果更改了Person对象引用的Account对象&#xff0c;则必须单独 保存 Account对象。 在Person对象上调用save 不会自动…

BZOJ4061/Gym100624F CERC2012 Farm and Factory 最短路、切比雪夫距离

传送门——BZOJCH 传送门——Vjudge 设\(f_i\)表示\(i\)到\(1\)号点的最短距离&#xff0c;\(g_i\)表示\(i\)到\(2\)号点的最短距离&#xff0c;\(s_i\)表示\(n1\)号点到\(i\)号点的最短距离&#xff0c;\(As_1,Bs_2\) 根据最短路三角形不等式&#xff0c;\(|f_i - A| \leq s_i…

scrapy安装_爬虫框架Scrapy简介与安装

Scrapy 框架Scrapy是用纯Python实现一个为了爬取网站数据、提取结构性数据而编写的应用框架&#xff0c;用途非常广泛。框架的力量&#xff0c;用户只需要定制开发几个模块就可以轻松的实现一个爬虫&#xff0c;用来抓取网页内容以及各种图片&#xff0c;非常之方便。Scrapy 使…

前端面试题(附上自己的回答)

一些开放性题目 1.自我介绍&#xff1a;除了基本个人信息以外&#xff0c;面试官更想听的是你与众不同的地方和你的优势。 2.项目介绍&#xff1f; 3.如何看待前端开发&#xff1f; 4.平时是如何学习前端开发的&#xff1f; 5.未来三到五年的规划是怎样的&#xff1f; position…

汇编语言的基础知识

汇编语言是在硬件上工作的编程语言&#xff0c;我们需要了解硬件系统的结构&#xff0c;才能有效的用汇编语言对其进行编程。 一&#xff1a;汇编语言的组成 1&#xff09;汇编指令&#xff1a;机器码的助记符&#xff0c;有对应的机器码。 2&#xff09;伪指令&#xff1a;没有…