brpc中http2 grpc协议解析

搭建gRPC服务 | bRPC

https://blog.csdn.net/INGNIGHT/article/details/132657099

global.cpp

http2_rpc_protocol.cpp

ParseH2Message解析frame header信息

ParseResult H2Context::ConsumeFrameHead(

这个是固定长度的9字节帧头部,length是,3*8bit(3字节),type8bit,flags8bit,streamid(最高32位置,应该是个0,所以&0x8000000是0)

解析完9字节帧头部,按照帧头中的type去解析,playload中的内容,假设type类型是header帧类型

H2ParseResult H2Context::OnHeaders(解析header帧

ConsumeHeaders解析Header帧

int H2StreamContext::ConsumeHeaders(butil::IOBufBytesIterator& it) {

playload是Header类型的帧,是hpack编码的。具体解析是Decode函数,按照hpack规则解析

details/hpack.h

先看下前4个bit为header类型帧哪种编码格式,如果是

inline ssize_t DecodeInteger(butil::IOBufBytesIterator& iter,

判断第一个bit,因为存在header帧类型,和index,所以判断比较复杂

第一次是1 << prefix_size -1 ,假设prefix_size是7,1<prefix_size是10000000(1后面7个0),1<<prefix-1是01111111(0后面7个1),然后&tmp,主要是把前面header帧类型部分擦出,然后通过(tmp<(1 << prefix)-1)判断最高位是否为1,

540行,iter已经++

0x7F,取出后面7bit,累加到高位位置(向左移动,也表示乘以2^m次方,),m纪录移动了多少位置

inline ssize_t HPacker::DecodeWithKnownPrefix(

name在静态表中(需要解析出数字),value需要解析

inline ssize_t DecodeString(butil::IOBufBytesIterator& iter, std::string* out) {

获得value最高位的huffman,判断是否是huffman编码。如果是是huffman编码,在按照huffman编码解析。如果不是,直接按照length长度copy字符串。

哈夫曼编码

details/hpack.h

ProcessHttpRequest解析帧中payload部分(剔除head帧中payload的header hpack/非hpack编码部分,这部分在ParseH2Message已经解析)

grpc:https://blog.csdn.net/INGNIGHT/article/details/132657099

http2的data帧中grpc编码前面有5个length prefix message

序列化,payload部分到protobuf request中,grpc中指出payload有json和proto两种序列化编码,

ParsePbFromIOBuf将proto转为pb request

JsonToProtoMessage将json转为pb request

相关推荐

  1. HTTPS握手

    2024-05-04 08:30:02       34 阅读
  2. Webserve(4): HTTP

    2024-05-04 08:30:02       35 阅读
  3. httphttps详细

    2024-05-04 08:30:02       50 阅读
  4. vue3、vue2nextTick源码

    2024-05-04 08:30:02       50 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-04 08:30:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-04 08:30:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-05-04 08:30:02       82 阅读
  4. Python语言-面向对象

    2024-05-04 08:30:02       91 阅读

热门阅读

  1. YOLOv8检测图片和视频

    2024-05-04 08:30:02       35 阅读
  2. React 之 Effect与事件(event)(八)

    2024-05-04 08:30:02       38 阅读
  3. 深入探究TCP/IP协议

    2024-05-04 08:30:02       36 阅读
  4. 【收录 Hello 算法】2.5 小结

    2024-05-04 08:30:02       28 阅读
  5. 【23-Scikit-learn最佳实践:项目案例分析与总结】

    2024-05-04 08:30:02       32 阅读
  6. 4. 寻找两个正序数组的中位数

    2024-05-04 08:30:02       33 阅读
  7. OeceanBase开发者大会·2024精彩内容回顾

    2024-05-04 08:30:02       34 阅读
  8. 三种修改 Docker 镜像默认存储位置的方法

    2024-05-04 08:30:02       36 阅读
  9. 在Ubuntu上怎么查看安装了哪些包?

    2024-05-04 08:30:02       32 阅读
  10. 在Ubuntu上怎么卸载qemu-system-x86_64

    2024-05-04 08:30:02       31 阅读
  11. C++中的位运算符

    2024-05-04 08:30:02       33 阅读