当前位置: 首页 > news >正文

高密住房和城乡建设厅网站网站seo查询站长之家

高密住房和城乡建设厅网站,网站seo查询站长之家,不良人网页设计怎么做,wordpress改字体颜色前言 HTTP2终于支持对头部进行压缩传输了#xff0c;Netty很早就支持HTTP2了#xff0c;看下Netty对HPACK的实现源码#xff0c;可以对HPACK理解的更深一下。 HpackDecoder Netty内置的编解码器Http2FrameCodec专门用来对HTTP2的各种Frame进行编解码#xff0c;其中就包…前言 HTTP2终于支持对头部进行压缩传输了Netty很早就支持HTTP2了看下Netty对HPACK的实现源码可以对HPACK理解的更深一下。 HpackDecoder Netty内置的编解码器Http2FrameCodec专门用来对HTTP2的各种Frame进行编解码其中就包含将ByteBuf解码为HeadersFrame解码的工作最终交给了io.netty.handler.codec.http2.HpackDecoder。 状态 HpackDecoder维护了一组状态常量代表的是当前对Header的读取状态不同的状态做的事情是不一样的HpackDecoder通过一个While循环来读取Header因为一个Frame里面包含若干个Header根据读取到的数据判断State会不断变化流转理解了这些State再看代码就简单的多了。 State说明READ_HEADER_REPRESENTATION读取header的初试状态READ_INDEXED_HEADER读取被索引的完整header即name和value均被索引READ_INDEXED_HEADER_NAME读取被索引的header nameREAD_LITERAL_HEADER_NAME_LENGTH_PREFIXname未被索引读取name长度前缀判断是否使用哈夫曼编码READ_LITERAL_HEADER_NAME_LENGTHname未被索引读取name长度READ_LITERAL_HEADER_NAMEname未被索引读取header nameREAD_LITERAL_HEADER_VALUE_LENGTH_PREFIX读取value长度前缀判断是否使用哈夫曼编码READ_LITERAL_HEADER_VALUE_LENGTH读取value长度READ_LITERAL_HEADER_VALUEvalue未被索引读取value decode() 解码的方法是io.netty.handler.codec.http2.HpackDecoder#decode()这里直接贴出源码核心代码已写注释 private void decode(ByteBuf in, Http2HeadersSink sink) throws Http2Exception {int index 0;int nameLength 0;int valueLength 0;byte state READ_HEADER_REPRESENTATION;// 初始状态 准备读取Headerboolean huffmanEncoded false;// 是否使用哈夫曼编码 长度的第1个Bit来标记AsciiString name null;IndexType indexType IndexType.NONE;// 索引类型while (in.isReadable()) {// 只要有数据就循环读switch (state) {case READ_HEADER_REPRESENTATION:byte b in.readByte();// 读取首字节if (maxDynamicTableSizeChangeRequired (b 0xE0) ! 0x20) {// HpackEncoder MUST signal maximum dynamic table size changethrow MAX_DYNAMIC_TABLE_SIZE_CHANGE_REQUIRED;}if (b 0) {// 小于0 即最高位是1代表name和value均被索引// Indexed Header Fieldindex b 0x7F;switch (index) {case 0:throw DECODE_ILLEGAL_INDEX_VALUE;case 0x7F: // 索引号超过了1字节需要继续读取 才能获取最终索引号state READ_INDEXED_HEADER;break;default:// 索引号没超 直接从静态/动态表读取即可HpackHeaderField indexedHeader getIndexedHeader(index);sink.appendToHeaderList((AsciiString) indexedHeader.name,(AsciiString) indexedHeader.value);}} else if ((b 0x40) 0x40) {// 01开头 header需要加入到动态表// Literal Header Field with Incremental IndexingindexType IndexType.INCREMENTAL;index b 0x3F;switch (index) {case 0:// name未被索引读取name长度 再读namestate READ_LITERAL_HEADER_NAME_LENGTH_PREFIX;break;case 0x3F:// name 索引号超了1字节 需要继续读state READ_INDEXED_HEADER_NAME;break;default:// name被索引继续读valuename readName(index);nameLength name.length();state READ_LITERAL_HEADER_VALUE_LENGTH_PREFIX;}} else if ((b 0x20) 0x20) {// Dynamic Table Size Update// See https://www.rfc-editor.org/rfc/rfc7541.html#section-4.2throw connectionError(COMPRESSION_ERROR, Dynamic table size update must happen at the beginning of the header block);} else {// Literal Header Field without Indexing / never IndexedindexType (b 0x10) 0x10 ? IndexType.NEVER : IndexType.NONE;index b 0x0F;switch (index) {case 0:state READ_LITERAL_HEADER_NAME_LENGTH_PREFIX;break;case 0x0F:state READ_INDEXED_HEADER_NAME;break;default:// Index was stored as the prefixname readName(index);nameLength name.length();state READ_LITERAL_HEADER_VALUE_LENGTH_PREFIX;}}break;case READ_INDEXED_HEADER:// 被索引的header读取可变长度的索引号从表中获取headerHpackHeaderField indexedHeader getIndexedHeader(decodeULE128(in, index));sink.appendToHeaderList((AsciiString) indexedHeader.name,(AsciiString) indexedHeader.value);state READ_HEADER_REPRESENTATION;break;case READ_INDEXED_HEADER_NAME:// Header Name matches an entry in the Header Tablename readName(decodeULE128(in, index));nameLength name.length();state READ_LITERAL_HEADER_VALUE_LENGTH_PREFIX;break;case READ_LITERAL_HEADER_NAME_LENGTH_PREFIX:// 读取name前缀 判断是否使用哈夫曼编码b in.readByte();huffmanEncoded (b 0x80) 0x80;index b 0x7F;if (index 0x7f) {state READ_LITERAL_HEADER_NAME_LENGTH;} else {nameLength index;state READ_LITERAL_HEADER_NAME;}break;case READ_LITERAL_HEADER_NAME_LENGTH:// Header Name is a Literal StringnameLength decodeULE128(in, index);state READ_LITERAL_HEADER_NAME;break;case READ_LITERAL_HEADER_NAME:// Wait until entire name is readableif (in.readableBytes() nameLength) {throw notEnoughDataException(in);}name readStringLiteral(in, nameLength, huffmanEncoded);state READ_LITERAL_HEADER_VALUE_LENGTH_PREFIX;break;case READ_LITERAL_HEADER_VALUE_LENGTH_PREFIX:b in.readByte();huffmanEncoded (b 0x80) 0x80;index b 0x7F;switch (index) {case 0x7f:state READ_LITERAL_HEADER_VALUE_LENGTH;break;case 0:insertHeader(sink, name, EMPTY_STRING, indexType);state READ_HEADER_REPRESENTATION;break;default:valueLength index;state READ_LITERAL_HEADER_VALUE;}break;case READ_LITERAL_HEADER_VALUE_LENGTH:// Header Value is a Literal StringvalueLength decodeULE128(in, index);state READ_LITERAL_HEADER_VALUE;break;case READ_LITERAL_HEADER_VALUE:// Wait until entire value is readableif (in.readableBytes() valueLength) {throw notEnoughDataException(in);}AsciiString value readStringLiteral(in, valueLength, huffmanEncoded);insertHeader(sink, name, value, indexType);state READ_HEADER_REPRESENTATION;break;default:throw new Error(should not reach here state: state);}}if (state ! READ_HEADER_REPRESENTATION) {throw connectionError(COMPRESSION_ERROR, Incomplete header block fragment.);} }该方法做的事情 读取首字节判断最高位是否是1开头。如果是代表name和value都是被索引的继续读取索引号从静态/动态表获取header即可。判断高位是否是01开头是的话就需要把读取到的header添加到动态表中进行维护。如果name被索引则读取索引号从静态/动态表获取。如果没有被索引则判断长度的第1Bit是否是1如果是代表使用了哈夫曼编码否则使用常规的ASCII字符编码。读取value的规则类似也是先判断是否使用哈夫曼编码再按规则读取。 静态表 Netty通过io.netty.handler.codec.http2.HpackStaticTable类来维护静态表硬编码写死的不支持动态修改。 final class HpackStaticTable {static final int NOT_FOUND -1;// Appendix A: Static Table// https://tools.ietf.org/html/rfc7541#appendix-Aprivate static final ListHpackHeaderField STATIC_TABLE Arrays.asList(/* 1 */ newEmptyHeaderField(:authority),/* 2 */ newHeaderField(:method, GET),/* 3 */ newHeaderField(:method, POST),/* 4 */ newHeaderField(:path, /),/* 5 */ newHeaderField(:path, /index.html),/* 6 */ newHeaderField(:scheme, http),/* 7 */ newHeaderField(:scheme, https),/* 61 */ newEmptyHeaderField(www-authenticate)。。。。。。); }动态表 Netty通过io.netty.handler.codec.http2.HpackDynamicTable类来维护动态表动态表初始是空的只有读到01开头的Header才会加入到动态表中维护。 final class HpackDynamicTable {// a circular queue of header fieldsHpackHeaderField[] hpackHeaderFields;int head;int tail;private long size;private long capacity -1;public void add(HpackHeaderField header) {int headerSize header.size();if (headerSize capacity) {clear();return;}while (capacity - size headerSize) {remove();}hpackHeaderFields[head] header;size headerSize;if (head hpackHeaderFields.length) {head 0;}}。。。。。。 }
http://www.w-s-a.com/news/730506/

相关文章:

  • 网站开发维护运维无人在线电视剧免费观看
  • 电子商务网站建设开题报告展馆网站建设
  • 门户网站建设的背景和意义手机网站前
  • 国内免费视频素材无水印素材网站国家最新消息
  • 襄阳seo站内优化学做网站论坛教程
  • 文明网站建设情况报告wordpress伪静态配置
  • 牙科网站模板个人微信网站建设
  • 厦门公司注册网站dw做简单小说网站
  • 网站建好以后每年都续费么wordpress 仿聚划算
  • 单位网站建设收费标准网上开店铺需要多少钱
  • 灯饰网站需要这么做申请域名的流程
  • 软件下载网站怎么赚钱wordpress减少数据库查询
  • 什么兼职网站可以做视频剪辑常见的推广平台有哪些
  • 网站开发是用html还是jsp设迹官网
  • 查公司信息的网站怎么学wordpress
  • 白银做网站长春一般建一个网站需要多少钱
  • 帮人做钓鱼网站的人网络推广培训职业学校
  • 淘宝客有必须做网站吗网站开发的形式有( )
  • 网站建设:上海珍岛网页版qq空间登录
  • 网站服务器ipteahouse wordpress主题
  • 深州市住房保障和城乡建设局网站做网站公司叫什么
  • 织梦网站转跳手机站注册公司代理记账费用
  • wordpress建站Pdf亚马逊aws在线观看
  • 做网站的外包公司有哪些WordPress调用json数据
  • 做网站网站怎么赚钱网站的建设及维护报告
  • 可以做效果图的网站东莞网站优化什么方法
  • 网站和软件的区别怎么做招生网站
  • 雄安免费网站建设电话如何做网站推广 求指点
  • 十大免费cad网站入口软件北京做网站建设价格
  • 建设一个公司网站要具备什么网页制作的专业