grpc 1.23.1 → 1.24.0.pre1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of grpc might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Makefile +757 -477
- data/include/grpc/grpc.h +3 -1
- data/include/grpc/grpc_security.h +20 -4
- data/include/grpc/impl/codegen/grpc_types.h +6 -5
- data/include/grpc/impl/codegen/port_platform.h +25 -0
- data/src/core/ext/filters/client_channel/backend_metric.cc +78 -0
- data/src/core/ext/filters/client_channel/backend_metric.h +36 -0
- data/src/core/ext/filters/client_channel/channel_connectivity.cc +16 -2
- data/src/core/ext/filters/client_channel/client_channel.cc +325 -267
- data/src/core/ext/filters/client_channel/client_channel_factory.h +0 -4
- data/src/core/ext/filters/client_channel/health/health_check_client.cc +23 -32
- data/src/core/ext/filters/client_channel/http_proxy.cc +7 -3
- data/src/core/ext/filters/client_channel/lb_policy.cc +1 -1
- data/src/core/ext/filters/client_channel/lb_policy.h +58 -34
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +46 -50
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +9 -2
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +35 -17
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +130 -215
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +34 -21
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +1120 -802
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel.h +8 -2
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_secure.cc +33 -12
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_client_stats.cc +151 -40
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_client_stats.h +184 -26
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_load_balancer_api.cc +389 -245
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_load_balancer_api.h +98 -60
- data/src/core/ext/filters/client_channel/lb_policy_registry.cc +6 -1
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +89 -0
- data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +3 -8
- data/src/core/ext/filters/client_channel/server_address.cc +1 -3
- data/src/core/ext/filters/client_channel/server_address.h +1 -1
- data/src/core/ext/filters/client_channel/subchannel.h +2 -1
- data/src/core/ext/filters/client_idle/client_idle_filter.cc +207 -29
- data/src/core/ext/filters/http/client/http_client_filter.cc +10 -8
- data/src/core/ext/filters/http/client_authority_filter.cc +1 -1
- data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +10 -7
- data/src/core/ext/filters/http/server/http_server_filter.cc +52 -26
- data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +23 -20
- data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +24 -21
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +1 -1
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +37 -24
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +1 -0
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +237 -191
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +29 -27
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +1 -1
- data/src/core/ext/transport/chttp2/transport/hpack_table.cc +19 -4
- data/src/core/ext/transport/chttp2/transport/hpack_table.h +13 -4
- data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +2 -1
- data/src/core/ext/transport/chttp2/transport/internal.h +0 -2
- data/src/core/ext/transport/chttp2/transport/parsing.cc +99 -71
- data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c +222 -0
- data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h +818 -0
- data/src/core/ext/upb-generated/envoy/api/v2/cds.upb.c +314 -0
- data/src/core/ext/upb-generated/envoy/api/v2/cds.upb.h +1142 -0
- data/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c +53 -0
- data/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.h +158 -0
- data/src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c +34 -0
- data/src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.h +69 -0
- data/src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c +49 -0
- data/src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.h +240 -0
- data/src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c +110 -0
- data/src/core/ext/upb-generated/envoy/api/v2/core/address.upb.h +324 -0
- data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c +235 -0
- data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h +661 -0
- data/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c +84 -0
- data/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h +274 -0
- data/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c +175 -0
- data/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h +572 -0
- data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c +150 -0
- data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h +596 -0
- data/src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c +35 -0
- data/src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.h +80 -0
- data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c +95 -0
- data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h +308 -0
- data/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c +128 -0
- data/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.h +392 -0
- data/src/core/ext/upb-generated/envoy/api/v2/eds.upb.c +91 -0
- data/src/core/ext/upb-generated/envoy/api/v2/eds.upb.h +236 -0
- data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.c +88 -0
- data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.h +258 -0
- data/src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.c +111 -0
- data/src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.h +324 -0
- data/src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.c +23 -0
- data/src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.h +50 -0
- data/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c +52 -0
- data/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.h +130 -0
- data/src/core/ext/upb-generated/envoy/type/percent.upb.c +39 -0
- data/src/core/ext/upb-generated/envoy/type/percent.upb.h +87 -0
- data/src/core/ext/upb-generated/envoy/type/range.upb.c +39 -0
- data/src/core/ext/upb-generated/envoy/type/range.upb.h +85 -0
- data/src/core/ext/upb-generated/gogoproto/gogo.upb.c +17 -0
- data/src/core/ext/upb-generated/gogoproto/gogo.upb.h +30 -0
- data/src/core/ext/upb-generated/google/api/annotations.upb.c +18 -0
- data/src/core/ext/upb-generated/google/api/annotations.upb.h +30 -0
- data/src/core/ext/upb-generated/google/api/http.upb.c +66 -0
- data/src/core/ext/upb-generated/google/api/http.upb.h +190 -0
- data/src/core/ext/upb-generated/google/protobuf/any.upb.c +27 -0
- data/src/core/ext/upb-generated/google/protobuf/any.upb.h +58 -0
- data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +485 -0
- data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +1690 -0
- data/src/core/ext/upb-generated/google/protobuf/duration.upb.c +27 -0
- data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +58 -0
- data/src/core/ext/upb-generated/google/protobuf/empty.upb.c +22 -0
- data/src/core/ext/upb-generated/google/protobuf/empty.upb.h +50 -0
- data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +79 -0
- data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +215 -0
- data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.c +27 -0
- data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +58 -0
- data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.c +106 -0
- data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +238 -0
- data/src/core/ext/upb-generated/google/rpc/status.upb.c +33 -0
- data/src/core/ext/upb-generated/google/rpc/status.upb.h +74 -0
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c +49 -0
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +126 -0
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +209 -0
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +681 -0
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c +42 -0
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +109 -0
- data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c +36 -0
- data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +84 -0
- data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c +133 -0
- data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +359 -0
- data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c +58 -0
- data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h +144 -0
- data/src/core/ext/upb-generated/validate/validate.upb.c +443 -0
- data/src/core/ext/upb-generated/validate/validate.upb.h +2037 -0
- data/src/core/lib/channel/channel_args.cc +21 -0
- data/src/core/lib/channel/channel_args.h +16 -2
- data/src/core/lib/channel/channel_stack.h +2 -1
- data/src/core/lib/channel/channelz.cc +54 -56
- data/src/core/lib/channel/channelz.h +29 -12
- data/src/core/lib/compression/compression.cc +2 -1
- data/src/core/lib/compression/compression_internal.h +8 -0
- data/src/core/lib/gpr/log_linux.cc +2 -2
- data/src/core/lib/gpr/log_posix.cc +2 -2
- data/src/core/lib/gpr/time_precise.cc +123 -36
- data/src/core/lib/gpr/time_precise.h +37 -0
- data/src/core/lib/gprpp/abstract.h +10 -0
- data/src/core/lib/gprpp/atomic.h +4 -0
- data/src/core/lib/gprpp/inlined_vector.h +20 -4
- data/src/core/lib/gprpp/map.h +109 -6
- data/src/core/lib/gprpp/memory.h +6 -0
- data/src/core/lib/gprpp/ref_counted_ptr.h +2 -0
- data/src/core/lib/iomgr/ev_epollex_linux.cc +29 -54
- data/src/core/lib/iomgr/exec_ctx.cc +27 -17
- data/src/core/lib/iomgr/exec_ctx.h +3 -0
- data/src/core/lib/iomgr/sockaddr_utils.cc +1 -3
- data/src/core/lib/iomgr/tcp_posix.cc +16 -25
- data/src/core/lib/iomgr/tcp_server_custom.cc +1 -1
- data/src/core/lib/iomgr/timer_manager.cc +8 -1
- data/src/core/lib/iomgr/timer_manager.h +2 -0
- data/src/core/lib/security/credentials/credentials.h +8 -2
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +23 -0
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +3 -0
- data/src/core/lib/security/credentials/tls/spiffe_credentials.cc +3 -3
- data/src/core/lib/security/security_connector/ssl_utils.cc +1 -12
- data/src/core/lib/security/security_connector/ssl_utils.h +10 -6
- data/src/core/lib/security/security_connector/ssl_utils_config.cc +32 -0
- data/src/core/lib/security/security_connector/ssl_utils_config.h +30 -0
- data/src/core/lib/security/security_connector/tls/spiffe_security_connector.cc +161 -49
- data/src/core/lib/security/security_connector/tls/spiffe_security_connector.h +34 -1
- data/src/core/lib/slice/slice_intern.cc +17 -9
- data/src/core/lib/slice/slice_internal.h +34 -7
- data/src/core/lib/slice/slice_utils.h +7 -3
- data/src/core/lib/surface/call.cc +97 -57
- data/src/core/lib/surface/channel.cc +2 -2
- data/src/core/lib/surface/completion_queue.cc +10 -16
- data/src/core/lib/surface/init.cc +3 -0
- data/src/core/lib/surface/server.cc +11 -14
- data/src/core/lib/surface/validate_metadata.cc +4 -0
- data/src/core/lib/surface/version.cc +2 -2
- data/src/core/lib/transport/metadata.cc +4 -4
- data/src/core/lib/transport/metadata_batch.cc +72 -16
- data/src/core/lib/transport/metadata_batch.h +38 -0
- data/src/core/lib/transport/static_metadata.cc +814 -1023
- data/src/core/lib/transport/static_metadata.h +271 -213
- data/src/core/lib/transport/transport.h +12 -0
- data/src/core/plugin_registry/grpc_plugin_registry.cc +4 -0
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +104 -76
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +34 -16
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +2 -2
- data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +10 -6
- data/src/core/tsi/alts/handshaker/alts_tsi_utils.h +4 -3
- data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +74 -48
- data/src/core/tsi/alts/handshaker/transport_security_common_api.h +34 -26
- data/src/core/tsi/ssl_transport_security.cc +14 -6
- data/src/core/tsi/ssl_transport_security.h +4 -0
- data/src/ruby/ext/grpc/ext-export.clang +1 -0
- data/src/ruby/ext/grpc/ext-export.gcc +6 -0
- data/src/ruby/ext/grpc/extconf.rb +5 -0
- data/src/ruby/ext/grpc/rb_enable_cpp.cc +22 -0
- data/src/ruby/ext/grpc/rb_grpc.c +1 -42
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -0
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +6 -0
- data/src/ruby/lib/grpc.rb +2 -0
- data/src/ruby/lib/grpc/core/status_codes.rb +135 -0
- data/src/ruby/lib/grpc/errors.rb +4 -7
- data/src/ruby/lib/grpc/google_rpc_status_utils.rb +9 -4
- data/src/ruby/lib/grpc/structs.rb +15 -0
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/spec/errors_spec.rb +1 -0
- data/src/ruby/spec/pb/codegen/grpc/testing/package_options_import.proto +22 -0
- data/src/ruby/spec/pb/codegen/grpc/testing/package_options_ruby_style.proto +34 -0
- data/src/ruby/spec/pb/codegen/package_option_spec.rb +53 -29
- data/third_party/upb/upb/decode.c +604 -0
- data/third_party/upb/upb/decode.h +21 -0
- data/third_party/upb/upb/encode.c +378 -0
- data/third_party/upb/upb/encode.h +21 -0
- data/third_party/upb/upb/generated_util.h +105 -0
- data/third_party/upb/upb/msg.c +111 -0
- data/third_party/upb/upb/msg.h +69 -0
- data/third_party/upb/upb/port.c +27 -0
- data/third_party/upb/upb/port_def.inc +152 -0
- data/third_party/upb/upb/port_undef.inc +21 -0
- data/third_party/upb/upb/table.c +911 -0
- data/third_party/upb/upb/table.int.h +507 -0
- data/third_party/upb/upb/upb.c +261 -0
- data/third_party/upb/upb/upb.h +364 -0
- metadata +134 -55
- data/src/core/ext/filters/client_channel/health/health.pb.c +0 -23
- data/src/core/ext/filters/client_channel/health/health.pb.h +0 -73
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/google/protobuf/duration.pb.c +0 -19
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/google/protobuf/duration.pb.h +0 -54
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/google/protobuf/timestamp.pb.c +0 -19
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/google/protobuf/timestamp.pb.h +0 -54
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c +0 -89
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h +0 -164
- data/src/core/tsi/alts/handshaker/alts_handshaker_service_api.cc +0 -520
- data/src/core/tsi/alts/handshaker/alts_handshaker_service_api.h +0 -323
- data/src/core/tsi/alts/handshaker/alts_handshaker_service_api_util.cc +0 -145
- data/src/core/tsi/alts/handshaker/alts_handshaker_service_api_util.h +0 -149
- data/src/core/tsi/alts/handshaker/altscontext.pb.c +0 -47
- data/src/core/tsi/alts/handshaker/altscontext.pb.h +0 -63
- data/src/core/tsi/alts/handshaker/handshaker.pb.c +0 -122
- data/src/core/tsi/alts/handshaker/handshaker.pb.h +0 -254
- data/src/core/tsi/alts/handshaker/transport_security_common.pb.c +0 -49
- data/src/core/tsi/alts/handshaker/transport_security_common.pb.h +0 -78
- data/third_party/nanopb/pb.h +0 -579
- data/third_party/nanopb/pb_common.c +0 -97
- data/third_party/nanopb/pb_common.h +0 -42
- data/third_party/nanopb/pb_decode.c +0 -1347
- data/third_party/nanopb/pb_decode.h +0 -149
- data/third_party/nanopb/pb_encode.c +0 -696
- data/third_party/nanopb/pb_encode.h +0 -154
@@ -38,6 +38,9 @@
|
|
38
38
|
#include "src/core/lib/surface/validate_metadata.h"
|
39
39
|
#include "src/core/lib/transport/http2_errors.h"
|
40
40
|
|
41
|
+
grpc_core::DebugOnlyTraceFlag grpc_trace_chttp2_hpack_parser(
|
42
|
+
false, "chttp2_hpack_parser");
|
43
|
+
|
41
44
|
typedef enum {
|
42
45
|
NOT_BINARY,
|
43
46
|
BINARY_BEGIN,
|
@@ -643,7 +646,7 @@ static void GPR_ATTRIBUTE_NOINLINE on_hdr_log(grpc_mdelem md) {
|
|
643
646
|
/* emission helpers */
|
644
647
|
template <bool do_add>
|
645
648
|
static grpc_error* on_hdr(grpc_chttp2_hpack_parser* p, grpc_mdelem md) {
|
646
|
-
if (GRPC_TRACE_FLAG_ENABLED(
|
649
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_trace_chttp2_hpack_parser)) {
|
647
650
|
on_hdr_log(md);
|
648
651
|
}
|
649
652
|
if (do_add) {
|
@@ -652,12 +655,7 @@ static grpc_error* on_hdr(grpc_chttp2_hpack_parser* p, grpc_mdelem md) {
|
|
652
655
|
grpc_error* err = grpc_chttp2_hptbl_add(&p->table, md);
|
653
656
|
if (GPR_UNLIKELY(err != GRPC_ERROR_NONE)) return err;
|
654
657
|
}
|
655
|
-
|
656
|
-
GRPC_MDELEM_UNREF(md);
|
657
|
-
return GRPC_ERROR_CREATE_FROM_STATIC_STRING("on_header callback not set");
|
658
|
-
}
|
659
|
-
p->on_header(p->on_header_user_data, md);
|
660
|
-
return GRPC_ERROR_NONE;
|
658
|
+
return p->on_header(p->on_header_user_data, md);
|
661
659
|
}
|
662
660
|
|
663
661
|
static grpc_core::UnmanagedMemorySlice take_string_extern(
|
@@ -762,23 +760,26 @@ static grpc_error* parse_stream_dep0(grpc_chttp2_hpack_parser* p,
|
|
762
760
|
return parse_stream_dep1(p, cur + 1, end);
|
763
761
|
}
|
764
762
|
|
763
|
+
static grpc_error* GPR_ATTRIBUTE_NOINLINE
|
764
|
+
on_invalid_hpack_idx(grpc_chttp2_hpack_parser* p) {
|
765
|
+
return grpc_error_set_int(
|
766
|
+
grpc_error_set_int(
|
767
|
+
GRPC_ERROR_CREATE_FROM_STATIC_STRING("Invalid HPACK index received"),
|
768
|
+
GRPC_ERROR_INT_INDEX, static_cast<intptr_t>(p->index)),
|
769
|
+
GRPC_ERROR_INT_SIZE, static_cast<intptr_t>(p->table.num_ents));
|
770
|
+
}
|
771
|
+
|
765
772
|
/* emit an indexed field; jumps to begin the next field on completion */
|
766
773
|
static grpc_error* finish_indexed_field(grpc_chttp2_hpack_parser* p,
|
767
774
|
const uint8_t* cur,
|
768
775
|
const uint8_t* end) {
|
769
|
-
grpc_mdelem md = grpc_chttp2_hptbl_lookup(&p->table, p->index);
|
770
|
-
if (GRPC_MDISNULL(md)) {
|
771
|
-
return
|
772
|
-
grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
773
|
-
"Invalid HPACK index received"),
|
774
|
-
GRPC_ERROR_INT_INDEX,
|
775
|
-
static_cast<intptr_t>(p->index)),
|
776
|
-
GRPC_ERROR_INT_SIZE, static_cast<intptr_t>(p->table.num_ents));
|
776
|
+
grpc_mdelem md = grpc_chttp2_hptbl_lookup<true>(&p->table, p->index);
|
777
|
+
if (GPR_UNLIKELY(GRPC_MDISNULL(md))) {
|
778
|
+
return on_invalid_hpack_idx(p);
|
777
779
|
}
|
778
|
-
GRPC_MDELEM_REF(md);
|
779
780
|
GRPC_STATS_INC_HPACK_RECV_INDEXED();
|
780
781
|
grpc_error* err = on_hdr<false>(p, md);
|
781
|
-
if (err != GRPC_ERROR_NONE) return err;
|
782
|
+
if (GPR_UNLIKELY(err != GRPC_ERROR_NONE)) return err;
|
782
783
|
return parse_begin(p, cur, end);
|
783
784
|
}
|
784
785
|
|
@@ -1021,7 +1022,7 @@ static grpc_error* parse_lithdr_nvridx_v(grpc_chttp2_hpack_parser* p,
|
|
1021
1022
|
/* finish parsing a max table size change */
|
1022
1023
|
static grpc_error* finish_max_tbl_size(grpc_chttp2_hpack_parser* p,
|
1023
1024
|
const uint8_t* cur, const uint8_t* end) {
|
1024
|
-
if (GRPC_TRACE_FLAG_ENABLED(
|
1025
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_trace_chttp2_hpack_parser)) {
|
1025
1026
|
gpr_log(GPR_INFO, "MAX TABLE SIZE: %d", p->index);
|
1026
1027
|
}
|
1027
1028
|
grpc_error* err =
|
@@ -1554,13 +1555,8 @@ static void set_precomputed_md_idx(grpc_chttp2_hpack_parser* p,
|
|
1554
1555
|
static grpc_error* is_binary_indexed_header(grpc_chttp2_hpack_parser* p,
|
1555
1556
|
bool* is) {
|
1556
1557
|
grpc_mdelem elem = grpc_chttp2_hptbl_lookup(&p->table, p->index);
|
1557
|
-
if (GRPC_MDISNULL(elem)) {
|
1558
|
-
return
|
1559
|
-
grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
1560
|
-
"Invalid HPACK index received"),
|
1561
|
-
GRPC_ERROR_INT_INDEX,
|
1562
|
-
static_cast<intptr_t>(p->index)),
|
1563
|
-
GRPC_ERROR_INT_SIZE, static_cast<intptr_t>(p->table.num_ents));
|
1558
|
+
if (GPR_UNLIKELY(GRPC_MDISNULL(elem))) {
|
1559
|
+
return on_invalid_hpack_idx(p);
|
1564
1560
|
}
|
1565
1561
|
/* We know that GRPC_MDKEY(elem) points to a reference counted slice since:
|
1566
1562
|
* 1. elem was a result of grpc_chttp2_hptbl_lookup
|
@@ -1596,10 +1592,16 @@ static grpc_error* parse_value_string_with_literal_key(
|
|
1596
1592
|
return parse_value_string(p, cur, end, is_binary_literal_header(p));
|
1597
1593
|
}
|
1598
1594
|
|
1595
|
+
/* "Uninitialized" header parser to save us a branch in on_hdr(). */
|
1596
|
+
static grpc_error* on_header_uninitialized(void* user_data, grpc_mdelem md) {
|
1597
|
+
GRPC_MDELEM_UNREF(md);
|
1598
|
+
return GRPC_ERROR_CREATE_FROM_STATIC_STRING("on_header callback not set");
|
1599
|
+
}
|
1600
|
+
|
1599
1601
|
/* PUBLIC INTERFACE */
|
1600
1602
|
|
1601
1603
|
void grpc_chttp2_hpack_parser_init(grpc_chttp2_hpack_parser* p) {
|
1602
|
-
p->on_header =
|
1604
|
+
p->on_header = on_header_uninitialized;
|
1603
1605
|
p->on_header_user_data = nullptr;
|
1604
1606
|
p->state = parse_begin;
|
1605
1607
|
p->key.data.referenced = grpc_empty_slice();
|
@@ -1747,7 +1749,7 @@ grpc_error* grpc_chttp2_header_parser_parse(void* hpack_parser,
|
|
1747
1749
|
grpc_chttp2_mark_stream_closed(t, s, true, false, GRPC_ERROR_NONE);
|
1748
1750
|
}
|
1749
1751
|
}
|
1750
|
-
parser->on_header =
|
1752
|
+
parser->on_header = on_header_uninitialized;
|
1751
1753
|
parser->on_header_user_data = nullptr;
|
1752
1754
|
parser->is_boundary = 0xde;
|
1753
1755
|
parser->is_eof = 0xde;
|
@@ -46,7 +46,7 @@ typedef struct {
|
|
46
46
|
|
47
47
|
struct grpc_chttp2_hpack_parser {
|
48
48
|
/* user specified callback for each header output */
|
49
|
-
|
49
|
+
grpc_error* (*on_header)(void* user_data, grpc_mdelem md);
|
50
50
|
void* on_header_user_data;
|
51
51
|
|
52
52
|
grpc_error* last_error;
|
@@ -44,19 +44,34 @@ void grpc_chttp2_hptbl_destroy(grpc_chttp2_hptbl* tbl) {
|
|
44
44
|
tbl->ents = nullptr;
|
45
45
|
}
|
46
46
|
|
47
|
-
|
48
|
-
|
47
|
+
template <bool take_ref>
|
48
|
+
static grpc_mdelem lookup_dynamic_index(const grpc_chttp2_hptbl* tbl,
|
49
|
+
uint32_t tbl_index) {
|
49
50
|
/* Not static - find the value in the list of valid entries */
|
50
51
|
tbl_index -= (GRPC_CHTTP2_LAST_STATIC_ENTRY + 1);
|
51
52
|
if (tbl_index < tbl->num_ents) {
|
52
53
|
uint32_t offset =
|
53
54
|
(tbl->num_ents - 1u - tbl_index + tbl->first_ent) % tbl->cap_entries;
|
54
|
-
|
55
|
+
grpc_mdelem md = tbl->ents[offset];
|
56
|
+
if (take_ref) {
|
57
|
+
GRPC_MDELEM_REF(md);
|
58
|
+
}
|
59
|
+
return md;
|
55
60
|
}
|
56
61
|
/* Invalid entry: return error */
|
57
62
|
return GRPC_MDNULL;
|
58
63
|
}
|
59
64
|
|
65
|
+
grpc_mdelem grpc_chttp2_hptbl_lookup_dynamic_index(const grpc_chttp2_hptbl* tbl,
|
66
|
+
uint32_t tbl_index) {
|
67
|
+
return lookup_dynamic_index<false>(tbl, tbl_index);
|
68
|
+
}
|
69
|
+
|
70
|
+
grpc_mdelem grpc_chttp2_hptbl_lookup_ref_dynamic_index(
|
71
|
+
const grpc_chttp2_hptbl* tbl, uint32_t tbl_index) {
|
72
|
+
return lookup_dynamic_index<true>(tbl, tbl_index);
|
73
|
+
}
|
74
|
+
|
60
75
|
/* Evict one element from the table */
|
61
76
|
static void evict1(grpc_chttp2_hptbl* tbl) {
|
62
77
|
grpc_mdelem first_ent = tbl->ents[tbl->first_ent];
|
@@ -189,7 +204,7 @@ grpc_chttp2_hptbl_find_result grpc_chttp2_hptbl_find(
|
|
189
204
|
|
190
205
|
/* See if the string is in the static table */
|
191
206
|
for (i = 0; i < GRPC_CHTTP2_LAST_STATIC_ENTRY; i++) {
|
192
|
-
grpc_mdelem ent = grpc_static_mdelem_manifested[i];
|
207
|
+
grpc_mdelem ent = grpc_static_mdelem_manifested()[i];
|
193
208
|
if (!grpc_slice_eq(GRPC_MDKEY(md), GRPC_MDKEY(ent))) continue;
|
194
209
|
r.index = i + 1u;
|
195
210
|
r.has_value = grpc_slice_eq(GRPC_MDVALUE(md), GRPC_MDVALUE(ent));
|
@@ -95,6 +95,9 @@ grpc_error* grpc_chttp2_hptbl_set_current_table_size(grpc_chttp2_hptbl* tbl,
|
|
95
95
|
/* lookup a table entry based on its hpack index */
|
96
96
|
grpc_mdelem grpc_chttp2_hptbl_lookup_dynamic_index(const grpc_chttp2_hptbl* tbl,
|
97
97
|
uint32_t tbl_index);
|
98
|
+
grpc_mdelem grpc_chttp2_hptbl_lookup_ref_dynamic_index(
|
99
|
+
const grpc_chttp2_hptbl* tbl, uint32_t tbl_index);
|
100
|
+
template <bool take_ref = false>
|
98
101
|
inline grpc_mdelem grpc_chttp2_hptbl_lookup(const grpc_chttp2_hptbl* tbl,
|
99
102
|
uint32_t index) {
|
100
103
|
/* Static table comes first, just return an entry from it.
|
@@ -103,9 +106,15 @@ inline grpc_mdelem grpc_chttp2_hptbl_lookup(const grpc_chttp2_hptbl* tbl,
|
|
103
106
|
must follow the hpack standard. If that changes, we *must* not rely on
|
104
107
|
reading the core static metadata table here; at that point we'd need our
|
105
108
|
own singleton static metadata in the correct order. */
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
+
if (index <= GRPC_CHTTP2_LAST_STATIC_ENTRY) {
|
110
|
+
return grpc_static_mdelem_manifested()[index - 1];
|
111
|
+
} else {
|
112
|
+
if (take_ref) {
|
113
|
+
return grpc_chttp2_hptbl_lookup_ref_dynamic_index(tbl, index);
|
114
|
+
} else {
|
115
|
+
return grpc_chttp2_hptbl_lookup_dynamic_index(tbl, index);
|
116
|
+
}
|
117
|
+
}
|
109
118
|
}
|
110
119
|
/* add a table entry to the index */
|
111
120
|
grpc_error* grpc_chttp2_hptbl_add(grpc_chttp2_hptbl* tbl,
|
@@ -120,7 +129,7 @@ size_t grpc_chttp2_get_size_in_hpack_table(grpc_mdelem elem,
|
|
120
129
|
inline uintptr_t grpc_chttp2_get_static_hpack_table_index(grpc_mdelem md) {
|
121
130
|
uintptr_t index =
|
122
131
|
reinterpret_cast<grpc_core::StaticMetadata*>(GRPC_MDELEM_DATA(md)) -
|
123
|
-
grpc_static_mdelem_table;
|
132
|
+
grpc_static_mdelem_table();
|
124
133
|
if (index < GRPC_CHTTP2_LAST_STATIC_ENTRY) {
|
125
134
|
return index + 1; // Hpack static metadata element indices start at 1
|
126
135
|
}
|
@@ -38,7 +38,8 @@ grpc_error* grpc_chttp2_incoming_metadata_buffer_add(
|
|
38
38
|
storage = static_cast<grpc_linked_mdelem*>(
|
39
39
|
buffer->arena->Alloc(sizeof(grpc_linked_mdelem)));
|
40
40
|
}
|
41
|
-
|
41
|
+
storage->md = elem;
|
42
|
+
return grpc_metadata_batch_link_tail(&buffer->batch, storage);
|
42
43
|
}
|
43
44
|
|
44
45
|
grpc_error* grpc_chttp2_incoming_metadata_buffer_replace_or_add(
|
@@ -571,8 +571,6 @@ struct grpc_chttp2_stream {
|
|
571
571
|
/** Are we buffering writes on this stream? If yes, we won't become writable
|
572
572
|
until there's enough queued up in the flow_controlled_buffer */
|
573
573
|
bool write_buffering = false;
|
574
|
-
/** Has trailing metadata been received. */
|
575
|
-
bool received_trailing_metadata = false;
|
576
574
|
|
577
575
|
/* have we sent or received the EOS bit? */
|
578
576
|
bool eos_received = false;
|
@@ -108,7 +108,7 @@ grpc_error* grpc_chttp2_perform_read(grpc_chttp2_transport* t,
|
|
108
108
|
/* fallthrough */
|
109
109
|
dts_fh_0:
|
110
110
|
case GRPC_DTS_FH_0:
|
111
|
-
|
111
|
+
GPR_DEBUG_ASSERT(cur < end);
|
112
112
|
t->incoming_frame_size = (static_cast<uint32_t>(*cur)) << 16;
|
113
113
|
if (++cur == end) {
|
114
114
|
t->deframe_state = GRPC_DTS_FH_1;
|
@@ -116,7 +116,7 @@ grpc_error* grpc_chttp2_perform_read(grpc_chttp2_transport* t,
|
|
116
116
|
}
|
117
117
|
/* fallthrough */
|
118
118
|
case GRPC_DTS_FH_1:
|
119
|
-
|
119
|
+
GPR_DEBUG_ASSERT(cur < end);
|
120
120
|
t->incoming_frame_size |= (static_cast<uint32_t>(*cur)) << 8;
|
121
121
|
if (++cur == end) {
|
122
122
|
t->deframe_state = GRPC_DTS_FH_2;
|
@@ -124,7 +124,7 @@ grpc_error* grpc_chttp2_perform_read(grpc_chttp2_transport* t,
|
|
124
124
|
}
|
125
125
|
/* fallthrough */
|
126
126
|
case GRPC_DTS_FH_2:
|
127
|
-
|
127
|
+
GPR_DEBUG_ASSERT(cur < end);
|
128
128
|
t->incoming_frame_size |= *cur;
|
129
129
|
if (++cur == end) {
|
130
130
|
t->deframe_state = GRPC_DTS_FH_3;
|
@@ -132,7 +132,7 @@ grpc_error* grpc_chttp2_perform_read(grpc_chttp2_transport* t,
|
|
132
132
|
}
|
133
133
|
/* fallthrough */
|
134
134
|
case GRPC_DTS_FH_3:
|
135
|
-
|
135
|
+
GPR_DEBUG_ASSERT(cur < end);
|
136
136
|
t->incoming_frame_type = *cur;
|
137
137
|
if (++cur == end) {
|
138
138
|
t->deframe_state = GRPC_DTS_FH_4;
|
@@ -140,7 +140,7 @@ grpc_error* grpc_chttp2_perform_read(grpc_chttp2_transport* t,
|
|
140
140
|
}
|
141
141
|
/* fallthrough */
|
142
142
|
case GRPC_DTS_FH_4:
|
143
|
-
|
143
|
+
GPR_DEBUG_ASSERT(cur < end);
|
144
144
|
t->incoming_frame_flags = *cur;
|
145
145
|
if (++cur == end) {
|
146
146
|
t->deframe_state = GRPC_DTS_FH_5;
|
@@ -148,7 +148,7 @@ grpc_error* grpc_chttp2_perform_read(grpc_chttp2_transport* t,
|
|
148
148
|
}
|
149
149
|
/* fallthrough */
|
150
150
|
case GRPC_DTS_FH_5:
|
151
|
-
|
151
|
+
GPR_DEBUG_ASSERT(cur < end);
|
152
152
|
t->incoming_stream_id = ((static_cast<uint32_t>(*cur)) & 0x7f) << 24;
|
153
153
|
if (++cur == end) {
|
154
154
|
t->deframe_state = GRPC_DTS_FH_6;
|
@@ -156,7 +156,7 @@ grpc_error* grpc_chttp2_perform_read(grpc_chttp2_transport* t,
|
|
156
156
|
}
|
157
157
|
/* fallthrough */
|
158
158
|
case GRPC_DTS_FH_6:
|
159
|
-
|
159
|
+
GPR_DEBUG_ASSERT(cur < end);
|
160
160
|
t->incoming_stream_id |= (static_cast<uint32_t>(*cur)) << 16;
|
161
161
|
if (++cur == end) {
|
162
162
|
t->deframe_state = GRPC_DTS_FH_7;
|
@@ -164,7 +164,7 @@ grpc_error* grpc_chttp2_perform_read(grpc_chttp2_transport* t,
|
|
164
164
|
}
|
165
165
|
/* fallthrough */
|
166
166
|
case GRPC_DTS_FH_7:
|
167
|
-
|
167
|
+
GPR_DEBUG_ASSERT(cur < end);
|
168
168
|
t->incoming_stream_id |= (static_cast<uint32_t>(*cur)) << 8;
|
169
169
|
if (++cur == end) {
|
170
170
|
t->deframe_state = GRPC_DTS_FH_8;
|
@@ -172,7 +172,7 @@ grpc_error* grpc_chttp2_perform_read(grpc_chttp2_transport* t,
|
|
172
172
|
}
|
173
173
|
/* fallthrough */
|
174
174
|
case GRPC_DTS_FH_8:
|
175
|
-
|
175
|
+
GPR_DEBUG_ASSERT(cur < end);
|
176
176
|
t->incoming_stream_id |= (static_cast<uint32_t>(*cur));
|
177
177
|
t->deframe_state = GRPC_DTS_FRAME;
|
178
178
|
err = init_frame_parser(t);
|
@@ -208,7 +208,7 @@ grpc_error* grpc_chttp2_perform_read(grpc_chttp2_transport* t,
|
|
208
208
|
}
|
209
209
|
/* fallthrough */
|
210
210
|
case GRPC_DTS_FRAME:
|
211
|
-
|
211
|
+
GPR_DEBUG_ASSERT(cur < end);
|
212
212
|
if (static_cast<uint32_t>(end - cur) == t->incoming_frame_size) {
|
213
213
|
err = parse_frame_slice(
|
214
214
|
t,
|
@@ -318,7 +318,10 @@ static grpc_error* skip_parser(void* parser, grpc_chttp2_transport* t,
|
|
318
318
|
return GRPC_ERROR_NONE;
|
319
319
|
}
|
320
320
|
|
321
|
-
static
|
321
|
+
static grpc_error* skip_header(void* tp, grpc_mdelem md) {
|
322
|
+
GRPC_MDELEM_UNREF(md);
|
323
|
+
return GRPC_ERROR_NONE;
|
324
|
+
}
|
322
325
|
|
323
326
|
static grpc_error* init_skip_frame_parser(grpc_chttp2_transport* t,
|
324
327
|
int is_header) {
|
@@ -419,91 +422,117 @@ static bool is_nonzero_status(grpc_mdelem md) {
|
|
419
422
|
!md_cmp(md, GRPC_MDELEM_GRPC_STATUS_0, GRPC_MDSTR_GRPC_STATUS);
|
420
423
|
}
|
421
424
|
|
422
|
-
static void
|
425
|
+
static void GPR_ATTRIBUTE_NOINLINE on_initial_header_log(
|
426
|
+
grpc_chttp2_transport* t, grpc_chttp2_stream* s, grpc_mdelem md) {
|
427
|
+
char* key = grpc_slice_to_c_string(GRPC_MDKEY(md));
|
428
|
+
char* value =
|
429
|
+
grpc_dump_slice(GRPC_MDVALUE(md), GPR_DUMP_HEX | GPR_DUMP_ASCII);
|
430
|
+
gpr_log(GPR_INFO, "HTTP:%d:HDR:%s: %s: %s", s->id,
|
431
|
+
t->is_client ? "CLI" : "SVR", key, value);
|
432
|
+
gpr_free(key);
|
433
|
+
gpr_free(value);
|
434
|
+
}
|
435
|
+
|
436
|
+
static grpc_error* GPR_ATTRIBUTE_NOINLINE handle_timeout(grpc_chttp2_stream* s,
|
437
|
+
grpc_mdelem md) {
|
438
|
+
grpc_millis* cached_timeout =
|
439
|
+
static_cast<grpc_millis*>(grpc_mdelem_get_user_data(md, free_timeout));
|
440
|
+
grpc_millis timeout;
|
441
|
+
if (cached_timeout != nullptr) {
|
442
|
+
timeout = *cached_timeout;
|
443
|
+
} else {
|
444
|
+
if (GPR_UNLIKELY(!grpc_http2_decode_timeout(GRPC_MDVALUE(md), &timeout))) {
|
445
|
+
char* val = grpc_slice_to_c_string(GRPC_MDVALUE(md));
|
446
|
+
gpr_log(GPR_ERROR, "Ignoring bad timeout value '%s'", val);
|
447
|
+
gpr_free(val);
|
448
|
+
timeout = GRPC_MILLIS_INF_FUTURE;
|
449
|
+
}
|
450
|
+
if (GRPC_MDELEM_IS_INTERNED(md)) {
|
451
|
+
/* store the result */
|
452
|
+
cached_timeout =
|
453
|
+
static_cast<grpc_millis*>(gpr_malloc(sizeof(grpc_millis)));
|
454
|
+
*cached_timeout = timeout;
|
455
|
+
grpc_mdelem_set_user_data(md, free_timeout, cached_timeout);
|
456
|
+
}
|
457
|
+
}
|
458
|
+
if (timeout != GRPC_MILLIS_INF_FUTURE) {
|
459
|
+
grpc_chttp2_incoming_metadata_buffer_set_deadline(
|
460
|
+
&s->metadata_buffer[0], grpc_core::ExecCtx::Get()->Now() + timeout);
|
461
|
+
}
|
462
|
+
GRPC_MDELEM_UNREF(md);
|
463
|
+
return GRPC_ERROR_NONE;
|
464
|
+
}
|
465
|
+
|
466
|
+
static grpc_error* GPR_ATTRIBUTE_NOINLINE handle_metadata_size_limit_exceeded(
|
467
|
+
grpc_chttp2_transport* t, grpc_chttp2_stream* s, grpc_mdelem md,
|
468
|
+
size_t new_size, size_t metadata_size_limit) {
|
469
|
+
gpr_log(GPR_DEBUG,
|
470
|
+
"received initial metadata size exceeds limit (%" PRIuPTR
|
471
|
+
" vs. %" PRIuPTR ")",
|
472
|
+
new_size, metadata_size_limit);
|
473
|
+
grpc_chttp2_cancel_stream(
|
474
|
+
t, s,
|
475
|
+
grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
476
|
+
"received initial metadata size exceeds limit"),
|
477
|
+
GRPC_ERROR_INT_GRPC_STATUS,
|
478
|
+
GRPC_STATUS_RESOURCE_EXHAUSTED));
|
479
|
+
grpc_chttp2_parsing_become_skip_parser(t);
|
480
|
+
s->seen_error = true;
|
481
|
+
GRPC_MDELEM_UNREF(md);
|
482
|
+
return GRPC_ERROR_NONE;
|
483
|
+
}
|
484
|
+
|
485
|
+
static grpc_error* GPR_ATTRIBUTE_NOINLINE
|
486
|
+
handle_metadata_add_failure(grpc_chttp2_transport* t, grpc_chttp2_stream* s,
|
487
|
+
grpc_mdelem md, grpc_error* error) {
|
488
|
+
grpc_chttp2_cancel_stream(t, s, error);
|
489
|
+
grpc_chttp2_parsing_become_skip_parser(t);
|
490
|
+
s->seen_error = true;
|
491
|
+
GRPC_MDELEM_UNREF(md);
|
492
|
+
return GRPC_ERROR_NONE;
|
493
|
+
}
|
494
|
+
|
495
|
+
static grpc_error* on_initial_header(void* tp, grpc_mdelem md) {
|
423
496
|
GPR_TIMER_SCOPE("on_initial_header", 0);
|
424
497
|
|
425
498
|
grpc_chttp2_transport* t = static_cast<grpc_chttp2_transport*>(tp);
|
426
499
|
grpc_chttp2_stream* s = t->incoming_stream;
|
427
|
-
|
500
|
+
GPR_DEBUG_ASSERT(s != nullptr);
|
428
501
|
|
429
502
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_http_trace)) {
|
430
|
-
|
431
|
-
char* value =
|
432
|
-
grpc_dump_slice(GRPC_MDVALUE(md), GPR_DUMP_HEX | GPR_DUMP_ASCII);
|
433
|
-
gpr_log(GPR_INFO, "HTTP:%d:HDR:%s: %s: %s", s->id,
|
434
|
-
t->is_client ? "CLI" : "SVR", key, value);
|
435
|
-
gpr_free(key);
|
436
|
-
gpr_free(value);
|
503
|
+
on_initial_header_log(t, s, md);
|
437
504
|
}
|
438
505
|
|
439
506
|
if (is_nonzero_status(md)) { // not GRPC_MDELEM_GRPC_STATUS_0?
|
440
507
|
s->seen_error = true;
|
441
508
|
} else if (md_key_cmp(md, GRPC_MDSTR_GRPC_TIMEOUT)) {
|
442
|
-
|
443
|
-
static_cast<grpc_millis*>(grpc_mdelem_get_user_data(md, free_timeout));
|
444
|
-
grpc_millis timeout;
|
445
|
-
if (cached_timeout != nullptr) {
|
446
|
-
timeout = *cached_timeout;
|
447
|
-
} else {
|
448
|
-
if (GPR_UNLIKELY(
|
449
|
-
!grpc_http2_decode_timeout(GRPC_MDVALUE(md), &timeout))) {
|
450
|
-
char* val = grpc_slice_to_c_string(GRPC_MDVALUE(md));
|
451
|
-
gpr_log(GPR_ERROR, "Ignoring bad timeout value '%s'", val);
|
452
|
-
gpr_free(val);
|
453
|
-
timeout = GRPC_MILLIS_INF_FUTURE;
|
454
|
-
}
|
455
|
-
if (GRPC_MDELEM_IS_INTERNED(md)) {
|
456
|
-
/* store the result */
|
457
|
-
cached_timeout =
|
458
|
-
static_cast<grpc_millis*>(gpr_malloc(sizeof(grpc_millis)));
|
459
|
-
*cached_timeout = timeout;
|
460
|
-
grpc_mdelem_set_user_data(md, free_timeout, cached_timeout);
|
461
|
-
}
|
462
|
-
}
|
463
|
-
if (timeout != GRPC_MILLIS_INF_FUTURE) {
|
464
|
-
grpc_chttp2_incoming_metadata_buffer_set_deadline(
|
465
|
-
&s->metadata_buffer[0], grpc_core::ExecCtx::Get()->Now() + timeout);
|
466
|
-
}
|
467
|
-
GRPC_MDELEM_UNREF(md);
|
468
|
-
return;
|
509
|
+
return handle_timeout(s, md);
|
469
510
|
}
|
470
511
|
|
471
512
|
const size_t new_size = s->metadata_buffer[0].size + GRPC_MDELEM_LENGTH(md);
|
472
513
|
const size_t metadata_size_limit =
|
473
514
|
t->settings[GRPC_ACKED_SETTINGS]
|
474
515
|
[GRPC_CHTTP2_SETTINGS_MAX_HEADER_LIST_SIZE];
|
475
|
-
if (new_size > metadata_size_limit) {
|
476
|
-
|
477
|
-
|
478
|
-
" vs. %" PRIuPTR ")",
|
479
|
-
new_size, metadata_size_limit);
|
480
|
-
grpc_chttp2_cancel_stream(
|
481
|
-
t, s,
|
482
|
-
grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
483
|
-
"received initial metadata size exceeds limit"),
|
484
|
-
GRPC_ERROR_INT_GRPC_STATUS,
|
485
|
-
GRPC_STATUS_RESOURCE_EXHAUSTED));
|
486
|
-
grpc_chttp2_parsing_become_skip_parser(t);
|
487
|
-
s->seen_error = true;
|
488
|
-
GRPC_MDELEM_UNREF(md);
|
516
|
+
if (GPR_UNLIKELY(new_size > metadata_size_limit)) {
|
517
|
+
return handle_metadata_size_limit_exceeded(t, s, md, new_size,
|
518
|
+
metadata_size_limit);
|
489
519
|
} else {
|
490
520
|
grpc_error* error =
|
491
521
|
grpc_chttp2_incoming_metadata_buffer_add(&s->metadata_buffer[0], md);
|
492
|
-
if (error != GRPC_ERROR_NONE) {
|
493
|
-
|
494
|
-
grpc_chttp2_parsing_become_skip_parser(t);
|
495
|
-
s->seen_error = true;
|
496
|
-
GRPC_MDELEM_UNREF(md);
|
522
|
+
if (GPR_UNLIKELY(error != GRPC_ERROR_NONE)) {
|
523
|
+
return handle_metadata_add_failure(t, s, md, error);
|
497
524
|
}
|
498
525
|
}
|
526
|
+
// Not timeout-related metadata, and no error occurred.
|
527
|
+
return GRPC_ERROR_NONE;
|
499
528
|
}
|
500
529
|
|
501
|
-
static
|
530
|
+
static grpc_error* on_trailing_header(void* tp, grpc_mdelem md) {
|
502
531
|
GPR_TIMER_SCOPE("on_trailing_header", 0);
|
503
532
|
|
504
533
|
grpc_chttp2_transport* t = static_cast<grpc_chttp2_transport*>(tp);
|
505
534
|
grpc_chttp2_stream* s = t->incoming_stream;
|
506
|
-
|
535
|
+
GPR_DEBUG_ASSERT(s != nullptr);
|
507
536
|
|
508
537
|
if (GRPC_TRACE_FLAG_ENABLED(grpc_http_trace)) {
|
509
538
|
char* key = grpc_slice_to_c_string(GRPC_MDKEY(md));
|
@@ -547,6 +576,7 @@ static void on_trailing_header(void* tp, grpc_mdelem md) {
|
|
547
576
|
GRPC_MDELEM_UNREF(md);
|
548
577
|
}
|
549
578
|
}
|
579
|
+
return GRPC_ERROR_NONE;
|
550
580
|
}
|
551
581
|
|
552
582
|
static grpc_error* init_header_frame_parser(grpc_chttp2_transport* t,
|
@@ -626,7 +656,7 @@ static grpc_error* init_header_frame_parser(grpc_chttp2_transport* t,
|
|
626
656
|
} else {
|
627
657
|
t->incoming_stream = s;
|
628
658
|
}
|
629
|
-
|
659
|
+
GPR_DEBUG_ASSERT(s != nullptr);
|
630
660
|
s->stats.incoming.framing_bytes += 9;
|
631
661
|
if (GPR_UNLIKELY(s->read_closed)) {
|
632
662
|
GRPC_CHTTP2_IF_TRACING(gpr_log(
|
@@ -647,7 +677,6 @@ static grpc_error* init_header_frame_parser(grpc_chttp2_transport* t,
|
|
647
677
|
*s->trailing_metadata_available = true;
|
648
678
|
}
|
649
679
|
t->hpack_parser.on_header = on_trailing_header;
|
650
|
-
s->received_trailing_metadata = true;
|
651
680
|
} else {
|
652
681
|
GRPC_CHTTP2_IF_TRACING(gpr_log(GPR_INFO, "parsing initial_metadata"));
|
653
682
|
t->hpack_parser.on_header = on_initial_header;
|
@@ -656,7 +685,6 @@ static grpc_error* init_header_frame_parser(grpc_chttp2_transport* t,
|
|
656
685
|
case 1:
|
657
686
|
GRPC_CHTTP2_IF_TRACING(gpr_log(GPR_INFO, "parsing trailing_metadata"));
|
658
687
|
t->hpack_parser.on_header = on_trailing_header;
|
659
|
-
s->received_trailing_metadata = true;
|
660
688
|
break;
|
661
689
|
case 2:
|
662
690
|
gpr_log(GPR_ERROR, "too many header frames received");
|