grpc 1.0.1 → 1.1.2
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 +3696 -867
- data/etc/roots.pem +39 -111
- data/include/grpc/byte_buffer.h +64 -1
- data/include/grpc/census.h +40 -96
- data/include/grpc/compression.h +2 -1
- data/include/grpc/grpc.h +42 -7
- data/include/grpc/grpc_posix.h +8 -5
- data/include/grpc/impl/codegen/atm.h +3 -0
- data/include/grpc/impl/codegen/atm_gcc_atomic.h +2 -0
- data/include/grpc/impl/codegen/atm_gcc_sync.h +8 -0
- data/include/grpc/impl/codegen/atm_windows.h +4 -0
- data/include/grpc/impl/codegen/byte_buffer_reader.h +4 -4
- data/include/grpc/impl/codegen/compression_types.h +1 -1
- data/include/grpc/impl/codegen/connectivity_state.h +2 -0
- data/include/grpc/impl/codegen/exec_ctx_fwd.h +41 -0
- data/include/grpc/impl/codegen/gpr_slice.h +84 -0
- data/include/grpc/impl/codegen/{alloc.h → gpr_types.h} +30 -29
- data/include/grpc/impl/codegen/grpc_types.h +91 -9
- data/include/grpc/impl/codegen/port_platform.h +25 -92
- data/include/grpc/impl/codegen/slice.h +54 -97
- data/include/grpc/impl/codegen/sync.h +0 -253
- data/include/grpc/module.modulemap +0 -2
- data/include/grpc/slice.h +132 -0
- data/include/grpc/{impl/codegen/slice_buffer.h → slice_buffer.h} +22 -39
- data/include/grpc/support/alloc.h +40 -1
- data/include/grpc/support/log.h +80 -1
- data/include/grpc/support/log_windows.h +2 -0
- data/include/grpc/support/string_util.h +1 -1
- data/include/grpc/support/sync.h +252 -0
- data/include/grpc/support/time.h +67 -1
- data/src/boringssl/err_data.c +639 -627
- data/src/core/ext/census/base_resources.c +71 -0
- data/src/core/ext/census/base_resources.h +39 -0
- data/src/core/ext/census/gen/census.pb.c +26 -29
- data/src/core/ext/census/gen/census.pb.h +68 -67
- data/src/core/ext/census/gen/trace_context.pb.c +81 -0
- data/src/core/ext/census/gen/trace_context.pb.h +99 -0
- data/src/core/ext/census/grpc_filter.c +22 -16
- data/src/core/ext/census/grpc_plugin.c +2 -1
- data/src/core/ext/census/initialize.c +16 -4
- data/src/core/ext/census/mlog.h +1 -1
- data/src/core/ext/census/placeholders.c +0 -45
- data/src/core/ext/census/resource.c +312 -0
- data/src/core/ext/census/resource.h +63 -0
- data/src/core/ext/census/trace_context.c +86 -0
- data/src/core/ext/census/trace_context.h +68 -0
- data/src/core/ext/census/tracing.c +8 -2
- data/src/core/ext/{client_config → client_channel}/channel_connectivity.c +8 -4
- data/src/core/ext/client_channel/client_channel.c +1218 -0
- data/src/core/ext/{client_config → client_channel}/client_channel.h +8 -11
- data/src/core/ext/{client_config → client_channel}/client_channel_factory.c +33 -3
- data/src/core/ext/{client_config → client_channel}/client_channel_factory.h +15 -8
- data/src/core/ext/{client_config/client_config_plugin.c → client_channel/client_channel_plugin.c} +16 -15
- data/src/core/ext/{client_config → client_channel}/connector.c +1 -1
- data/src/core/ext/{client_config → client_channel}/connector.h +5 -8
- data/{include/grpc/support/slice_buffer.h → src/core/ext/client_channel/default_initial_connect_string.c} +4 -5
- data/src/core/ext/client_channel/http_connect_handshaker.c +399 -0
- data/src/core/ext/client_channel/http_connect_handshaker.h +52 -0
- data/src/core/ext/{client_config → client_channel}/initial_connect_string.c +6 -7
- data/src/core/ext/{client_config → client_channel}/initial_connect_string.h +10 -10
- data/src/core/ext/{client_config → client_channel}/lb_policy.c +11 -11
- data/src/core/ext/{client_config → client_channel}/lb_policy.h +68 -27
- data/src/core/ext/client_channel/lb_policy_factory.c +163 -0
- data/src/core/ext/{client_config → client_channel}/lb_policy_factory.h +64 -9
- data/src/core/ext/{client_config → client_channel}/lb_policy_registry.c +6 -4
- data/src/core/ext/{client_config → client_channel}/lb_policy_registry.h +4 -4
- data/src/core/ext/{client_config → client_channel}/parse_address.c +21 -14
- data/src/core/ext/{client_config → client_channel}/parse_address.h +8 -10
- data/src/core/ext/{client_config → client_channel}/resolver.c +3 -4
- data/src/core/ext/{client_config → client_channel}/resolver.h +11 -15
- data/src/core/ext/{client_config → client_channel}/resolver_factory.c +4 -3
- data/src/core/ext/{client_config → client_channel}/resolver_factory.h +13 -11
- data/src/core/ext/{client_config → client_channel}/resolver_registry.c +54 -34
- data/src/core/ext/{client_config → client_channel}/resolver_registry.h +21 -8
- data/src/core/ext/{client_config → client_channel}/subchannel.c +208 -119
- data/src/core/ext/{client_config → client_channel}/subchannel.h +21 -11
- data/src/core/ext/{client_config → client_channel}/subchannel_index.c +6 -17
- data/src/core/ext/{client_config → client_channel}/subchannel_index.h +7 -7
- data/src/core/ext/{client_config → client_channel}/uri_parser.c +21 -28
- data/src/core/ext/{client_config → client_channel}/uri_parser.h +3 -3
- data/src/core/ext/lb_policy/grpclb/grpclb.c +1406 -0
- data/src/core/ext/lb_policy/grpclb/grpclb.h +44 -0
- data/src/core/ext/lb_policy/grpclb/load_balancer_api.c +117 -37
- data/src/core/ext/lb_policy/grpclb/load_balancer_api.h +31 -12
- data/src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c +6 -36
- data/src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h +22 -42
- data/src/core/ext/lb_policy/pick_first/pick_first.c +64 -46
- data/src/core/ext/lb_policy/round_robin/round_robin.c +324 -160
- data/src/core/ext/load_reporting/load_reporting.c +7 -56
- data/src/core/ext/load_reporting/load_reporting.h +41 -28
- data/src/core/ext/load_reporting/load_reporting_filter.c +132 -42
- data/src/core/ext/load_reporting/load_reporting_filter.h +1 -0
- data/src/core/ext/resolver/dns/native/dns_resolver.c +88 -80
- data/src/core/ext/resolver/sockaddr/sockaddr_resolver.c +57 -102
- data/src/core/ext/transport/chttp2/alpn/alpn.c +1 -1
- data/src/core/ext/transport/chttp2/client/chttp2_connector.c +253 -0
- data/src/core/{lib/iomgr/ev_poll_and_epoll_posix.h → ext/transport/chttp2/client/chttp2_connector.h} +5 -5
- data/src/core/ext/transport/chttp2/client/insecure/channel_create.c +31 -160
- data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.c +5 -5
- data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.c +44 -243
- data/src/core/ext/transport/chttp2/server/chttp2_server.c +342 -0
- data/src/core/ext/transport/chttp2/server/chttp2_server.h +47 -0
- data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.c +11 -124
- data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.c +20 -9
- data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.c +28 -236
- data/src/core/ext/transport/chttp2/transport/bin_decoder.c +31 -27
- data/src/core/ext/transport/chttp2/transport/bin_decoder.h +5 -4
- data/src/core/ext/transport/chttp2/transport/bin_encoder.c +25 -22
- data/src/core/ext/transport/chttp2/transport/bin_encoder.h +8 -7
- data/src/core/ext/transport/chttp2/transport/chttp2_plugin.c +0 -3
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.c +1345 -1521
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +3 -1
- data/src/core/ext/transport/chttp2/transport/frame.h +3 -5
- data/src/core/ext/transport/chttp2/transport/frame_data.c +50 -47
- data/src/core/ext/transport/chttp2/transport/frame_data.h +8 -9
- data/src/core/ext/transport/chttp2/transport/frame_goaway.c +19 -21
- data/src/core/ext/transport/chttp2/transport/frame_goaway.h +9 -8
- data/src/core/ext/transport/chttp2/transport/frame_ping.c +13 -12
- data/src/core/ext/transport/chttp2/transport/frame_ping.h +6 -6
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.c +31 -19
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +8 -7
- data/src/core/ext/transport/chttp2/transport/frame_settings.c +22 -25
- data/src/core/ext/transport/chttp2/transport/frame_settings.h +9 -8
- data/src/core/ext/transport/chttp2/transport/frame_window_update.c +26 -18
- data/src/core/ext/transport/chttp2/transport/frame_window_update.h +5 -6
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.c +68 -58
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +8 -5
- data/src/core/ext/transport/chttp2/transport/hpack_parser.c +327 -214
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +14 -9
- data/src/core/ext/transport/chttp2/transport/hpack_table.c +24 -19
- data/src/core/ext/transport/chttp2/transport/hpack_table.h +9 -6
- data/src/core/ext/transport/chttp2/transport/incoming_metadata.c +2 -2
- data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +1 -1
- data/src/core/ext/transport/chttp2/transport/internal.h +284 -436
- data/src/core/ext/transport/chttp2/transport/parsing.c +355 -590
- data/src/core/ext/transport/chttp2/transport/stream_lists.c +36 -309
- data/src/core/ext/transport/chttp2/transport/stream_map.c +13 -34
- data/src/core/ext/transport/chttp2/transport/stream_map.h +3 -4
- data/src/core/ext/transport/chttp2/transport/writing.c +174 -286
- data/src/core/lib/channel/channel_args.c +70 -13
- data/src/core/lib/channel/channel_args.h +28 -2
- data/src/core/lib/channel/channel_stack.c +77 -28
- data/src/core/lib/channel/channel_stack.h +61 -23
- data/src/core/lib/channel/channel_stack_builder.c +33 -25
- data/src/core/lib/channel/channel_stack_builder.h +17 -8
- data/src/core/lib/channel/compress_filter.c +52 -36
- data/src/core/lib/channel/connected_channel.c +20 -12
- data/src/core/lib/channel/connected_channel.h +2 -1
- data/src/core/lib/channel/context.h +13 -1
- data/src/core/lib/channel/deadline_filter.c +344 -0
- data/src/core/lib/channel/deadline_filter.h +99 -0
- data/src/core/lib/channel/handshaker.c +240 -0
- data/src/core/lib/channel/handshaker.h +164 -0
- data/src/core/lib/{security/credentials/google_default/credentials_windows.c → channel/handshaker_factory.c} +16 -23
- data/src/core/lib/channel/handshaker_factory.h +66 -0
- data/src/core/lib/channel/handshaker_registry.c +113 -0
- data/src/core/{ext/client_config/client_config.h → lib/channel/handshaker_registry.h} +26 -16
- data/src/core/lib/channel/http_client_filter.c +248 -46
- data/src/core/lib/channel/http_client_filter.h +3 -0
- data/src/core/lib/channel/http_server_filter.c +136 -24
- data/src/core/lib/channel/message_size_filter.c +261 -0
- data/src/core/lib/channel/message_size_filter.h +39 -0
- data/src/core/lib/compression/message_compress.c +43 -37
- data/src/core/lib/compression/message_compress.h +7 -5
- data/src/core/lib/http/format_request.c +26 -11
- data/src/core/lib/http/format_request.h +7 -5
- data/src/core/lib/http/httpcli.c +45 -27
- data/src/core/lib/http/httpcli.h +4 -4
- data/src/core/lib/http/httpcli_security_connector.c +56 -46
- data/src/core/lib/http/parser.c +17 -14
- data/src/core/lib/http/parser.h +4 -2
- data/src/core/lib/iomgr/closure.c +49 -7
- data/src/core/lib/iomgr/closure.h +56 -14
- data/src/core/lib/iomgr/combiner.c +422 -0
- data/src/core/lib/iomgr/combiner.h +64 -0
- data/src/core/lib/iomgr/endpoint.c +8 -2
- data/src/core/lib/iomgr/endpoint.h +17 -7
- data/src/core/lib/iomgr/endpoint_pair.h +3 -2
- data/src/core/lib/iomgr/endpoint_pair_posix.c +9 -8
- data/src/core/{ext/client_config/lb_policy_factory.c → lib/iomgr/endpoint_pair_uv.c} +18 -13
- data/src/core/lib/iomgr/endpoint_pair_windows.c +7 -6
- data/src/core/lib/iomgr/error.c +72 -6
- data/src/core/lib/iomgr/error.h +30 -3
- data/src/core/lib/iomgr/ev_epoll_linux.c +500 -382
- data/src/core/lib/iomgr/ev_epoll_linux.h +3 -2
- data/src/core/lib/iomgr/ev_poll_posix.c +317 -30
- data/src/core/lib/iomgr/ev_poll_posix.h +1 -0
- data/src/core/lib/iomgr/ev_posix.c +26 -5
- data/src/core/lib/iomgr/ev_posix.h +12 -1
- data/src/core/lib/iomgr/exec_ctx.c +27 -94
- data/src/core/lib/iomgr/exec_ctx.h +19 -22
- data/src/core/lib/iomgr/executor.c +29 -8
- data/src/core/lib/iomgr/executor.h +2 -4
- data/src/core/lib/iomgr/iocp_windows.c +3 -4
- data/src/core/lib/iomgr/iomgr.c +14 -10
- data/src/core/lib/iomgr/iomgr.h +6 -2
- data/src/core/lib/iomgr/iomgr_posix.c +2 -2
- data/src/core/lib/iomgr/iomgr_uv.c +49 -0
- data/src/core/lib/iomgr/iomgr_windows.c +2 -2
- data/src/core/lib/iomgr/load_file.c +3 -3
- data/src/core/lib/iomgr/load_file.h +2 -2
- data/src/core/lib/iomgr/network_status_tracker.c +1 -1
- data/src/core/lib/iomgr/pollset_set_uv.c +62 -0
- data/src/core/lib/iomgr/pollset_set_windows.c +3 -3
- data/src/core/lib/iomgr/pollset_uv.c +142 -0
- data/src/core/lib/iomgr/pollset_uv.h +42 -0
- data/src/core/lib/iomgr/pollset_windows.c +5 -6
- data/src/core/lib/iomgr/port.h +129 -0
- data/src/core/lib/iomgr/resolve_address.h +2 -1
- data/src/core/lib/iomgr/resolve_address_posix.c +14 -13
- data/src/core/lib/iomgr/resolve_address_uv.c +233 -0
- data/src/core/lib/iomgr/resolve_address_windows.c +14 -12
- data/src/core/lib/iomgr/resource_quota.c +832 -0
- data/src/core/lib/iomgr/resource_quota.h +159 -0
- data/src/core/lib/iomgr/sockaddr.h +10 -2
- data/src/core/lib/iomgr/sockaddr_utils.c +63 -36
- data/src/core/lib/iomgr/sockaddr_utils.h +14 -14
- data/src/core/lib/iomgr/socket_mutator.c +98 -0
- data/src/core/lib/iomgr/socket_mutator.h +80 -0
- data/src/core/lib/iomgr/socket_utils.h +42 -0
- data/src/core/lib/iomgr/socket_utils_common_posix.c +28 -13
- data/src/core/lib/iomgr/socket_utils_linux.c +11 -5
- data/src/core/lib/iomgr/socket_utils_posix.c +10 -7
- data/src/core/lib/iomgr/socket_utils_posix.h +11 -4
- data/src/core/lib/iomgr/socket_utils_uv.c +49 -0
- data/src/core/lib/iomgr/socket_utils_windows.c +52 -0
- data/src/core/lib/iomgr/socket_windows.c +14 -6
- data/src/core/lib/iomgr/socket_windows.h +1 -0
- data/src/core/lib/iomgr/tcp_client.h +8 -2
- data/src/core/lib/iomgr/tcp_client_posix.c +131 -82
- data/src/core/lib/iomgr/tcp_client_posix.h +45 -0
- data/src/core/lib/iomgr/tcp_client_uv.c +190 -0
- data/src/core/lib/iomgr/tcp_client_windows.c +54 -30
- data/src/core/lib/iomgr/tcp_posix.c +135 -56
- data/src/core/lib/iomgr/tcp_posix.h +2 -2
- data/src/core/lib/iomgr/tcp_server.h +14 -6
- data/src/core/lib/iomgr/tcp_server_posix.c +154 -118
- data/src/core/lib/iomgr/tcp_server_uv.c +388 -0
- data/src/core/lib/iomgr/tcp_server_windows.c +127 -100
- data/src/core/lib/iomgr/tcp_uv.c +367 -0
- data/src/core/lib/iomgr/tcp_uv.h +59 -0
- data/src/core/lib/iomgr/tcp_windows.c +65 -48
- data/src/core/lib/iomgr/tcp_windows.h +3 -1
- data/src/core/lib/iomgr/timer.h +21 -21
- data/src/core/lib/iomgr/{timer.c → timer_generic.c} +15 -10
- data/src/core/lib/iomgr/timer_generic.h +49 -0
- data/src/core/lib/iomgr/timer_heap.c +6 -0
- data/src/core/lib/iomgr/timer_uv.c +99 -0
- data/src/core/lib/iomgr/timer_uv.h +47 -0
- data/src/core/lib/iomgr/udp_server.c +116 -98
- data/src/core/lib/iomgr/udp_server.h +5 -3
- data/src/core/lib/iomgr/unix_sockets_posix.c +14 -6
- data/src/core/lib/iomgr/unix_sockets_posix.h +6 -5
- data/src/core/lib/iomgr/unix_sockets_posix_noop.c +4 -4
- data/src/core/lib/iomgr/wakeup_fd_cv.c +118 -0
- data/src/core/lib/iomgr/wakeup_fd_cv.h +80 -0
- data/src/core/lib/iomgr/wakeup_fd_eventfd.c +3 -3
- data/src/core/lib/iomgr/wakeup_fd_nospecial.c +3 -3
- data/src/core/lib/iomgr/wakeup_fd_pipe.c +12 -6
- data/src/core/lib/iomgr/wakeup_fd_posix.c +34 -5
- data/src/core/lib/iomgr/wakeup_fd_posix.h +5 -0
- data/src/core/lib/iomgr/workqueue.h +12 -20
- data/src/core/{ext/client_config/client_config.c → lib/iomgr/workqueue_uv.c} +24 -33
- data/{include/grpc/support/slice.h → src/core/lib/iomgr/workqueue_uv.h} +4 -6
- data/src/core/lib/iomgr/workqueue_windows.c +9 -8
- data/src/core/lib/json/json.c +3 -3
- data/src/core/lib/json/json.h +11 -11
- data/src/core/lib/json/json_reader.c +9 -5
- data/src/core/lib/profiling/basic_timers.c +10 -1
- data/src/core/lib/profiling/timers.h +2 -0
- data/src/core/lib/security/context/security_context.c +13 -3
- data/src/core/lib/security/context/security_context.h +20 -0
- data/src/core/lib/security/credentials/composite/composite_credentials.c +28 -14
- data/src/core/lib/security/credentials/composite/composite_credentials.h +2 -2
- data/src/core/lib/security/credentials/credentials.c +48 -19
- data/src/core/lib/security/credentials/credentials.h +36 -19
- data/src/core/lib/security/credentials/credentials_metadata.c +11 -8
- data/src/core/lib/security/credentials/fake/fake_credentials.c +15 -11
- data/src/core/lib/security/credentials/google_default/{credentials_posix.c → credentials_generic.c} +7 -14
- data/src/core/lib/security/credentials/google_default/google_default_credentials.c +33 -21
- data/src/core/lib/security/credentials/google_default/google_default_credentials.h +14 -0
- data/src/core/lib/security/credentials/iam/iam_credentials.c +3 -2
- data/src/core/lib/security/credentials/jwt/json_token.c +1 -0
- data/src/core/lib/security/credentials/jwt/json_token.h +1 -1
- data/src/core/lib/security/credentials/jwt/jwt_credentials.c +54 -19
- data/src/core/lib/security/credentials/jwt/jwt_credentials.h +2 -1
- data/src/core/lib/security/credentials/jwt/jwt_verifier.c +129 -79
- data/src/core/lib/security/credentials/jwt/jwt_verifier.h +9 -6
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.c +63 -28
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +1 -1
- data/src/core/lib/security/credentials/plugin/plugin_credentials.c +32 -11
- data/src/core/lib/security/credentials/ssl/ssl_credentials.c +13 -9
- data/src/core/lib/security/transport/client_auth_filter.c +33 -27
- data/src/core/lib/security/transport/secure_endpoint.c +93 -68
- data/src/core/lib/security/transport/secure_endpoint.h +2 -2
- data/src/core/lib/security/transport/security_connector.c +133 -168
- data/src/core/lib/security/transport/security_connector.h +31 -46
- data/src/core/lib/security/transport/security_handshaker.c +501 -0
- data/src/core/lib/security/transport/{handshake.h → security_handshaker.h} +10 -10
- data/src/core/lib/security/transport/server_auth_filter.c +50 -38
- data/src/core/lib/security/util/b64.c +11 -8
- data/src/core/lib/security/util/b64.h +5 -4
- data/src/core/lib/slice/percent_encoding.c +182 -0
- data/src/core/lib/slice/percent_encoding.h +78 -0
- data/src/core/lib/{support → slice}/slice.c +81 -50
- data/src/core/lib/{support → slice}/slice_buffer.c +78 -60
- data/src/core/lib/slice/slice_internal.h +49 -0
- data/src/core/lib/slice/slice_string_helpers.c +90 -0
- data/src/core/lib/{iomgr/workqueue_posix.h → slice/slice_string_helpers.h} +18 -18
- data/src/core/lib/support/backoff.c +24 -13
- data/src/core/lib/support/backoff.h +5 -2
- data/src/core/lib/support/env.h +0 -2
- data/src/core/lib/support/log.c +5 -4
- data/src/core/lib/support/log_linux.c +0 -1
- data/src/core/lib/support/log_posix.c +1 -1
- data/src/core/lib/support/mpscq.c +83 -0
- data/src/core/lib/support/mpscq.h +65 -0
- data/src/core/lib/support/string.c +58 -49
- data/src/core/lib/support/string.h +11 -8
- data/src/core/lib/support/subprocess_posix.c +5 -2
- data/src/core/lib/support/thd.c +1 -1
- data/src/core/lib/support/time.c +43 -79
- data/src/core/lib/support/time_posix.c +1 -1
- data/src/core/lib/support/tmpfile.h +0 -2
- data/src/core/lib/surface/alarm.c +4 -1
- data/src/core/lib/surface/byte_buffer.c +17 -11
- data/src/core/lib/surface/byte_buffer_reader.c +23 -15
- data/src/core/lib/surface/call.c +294 -276
- data/src/core/lib/surface/call.h +24 -9
- data/src/core/lib/surface/call_log_batch.c +5 -3
- data/src/core/lib/surface/channel.c +127 -111
- data/src/core/lib/surface/channel.h +14 -5
- data/src/core/lib/surface/channel_init.c +1 -1
- data/src/core/lib/surface/channel_init.h +10 -1
- data/src/core/lib/surface/channel_ping.c +7 -6
- data/src/core/lib/surface/completion_queue.c +154 -18
- data/src/core/lib/surface/completion_queue.h +5 -0
- data/src/core/lib/surface/init.c +40 -6
- data/src/core/lib/surface/init.h +1 -0
- data/src/core/lib/surface/init_secure.c +5 -2
- data/src/core/lib/surface/lame_client.c +28 -18
- data/src/core/lib/surface/server.c +134 -87
- data/src/core/lib/surface/server.h +8 -0
- data/src/core/lib/surface/validate_metadata.c +1 -1
- data/src/core/lib/surface/version.c +3 -1
- data/src/core/lib/transport/byte_stream.c +7 -4
- data/src/core/lib/transport/byte_stream.h +6 -10
- data/src/core/lib/transport/connectivity_state.c +21 -12
- data/src/core/lib/transport/connectivity_state.h +4 -1
- data/src/core/lib/transport/mdstr_hash_table.c +118 -0
- data/src/core/lib/transport/mdstr_hash_table.h +77 -0
- data/src/core/lib/transport/metadata.c +83 -60
- data/src/core/lib/transport/metadata.h +41 -23
- data/src/core/lib/transport/metadata_batch.c +17 -11
- data/src/core/lib/transport/metadata_batch.h +20 -6
- data/src/core/lib/transport/pid_controller.c +57 -0
- data/src/core/lib/transport/pid_controller.h +64 -0
- data/src/core/lib/transport/service_config.c +251 -0
- data/src/core/lib/transport/service_config.h +71 -0
- data/src/core/lib/transport/static_metadata.c +18 -16
- data/src/core/lib/transport/static_metadata.h +113 -107
- data/src/core/{ext/transport/chttp2 → lib}/transport/timeout_encoding.c +3 -3
- data/src/core/{ext/transport/chttp2 → lib}/transport/timeout_encoding.h +7 -7
- data/src/core/lib/transport/transport.c +84 -23
- data/src/core/lib/transport/transport.h +53 -8
- data/src/core/lib/transport/transport_impl.h +3 -0
- data/src/core/lib/transport/transport_op_string.c +92 -20
- data/src/core/lib/tsi/ssl_transport_security.c +3 -1
- data/src/core/plugin_registry/grpc_plugin_registry.c +8 -4
- data/src/ruby/ext/grpc/extconf.rb +0 -1
- data/src/ruby/ext/grpc/rb_byte_buffer.c +8 -7
- data/src/ruby/ext/grpc/rb_call.c +15 -5
- data/src/ruby/ext/grpc/rb_channel.c +1 -1
- data/src/ruby/ext/grpc/rb_compression_options.c +466 -0
- data/src/{core/ext/client_config/default_initial_connect_string.c → ruby/ext/grpc/rb_compression_options.h} +10 -5
- data/src/ruby/ext/grpc/rb_grpc.c +3 -1
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +198 -190
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +306 -294
- data/src/ruby/ext/grpc/rb_server.c +18 -12
- data/src/ruby/lib/grpc/errors.rb +154 -2
- data/src/ruby/lib/grpc/generic/active_call.rb +144 -63
- data/src/ruby/lib/grpc/generic/bidi_call.rb +18 -2
- data/src/ruby/lib/grpc/generic/client_stub.rb +7 -5
- data/src/ruby/lib/grpc/generic/rpc_desc.rb +39 -13
- data/src/ruby/lib/grpc/generic/rpc_server.rb +51 -24
- data/src/ruby/lib/grpc/generic/service.rb +3 -2
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/pb/grpc/health/checker.rb +3 -1
- data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +7 -0
- data/src/ruby/pb/test/client.rb +307 -7
- data/src/ruby/pb/test/server.rb +26 -1
- data/src/ruby/spec/compression_options_spec.rb +164 -0
- data/src/ruby/spec/error_sanity_spec.rb +64 -0
- data/src/ruby/spec/generic/active_call_spec.rb +290 -12
- data/src/ruby/spec/generic/client_stub_spec.rb +91 -41
- data/src/ruby/spec/generic/rpc_desc_spec.rb +36 -16
- data/src/ruby/spec/generic/rpc_server_pool_spec.rb +22 -28
- data/src/ruby/spec/generic/rpc_server_spec.rb +6 -6
- data/src/ruby/spec/pb/health/checker_spec.rb +27 -19
- data/src/ruby/spec/spec_helper.rb +2 -0
- data/third_party/boringssl/crypto/aes/aes.c +12 -12
- data/third_party/boringssl/crypto/aes/mode_wrappers.c +6 -2
- data/third_party/boringssl/crypto/asn1/a_d2i_fp.c +28 -13
- data/third_party/boringssl/crypto/asn1/a_gentm.c +2 -0
- data/third_party/boringssl/crypto/asn1/a_object.c +7 -3
- data/third_party/boringssl/crypto/asn1/a_strnid.c +1 -0
- data/third_party/boringssl/crypto/asn1/a_time.c +0 -11
- data/third_party/boringssl/crypto/asn1/a_type.c +0 -2
- data/third_party/boringssl/crypto/asn1/a_utctm.c +1 -30
- data/third_party/boringssl/crypto/asn1/asn1_lib.c +56 -76
- data/third_party/boringssl/crypto/asn1/asn1_locl.h +0 -10
- data/third_party/boringssl/crypto/asn1/asn1_par.c +0 -322
- data/third_party/boringssl/crypto/asn1/f_enum.c +1 -108
- data/third_party/boringssl/crypto/asn1/f_int.c +1 -106
- data/third_party/boringssl/crypto/asn1/f_string.c +1 -106
- data/third_party/boringssl/crypto/asn1/tasn_dec.c +10 -14
- data/third_party/boringssl/crypto/asn1/tasn_enc.c +17 -11
- data/third_party/boringssl/crypto/asn1/tasn_typ.c +29 -42
- data/third_party/boringssl/crypto/asn1/tasn_utl.c +1 -1
- data/third_party/boringssl/crypto/base64/base64.c +249 -285
- data/third_party/boringssl/crypto/bio/bio.c +13 -23
- data/third_party/boringssl/crypto/bio/bio_mem.c +3 -2
- data/third_party/boringssl/crypto/bio/connect.c +12 -3
- data/third_party/boringssl/crypto/bio/fd.c +22 -15
- data/third_party/boringssl/crypto/bio/file.c +2 -38
- data/third_party/boringssl/crypto/bio/hexdump.c +1 -2
- data/third_party/boringssl/crypto/bio/internal.h +3 -0
- data/third_party/boringssl/crypto/bio/pair.c +1 -1
- data/third_party/boringssl/crypto/bio/socket.c +10 -2
- data/third_party/boringssl/crypto/bio/socket_helper.c +2 -2
- data/third_party/boringssl/crypto/bn/asm/x86_64-gcc.c +0 -8
- data/third_party/boringssl/crypto/bn/bn.c +38 -0
- data/third_party/boringssl/crypto/bn/cmp.c +25 -0
- data/third_party/boringssl/crypto/bn/convert.c +73 -76
- data/third_party/boringssl/crypto/bn/div.c +136 -70
- data/third_party/boringssl/crypto/bn/exponentiation.c +86 -381
- data/third_party/boringssl/crypto/bn/gcd.c +213 -296
- data/third_party/boringssl/crypto/bn/generic.c +0 -80
- data/third_party/boringssl/crypto/bn/internal.h +15 -3
- data/third_party/boringssl/crypto/bn/montgomery.c +57 -207
- data/third_party/boringssl/crypto/bn/montgomery_inv.c +160 -0
- data/third_party/boringssl/crypto/bn/mul.c +2 -1
- data/third_party/boringssl/crypto/bn/prime.c +24 -8
- data/third_party/boringssl/crypto/bn/random.c +47 -33
- data/third_party/boringssl/crypto/bn/sqrt.c +4 -5
- data/third_party/boringssl/crypto/buf/buf.c +25 -21
- data/third_party/boringssl/crypto/bytestring/ber.c +1 -0
- data/third_party/boringssl/crypto/bytestring/cbb.c +50 -22
- data/third_party/boringssl/crypto/bytestring/cbs.c +28 -4
- data/third_party/boringssl/crypto/chacha/{chacha_generic.c → chacha.c} +56 -29
- data/third_party/boringssl/crypto/cipher/aead.c +11 -22
- data/third_party/boringssl/crypto/cipher/cipher.c +2 -2
- data/third_party/boringssl/crypto/cipher/e_aes.c +53 -103
- data/third_party/boringssl/crypto/cipher/e_chacha20poly1305.c +2 -8
- data/third_party/boringssl/crypto/cipher/e_des.c +3 -5
- data/third_party/boringssl/crypto/cipher/e_null.c +1 -1
- data/third_party/boringssl/crypto/cipher/e_rc2.c +1 -1
- data/third_party/boringssl/crypto/cipher/e_rc4.c +1 -1
- data/third_party/boringssl/crypto/cipher/e_ssl3.c +3 -63
- data/third_party/boringssl/crypto/cipher/e_tls.c +12 -83
- data/third_party/boringssl/crypto/cipher/internal.h +8 -10
- data/third_party/boringssl/crypto/cipher/tls_cbc.c +69 -40
- data/third_party/boringssl/crypto/conf/conf.c +2 -1
- data/third_party/boringssl/crypto/cpu-aarch64-linux.c +61 -0
- data/third_party/boringssl/crypto/cpu-arm-linux.c +360 -0
- data/third_party/boringssl/crypto/cpu-arm.c +0 -161
- data/third_party/boringssl/crypto/cpu-intel.c +5 -3
- data/third_party/boringssl/{ssl/test/scoped_types.h → crypto/cpu-ppc64le.c} +21 -9
- data/third_party/boringssl/crypto/crypto.c +29 -7
- data/third_party/boringssl/crypto/curve25519/curve25519.c +284 -242
- data/third_party/boringssl/crypto/curve25519/internal.h +64 -0
- data/third_party/boringssl/crypto/curve25519/spake25519.c +464 -0
- data/third_party/boringssl/crypto/curve25519/x25519-x86_64.c +21 -0
- data/third_party/boringssl/crypto/dh/check.c +22 -6
- data/third_party/boringssl/crypto/dh/dh.c +45 -21
- data/third_party/boringssl/crypto/dh/dh_asn1.c +96 -20
- data/third_party/boringssl/crypto/dh/params.c +30 -78
- data/third_party/boringssl/crypto/digest/digest.c +3 -3
- data/third_party/boringssl/crypto/dsa/dsa.c +59 -29
- data/third_party/boringssl/crypto/dsa/dsa_asn1.c +4 -0
- data/third_party/boringssl/crypto/ec/ec.c +84 -140
- data/third_party/boringssl/crypto/ec/ec_asn1.c +82 -52
- data/third_party/boringssl/crypto/ec/ec_key.c +15 -15
- data/third_party/boringssl/crypto/ec/ec_montgomery.c +87 -50
- data/third_party/boringssl/crypto/ec/internal.h +12 -36
- data/third_party/boringssl/crypto/ec/oct.c +11 -11
- data/third_party/boringssl/crypto/ec/p224-64.c +59 -116
- data/third_party/boringssl/crypto/ec/p256-64.c +88 -163
- data/third_party/boringssl/crypto/ec/p256-x86_64.c +46 -58
- data/third_party/boringssl/crypto/ec/simple.c +81 -201
- data/third_party/boringssl/crypto/ec/util-64.c +0 -74
- data/third_party/boringssl/crypto/ecdh/ecdh.c +7 -1
- data/third_party/boringssl/crypto/ecdsa/ecdsa.c +28 -46
- data/third_party/boringssl/crypto/ecdsa/ecdsa_asn1.c +1 -0
- data/third_party/boringssl/crypto/engine/engine.c +1 -1
- data/third_party/boringssl/crypto/err/err.c +3 -3
- data/third_party/boringssl/crypto/evp/evp.c +14 -59
- data/third_party/boringssl/crypto/evp/evp_asn1.c +144 -87
- data/third_party/boringssl/crypto/evp/evp_ctx.c +7 -7
- data/third_party/boringssl/crypto/evp/internal.h +4 -46
- data/third_party/boringssl/crypto/evp/p_dsa_asn1.c +8 -157
- data/third_party/boringssl/crypto/evp/p_ec.c +1 -1
- data/third_party/boringssl/crypto/evp/p_ec_asn1.c +22 -170
- data/third_party/boringssl/crypto/evp/p_rsa.c +1 -1
- data/third_party/boringssl/crypto/evp/p_rsa_asn1.c +10 -548
- data/third_party/boringssl/crypto/evp/print.c +520 -0
- data/third_party/boringssl/crypto/ex_data.c +4 -6
- data/third_party/boringssl/crypto/hkdf/hkdf.c +38 -17
- data/third_party/boringssl/crypto/hmac/hmac.c +6 -6
- data/third_party/boringssl/crypto/internal.h +57 -77
- data/third_party/boringssl/crypto/lhash/lhash.c +6 -10
- data/third_party/boringssl/crypto/md4/md4.c +9 -0
- data/third_party/boringssl/crypto/mem.c +19 -19
- data/third_party/boringssl/crypto/modes/cfb.c +5 -6
- data/third_party/boringssl/crypto/modes/ctr.c +10 -18
- data/third_party/boringssl/crypto/modes/gcm.c +100 -66
- data/third_party/boringssl/crypto/modes/internal.h +15 -27
- data/third_party/boringssl/crypto/modes/ofb.c +9 -22
- data/third_party/boringssl/crypto/newhope/error_correction.c +131 -0
- data/third_party/boringssl/crypto/newhope/internal.h +71 -0
- data/third_party/boringssl/crypto/newhope/newhope.c +174 -0
- data/third_party/boringssl/crypto/newhope/ntt.c +148 -0
- data/third_party/boringssl/crypto/newhope/poly.c +183 -0
- data/third_party/boringssl/crypto/newhope/precomp.c +306 -0
- data/third_party/boringssl/crypto/newhope/reduce.c +42 -0
- data/third_party/boringssl/crypto/obj/obj.c +111 -135
- data/third_party/boringssl/crypto/obj/obj_dat.h +4 -10
- data/third_party/boringssl/crypto/pem/pem_lib.c +6 -43
- data/third_party/boringssl/crypto/pem/pem_pkey.c +10 -19
- data/third_party/boringssl/crypto/pkcs8/p5_pbe.c +1 -0
- data/third_party/boringssl/crypto/pkcs8/p5_pbev2.c +2 -1
- data/third_party/boringssl/crypto/pkcs8/p8_pkey.c +2 -2
- data/third_party/boringssl/crypto/pkcs8/pkcs8.c +95 -87
- data/third_party/boringssl/crypto/{test/test_util.h → poly1305/internal.h} +15 -10
- data/third_party/boringssl/crypto/poly1305/poly1305.c +8 -15
- data/third_party/boringssl/crypto/poly1305/poly1305_arm.c +1 -0
- data/third_party/boringssl/crypto/poly1305/poly1305_vec.c +3 -3
- data/third_party/boringssl/crypto/rand/deterministic.c +47 -0
- data/third_party/boringssl/crypto/rand/rand.c +4 -1
- data/third_party/boringssl/crypto/rand/urandom.c +5 -7
- data/third_party/boringssl/crypto/rand/windows.c +5 -8
- data/third_party/boringssl/crypto/rc4/rc4.c +24 -209
- data/third_party/boringssl/crypto/refcount_lock.c +2 -2
- data/third_party/boringssl/crypto/rsa/blinding.c +74 -232
- data/third_party/boringssl/crypto/rsa/internal.h +5 -13
- data/third_party/boringssl/crypto/rsa/padding.c +64 -63
- data/third_party/boringssl/crypto/rsa/rsa.c +50 -28
- data/third_party/boringssl/crypto/rsa/rsa_asn1.c +8 -16
- data/third_party/boringssl/crypto/rsa/rsa_impl.c +134 -122
- data/third_party/boringssl/crypto/sha/sha256.c +2 -2
- data/third_party/boringssl/crypto/sha/sha512.c +7 -7
- data/third_party/boringssl/crypto/stack/stack.c +13 -22
- data/third_party/boringssl/crypto/thread.c +21 -12
- data/third_party/boringssl/crypto/thread_none.c +6 -2
- data/third_party/boringssl/crypto/thread_pthread.c +16 -7
- data/third_party/boringssl/crypto/thread_win.c +38 -85
- data/third_party/boringssl/crypto/x509/a_sign.c +3 -3
- data/third_party/boringssl/crypto/x509/a_strex.c +1 -1
- data/third_party/boringssl/crypto/x509/a_verify.c +2 -2
- data/third_party/boringssl/crypto/{evp → x509}/algorithm.c +37 -53
- data/third_party/boringssl/crypto/x509/asn1_gen.c +1 -2
- data/third_party/boringssl/crypto/x509/by_dir.c +6 -6
- data/third_party/boringssl/crypto/x509/internal.h +66 -0
- data/third_party/boringssl/crypto/x509/rsa_pss.c +385 -0
- data/third_party/boringssl/crypto/x509/t_x509.c +10 -12
- data/third_party/boringssl/crypto/x509/x509.c +5 -0
- data/third_party/boringssl/crypto/x509/x509_att.c +9 -3
- data/third_party/boringssl/crypto/x509/x509_lu.c +34 -44
- data/third_party/boringssl/crypto/x509/x509_obj.c +19 -2
- data/third_party/boringssl/crypto/x509/x509_r2x.c +9 -5
- data/third_party/boringssl/crypto/x509/x509_set.c +5 -0
- data/third_party/boringssl/crypto/x509/x509_txt.c +5 -0
- data/third_party/boringssl/crypto/x509/x509_vfy.c +63 -32
- data/third_party/boringssl/crypto/x509/x509_vpm.c +29 -18
- data/third_party/boringssl/crypto/x509/x509cset.c +2 -1
- data/third_party/boringssl/crypto/x509/x_crl.c +2 -2
- data/third_party/boringssl/crypto/x509/x_name.c +14 -17
- data/third_party/boringssl/crypto/x509/x_pubkey.c +10 -7
- data/third_party/boringssl/crypto/x509/x_x509.c +67 -6
- data/third_party/boringssl/crypto/x509v3/pcy_cache.c +2 -2
- data/third_party/boringssl/crypto/x509v3/pcy_tree.c +2 -1
- data/third_party/boringssl/crypto/x509v3/v3_conf.c +4 -3
- data/third_party/boringssl/crypto/x509v3/v3_cpols.c +5 -0
- data/third_party/boringssl/crypto/x509v3/v3_prn.c +0 -3
- data/third_party/boringssl/crypto/x509v3/v3_purp.c +2 -2
- data/third_party/boringssl/crypto/x509v3/v3_utl.c +2 -1
- data/third_party/boringssl/include/openssl/aead.h +72 -73
- data/third_party/boringssl/include/openssl/arm_arch.h +0 -6
- data/third_party/boringssl/include/openssl/asn1.h +103 -235
- data/third_party/boringssl/include/openssl/asn1_mac.h +17 -74
- data/third_party/boringssl/include/openssl/asn1t.h +1 -11
- data/third_party/boringssl/include/openssl/base.h +145 -3
- data/third_party/boringssl/include/openssl/base64.h +20 -17
- data/third_party/boringssl/include/openssl/bio.h +59 -34
- data/third_party/boringssl/include/openssl/bn.h +118 -51
- data/third_party/boringssl/include/openssl/buf.h +15 -0
- data/third_party/boringssl/include/openssl/bytestring.h +52 -4
- data/third_party/boringssl/include/openssl/chacha.h +2 -2
- data/third_party/boringssl/include/openssl/cipher.h +18 -1
- data/third_party/boringssl/include/openssl/cmac.h +11 -0
- data/third_party/boringssl/include/openssl/conf.h +13 -2
- data/third_party/boringssl/include/openssl/cpu.h +20 -23
- data/third_party/boringssl/include/openssl/crypto.h +22 -1
- data/third_party/boringssl/include/openssl/curve25519.h +96 -4
- data/third_party/boringssl/include/openssl/dh.h +71 -16
- data/third_party/boringssl/include/openssl/digest.h +38 -11
- data/third_party/boringssl/include/openssl/dsa.h +40 -4
- data/third_party/boringssl/include/openssl/ec.h +44 -18
- data/third_party/boringssl/include/openssl/ec_key.h +27 -6
- data/third_party/boringssl/include/openssl/ecdsa.h +11 -0
- data/third_party/boringssl/include/openssl/engine.h +11 -0
- data/third_party/boringssl/include/openssl/evp.h +52 -88
- data/third_party/boringssl/include/openssl/hkdf.h +24 -4
- data/third_party/boringssl/include/openssl/hmac.h +20 -6
- data/third_party/boringssl/include/openssl/md4.h +4 -0
- data/third_party/boringssl/include/openssl/mem.h +19 -0
- data/third_party/boringssl/include/openssl/newhope.h +158 -0
- data/third_party/boringssl/include/openssl/nid.h +4166 -0
- data/third_party/boringssl/include/openssl/obj.h +31 -3
- data/third_party/boringssl/include/openssl/obj_mac.h +17 -4143
- data/third_party/boringssl/include/openssl/{opensslfeatures.h → opensslconf.h} +3 -3
- data/third_party/boringssl/include/openssl/pem.h +5 -0
- data/third_party/boringssl/include/openssl/pkcs8.h +12 -0
- data/third_party/boringssl/include/openssl/rand.h +6 -0
- data/third_party/boringssl/include/openssl/rc4.h +6 -0
- data/third_party/boringssl/{crypto/dh/internal.h → include/openssl/ripemd.h} +38 -11
- data/third_party/boringssl/include/openssl/rsa.h +127 -65
- data/third_party/boringssl/include/openssl/sha.h +14 -10
- data/third_party/boringssl/include/openssl/ssl.h +561 -275
- data/third_party/boringssl/include/openssl/ssl3.h +18 -25
- data/third_party/boringssl/include/openssl/stack.h +2 -4
- data/third_party/boringssl/include/openssl/stack_macros.h +321 -353
- data/third_party/boringssl/include/openssl/thread.h +31 -13
- data/third_party/boringssl/include/openssl/time_support.h +1 -0
- data/third_party/boringssl/include/openssl/tls1.h +37 -33
- data/third_party/boringssl/include/openssl/x509.h +69 -26
- data/third_party/boringssl/include/openssl/x509_vfy.h +12 -10
- data/third_party/boringssl/include/openssl/x509v3.h +23 -2
- data/third_party/boringssl/ssl/custom_extensions.c +3 -5
- data/third_party/boringssl/ssl/d1_both.c +463 -499
- data/third_party/boringssl/ssl/d1_lib.c +38 -109
- data/third_party/boringssl/ssl/d1_pkt.c +173 -334
- data/third_party/boringssl/ssl/d1_srtp.c +20 -18
- data/third_party/boringssl/ssl/{d1_meth.c → dtls_method.c} +88 -15
- data/third_party/boringssl/ssl/dtls_record.c +27 -26
- data/third_party/boringssl/ssl/{s3_clnt.c → handshake_client.c} +816 -904
- data/third_party/boringssl/ssl/handshake_server.c +1932 -0
- data/third_party/boringssl/ssl/internal.h +712 -439
- data/third_party/boringssl/ssl/s3_both.c +445 -257
- data/third_party/boringssl/ssl/s3_enc.c +53 -36
- data/third_party/boringssl/ssl/s3_lib.c +23 -268
- data/third_party/boringssl/ssl/s3_pkt.c +168 -364
- data/third_party/boringssl/ssl/ssl_aead_ctx.c +46 -17
- data/third_party/boringssl/ssl/ssl_asn1.c +56 -26
- data/third_party/boringssl/ssl/ssl_buffer.c +16 -24
- data/third_party/boringssl/ssl/ssl_cert.c +324 -49
- data/third_party/boringssl/ssl/ssl_cipher.c +205 -150
- data/third_party/boringssl/ssl/ssl_ecdh.c +287 -51
- data/third_party/boringssl/ssl/ssl_file.c +21 -68
- data/third_party/boringssl/ssl/ssl_lib.c +881 -510
- data/third_party/boringssl/ssl/ssl_rsa.c +404 -34
- data/third_party/boringssl/ssl/ssl_session.c +324 -103
- data/third_party/boringssl/ssl/ssl_stat.c +6 -88
- data/third_party/boringssl/ssl/t1_enc.c +23 -39
- data/third_party/boringssl/ssl/t1_lib.c +1120 -622
- data/third_party/boringssl/ssl/tls13_both.c +440 -0
- data/third_party/boringssl/ssl/tls13_client.c +682 -0
- data/third_party/boringssl/ssl/tls13_enc.c +391 -0
- data/third_party/boringssl/ssl/tls13_server.c +672 -0
- data/third_party/boringssl/ssl/{s3_meth.c → tls_method.c} +100 -21
- data/third_party/boringssl/ssl/tls_record.c +159 -77
- data/third_party/nanopb/pb.h +60 -28
- data/third_party/nanopb/pb_decode.c +120 -92
- data/third_party/nanopb/pb_decode.h +3 -3
- data/third_party/nanopb/pb_encode.c +73 -67
- data/third_party/nanopb/pb_encode.h +4 -4
- metadata +155 -89
- data/include/grpc/impl/codegen/byte_buffer.h +0 -122
- data/include/grpc/impl/codegen/log.h +0 -118
- data/include/grpc/impl/codegen/time.h +0 -130
- data/src/core/ext/client_config/client_channel.c +0 -593
- data/src/core/ext/client_config/subchannel_call_holder.c +0 -272
- data/src/core/ext/client_config/subchannel_call_holder.h +0 -99
- data/src/core/lib/iomgr/ev_poll_and_epoll_posix.c +0 -2046
- data/src/core/lib/iomgr/workqueue_posix.c +0 -151
- data/src/core/lib/security/transport/handshake.c +0 -368
- data/third_party/boringssl/crypto/asn1/a_bytes.c +0 -308
- data/third_party/boringssl/crypto/asn1/bio_asn1.c +0 -477
- data/third_party/boringssl/crypto/asn1/bio_ndef.c +0 -251
- data/third_party/boringssl/crypto/asn1/t_pkey.c +0 -110
- data/third_party/boringssl/crypto/asn1/tasn_prn.c +0 -596
- data/third_party/boringssl/crypto/chacha/chacha_vec.c +0 -328
- data/third_party/boringssl/crypto/directory.h +0 -66
- data/third_party/boringssl/crypto/directory_posix.c +0 -108
- data/third_party/boringssl/crypto/directory_win.c +0 -144
- data/third_party/boringssl/crypto/test/scoped_types.h +0 -140
- data/third_party/boringssl/include/openssl/pqueue.h +0 -146
- data/third_party/boringssl/ssl/d1_clnt.c +0 -561
- data/third_party/boringssl/ssl/d1_srvr.c +0 -476
- data/third_party/boringssl/ssl/pqueue/pqueue.c +0 -197
- data/third_party/boringssl/ssl/s3_srvr.c +0 -2272
- data/third_party/boringssl/ssl/test/async_bio.h +0 -45
- data/third_party/boringssl/ssl/test/packeted_bio.h +0 -44
- data/third_party/boringssl/ssl/test/test_config.h +0 -110
@@ -34,9 +34,9 @@
|
|
34
34
|
#ifndef GRPC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_HPACK_ENCODER_H
|
35
35
|
#define GRPC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_HPACK_ENCODER_H
|
36
36
|
|
37
|
+
#include <grpc/slice.h>
|
38
|
+
#include <grpc/slice_buffer.h>
|
37
39
|
#include <grpc/support/port_platform.h>
|
38
|
-
#include <grpc/support/slice.h>
|
39
|
-
#include <grpc/support/slice_buffer.h>
|
40
40
|
#include "src/core/ext/transport/chttp2/transport/frame.h"
|
41
41
|
#include "src/core/lib/transport/metadata.h"
|
42
42
|
#include "src/core/lib/transport/metadata_batch.h"
|
@@ -83,15 +83,18 @@ typedef struct {
|
|
83
83
|
} grpc_chttp2_hpack_compressor;
|
84
84
|
|
85
85
|
void grpc_chttp2_hpack_compressor_init(grpc_chttp2_hpack_compressor *c);
|
86
|
-
void grpc_chttp2_hpack_compressor_destroy(
|
86
|
+
void grpc_chttp2_hpack_compressor_destroy(grpc_exec_ctx *exec_ctx,
|
87
|
+
grpc_chttp2_hpack_compressor *c);
|
87
88
|
void grpc_chttp2_hpack_compressor_set_max_table_size(
|
88
89
|
grpc_chttp2_hpack_compressor *c, uint32_t max_table_size);
|
89
90
|
void grpc_chttp2_hpack_compressor_set_max_usable_size(
|
90
91
|
grpc_chttp2_hpack_compressor *c, uint32_t max_table_size);
|
91
92
|
|
92
|
-
void grpc_chttp2_encode_header(
|
93
|
+
void grpc_chttp2_encode_header(grpc_exec_ctx *exec_ctx,
|
94
|
+
grpc_chttp2_hpack_compressor *c, uint32_t id,
|
93
95
|
grpc_metadata_batch *metadata, int is_eof,
|
96
|
+
size_t max_frame_size,
|
94
97
|
grpc_transport_one_way_stats *stats,
|
95
|
-
|
98
|
+
grpc_slice_buffer *outbuf);
|
96
99
|
|
97
100
|
#endif /* GRPC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_HPACK_ENCODER_H */
|
@@ -50,6 +50,7 @@
|
|
50
50
|
#include <grpc/support/useful.h>
|
51
51
|
|
52
52
|
#include "src/core/ext/transport/chttp2/transport/bin_encoder.h"
|
53
|
+
#include "src/core/ext/transport/chttp2/transport/http2_errors.h"
|
53
54
|
#include "src/core/lib/profiling/timers.h"
|
54
55
|
#include "src/core/lib/support/string.h"
|
55
56
|
|
@@ -78,69 +79,96 @@ typedef enum {
|
|
78
79
|
a set of indirect jumps, and so not waste stack space. */
|
79
80
|
|
80
81
|
/* forward declarations for parsing states */
|
81
|
-
static grpc_error *parse_begin(
|
82
|
+
static grpc_error *parse_begin(grpc_exec_ctx *exec_ctx,
|
83
|
+
grpc_chttp2_hpack_parser *p, const uint8_t *cur,
|
82
84
|
const uint8_t *end);
|
83
|
-
static grpc_error *parse_error(
|
85
|
+
static grpc_error *parse_error(grpc_exec_ctx *exec_ctx,
|
86
|
+
grpc_chttp2_hpack_parser *p, const uint8_t *cur,
|
84
87
|
const uint8_t *end, grpc_error *error);
|
85
|
-
static grpc_error *still_parse_error(
|
88
|
+
static grpc_error *still_parse_error(grpc_exec_ctx *exec_ctx,
|
89
|
+
grpc_chttp2_hpack_parser *p,
|
86
90
|
const uint8_t *cur, const uint8_t *end);
|
87
|
-
static grpc_error *parse_illegal_op(
|
91
|
+
static grpc_error *parse_illegal_op(grpc_exec_ctx *exec_ctx,
|
92
|
+
grpc_chttp2_hpack_parser *p,
|
88
93
|
const uint8_t *cur, const uint8_t *end);
|
89
94
|
|
90
|
-
static grpc_error *parse_string_prefix(
|
95
|
+
static grpc_error *parse_string_prefix(grpc_exec_ctx *exec_ctx,
|
96
|
+
grpc_chttp2_hpack_parser *p,
|
91
97
|
const uint8_t *cur, const uint8_t *end);
|
92
|
-
static grpc_error *parse_key_string(
|
98
|
+
static grpc_error *parse_key_string(grpc_exec_ctx *exec_ctx,
|
99
|
+
grpc_chttp2_hpack_parser *p,
|
93
100
|
const uint8_t *cur, const uint8_t *end);
|
94
101
|
static grpc_error *parse_value_string_with_indexed_key(
|
95
|
-
grpc_chttp2_hpack_parser *p, const uint8_t *cur,
|
102
|
+
grpc_exec_ctx *exec_ctx, grpc_chttp2_hpack_parser *p, const uint8_t *cur,
|
103
|
+
const uint8_t *end);
|
96
104
|
static grpc_error *parse_value_string_with_literal_key(
|
97
|
-
grpc_chttp2_hpack_parser *p, const uint8_t *cur,
|
105
|
+
grpc_exec_ctx *exec_ctx, grpc_chttp2_hpack_parser *p, const uint8_t *cur,
|
106
|
+
const uint8_t *end);
|
98
107
|
|
99
|
-
static grpc_error *parse_value0(
|
108
|
+
static grpc_error *parse_value0(grpc_exec_ctx *exec_ctx,
|
109
|
+
grpc_chttp2_hpack_parser *p, const uint8_t *cur,
|
100
110
|
const uint8_t *end);
|
101
|
-
static grpc_error *parse_value1(
|
111
|
+
static grpc_error *parse_value1(grpc_exec_ctx *exec_ctx,
|
112
|
+
grpc_chttp2_hpack_parser *p, const uint8_t *cur,
|
102
113
|
const uint8_t *end);
|
103
|
-
static grpc_error *parse_value2(
|
114
|
+
static grpc_error *parse_value2(grpc_exec_ctx *exec_ctx,
|
115
|
+
grpc_chttp2_hpack_parser *p, const uint8_t *cur,
|
104
116
|
const uint8_t *end);
|
105
|
-
static grpc_error *parse_value3(
|
117
|
+
static grpc_error *parse_value3(grpc_exec_ctx *exec_ctx,
|
118
|
+
grpc_chttp2_hpack_parser *p, const uint8_t *cur,
|
106
119
|
const uint8_t *end);
|
107
|
-
static grpc_error *parse_value4(
|
120
|
+
static grpc_error *parse_value4(grpc_exec_ctx *exec_ctx,
|
121
|
+
grpc_chttp2_hpack_parser *p, const uint8_t *cur,
|
108
122
|
const uint8_t *end);
|
109
|
-
static grpc_error *parse_value5up(
|
123
|
+
static grpc_error *parse_value5up(grpc_exec_ctx *exec_ctx,
|
124
|
+
grpc_chttp2_hpack_parser *p,
|
110
125
|
const uint8_t *cur, const uint8_t *end);
|
111
126
|
|
112
|
-
static grpc_error *parse_indexed_field(
|
127
|
+
static grpc_error *parse_indexed_field(grpc_exec_ctx *exec_ctx,
|
128
|
+
grpc_chttp2_hpack_parser *p,
|
113
129
|
const uint8_t *cur, const uint8_t *end);
|
114
|
-
static grpc_error *parse_indexed_field_x(
|
130
|
+
static grpc_error *parse_indexed_field_x(grpc_exec_ctx *exec_ctx,
|
131
|
+
grpc_chttp2_hpack_parser *p,
|
115
132
|
const uint8_t *cur,
|
116
133
|
const uint8_t *end);
|
117
|
-
static grpc_error *parse_lithdr_incidx(
|
134
|
+
static grpc_error *parse_lithdr_incidx(grpc_exec_ctx *exec_ctx,
|
135
|
+
grpc_chttp2_hpack_parser *p,
|
118
136
|
const uint8_t *cur, const uint8_t *end);
|
119
|
-
static grpc_error *parse_lithdr_incidx_x(
|
137
|
+
static grpc_error *parse_lithdr_incidx_x(grpc_exec_ctx *exec_ctx,
|
138
|
+
grpc_chttp2_hpack_parser *p,
|
120
139
|
const uint8_t *cur,
|
121
140
|
const uint8_t *end);
|
122
|
-
static grpc_error *parse_lithdr_incidx_v(
|
141
|
+
static grpc_error *parse_lithdr_incidx_v(grpc_exec_ctx *exec_ctx,
|
142
|
+
grpc_chttp2_hpack_parser *p,
|
123
143
|
const uint8_t *cur,
|
124
144
|
const uint8_t *end);
|
125
|
-
static grpc_error *parse_lithdr_notidx(
|
145
|
+
static grpc_error *parse_lithdr_notidx(grpc_exec_ctx *exec_ctx,
|
146
|
+
grpc_chttp2_hpack_parser *p,
|
126
147
|
const uint8_t *cur, const uint8_t *end);
|
127
|
-
static grpc_error *parse_lithdr_notidx_x(
|
148
|
+
static grpc_error *parse_lithdr_notidx_x(grpc_exec_ctx *exec_ctx,
|
149
|
+
grpc_chttp2_hpack_parser *p,
|
128
150
|
const uint8_t *cur,
|
129
151
|
const uint8_t *end);
|
130
|
-
static grpc_error *parse_lithdr_notidx_v(
|
152
|
+
static grpc_error *parse_lithdr_notidx_v(grpc_exec_ctx *exec_ctx,
|
153
|
+
grpc_chttp2_hpack_parser *p,
|
131
154
|
const uint8_t *cur,
|
132
155
|
const uint8_t *end);
|
133
|
-
static grpc_error *parse_lithdr_nvridx(
|
156
|
+
static grpc_error *parse_lithdr_nvridx(grpc_exec_ctx *exec_ctx,
|
157
|
+
grpc_chttp2_hpack_parser *p,
|
134
158
|
const uint8_t *cur, const uint8_t *end);
|
135
|
-
static grpc_error *parse_lithdr_nvridx_x(
|
159
|
+
static grpc_error *parse_lithdr_nvridx_x(grpc_exec_ctx *exec_ctx,
|
160
|
+
grpc_chttp2_hpack_parser *p,
|
136
161
|
const uint8_t *cur,
|
137
162
|
const uint8_t *end);
|
138
|
-
static grpc_error *parse_lithdr_nvridx_v(
|
163
|
+
static grpc_error *parse_lithdr_nvridx_v(grpc_exec_ctx *exec_ctx,
|
164
|
+
grpc_chttp2_hpack_parser *p,
|
139
165
|
const uint8_t *cur,
|
140
166
|
const uint8_t *end);
|
141
|
-
static grpc_error *parse_max_tbl_size(
|
167
|
+
static grpc_error *parse_max_tbl_size(grpc_exec_ctx *exec_ctx,
|
168
|
+
grpc_chttp2_hpack_parser *p,
|
142
169
|
const uint8_t *cur, const uint8_t *end);
|
143
|
-
static grpc_error *parse_max_tbl_size_x(
|
170
|
+
static grpc_error *parse_max_tbl_size_x(grpc_exec_ctx *exec_ctx,
|
171
|
+
grpc_chttp2_hpack_parser *p,
|
144
172
|
const uint8_t *cur, const uint8_t *end);
|
145
173
|
|
146
174
|
/* we translate the first byte of a hpack field into one of these decoding
|
@@ -639,17 +667,17 @@ static const uint8_t inverse_base64[256] = {
|
|
639
667
|
};
|
640
668
|
|
641
669
|
/* emission helpers */
|
642
|
-
static grpc_error *on_hdr(
|
643
|
-
int add_to_table) {
|
670
|
+
static grpc_error *on_hdr(grpc_exec_ctx *exec_ctx, grpc_chttp2_hpack_parser *p,
|
671
|
+
grpc_mdelem *md, int add_to_table) {
|
644
672
|
if (add_to_table) {
|
645
|
-
grpc_error *err = grpc_chttp2_hptbl_add(&p->table, md);
|
673
|
+
grpc_error *err = grpc_chttp2_hptbl_add(exec_ctx, &p->table, md);
|
646
674
|
if (err != GRPC_ERROR_NONE) return err;
|
647
675
|
}
|
648
676
|
if (p->on_header == NULL) {
|
649
|
-
GRPC_MDELEM_UNREF(md);
|
677
|
+
GRPC_MDELEM_UNREF(exec_ctx, md);
|
650
678
|
return GRPC_ERROR_CREATE("on_header callback not set");
|
651
679
|
}
|
652
|
-
p->on_header(p->on_header_user_data, md);
|
680
|
+
p->on_header(exec_ctx, p->on_header_user_data, md);
|
653
681
|
return GRPC_ERROR_NONE;
|
654
682
|
}
|
655
683
|
|
@@ -661,78 +689,86 @@ static grpc_mdstr *take_string(grpc_chttp2_hpack_parser *p,
|
|
661
689
|
}
|
662
690
|
|
663
691
|
/* jump to the next state */
|
664
|
-
static grpc_error *parse_next(
|
692
|
+
static grpc_error *parse_next(grpc_exec_ctx *exec_ctx,
|
693
|
+
grpc_chttp2_hpack_parser *p, const uint8_t *cur,
|
665
694
|
const uint8_t *end) {
|
666
695
|
p->state = *p->next_state++;
|
667
|
-
return p->state(p, cur, end);
|
696
|
+
return p->state(exec_ctx, p, cur, end);
|
668
697
|
}
|
669
698
|
|
670
699
|
/* begin parsing a header: all functionality is encoded into lookup tables
|
671
700
|
above */
|
672
|
-
static grpc_error *parse_begin(
|
701
|
+
static grpc_error *parse_begin(grpc_exec_ctx *exec_ctx,
|
702
|
+
grpc_chttp2_hpack_parser *p, const uint8_t *cur,
|
673
703
|
const uint8_t *end) {
|
674
704
|
if (cur == end) {
|
675
705
|
p->state = parse_begin;
|
676
706
|
return GRPC_ERROR_NONE;
|
677
707
|
}
|
678
708
|
|
679
|
-
return first_byte_action[first_byte_lut[*cur]](p, cur, end);
|
709
|
+
return first_byte_action[first_byte_lut[*cur]](exec_ctx, p, cur, end);
|
680
710
|
}
|
681
711
|
|
682
712
|
/* stream dependency and prioritization data: we just skip it */
|
683
|
-
static grpc_error *parse_stream_weight(
|
713
|
+
static grpc_error *parse_stream_weight(grpc_exec_ctx *exec_ctx,
|
714
|
+
grpc_chttp2_hpack_parser *p,
|
684
715
|
const uint8_t *cur, const uint8_t *end) {
|
685
716
|
if (cur == end) {
|
686
717
|
p->state = parse_stream_weight;
|
687
718
|
return GRPC_ERROR_NONE;
|
688
719
|
}
|
689
720
|
|
690
|
-
return p->after_prioritization(p, cur + 1, end);
|
721
|
+
return p->after_prioritization(exec_ctx, p, cur + 1, end);
|
691
722
|
}
|
692
723
|
|
693
|
-
static grpc_error *parse_stream_dep3(
|
724
|
+
static grpc_error *parse_stream_dep3(grpc_exec_ctx *exec_ctx,
|
725
|
+
grpc_chttp2_hpack_parser *p,
|
694
726
|
const uint8_t *cur, const uint8_t *end) {
|
695
727
|
if (cur == end) {
|
696
728
|
p->state = parse_stream_dep3;
|
697
729
|
return GRPC_ERROR_NONE;
|
698
730
|
}
|
699
731
|
|
700
|
-
return parse_stream_weight(p, cur + 1, end);
|
732
|
+
return parse_stream_weight(exec_ctx, p, cur + 1, end);
|
701
733
|
}
|
702
734
|
|
703
|
-
static grpc_error *parse_stream_dep2(
|
735
|
+
static grpc_error *parse_stream_dep2(grpc_exec_ctx *exec_ctx,
|
736
|
+
grpc_chttp2_hpack_parser *p,
|
704
737
|
const uint8_t *cur, const uint8_t *end) {
|
705
738
|
if (cur == end) {
|
706
739
|
p->state = parse_stream_dep2;
|
707
740
|
return GRPC_ERROR_NONE;
|
708
741
|
}
|
709
742
|
|
710
|
-
return parse_stream_dep3(p, cur + 1, end);
|
743
|
+
return parse_stream_dep3(exec_ctx, p, cur + 1, end);
|
711
744
|
}
|
712
745
|
|
713
|
-
static grpc_error *parse_stream_dep1(
|
746
|
+
static grpc_error *parse_stream_dep1(grpc_exec_ctx *exec_ctx,
|
747
|
+
grpc_chttp2_hpack_parser *p,
|
714
748
|
const uint8_t *cur, const uint8_t *end) {
|
715
749
|
if (cur == end) {
|
716
750
|
p->state = parse_stream_dep1;
|
717
751
|
return GRPC_ERROR_NONE;
|
718
752
|
}
|
719
753
|
|
720
|
-
return parse_stream_dep2(p, cur + 1, end);
|
754
|
+
return parse_stream_dep2(exec_ctx, p, cur + 1, end);
|
721
755
|
}
|
722
756
|
|
723
|
-
static grpc_error *parse_stream_dep0(
|
757
|
+
static grpc_error *parse_stream_dep0(grpc_exec_ctx *exec_ctx,
|
758
|
+
grpc_chttp2_hpack_parser *p,
|
724
759
|
const uint8_t *cur, const uint8_t *end) {
|
725
760
|
if (cur == end) {
|
726
761
|
p->state = parse_stream_dep0;
|
727
762
|
return GRPC_ERROR_NONE;
|
728
763
|
}
|
729
764
|
|
730
|
-
return parse_stream_dep1(p, cur + 1, end);
|
765
|
+
return parse_stream_dep1(exec_ctx, p, cur + 1, end);
|
731
766
|
}
|
732
767
|
|
733
768
|
/* emit an indexed field; for now just logs it to console; jumps to
|
734
769
|
begin the next field on completion */
|
735
|
-
static grpc_error *finish_indexed_field(
|
770
|
+
static grpc_error *finish_indexed_field(grpc_exec_ctx *exec_ctx,
|
771
|
+
grpc_chttp2_hpack_parser *p,
|
736
772
|
const uint8_t *cur,
|
737
773
|
const uint8_t *end) {
|
738
774
|
grpc_mdelem *md = grpc_chttp2_hptbl_lookup(&p->table, p->index);
|
@@ -743,21 +779,23 @@ static grpc_error *finish_indexed_field(grpc_chttp2_hpack_parser *p,
|
|
743
779
|
GRPC_ERROR_INT_SIZE, (intptr_t)p->table.num_ents);
|
744
780
|
}
|
745
781
|
GRPC_MDELEM_REF(md);
|
746
|
-
grpc_error *err = on_hdr(p, md, 0);
|
782
|
+
grpc_error *err = on_hdr(exec_ctx, p, md, 0);
|
747
783
|
if (err != GRPC_ERROR_NONE) return err;
|
748
|
-
return parse_begin(p, cur, end);
|
784
|
+
return parse_begin(exec_ctx, p, cur, end);
|
749
785
|
}
|
750
786
|
|
751
787
|
/* parse an indexed field with index < 127 */
|
752
|
-
static grpc_error *parse_indexed_field(
|
788
|
+
static grpc_error *parse_indexed_field(grpc_exec_ctx *exec_ctx,
|
789
|
+
grpc_chttp2_hpack_parser *p,
|
753
790
|
const uint8_t *cur, const uint8_t *end) {
|
754
791
|
p->dynamic_table_update_allowed = 0;
|
755
792
|
p->index = (*cur) & 0x7f;
|
756
|
-
return finish_indexed_field(p, cur + 1, end);
|
793
|
+
return finish_indexed_field(exec_ctx, p, cur + 1, end);
|
757
794
|
}
|
758
795
|
|
759
796
|
/* parse an indexed field with index >= 127 */
|
760
|
-
static grpc_error *parse_indexed_field_x(
|
797
|
+
static grpc_error *parse_indexed_field_x(grpc_exec_ctx *exec_ctx,
|
798
|
+
grpc_chttp2_hpack_parser *p,
|
761
799
|
const uint8_t *cur,
|
762
800
|
const uint8_t *end) {
|
763
801
|
static const grpc_chttp2_hpack_parser_state and_then[] = {
|
@@ -766,49 +804,53 @@ static grpc_error *parse_indexed_field_x(grpc_chttp2_hpack_parser *p,
|
|
766
804
|
p->next_state = and_then;
|
767
805
|
p->index = 0x7f;
|
768
806
|
p->parsing.value = &p->index;
|
769
|
-
return parse_value0(p, cur + 1, end);
|
807
|
+
return parse_value0(exec_ctx, p, cur + 1, end);
|
770
808
|
}
|
771
809
|
|
772
810
|
/* finish a literal header with incremental indexing: just log, and jump to '
|
773
811
|
begin */
|
774
|
-
static grpc_error *finish_lithdr_incidx(
|
812
|
+
static grpc_error *finish_lithdr_incidx(grpc_exec_ctx *exec_ctx,
|
813
|
+
grpc_chttp2_hpack_parser *p,
|
775
814
|
const uint8_t *cur,
|
776
815
|
const uint8_t *end) {
|
777
816
|
grpc_mdelem *md = grpc_chttp2_hptbl_lookup(&p->table, p->index);
|
778
817
|
GPR_ASSERT(md != NULL); /* handled in string parsing */
|
779
|
-
grpc_error *err =
|
780
|
-
|
781
|
-
|
782
|
-
|
783
|
-
if (err != GRPC_ERROR_NONE) return parse_error(p, cur, end, err);
|
784
|
-
return parse_begin(p, cur, end);
|
818
|
+
grpc_error *err = on_hdr(exec_ctx, p, grpc_mdelem_from_metadata_strings(
|
819
|
+
exec_ctx, GRPC_MDSTR_REF(md->key),
|
820
|
+
take_string(p, &p->value)),
|
821
|
+
1);
|
822
|
+
if (err != GRPC_ERROR_NONE) return parse_error(exec_ctx, p, cur, end, err);
|
823
|
+
return parse_begin(exec_ctx, p, cur, end);
|
785
824
|
}
|
786
825
|
|
787
826
|
/* finish a literal header with incremental indexing with no index */
|
788
|
-
static grpc_error *finish_lithdr_incidx_v(
|
827
|
+
static grpc_error *finish_lithdr_incidx_v(grpc_exec_ctx *exec_ctx,
|
828
|
+
grpc_chttp2_hpack_parser *p,
|
789
829
|
const uint8_t *cur,
|
790
830
|
const uint8_t *end) {
|
791
|
-
grpc_error *err =
|
792
|
-
|
793
|
-
|
794
|
-
|
795
|
-
if (err != GRPC_ERROR_NONE) return parse_error(p, cur, end, err);
|
796
|
-
return parse_begin(p, cur, end);
|
831
|
+
grpc_error *err = on_hdr(exec_ctx, p, grpc_mdelem_from_metadata_strings(
|
832
|
+
exec_ctx, take_string(p, &p->key),
|
833
|
+
take_string(p, &p->value)),
|
834
|
+
1);
|
835
|
+
if (err != GRPC_ERROR_NONE) return parse_error(exec_ctx, p, cur, end, err);
|
836
|
+
return parse_begin(exec_ctx, p, cur, end);
|
797
837
|
}
|
798
838
|
|
799
839
|
/* parse a literal header with incremental indexing; index < 63 */
|
800
|
-
static grpc_error *parse_lithdr_incidx(
|
840
|
+
static grpc_error *parse_lithdr_incidx(grpc_exec_ctx *exec_ctx,
|
841
|
+
grpc_chttp2_hpack_parser *p,
|
801
842
|
const uint8_t *cur, const uint8_t *end) {
|
802
843
|
static const grpc_chttp2_hpack_parser_state and_then[] = {
|
803
844
|
parse_value_string_with_indexed_key, finish_lithdr_incidx};
|
804
845
|
p->dynamic_table_update_allowed = 0;
|
805
846
|
p->next_state = and_then;
|
806
847
|
p->index = (*cur) & 0x3f;
|
807
|
-
return parse_string_prefix(p, cur + 1, end);
|
848
|
+
return parse_string_prefix(exec_ctx, p, cur + 1, end);
|
808
849
|
}
|
809
850
|
|
810
851
|
/* parse a literal header with incremental indexing; index >= 63 */
|
811
|
-
static grpc_error *parse_lithdr_incidx_x(
|
852
|
+
static grpc_error *parse_lithdr_incidx_x(grpc_exec_ctx *exec_ctx,
|
853
|
+
grpc_chttp2_hpack_parser *p,
|
812
854
|
const uint8_t *cur,
|
813
855
|
const uint8_t *end) {
|
814
856
|
static const grpc_chttp2_hpack_parser_state and_then[] = {
|
@@ -818,11 +860,12 @@ static grpc_error *parse_lithdr_incidx_x(grpc_chttp2_hpack_parser *p,
|
|
818
860
|
p->next_state = and_then;
|
819
861
|
p->index = 0x3f;
|
820
862
|
p->parsing.value = &p->index;
|
821
|
-
return parse_value0(p, cur + 1, end);
|
863
|
+
return parse_value0(exec_ctx, p, cur + 1, end);
|
822
864
|
}
|
823
865
|
|
824
866
|
/* parse a literal header with incremental indexing; index = 0 */
|
825
|
-
static grpc_error *parse_lithdr_incidx_v(
|
867
|
+
static grpc_error *parse_lithdr_incidx_v(grpc_exec_ctx *exec_ctx,
|
868
|
+
grpc_chttp2_hpack_parser *p,
|
826
869
|
const uint8_t *cur,
|
827
870
|
const uint8_t *end) {
|
828
871
|
static const grpc_chttp2_hpack_parser_state and_then[] = {
|
@@ -830,48 +873,52 @@ static grpc_error *parse_lithdr_incidx_v(grpc_chttp2_hpack_parser *p,
|
|
830
873
|
parse_value_string_with_literal_key, finish_lithdr_incidx_v};
|
831
874
|
p->dynamic_table_update_allowed = 0;
|
832
875
|
p->next_state = and_then;
|
833
|
-
return parse_string_prefix(p, cur + 1, end);
|
876
|
+
return parse_string_prefix(exec_ctx, p, cur + 1, end);
|
834
877
|
}
|
835
878
|
|
836
879
|
/* finish a literal header without incremental indexing */
|
837
|
-
static grpc_error *finish_lithdr_notidx(
|
880
|
+
static grpc_error *finish_lithdr_notidx(grpc_exec_ctx *exec_ctx,
|
881
|
+
grpc_chttp2_hpack_parser *p,
|
838
882
|
const uint8_t *cur,
|
839
883
|
const uint8_t *end) {
|
840
884
|
grpc_mdelem *md = grpc_chttp2_hptbl_lookup(&p->table, p->index);
|
841
885
|
GPR_ASSERT(md != NULL); /* handled in string parsing */
|
842
|
-
grpc_error *err =
|
843
|
-
|
844
|
-
|
845
|
-
|
846
|
-
if (err != GRPC_ERROR_NONE) return parse_error(p, cur, end, err);
|
847
|
-
return parse_begin(p, cur, end);
|
886
|
+
grpc_error *err = on_hdr(exec_ctx, p, grpc_mdelem_from_metadata_strings(
|
887
|
+
exec_ctx, GRPC_MDSTR_REF(md->key),
|
888
|
+
take_string(p, &p->value)),
|
889
|
+
0);
|
890
|
+
if (err != GRPC_ERROR_NONE) return parse_error(exec_ctx, p, cur, end, err);
|
891
|
+
return parse_begin(exec_ctx, p, cur, end);
|
848
892
|
}
|
849
893
|
|
850
894
|
/* finish a literal header without incremental indexing with index = 0 */
|
851
|
-
static grpc_error *finish_lithdr_notidx_v(
|
895
|
+
static grpc_error *finish_lithdr_notidx_v(grpc_exec_ctx *exec_ctx,
|
896
|
+
grpc_chttp2_hpack_parser *p,
|
852
897
|
const uint8_t *cur,
|
853
898
|
const uint8_t *end) {
|
854
|
-
grpc_error *err =
|
855
|
-
|
856
|
-
|
857
|
-
|
858
|
-
if (err != GRPC_ERROR_NONE) return parse_error(p, cur, end, err);
|
859
|
-
return parse_begin(p, cur, end);
|
899
|
+
grpc_error *err = on_hdr(exec_ctx, p, grpc_mdelem_from_metadata_strings(
|
900
|
+
exec_ctx, take_string(p, &p->key),
|
901
|
+
take_string(p, &p->value)),
|
902
|
+
0);
|
903
|
+
if (err != GRPC_ERROR_NONE) return parse_error(exec_ctx, p, cur, end, err);
|
904
|
+
return parse_begin(exec_ctx, p, cur, end);
|
860
905
|
}
|
861
906
|
|
862
907
|
/* parse a literal header without incremental indexing; index < 15 */
|
863
|
-
static grpc_error *parse_lithdr_notidx(
|
908
|
+
static grpc_error *parse_lithdr_notidx(grpc_exec_ctx *exec_ctx,
|
909
|
+
grpc_chttp2_hpack_parser *p,
|
864
910
|
const uint8_t *cur, const uint8_t *end) {
|
865
911
|
static const grpc_chttp2_hpack_parser_state and_then[] = {
|
866
912
|
parse_value_string_with_indexed_key, finish_lithdr_notidx};
|
867
913
|
p->dynamic_table_update_allowed = 0;
|
868
914
|
p->next_state = and_then;
|
869
915
|
p->index = (*cur) & 0xf;
|
870
|
-
return parse_string_prefix(p, cur + 1, end);
|
916
|
+
return parse_string_prefix(exec_ctx, p, cur + 1, end);
|
871
917
|
}
|
872
918
|
|
873
919
|
/* parse a literal header without incremental indexing; index >= 15 */
|
874
|
-
static grpc_error *parse_lithdr_notidx_x(
|
920
|
+
static grpc_error *parse_lithdr_notidx_x(grpc_exec_ctx *exec_ctx,
|
921
|
+
grpc_chttp2_hpack_parser *p,
|
875
922
|
const uint8_t *cur,
|
876
923
|
const uint8_t *end) {
|
877
924
|
static const grpc_chttp2_hpack_parser_state and_then[] = {
|
@@ -881,11 +928,12 @@ static grpc_error *parse_lithdr_notidx_x(grpc_chttp2_hpack_parser *p,
|
|
881
928
|
p->next_state = and_then;
|
882
929
|
p->index = 0xf;
|
883
930
|
p->parsing.value = &p->index;
|
884
|
-
return parse_value0(p, cur + 1, end);
|
931
|
+
return parse_value0(exec_ctx, p, cur + 1, end);
|
885
932
|
}
|
886
933
|
|
887
934
|
/* parse a literal header without incremental indexing; index == 0 */
|
888
|
-
static grpc_error *parse_lithdr_notidx_v(
|
935
|
+
static grpc_error *parse_lithdr_notidx_v(grpc_exec_ctx *exec_ctx,
|
936
|
+
grpc_chttp2_hpack_parser *p,
|
889
937
|
const uint8_t *cur,
|
890
938
|
const uint8_t *end) {
|
891
939
|
static const grpc_chttp2_hpack_parser_state and_then[] = {
|
@@ -893,48 +941,52 @@ static grpc_error *parse_lithdr_notidx_v(grpc_chttp2_hpack_parser *p,
|
|
893
941
|
parse_value_string_with_literal_key, finish_lithdr_notidx_v};
|
894
942
|
p->dynamic_table_update_allowed = 0;
|
895
943
|
p->next_state = and_then;
|
896
|
-
return parse_string_prefix(p, cur + 1, end);
|
944
|
+
return parse_string_prefix(exec_ctx, p, cur + 1, end);
|
897
945
|
}
|
898
946
|
|
899
947
|
/* finish a literal header that is never indexed */
|
900
|
-
static grpc_error *finish_lithdr_nvridx(
|
948
|
+
static grpc_error *finish_lithdr_nvridx(grpc_exec_ctx *exec_ctx,
|
949
|
+
grpc_chttp2_hpack_parser *p,
|
901
950
|
const uint8_t *cur,
|
902
951
|
const uint8_t *end) {
|
903
952
|
grpc_mdelem *md = grpc_chttp2_hptbl_lookup(&p->table, p->index);
|
904
953
|
GPR_ASSERT(md != NULL); /* handled in string parsing */
|
905
|
-
grpc_error *err =
|
906
|
-
|
907
|
-
|
908
|
-
|
909
|
-
if (err != GRPC_ERROR_NONE) return parse_error(p, cur, end, err);
|
910
|
-
return parse_begin(p, cur, end);
|
954
|
+
grpc_error *err = on_hdr(exec_ctx, p, grpc_mdelem_from_metadata_strings(
|
955
|
+
exec_ctx, GRPC_MDSTR_REF(md->key),
|
956
|
+
take_string(p, &p->value)),
|
957
|
+
0);
|
958
|
+
if (err != GRPC_ERROR_NONE) return parse_error(exec_ctx, p, cur, end, err);
|
959
|
+
return parse_begin(exec_ctx, p, cur, end);
|
911
960
|
}
|
912
961
|
|
913
962
|
/* finish a literal header that is never indexed with an extra value */
|
914
|
-
static grpc_error *finish_lithdr_nvridx_v(
|
963
|
+
static grpc_error *finish_lithdr_nvridx_v(grpc_exec_ctx *exec_ctx,
|
964
|
+
grpc_chttp2_hpack_parser *p,
|
915
965
|
const uint8_t *cur,
|
916
966
|
const uint8_t *end) {
|
917
|
-
grpc_error *err =
|
918
|
-
|
919
|
-
|
920
|
-
|
921
|
-
if (err != GRPC_ERROR_NONE) return parse_error(p, cur, end, err);
|
922
|
-
return parse_begin(p, cur, end);
|
967
|
+
grpc_error *err = on_hdr(exec_ctx, p, grpc_mdelem_from_metadata_strings(
|
968
|
+
exec_ctx, take_string(p, &p->key),
|
969
|
+
take_string(p, &p->value)),
|
970
|
+
0);
|
971
|
+
if (err != GRPC_ERROR_NONE) return parse_error(exec_ctx, p, cur, end, err);
|
972
|
+
return parse_begin(exec_ctx, p, cur, end);
|
923
973
|
}
|
924
974
|
|
925
975
|
/* parse a literal header that is never indexed; index < 15 */
|
926
|
-
static grpc_error *parse_lithdr_nvridx(
|
976
|
+
static grpc_error *parse_lithdr_nvridx(grpc_exec_ctx *exec_ctx,
|
977
|
+
grpc_chttp2_hpack_parser *p,
|
927
978
|
const uint8_t *cur, const uint8_t *end) {
|
928
979
|
static const grpc_chttp2_hpack_parser_state and_then[] = {
|
929
980
|
parse_value_string_with_indexed_key, finish_lithdr_nvridx};
|
930
981
|
p->dynamic_table_update_allowed = 0;
|
931
982
|
p->next_state = and_then;
|
932
983
|
p->index = (*cur) & 0xf;
|
933
|
-
return parse_string_prefix(p, cur + 1, end);
|
984
|
+
return parse_string_prefix(exec_ctx, p, cur + 1, end);
|
934
985
|
}
|
935
986
|
|
936
987
|
/* parse a literal header that is never indexed; index >= 15 */
|
937
|
-
static grpc_error *parse_lithdr_nvridx_x(
|
988
|
+
static grpc_error *parse_lithdr_nvridx_x(grpc_exec_ctx *exec_ctx,
|
989
|
+
grpc_chttp2_hpack_parser *p,
|
938
990
|
const uint8_t *cur,
|
939
991
|
const uint8_t *end) {
|
940
992
|
static const grpc_chttp2_hpack_parser_state and_then[] = {
|
@@ -944,11 +996,12 @@ static grpc_error *parse_lithdr_nvridx_x(grpc_chttp2_hpack_parser *p,
|
|
944
996
|
p->next_state = and_then;
|
945
997
|
p->index = 0xf;
|
946
998
|
p->parsing.value = &p->index;
|
947
|
-
return parse_value0(p, cur + 1, end);
|
999
|
+
return parse_value0(exec_ctx, p, cur + 1, end);
|
948
1000
|
}
|
949
1001
|
|
950
1002
|
/* parse a literal header that is never indexed; index == 0 */
|
951
|
-
static grpc_error *parse_lithdr_nvridx_v(
|
1003
|
+
static grpc_error *parse_lithdr_nvridx_v(grpc_exec_ctx *exec_ctx,
|
1004
|
+
grpc_chttp2_hpack_parser *p,
|
952
1005
|
const uint8_t *cur,
|
953
1006
|
const uint8_t *end) {
|
954
1007
|
static const grpc_chttp2_hpack_parser_state and_then[] = {
|
@@ -956,44 +1009,47 @@ static grpc_error *parse_lithdr_nvridx_v(grpc_chttp2_hpack_parser *p,
|
|
956
1009
|
parse_value_string_with_literal_key, finish_lithdr_nvridx_v};
|
957
1010
|
p->dynamic_table_update_allowed = 0;
|
958
1011
|
p->next_state = and_then;
|
959
|
-
return parse_string_prefix(p, cur + 1, end);
|
1012
|
+
return parse_string_prefix(exec_ctx, p, cur + 1, end);
|
960
1013
|
}
|
961
1014
|
|
962
1015
|
/* finish parsing a max table size change */
|
963
|
-
static grpc_error *finish_max_tbl_size(
|
1016
|
+
static grpc_error *finish_max_tbl_size(grpc_exec_ctx *exec_ctx,
|
1017
|
+
grpc_chttp2_hpack_parser *p,
|
964
1018
|
const uint8_t *cur, const uint8_t *end) {
|
965
1019
|
if (grpc_http_trace) {
|
966
1020
|
gpr_log(GPR_INFO, "MAX TABLE SIZE: %d", p->index);
|
967
1021
|
}
|
968
1022
|
grpc_error *err =
|
969
|
-
grpc_chttp2_hptbl_set_current_table_size(&p->table, p->index);
|
970
|
-
if (err != GRPC_ERROR_NONE) return parse_error(p, cur, end, err);
|
971
|
-
return parse_begin(p, cur, end);
|
1023
|
+
grpc_chttp2_hptbl_set_current_table_size(exec_ctx, &p->table, p->index);
|
1024
|
+
if (err != GRPC_ERROR_NONE) return parse_error(exec_ctx, p, cur, end, err);
|
1025
|
+
return parse_begin(exec_ctx, p, cur, end);
|
972
1026
|
}
|
973
1027
|
|
974
1028
|
/* parse a max table size change, max size < 15 */
|
975
|
-
static grpc_error *parse_max_tbl_size(
|
1029
|
+
static grpc_error *parse_max_tbl_size(grpc_exec_ctx *exec_ctx,
|
1030
|
+
grpc_chttp2_hpack_parser *p,
|
976
1031
|
const uint8_t *cur, const uint8_t *end) {
|
977
1032
|
if (p->dynamic_table_update_allowed == 0) {
|
978
1033
|
return parse_error(
|
979
|
-
p, cur, end,
|
1034
|
+
exec_ctx, p, cur, end,
|
980
1035
|
GRPC_ERROR_CREATE(
|
981
1036
|
"More than two max table size changes in a single frame"));
|
982
1037
|
}
|
983
1038
|
p->dynamic_table_update_allowed--;
|
984
1039
|
p->index = (*cur) & 0x1f;
|
985
|
-
return finish_max_tbl_size(p, cur + 1, end);
|
1040
|
+
return finish_max_tbl_size(exec_ctx, p, cur + 1, end);
|
986
1041
|
}
|
987
1042
|
|
988
1043
|
/* parse a max table size change, max size >= 15 */
|
989
|
-
static grpc_error *parse_max_tbl_size_x(
|
1044
|
+
static grpc_error *parse_max_tbl_size_x(grpc_exec_ctx *exec_ctx,
|
1045
|
+
grpc_chttp2_hpack_parser *p,
|
990
1046
|
const uint8_t *cur,
|
991
1047
|
const uint8_t *end) {
|
992
1048
|
static const grpc_chttp2_hpack_parser_state and_then[] = {
|
993
1049
|
finish_max_tbl_size};
|
994
1050
|
if (p->dynamic_table_update_allowed == 0) {
|
995
1051
|
return parse_error(
|
996
|
-
p, cur, end,
|
1052
|
+
exec_ctx, p, cur, end,
|
997
1053
|
GRPC_ERROR_CREATE(
|
998
1054
|
"More than two max table size changes in a single frame"));
|
999
1055
|
}
|
@@ -1001,11 +1057,12 @@ static grpc_error *parse_max_tbl_size_x(grpc_chttp2_hpack_parser *p,
|
|
1001
1057
|
p->next_state = and_then;
|
1002
1058
|
p->index = 0x1f;
|
1003
1059
|
p->parsing.value = &p->index;
|
1004
|
-
return parse_value0(p, cur + 1, end);
|
1060
|
+
return parse_value0(exec_ctx, p, cur + 1, end);
|
1005
1061
|
}
|
1006
1062
|
|
1007
1063
|
/* a parse error: jam the parse state into parse_error, and return error */
|
1008
|
-
static grpc_error *parse_error(
|
1064
|
+
static grpc_error *parse_error(grpc_exec_ctx *exec_ctx,
|
1065
|
+
grpc_chttp2_hpack_parser *p, const uint8_t *cur,
|
1009
1066
|
const uint8_t *end, grpc_error *err) {
|
1010
1067
|
GPR_ASSERT(err != GRPC_ERROR_NONE);
|
1011
1068
|
if (p->last_error == GRPC_ERROR_NONE) {
|
@@ -1015,24 +1072,27 @@ static grpc_error *parse_error(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
|
|
1015
1072
|
return err;
|
1016
1073
|
}
|
1017
1074
|
|
1018
|
-
static grpc_error *still_parse_error(
|
1075
|
+
static grpc_error *still_parse_error(grpc_exec_ctx *exec_ctx,
|
1076
|
+
grpc_chttp2_hpack_parser *p,
|
1019
1077
|
const uint8_t *cur, const uint8_t *end) {
|
1020
1078
|
return GRPC_ERROR_REF(p->last_error);
|
1021
1079
|
}
|
1022
1080
|
|
1023
|
-
static grpc_error *parse_illegal_op(
|
1081
|
+
static grpc_error *parse_illegal_op(grpc_exec_ctx *exec_ctx,
|
1082
|
+
grpc_chttp2_hpack_parser *p,
|
1024
1083
|
const uint8_t *cur, const uint8_t *end) {
|
1025
1084
|
GPR_ASSERT(cur != end);
|
1026
1085
|
char *msg;
|
1027
1086
|
gpr_asprintf(&msg, "Illegal hpack op code %d", *cur);
|
1028
1087
|
grpc_error *err = GRPC_ERROR_CREATE(msg);
|
1029
1088
|
gpr_free(msg);
|
1030
|
-
return parse_error(p, cur, end, err);
|
1089
|
+
return parse_error(exec_ctx, p, cur, end, err);
|
1031
1090
|
}
|
1032
1091
|
|
1033
1092
|
/* parse the 1st byte of a varint into p->parsing.value
|
1034
1093
|
no overflow is possible */
|
1035
|
-
static grpc_error *parse_value0(
|
1094
|
+
static grpc_error *parse_value0(grpc_exec_ctx *exec_ctx,
|
1095
|
+
grpc_chttp2_hpack_parser *p, const uint8_t *cur,
|
1036
1096
|
const uint8_t *end) {
|
1037
1097
|
if (cur == end) {
|
1038
1098
|
p->state = parse_value0;
|
@@ -1042,15 +1102,16 @@ static grpc_error *parse_value0(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
|
|
1042
1102
|
*p->parsing.value += (*cur) & 0x7f;
|
1043
1103
|
|
1044
1104
|
if ((*cur) & 0x80) {
|
1045
|
-
return parse_value1(p, cur + 1, end);
|
1105
|
+
return parse_value1(exec_ctx, p, cur + 1, end);
|
1046
1106
|
} else {
|
1047
|
-
return parse_next(p, cur + 1, end);
|
1107
|
+
return parse_next(exec_ctx, p, cur + 1, end);
|
1048
1108
|
}
|
1049
1109
|
}
|
1050
1110
|
|
1051
1111
|
/* parse the 2nd byte of a varint into p->parsing.value
|
1052
1112
|
no overflow is possible */
|
1053
|
-
static grpc_error *parse_value1(
|
1113
|
+
static grpc_error *parse_value1(grpc_exec_ctx *exec_ctx,
|
1114
|
+
grpc_chttp2_hpack_parser *p, const uint8_t *cur,
|
1054
1115
|
const uint8_t *end) {
|
1055
1116
|
if (cur == end) {
|
1056
1117
|
p->state = parse_value1;
|
@@ -1060,15 +1121,16 @@ static grpc_error *parse_value1(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
|
|
1060
1121
|
*p->parsing.value += (((uint32_t)*cur) & 0x7f) << 7;
|
1061
1122
|
|
1062
1123
|
if ((*cur) & 0x80) {
|
1063
|
-
return parse_value2(p, cur + 1, end);
|
1124
|
+
return parse_value2(exec_ctx, p, cur + 1, end);
|
1064
1125
|
} else {
|
1065
|
-
return parse_next(p, cur + 1, end);
|
1126
|
+
return parse_next(exec_ctx, p, cur + 1, end);
|
1066
1127
|
}
|
1067
1128
|
}
|
1068
1129
|
|
1069
1130
|
/* parse the 3rd byte of a varint into p->parsing.value
|
1070
1131
|
no overflow is possible */
|
1071
|
-
static grpc_error *parse_value2(
|
1132
|
+
static grpc_error *parse_value2(grpc_exec_ctx *exec_ctx,
|
1133
|
+
grpc_chttp2_hpack_parser *p, const uint8_t *cur,
|
1072
1134
|
const uint8_t *end) {
|
1073
1135
|
if (cur == end) {
|
1074
1136
|
p->state = parse_value2;
|
@@ -1078,15 +1140,16 @@ static grpc_error *parse_value2(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
|
|
1078
1140
|
*p->parsing.value += (((uint32_t)*cur) & 0x7f) << 14;
|
1079
1141
|
|
1080
1142
|
if ((*cur) & 0x80) {
|
1081
|
-
return parse_value3(p, cur + 1, end);
|
1143
|
+
return parse_value3(exec_ctx, p, cur + 1, end);
|
1082
1144
|
} else {
|
1083
|
-
return parse_next(p, cur + 1, end);
|
1145
|
+
return parse_next(exec_ctx, p, cur + 1, end);
|
1084
1146
|
}
|
1085
1147
|
}
|
1086
1148
|
|
1087
1149
|
/* parse the 4th byte of a varint into p->parsing.value
|
1088
1150
|
no overflow is possible */
|
1089
|
-
static grpc_error *parse_value3(
|
1151
|
+
static grpc_error *parse_value3(grpc_exec_ctx *exec_ctx,
|
1152
|
+
grpc_chttp2_hpack_parser *p, const uint8_t *cur,
|
1090
1153
|
const uint8_t *end) {
|
1091
1154
|
if (cur == end) {
|
1092
1155
|
p->state = parse_value3;
|
@@ -1096,15 +1159,16 @@ static grpc_error *parse_value3(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
|
|
1096
1159
|
*p->parsing.value += (((uint32_t)*cur) & 0x7f) << 21;
|
1097
1160
|
|
1098
1161
|
if ((*cur) & 0x80) {
|
1099
|
-
return parse_value4(p, cur + 1, end);
|
1162
|
+
return parse_value4(exec_ctx, p, cur + 1, end);
|
1100
1163
|
} else {
|
1101
|
-
return parse_next(p, cur + 1, end);
|
1164
|
+
return parse_next(exec_ctx, p, cur + 1, end);
|
1102
1165
|
}
|
1103
1166
|
}
|
1104
1167
|
|
1105
1168
|
/* parse the 5th byte of a varint into p->parsing.value
|
1106
1169
|
depending on the byte, we may overflow, and care must be taken */
|
1107
|
-
static grpc_error *parse_value4(
|
1170
|
+
static grpc_error *parse_value4(grpc_exec_ctx *exec_ctx,
|
1171
|
+
grpc_chttp2_hpack_parser *p, const uint8_t *cur,
|
1108
1172
|
const uint8_t *end) {
|
1109
1173
|
uint8_t c;
|
1110
1174
|
uint32_t cur_value;
|
@@ -1130,9 +1194,9 @@ static grpc_error *parse_value4(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
|
|
1130
1194
|
*p->parsing.value = cur_value + add_value;
|
1131
1195
|
|
1132
1196
|
if ((*cur) & 0x80) {
|
1133
|
-
return parse_value5up(p, cur + 1, end);
|
1197
|
+
return parse_value5up(exec_ctx, p, cur + 1, end);
|
1134
1198
|
} else {
|
1135
|
-
return parse_next(p, cur + 1, end);
|
1199
|
+
return parse_next(exec_ctx, p, cur + 1, end);
|
1136
1200
|
}
|
1137
1201
|
|
1138
1202
|
error:
|
@@ -1142,13 +1206,14 @@ error:
|
|
1142
1206
|
*p->parsing.value, *cur);
|
1143
1207
|
grpc_error *err = GRPC_ERROR_CREATE(msg);
|
1144
1208
|
gpr_free(msg);
|
1145
|
-
return parse_error(p, cur, end, err);
|
1209
|
+
return parse_error(exec_ctx, p, cur, end, err);
|
1146
1210
|
}
|
1147
1211
|
|
1148
1212
|
/* parse any trailing bytes in a varint: it's possible to append an arbitrary
|
1149
1213
|
number of 0x80's and not affect the value - a zero will terminate - and
|
1150
1214
|
anything else will overflow */
|
1151
|
-
static grpc_error *parse_value5up(
|
1215
|
+
static grpc_error *parse_value5up(grpc_exec_ctx *exec_ctx,
|
1216
|
+
grpc_chttp2_hpack_parser *p,
|
1152
1217
|
const uint8_t *cur, const uint8_t *end) {
|
1153
1218
|
while (cur != end && *cur == 0x80) {
|
1154
1219
|
++cur;
|
@@ -1160,7 +1225,7 @@ static grpc_error *parse_value5up(grpc_chttp2_hpack_parser *p,
|
|
1160
1225
|
}
|
1161
1226
|
|
1162
1227
|
if (*cur == 0) {
|
1163
|
-
return parse_next(p, cur + 1, end);
|
1228
|
+
return parse_next(exec_ctx, p, cur + 1, end);
|
1164
1229
|
}
|
1165
1230
|
|
1166
1231
|
char *msg;
|
@@ -1170,11 +1235,12 @@ static grpc_error *parse_value5up(grpc_chttp2_hpack_parser *p,
|
|
1170
1235
|
*p->parsing.value, *cur);
|
1171
1236
|
grpc_error *err = GRPC_ERROR_CREATE(msg);
|
1172
1237
|
gpr_free(msg);
|
1173
|
-
return parse_error(p, cur, end, err);
|
1238
|
+
return parse_error(exec_ctx, p, cur, end, err);
|
1174
1239
|
}
|
1175
1240
|
|
1176
1241
|
/* parse a string prefix */
|
1177
|
-
static grpc_error *parse_string_prefix(
|
1242
|
+
static grpc_error *parse_string_prefix(grpc_exec_ctx *exec_ctx,
|
1243
|
+
grpc_chttp2_hpack_parser *p,
|
1178
1244
|
const uint8_t *cur, const uint8_t *end) {
|
1179
1245
|
if (cur == end) {
|
1180
1246
|
p->state = parse_string_prefix;
|
@@ -1185,9 +1251,9 @@ static grpc_error *parse_string_prefix(grpc_chttp2_hpack_parser *p,
|
|
1185
1251
|
p->huff = (*cur) >> 7;
|
1186
1252
|
if (p->strlen == 0x7f) {
|
1187
1253
|
p->parsing.value = &p->strlen;
|
1188
|
-
return parse_value0(p, cur + 1, end);
|
1254
|
+
return parse_value0(exec_ctx, p, cur + 1, end);
|
1189
1255
|
} else {
|
1190
|
-
return parse_next(p, cur + 1, end);
|
1256
|
+
return parse_next(exec_ctx, p, cur + 1, end);
|
1191
1257
|
}
|
1192
1258
|
}
|
1193
1259
|
|
@@ -1205,7 +1271,8 @@ static void append_bytes(grpc_chttp2_hpack_parser_string *str,
|
|
1205
1271
|
str->length += (uint32_t)length;
|
1206
1272
|
}
|
1207
1273
|
|
1208
|
-
static grpc_error *append_string(
|
1274
|
+
static grpc_error *append_string(grpc_exec_ctx *exec_ctx,
|
1275
|
+
grpc_chttp2_hpack_parser *p,
|
1209
1276
|
const uint8_t *cur, const uint8_t *end) {
|
1210
1277
|
grpc_chttp2_hpack_parser_string *str = p->parsing.str;
|
1211
1278
|
uint32_t bits;
|
@@ -1223,7 +1290,7 @@ static grpc_error *append_string(grpc_chttp2_hpack_parser *p,
|
|
1223
1290
|
bits = inverse_base64[*cur];
|
1224
1291
|
++cur;
|
1225
1292
|
if (bits == 255)
|
1226
|
-
return parse_error(p, cur, end,
|
1293
|
+
return parse_error(exec_ctx, p, cur, end,
|
1227
1294
|
GRPC_ERROR_CREATE("Illegal base64 character"));
|
1228
1295
|
else if (bits == 64)
|
1229
1296
|
goto b64_byte0;
|
@@ -1238,7 +1305,7 @@ static grpc_error *append_string(grpc_chttp2_hpack_parser *p,
|
|
1238
1305
|
bits = inverse_base64[*cur];
|
1239
1306
|
++cur;
|
1240
1307
|
if (bits == 255)
|
1241
|
-
return parse_error(p, cur, end,
|
1308
|
+
return parse_error(exec_ctx, p, cur, end,
|
1242
1309
|
GRPC_ERROR_CREATE("Illegal base64 character"));
|
1243
1310
|
else if (bits == 64)
|
1244
1311
|
goto b64_byte1;
|
@@ -1253,7 +1320,7 @@ static grpc_error *append_string(grpc_chttp2_hpack_parser *p,
|
|
1253
1320
|
bits = inverse_base64[*cur];
|
1254
1321
|
++cur;
|
1255
1322
|
if (bits == 255)
|
1256
|
-
return parse_error(p, cur, end,
|
1323
|
+
return parse_error(exec_ctx, p, cur, end,
|
1257
1324
|
GRPC_ERROR_CREATE("Illegal base64 character"));
|
1258
1325
|
else if (bits == 64)
|
1259
1326
|
goto b64_byte2;
|
@@ -1268,7 +1335,7 @@ static grpc_error *append_string(grpc_chttp2_hpack_parser *p,
|
|
1268
1335
|
bits = inverse_base64[*cur];
|
1269
1336
|
++cur;
|
1270
1337
|
if (bits == 255)
|
1271
|
-
return parse_error(p, cur, end,
|
1338
|
+
return parse_error(exec_ctx, p, cur, end,
|
1272
1339
|
GRPC_ERROR_CREATE("Illegal base64 character"));
|
1273
1340
|
else if (bits == 64)
|
1274
1341
|
goto b64_byte3;
|
@@ -1281,11 +1348,12 @@ static grpc_error *append_string(grpc_chttp2_hpack_parser *p,
|
|
1281
1348
|
goto b64_byte0;
|
1282
1349
|
}
|
1283
1350
|
GPR_UNREACHABLE_CODE(return parse_error(
|
1284
|
-
p, cur, end, GRPC_ERROR_CREATE("Should never reach here")));
|
1351
|
+
exec_ctx, p, cur, end, GRPC_ERROR_CREATE("Should never reach here")));
|
1285
1352
|
}
|
1286
1353
|
|
1287
1354
|
/* append a null terminator to a string */
|
1288
|
-
static grpc_error *finish_str(
|
1355
|
+
static grpc_error *finish_str(grpc_exec_ctx *exec_ctx,
|
1356
|
+
grpc_chttp2_hpack_parser *p, const uint8_t *cur,
|
1289
1357
|
const uint8_t *end) {
|
1290
1358
|
uint8_t terminator = 0;
|
1291
1359
|
uint8_t decoded[2];
|
@@ -1298,7 +1366,7 @@ static grpc_error *finish_str(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
|
|
1298
1366
|
break;
|
1299
1367
|
case B64_BYTE1:
|
1300
1368
|
return parse_error(
|
1301
|
-
p, cur, end,
|
1369
|
+
exec_ctx, p, cur, end,
|
1302
1370
|
GRPC_ERROR_CREATE("illegal base64 encoding")); /* illegal encoding */
|
1303
1371
|
case B64_BYTE2:
|
1304
1372
|
bits = p->base64_buffer;
|
@@ -1308,7 +1376,7 @@ static grpc_error *finish_str(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
|
|
1308
1376
|
bits & 0xffff);
|
1309
1377
|
grpc_error *err = GRPC_ERROR_CREATE(msg);
|
1310
1378
|
gpr_free(msg);
|
1311
|
-
return parse_error(p, cur, end, err);
|
1379
|
+
return parse_error(exec_ctx, p, cur, end, err);
|
1312
1380
|
}
|
1313
1381
|
decoded[0] = (uint8_t)(bits >> 16);
|
1314
1382
|
append_bytes(str, decoded, 1);
|
@@ -1321,7 +1389,7 @@ static grpc_error *finish_str(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
|
|
1321
1389
|
bits & 0xff);
|
1322
1390
|
grpc_error *err = GRPC_ERROR_CREATE(msg);
|
1323
1391
|
gpr_free(msg);
|
1324
|
-
return parse_error(p, cur, end, err);
|
1392
|
+
return parse_error(exec_ctx, p, cur, end, err);
|
1325
1393
|
}
|
1326
1394
|
decoded[0] = (uint8_t)(bits >> 16);
|
1327
1395
|
decoded[1] = (uint8_t)(bits >> 8);
|
@@ -1334,13 +1402,14 @@ static grpc_error *finish_str(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
|
|
1334
1402
|
}
|
1335
1403
|
|
1336
1404
|
/* decode a nibble from a huffman encoded stream */
|
1337
|
-
static grpc_error *huff_nibble(
|
1405
|
+
static grpc_error *huff_nibble(grpc_exec_ctx *exec_ctx,
|
1406
|
+
grpc_chttp2_hpack_parser *p, uint8_t nibble) {
|
1338
1407
|
int16_t emit = emit_sub_tbl[16 * emit_tbl[p->huff_state] + nibble];
|
1339
1408
|
int16_t next = next_sub_tbl[16 * next_tbl[p->huff_state] + nibble];
|
1340
1409
|
if (emit != -1) {
|
1341
1410
|
if (emit >= 0 && emit < 256) {
|
1342
1411
|
uint8_t c = (uint8_t)emit;
|
1343
|
-
grpc_error *err = append_string(p, &c, (&c) + 1);
|
1412
|
+
grpc_error *err = append_string(exec_ctx, p, &c, (&c) + 1);
|
1344
1413
|
if (err != GRPC_ERROR_NONE) return err;
|
1345
1414
|
} else {
|
1346
1415
|
assert(emit == 256);
|
@@ -1351,42 +1420,45 @@ static grpc_error *huff_nibble(grpc_chttp2_hpack_parser *p, uint8_t nibble) {
|
|
1351
1420
|
}
|
1352
1421
|
|
1353
1422
|
/* decode full bytes from a huffman encoded stream */
|
1354
|
-
static grpc_error *add_huff_bytes(
|
1423
|
+
static grpc_error *add_huff_bytes(grpc_exec_ctx *exec_ctx,
|
1424
|
+
grpc_chttp2_hpack_parser *p,
|
1355
1425
|
const uint8_t *cur, const uint8_t *end) {
|
1356
1426
|
for (; cur != end; ++cur) {
|
1357
|
-
grpc_error *err = huff_nibble(p, *cur >> 4);
|
1358
|
-
if (err != GRPC_ERROR_NONE) return parse_error(p, cur, end, err);
|
1359
|
-
err = huff_nibble(p, *cur & 0xf);
|
1360
|
-
if (err != GRPC_ERROR_NONE) return parse_error(p, cur, end, err);
|
1427
|
+
grpc_error *err = huff_nibble(exec_ctx, p, *cur >> 4);
|
1428
|
+
if (err != GRPC_ERROR_NONE) return parse_error(exec_ctx, p, cur, end, err);
|
1429
|
+
err = huff_nibble(exec_ctx, p, *cur & 0xf);
|
1430
|
+
if (err != GRPC_ERROR_NONE) return parse_error(exec_ctx, p, cur, end, err);
|
1361
1431
|
}
|
1362
1432
|
return GRPC_ERROR_NONE;
|
1363
1433
|
}
|
1364
1434
|
|
1365
1435
|
/* decode some string bytes based on the current decoding mode
|
1366
1436
|
(huffman or not) */
|
1367
|
-
static grpc_error *add_str_bytes(
|
1437
|
+
static grpc_error *add_str_bytes(grpc_exec_ctx *exec_ctx,
|
1438
|
+
grpc_chttp2_hpack_parser *p,
|
1368
1439
|
const uint8_t *cur, const uint8_t *end) {
|
1369
1440
|
if (p->huff) {
|
1370
|
-
return add_huff_bytes(p, cur, end);
|
1441
|
+
return add_huff_bytes(exec_ctx, p, cur, end);
|
1371
1442
|
} else {
|
1372
|
-
return append_string(p, cur, end);
|
1443
|
+
return append_string(exec_ctx, p, cur, end);
|
1373
1444
|
}
|
1374
1445
|
}
|
1375
1446
|
|
1376
1447
|
/* parse a string - tries to do large chunks at a time */
|
1377
|
-
static grpc_error *parse_string(
|
1448
|
+
static grpc_error *parse_string(grpc_exec_ctx *exec_ctx,
|
1449
|
+
grpc_chttp2_hpack_parser *p, const uint8_t *cur,
|
1378
1450
|
const uint8_t *end) {
|
1379
1451
|
size_t remaining = p->strlen - p->strgot;
|
1380
1452
|
size_t given = (size_t)(end - cur);
|
1381
1453
|
if (remaining <= given) {
|
1382
|
-
grpc_error *err = add_str_bytes(p, cur, cur + remaining);
|
1383
|
-
if (err != GRPC_ERROR_NONE) return parse_error(p, cur, end, err);
|
1384
|
-
err = finish_str(p, cur + remaining, end);
|
1385
|
-
if (err != GRPC_ERROR_NONE) return parse_error(p, cur, end, err);
|
1386
|
-
return parse_next(p, cur + remaining, end);
|
1454
|
+
grpc_error *err = add_str_bytes(exec_ctx, p, cur, cur + remaining);
|
1455
|
+
if (err != GRPC_ERROR_NONE) return parse_error(exec_ctx, p, cur, end, err);
|
1456
|
+
err = finish_str(exec_ctx, p, cur + remaining, end);
|
1457
|
+
if (err != GRPC_ERROR_NONE) return parse_error(exec_ctx, p, cur, end, err);
|
1458
|
+
return parse_next(exec_ctx, p, cur + remaining, end);
|
1387
1459
|
} else {
|
1388
|
-
grpc_error *err = add_str_bytes(p, cur, cur + given);
|
1389
|
-
if (err != GRPC_ERROR_NONE) return parse_error(p, cur, end, err);
|
1460
|
+
grpc_error *err = add_str_bytes(exec_ctx, p, cur, cur + given);
|
1461
|
+
if (err != GRPC_ERROR_NONE) return parse_error(exec_ctx, p, cur, end, err);
|
1390
1462
|
GPR_ASSERT(given <= UINT32_MAX - p->strgot);
|
1391
1463
|
p->strgot += (uint32_t)given;
|
1392
1464
|
p->state = parse_string;
|
@@ -1395,7 +1467,8 @@ static grpc_error *parse_string(grpc_chttp2_hpack_parser *p, const uint8_t *cur,
|
|
1395
1467
|
}
|
1396
1468
|
|
1397
1469
|
/* begin parsing a string - performs setup, calls parse_string */
|
1398
|
-
static grpc_error *begin_parse_string(
|
1470
|
+
static grpc_error *begin_parse_string(grpc_exec_ctx *exec_ctx,
|
1471
|
+
grpc_chttp2_hpack_parser *p,
|
1399
1472
|
const uint8_t *cur, const uint8_t *end,
|
1400
1473
|
uint8_t binary,
|
1401
1474
|
grpc_chttp2_hpack_parser_string *str) {
|
@@ -1404,13 +1477,14 @@ static grpc_error *begin_parse_string(grpc_chttp2_hpack_parser *p,
|
|
1404
1477
|
p->parsing.str = str;
|
1405
1478
|
p->huff_state = 0;
|
1406
1479
|
p->binary = binary;
|
1407
|
-
return parse_string(p, cur, end);
|
1480
|
+
return parse_string(exec_ctx, p, cur, end);
|
1408
1481
|
}
|
1409
1482
|
|
1410
1483
|
/* parse the key string */
|
1411
|
-
static grpc_error *parse_key_string(
|
1484
|
+
static grpc_error *parse_key_string(grpc_exec_ctx *exec_ctx,
|
1485
|
+
grpc_chttp2_hpack_parser *p,
|
1412
1486
|
const uint8_t *cur, const uint8_t *end) {
|
1413
|
-
return begin_parse_string(p, cur, end, NOT_BINARY, &p->key);
|
1487
|
+
return begin_parse_string(exec_ctx, p, cur, end, NOT_BINARY, &p->key);
|
1414
1488
|
}
|
1415
1489
|
|
1416
1490
|
/* check if a key represents a binary header or not */
|
@@ -1428,36 +1502,40 @@ static grpc_error *is_binary_indexed_header(grpc_chttp2_hpack_parser *p,
|
|
1428
1502
|
GRPC_ERROR_INT_INDEX, (intptr_t)p->index),
|
1429
1503
|
GRPC_ERROR_INT_SIZE, (intptr_t)p->table.num_ents);
|
1430
1504
|
}
|
1431
|
-
*is =
|
1432
|
-
|
1433
|
-
|
1505
|
+
*is = grpc_is_binary_header(
|
1506
|
+
(const char *)GRPC_SLICE_START_PTR(elem->key->slice),
|
1507
|
+
GRPC_SLICE_LENGTH(elem->key->slice));
|
1434
1508
|
return GRPC_ERROR_NONE;
|
1435
1509
|
}
|
1436
1510
|
|
1437
1511
|
/* parse the value string */
|
1438
|
-
static grpc_error *parse_value_string(
|
1512
|
+
static grpc_error *parse_value_string(grpc_exec_ctx *exec_ctx,
|
1513
|
+
grpc_chttp2_hpack_parser *p,
|
1439
1514
|
const uint8_t *cur, const uint8_t *end,
|
1440
1515
|
bool is_binary) {
|
1441
|
-
return begin_parse_string(p, cur, end,
|
1442
|
-
&p->value);
|
1516
|
+
return begin_parse_string(exec_ctx, p, cur, end,
|
1517
|
+
is_binary ? B64_BYTE0 : NOT_BINARY, &p->value);
|
1443
1518
|
}
|
1444
1519
|
|
1445
1520
|
static grpc_error *parse_value_string_with_indexed_key(
|
1446
|
-
grpc_chttp2_hpack_parser *p, const uint8_t *cur,
|
1521
|
+
grpc_exec_ctx *exec_ctx, grpc_chttp2_hpack_parser *p, const uint8_t *cur,
|
1522
|
+
const uint8_t *end) {
|
1447
1523
|
bool is_binary = false;
|
1448
1524
|
grpc_error *err = is_binary_indexed_header(p, &is_binary);
|
1449
|
-
if (err != GRPC_ERROR_NONE) return parse_error(p, cur, end, err);
|
1450
|
-
return parse_value_string(p, cur, end, is_binary);
|
1525
|
+
if (err != GRPC_ERROR_NONE) return parse_error(exec_ctx, p, cur, end, err);
|
1526
|
+
return parse_value_string(exec_ctx, p, cur, end, is_binary);
|
1451
1527
|
}
|
1452
1528
|
|
1453
1529
|
static grpc_error *parse_value_string_with_literal_key(
|
1454
|
-
grpc_chttp2_hpack_parser *p, const uint8_t *cur,
|
1455
|
-
|
1530
|
+
grpc_exec_ctx *exec_ctx, grpc_chttp2_hpack_parser *p, const uint8_t *cur,
|
1531
|
+
const uint8_t *end) {
|
1532
|
+
return parse_value_string(exec_ctx, p, cur, end, is_binary_literal_header(p));
|
1456
1533
|
}
|
1457
1534
|
|
1458
1535
|
/* PUBLIC INTERFACE */
|
1459
1536
|
|
1460
|
-
void grpc_chttp2_hpack_parser_init(
|
1537
|
+
void grpc_chttp2_hpack_parser_init(grpc_exec_ctx *exec_ctx,
|
1538
|
+
grpc_chttp2_hpack_parser *p) {
|
1461
1539
|
p->on_header = NULL;
|
1462
1540
|
p->on_header_user_data = NULL;
|
1463
1541
|
p->state = parse_begin;
|
@@ -1469,7 +1547,7 @@ void grpc_chttp2_hpack_parser_init(grpc_chttp2_hpack_parser *p) {
|
|
1469
1547
|
p->value.length = 0;
|
1470
1548
|
p->dynamic_table_update_allowed = 2;
|
1471
1549
|
p->last_error = GRPC_ERROR_NONE;
|
1472
|
-
grpc_chttp2_hptbl_init(&p->table);
|
1550
|
+
grpc_chttp2_hptbl_init(exec_ctx, &p->table);
|
1473
1551
|
}
|
1474
1552
|
|
1475
1553
|
void grpc_chttp2_hpack_parser_set_has_priority(grpc_chttp2_hpack_parser *p) {
|
@@ -1477,34 +1555,58 @@ void grpc_chttp2_hpack_parser_set_has_priority(grpc_chttp2_hpack_parser *p) {
|
|
1477
1555
|
p->state = parse_stream_dep0;
|
1478
1556
|
}
|
1479
1557
|
|
1480
|
-
void grpc_chttp2_hpack_parser_destroy(
|
1481
|
-
|
1558
|
+
void grpc_chttp2_hpack_parser_destroy(grpc_exec_ctx *exec_ctx,
|
1559
|
+
grpc_chttp2_hpack_parser *p) {
|
1560
|
+
grpc_chttp2_hptbl_destroy(exec_ctx, &p->table);
|
1482
1561
|
GRPC_ERROR_UNREF(p->last_error);
|
1483
1562
|
gpr_free(p->key.str);
|
1484
1563
|
gpr_free(p->value.str);
|
1485
1564
|
}
|
1486
1565
|
|
1487
|
-
grpc_error *grpc_chttp2_hpack_parser_parse(
|
1566
|
+
grpc_error *grpc_chttp2_hpack_parser_parse(grpc_exec_ctx *exec_ctx,
|
1567
|
+
grpc_chttp2_hpack_parser *p,
|
1488
1568
|
const uint8_t *beg,
|
1489
1569
|
const uint8_t *end) {
|
1490
1570
|
/* TODO(ctiller): limit the distance of end from beg, and perform multiple
|
1491
1571
|
steps in the event of a large chunk of data to limit
|
1492
1572
|
stack space usage when no tail call optimization is
|
1493
1573
|
available */
|
1494
|
-
return p->state(p, beg, end);
|
1574
|
+
return p->state(exec_ctx, p, beg, end);
|
1495
1575
|
}
|
1496
1576
|
|
1497
|
-
|
1498
|
-
|
1499
|
-
|
1500
|
-
|
1577
|
+
typedef void (*maybe_complete_func_type)(grpc_exec_ctx *exec_ctx,
|
1578
|
+
grpc_chttp2_transport *t,
|
1579
|
+
grpc_chttp2_stream *s);
|
1580
|
+
static const maybe_complete_func_type maybe_complete_funcs[] = {
|
1581
|
+
grpc_chttp2_maybe_complete_recv_initial_metadata,
|
1582
|
+
grpc_chttp2_maybe_complete_recv_trailing_metadata};
|
1583
|
+
|
1584
|
+
static void force_client_rst_stream(grpc_exec_ctx *exec_ctx, void *sp,
|
1585
|
+
grpc_error *error) {
|
1586
|
+
grpc_chttp2_stream *s = sp;
|
1587
|
+
grpc_chttp2_transport *t = s->t;
|
1588
|
+
if (!s->write_closed) {
|
1589
|
+
grpc_slice_buffer_add(
|
1590
|
+
&t->qbuf, grpc_chttp2_rst_stream_create(s->id, GRPC_CHTTP2_NO_ERROR,
|
1591
|
+
&s->stats.outgoing));
|
1592
|
+
grpc_chttp2_initiate_write(exec_ctx, t, false, "force_rst_stream");
|
1593
|
+
grpc_chttp2_mark_stream_closed(exec_ctx, t, s, true, true, GRPC_ERROR_NONE);
|
1594
|
+
}
|
1595
|
+
GRPC_CHTTP2_STREAM_UNREF(exec_ctx, s, "final_rst");
|
1596
|
+
}
|
1597
|
+
|
1598
|
+
grpc_error *grpc_chttp2_header_parser_parse(grpc_exec_ctx *exec_ctx,
|
1599
|
+
void *hpack_parser,
|
1600
|
+
grpc_chttp2_transport *t,
|
1601
|
+
grpc_chttp2_stream *s,
|
1602
|
+
grpc_slice slice, int is_last) {
|
1501
1603
|
grpc_chttp2_hpack_parser *parser = hpack_parser;
|
1502
1604
|
GPR_TIMER_BEGIN("grpc_chttp2_hpack_parser_parse", 0);
|
1503
|
-
if (
|
1504
|
-
|
1605
|
+
if (s != NULL) {
|
1606
|
+
s->stats.incoming.header_bytes += GRPC_SLICE_LENGTH(slice);
|
1505
1607
|
}
|
1506
1608
|
grpc_error *error = grpc_chttp2_hpack_parser_parse(
|
1507
|
-
parser,
|
1609
|
+
exec_ctx, parser, GRPC_SLICE_START_PTR(slice), GRPC_SLICE_END_PTR(slice));
|
1508
1610
|
if (error != GRPC_ERROR_NONE) {
|
1509
1611
|
GPR_TIMER_END("grpc_chttp2_hpack_parser_parse", 0);
|
1510
1612
|
return error;
|
@@ -1517,20 +1619,31 @@ grpc_error *grpc_chttp2_header_parser_parse(
|
|
1517
1619
|
}
|
1518
1620
|
/* need to check for null stream: this can occur if we receive an invalid
|
1519
1621
|
stream id on a header */
|
1520
|
-
if (
|
1622
|
+
if (s != NULL) {
|
1521
1623
|
if (parser->is_boundary) {
|
1522
|
-
if (
|
1523
|
-
GPR_ARRAY_SIZE(stream_parsing->got_metadata_on_parse)) {
|
1624
|
+
if (s->header_frames_received == GPR_ARRAY_SIZE(s->metadata_buffer)) {
|
1524
1625
|
return GRPC_ERROR_CREATE("Too many trailer frames");
|
1525
1626
|
}
|
1526
|
-
|
1527
|
-
|
1528
|
-
|
1529
|
-
|
1530
|
-
stream_parsing);
|
1627
|
+
s->published_metadata[s->header_frames_received] =
|
1628
|
+
GRPC_METADATA_PUBLISHED_FROM_WIRE;
|
1629
|
+
maybe_complete_funcs[s->header_frames_received](exec_ctx, t, s);
|
1630
|
+
s->header_frames_received++;
|
1531
1631
|
}
|
1532
1632
|
if (parser->is_eof) {
|
1533
|
-
|
1633
|
+
if (t->is_client && !s->write_closed) {
|
1634
|
+
/* server eof ==> complete closure; we may need to forcefully close
|
1635
|
+
the stream. Wait until the combiner lock is ready to be released
|
1636
|
+
however -- it might be that we receive a RST_STREAM following this
|
1637
|
+
and can avoid the extra write */
|
1638
|
+
GRPC_CHTTP2_STREAM_REF(s, "final_rst");
|
1639
|
+
grpc_closure_sched(
|
1640
|
+
exec_ctx, grpc_closure_create(force_client_rst_stream, s,
|
1641
|
+
grpc_combiner_finally_scheduler(
|
1642
|
+
t->combiner, false)),
|
1643
|
+
GRPC_ERROR_NONE);
|
1644
|
+
}
|
1645
|
+
grpc_chttp2_mark_stream_closed(exec_ctx, t, s, true, false,
|
1646
|
+
GRPC_ERROR_NONE);
|
1534
1647
|
}
|
1535
1648
|
}
|
1536
1649
|
parser->on_header = NULL;
|