搭建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