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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值