实现:grpc内部代码实现!
recvCompress: req.Header.Get(“grpc-encoding”),
headerFields = append(headerFields, hpack.HeaderField{Name: “grpc-encoding”, Value: s.sendCompress})
stream 内有:
recvCompress string
sendCompress string
使用:
res, err := c.UnaryEcho(ctx, &pb.EchoRequest{Message: msg}, grpc.UseCompressor(gzip.Name))
!
grpc 代码实现;
if rc := stream.RecvCompress(); s.opts.dc != nil && s.opts.dc.Type() == rc {dc = s.opts.dc} else if rc != "" && rc != encoding.Identity {decomp = encoding.GetCompressor(rc)if decomp == nil {st := status.Newf(codes.Unimplemented, "grpc: Decompressor is not installed for grpc-encoding %q", rc)t.WriteStatus(stream, st)return st.Err()}}// If cp is set, use it. Otherwise, attempt to compress the response using// the incoming message compression method.//// NOTE: this needs to be ahead of all handling, https://github.com/grpc/grpc-go/issues/686.if s.opts.cp != nil {cp = s.opts.cpstream.SetSendCompress(cp.Type())} else if rc := stream.RecvCompress(); rc != "" && rc != encoding.Identity {// Legacy compressor not specified; attempt to respond with same encoding.comp = encoding.GetCompressor(rc)if comp != nil {stream.SetSendCompress(rc)}}
