(ctx context.Context, stream *transport.ServerStream, msg any, cp Compressor, opts *transport.WriteOptions, comp encoding.Compressor)
| 1186 | } |
| 1187 | |
| 1188 | func (s *Server) sendResponse(ctx context.Context, stream *transport.ServerStream, msg any, cp Compressor, opts *transport.WriteOptions, comp encoding.Compressor) error { |
| 1189 | data, err := encode(s.getCodec(stream.ContentSubtype()), msg) |
| 1190 | if err != nil { |
| 1191 | channelz.Error(logger, s.channelz, "grpc: server failed to encode response: ", err) |
| 1192 | return err |
| 1193 | } |
| 1194 | |
| 1195 | compData, pf, err := compress(data, cp, comp, s.opts.bufferPool) |
| 1196 | if err != nil { |
| 1197 | data.Free() |
| 1198 | channelz.Error(logger, s.channelz, "grpc: server failed to compress response: ", err) |
| 1199 | return err |
| 1200 | } |
| 1201 | |
| 1202 | hdr, payload := msgHeader(data, compData, pf) |
| 1203 | |
| 1204 | defer func() { |
| 1205 | compData.Free() |
| 1206 | data.Free() |
| 1207 | // payload does not need to be freed here, it is either data or compData, both of |
| 1208 | // which are already freed. |
| 1209 | }() |
| 1210 | |
| 1211 | dataLen := data.Len() |
| 1212 | payloadLen := payload.Len() |
| 1213 | // TODO(dfawley): should we be checking len(data) instead? |
| 1214 | if payloadLen > s.opts.maxSendMessageSize { |
| 1215 | return status.Errorf(codes.ResourceExhausted, "grpc: trying to send message larger than max (%d vs. %d)", payloadLen, s.opts.maxSendMessageSize) |
| 1216 | } |
| 1217 | err = stream.Write(hdr, payload, opts) |
| 1218 | if err == nil && s.statsHandler != nil { |
| 1219 | s.statsHandler.HandleRPC(ctx, outPayload(false, msg, dataLen, payloadLen, time.Now())) |
| 1220 | } |
| 1221 | return err |
| 1222 | } |
| 1223 | |
| 1224 | // chainUnaryServerInterceptors chains all unary server interceptors into one. |
| 1225 | func chainUnaryServerInterceptors(s *Server) { |
no test coverage detected