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
@@ -41,235 +41,46 @@
|
|
41
41
|
|
42
42
|
#include "src/core/ext/transport/chttp2/transport/http2_errors.h"
|
43
43
|
#include "src/core/ext/transport/chttp2/transport/status_conversion.h"
|
44
|
-
#include "src/core/ext/transport/chttp2/transport/timeout_encoding.h"
|
45
44
|
#include "src/core/lib/profiling/timers.h"
|
46
45
|
#include "src/core/lib/transport/static_metadata.h"
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
static grpc_error *
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
grpc_chttp2_transport_parsing *transport_parsing) {
|
80
|
-
grpc_chttp2_stream_global *stream_global;
|
81
|
-
grpc_chttp2_stream_parsing *stream_parsing;
|
82
|
-
|
83
|
-
GPR_TIMER_BEGIN("grpc_chttp2_prepare_to_read", 0);
|
84
|
-
|
85
|
-
transport_parsing->next_stream_id = transport_global->next_stream_id;
|
86
|
-
memcpy(transport_parsing->last_sent_settings,
|
87
|
-
transport_global->settings[GRPC_SENT_SETTINGS],
|
88
|
-
sizeof(transport_parsing->last_sent_settings));
|
89
|
-
transport_parsing->max_frame_size =
|
90
|
-
transport_global->settings[GRPC_ACKED_SETTINGS]
|
91
|
-
[GRPC_CHTTP2_SETTINGS_MAX_FRAME_SIZE];
|
92
|
-
|
93
|
-
/* update the parsing view of incoming window */
|
94
|
-
while (grpc_chttp2_list_pop_unannounced_incoming_window_available(
|
95
|
-
transport_global, transport_parsing, &stream_global, &stream_parsing)) {
|
96
|
-
GRPC_CHTTP2_FLOW_MOVE_STREAM("parse", transport_parsing, stream_parsing,
|
97
|
-
incoming_window, stream_global,
|
98
|
-
unannounced_incoming_window_for_parse);
|
99
|
-
}
|
100
|
-
|
101
|
-
GPR_TIMER_END("grpc_chttp2_prepare_to_read", 0);
|
102
|
-
}
|
103
|
-
|
104
|
-
void grpc_chttp2_publish_reads(
|
105
|
-
grpc_exec_ctx *exec_ctx, grpc_chttp2_transport_global *transport_global,
|
106
|
-
grpc_chttp2_transport_parsing *transport_parsing) {
|
107
|
-
grpc_chttp2_stream_global *stream_global;
|
108
|
-
grpc_chttp2_stream_parsing *stream_parsing;
|
109
|
-
int was_zero;
|
110
|
-
int is_zero;
|
111
|
-
|
112
|
-
/* transport_parsing->last_incoming_stream_id is used as
|
113
|
-
last-grpc_chttp2_stream-id when
|
114
|
-
sending GOAWAY frame.
|
115
|
-
https://tools.ietf.org/html/draft-ietf-httpbis-http2-17#section-6.8
|
116
|
-
says that last-grpc_chttp2_stream-id is peer-initiated grpc_chttp2_stream
|
117
|
-
ID. So,
|
118
|
-
since we don't have server pushed streams, client should send
|
119
|
-
GOAWAY last-grpc_chttp2_stream-id=0 in this case. */
|
120
|
-
if (!transport_parsing->is_client) {
|
121
|
-
transport_global->last_incoming_stream_id =
|
122
|
-
transport_parsing->last_incoming_stream_id;
|
123
|
-
}
|
124
|
-
|
125
|
-
/* update global settings */
|
126
|
-
if (transport_parsing->settings_updated) {
|
127
|
-
memcpy(transport_global->settings[GRPC_PEER_SETTINGS],
|
128
|
-
transport_parsing->settings, sizeof(transport_parsing->settings));
|
129
|
-
transport_parsing->settings_updated = 0;
|
130
|
-
}
|
131
|
-
|
132
|
-
/* update settings based on ack if received */
|
133
|
-
if (transport_parsing->settings_ack_received) {
|
134
|
-
memcpy(transport_global->settings[GRPC_ACKED_SETTINGS],
|
135
|
-
transport_global->settings[GRPC_SENT_SETTINGS],
|
136
|
-
GRPC_CHTTP2_NUM_SETTINGS * sizeof(uint32_t));
|
137
|
-
transport_parsing->settings_ack_received = 0;
|
138
|
-
transport_global->sent_local_settings = 0;
|
139
|
-
}
|
140
|
-
|
141
|
-
/* move goaway to the global state if we received one (it will be
|
142
|
-
published later */
|
143
|
-
if (transport_parsing->goaway_received) {
|
144
|
-
grpc_chttp2_add_incoming_goaway(exec_ctx, transport_global,
|
145
|
-
(uint32_t)transport_parsing->goaway_error,
|
146
|
-
transport_parsing->goaway_text);
|
147
|
-
transport_parsing->goaway_text = gpr_empty_slice();
|
148
|
-
transport_parsing->goaway_received = 0;
|
149
|
-
}
|
150
|
-
|
151
|
-
/* propagate flow control tokens to global state */
|
152
|
-
was_zero = transport_global->outgoing_window <= 0;
|
153
|
-
GRPC_CHTTP2_FLOW_MOVE_TRANSPORT("parsed", transport_global, outgoing_window,
|
154
|
-
transport_parsing, outgoing_window);
|
155
|
-
is_zero = transport_global->outgoing_window <= 0;
|
156
|
-
if (was_zero && !is_zero) {
|
157
|
-
grpc_chttp2_initiate_write(exec_ctx, transport_global, false,
|
158
|
-
"new_global_flow_control");
|
159
|
-
}
|
160
|
-
|
161
|
-
if (transport_parsing->incoming_window <
|
162
|
-
transport_global->connection_window_target * 3 / 4) {
|
163
|
-
int64_t announce_bytes = transport_global->connection_window_target -
|
164
|
-
transport_parsing->incoming_window;
|
165
|
-
GRPC_CHTTP2_FLOW_CREDIT_TRANSPORT("parsed", transport_global,
|
166
|
-
announce_incoming_window, announce_bytes);
|
167
|
-
GRPC_CHTTP2_FLOW_CREDIT_TRANSPORT("parsed", transport_parsing,
|
168
|
-
incoming_window, announce_bytes);
|
169
|
-
grpc_chttp2_initiate_write(exec_ctx, transport_global, false,
|
170
|
-
"global incoming window");
|
171
|
-
}
|
172
|
-
|
173
|
-
/* for each stream that saw an update, fixup global state */
|
174
|
-
while (grpc_chttp2_list_pop_parsing_seen_stream(
|
175
|
-
transport_global, transport_parsing, &stream_global, &stream_parsing)) {
|
176
|
-
if (stream_parsing->seen_error) {
|
177
|
-
stream_global->seen_error = true;
|
178
|
-
stream_global->exceeded_metadata_size =
|
179
|
-
stream_parsing->exceeded_metadata_size;
|
180
|
-
grpc_chttp2_list_add_check_read_ops(transport_global, stream_global);
|
181
|
-
}
|
182
|
-
|
183
|
-
/* flush stats to global stream state */
|
184
|
-
grpc_transport_move_stats(&stream_parsing->stats, &stream_global->stats);
|
185
|
-
|
186
|
-
/* update outgoing flow control window */
|
187
|
-
was_zero = stream_global->outgoing_window <= 0;
|
188
|
-
GRPC_CHTTP2_FLOW_MOVE_STREAM("parsed", transport_global, stream_global,
|
189
|
-
outgoing_window, stream_parsing,
|
190
|
-
outgoing_window);
|
191
|
-
is_zero = stream_global->outgoing_window <= 0;
|
192
|
-
if (was_zero && !is_zero) {
|
193
|
-
grpc_chttp2_become_writable(exec_ctx, transport_global, stream_global,
|
194
|
-
false, "stream.read_flow_control");
|
195
|
-
}
|
196
|
-
|
197
|
-
stream_global->max_recv_bytes -= (uint32_t)GPR_MIN(
|
198
|
-
stream_global->max_recv_bytes, stream_parsing->received_bytes);
|
199
|
-
stream_parsing->received_bytes = 0;
|
200
|
-
|
201
|
-
/* publish incoming stream ops */
|
202
|
-
if (stream_global->incoming_frames.tail != NULL) {
|
203
|
-
stream_global->incoming_frames.tail->is_tail = 0;
|
204
|
-
}
|
205
|
-
if (stream_parsing->data_parser.incoming_frames.head != NULL) {
|
206
|
-
grpc_chttp2_list_add_check_read_ops(transport_global, stream_global);
|
207
|
-
}
|
208
|
-
grpc_chttp2_incoming_frame_queue_merge(
|
209
|
-
&stream_global->incoming_frames,
|
210
|
-
&stream_parsing->data_parser.incoming_frames);
|
211
|
-
if (stream_global->incoming_frames.tail != NULL) {
|
212
|
-
stream_global->incoming_frames.tail->is_tail = 1;
|
213
|
-
}
|
214
|
-
|
215
|
-
if (!stream_global->published_initial_metadata &&
|
216
|
-
stream_parsing->got_metadata_on_parse[0]) {
|
217
|
-
stream_parsing->got_metadata_on_parse[0] = 0;
|
218
|
-
stream_global->published_initial_metadata = 1;
|
219
|
-
GPR_SWAP(grpc_chttp2_incoming_metadata_buffer,
|
220
|
-
stream_parsing->metadata_buffer[0],
|
221
|
-
stream_global->received_initial_metadata);
|
222
|
-
grpc_chttp2_list_add_check_read_ops(transport_global, stream_global);
|
223
|
-
}
|
224
|
-
if (!stream_global->published_trailing_metadata &&
|
225
|
-
stream_parsing->got_metadata_on_parse[1]) {
|
226
|
-
stream_parsing->got_metadata_on_parse[1] = 0;
|
227
|
-
stream_global->published_trailing_metadata = 1;
|
228
|
-
GPR_SWAP(grpc_chttp2_incoming_metadata_buffer,
|
229
|
-
stream_parsing->metadata_buffer[1],
|
230
|
-
stream_global->received_trailing_metadata);
|
231
|
-
grpc_chttp2_list_add_check_read_ops(transport_global, stream_global);
|
232
|
-
}
|
233
|
-
|
234
|
-
if (stream_parsing->forced_close_error != GRPC_ERROR_NONE) {
|
235
|
-
intptr_t reason;
|
236
|
-
bool has_reason = grpc_error_get_int(stream_parsing->forced_close_error,
|
237
|
-
GRPC_ERROR_INT_HTTP2_ERROR, &reason);
|
238
|
-
if (has_reason && reason != GRPC_CHTTP2_NO_ERROR) {
|
239
|
-
grpc_status_code status_code =
|
240
|
-
has_reason
|
241
|
-
? grpc_chttp2_http2_error_to_grpc_status(
|
242
|
-
(grpc_chttp2_error_code)reason, stream_global->deadline)
|
243
|
-
: GRPC_STATUS_INTERNAL;
|
244
|
-
const char *status_details =
|
245
|
-
grpc_error_string(stream_parsing->forced_close_error);
|
246
|
-
gpr_slice slice_details = gpr_slice_from_copied_string(status_details);
|
247
|
-
grpc_error_free_string(status_details);
|
248
|
-
grpc_chttp2_fake_status(exec_ctx, transport_global, stream_global,
|
249
|
-
status_code, &slice_details);
|
250
|
-
}
|
251
|
-
grpc_chttp2_mark_stream_closed(exec_ctx, transport_global, stream_global,
|
252
|
-
1, 1, stream_parsing->forced_close_error);
|
253
|
-
}
|
254
|
-
|
255
|
-
if (stream_parsing->received_close) {
|
256
|
-
grpc_chttp2_mark_stream_closed(exec_ctx, transport_global, stream_global,
|
257
|
-
1, 0, GRPC_ERROR_NONE);
|
258
|
-
}
|
259
|
-
}
|
260
|
-
}
|
261
|
-
|
262
|
-
grpc_error *grpc_chttp2_perform_read(
|
263
|
-
grpc_exec_ctx *exec_ctx, grpc_chttp2_transport_parsing *transport_parsing,
|
264
|
-
gpr_slice slice) {
|
265
|
-
uint8_t *beg = GPR_SLICE_START_PTR(slice);
|
266
|
-
uint8_t *end = GPR_SLICE_END_PTR(slice);
|
46
|
+
#include "src/core/lib/transport/timeout_encoding.h"
|
47
|
+
|
48
|
+
static grpc_error *init_frame_parser(grpc_exec_ctx *exec_ctx,
|
49
|
+
grpc_chttp2_transport *t);
|
50
|
+
static grpc_error *init_header_frame_parser(grpc_exec_ctx *exec_ctx,
|
51
|
+
grpc_chttp2_transport *t,
|
52
|
+
int is_continuation);
|
53
|
+
static grpc_error *init_data_frame_parser(grpc_exec_ctx *exec_ctx,
|
54
|
+
grpc_chttp2_transport *t);
|
55
|
+
static grpc_error *init_rst_stream_parser(grpc_exec_ctx *exec_ctx,
|
56
|
+
grpc_chttp2_transport *t);
|
57
|
+
static grpc_error *init_settings_frame_parser(grpc_exec_ctx *exec_ctx,
|
58
|
+
grpc_chttp2_transport *t);
|
59
|
+
static grpc_error *init_window_update_frame_parser(grpc_exec_ctx *exec_ctx,
|
60
|
+
grpc_chttp2_transport *t);
|
61
|
+
static grpc_error *init_ping_parser(grpc_exec_ctx *exec_ctx,
|
62
|
+
grpc_chttp2_transport *t);
|
63
|
+
static grpc_error *init_goaway_parser(grpc_exec_ctx *exec_ctx,
|
64
|
+
grpc_chttp2_transport *t);
|
65
|
+
static grpc_error *init_skip_frame_parser(grpc_exec_ctx *exec_ctx,
|
66
|
+
grpc_chttp2_transport *t,
|
67
|
+
int is_header);
|
68
|
+
|
69
|
+
static grpc_error *parse_frame_slice(grpc_exec_ctx *exec_ctx,
|
70
|
+
grpc_chttp2_transport *t, grpc_slice slice,
|
71
|
+
int is_last);
|
72
|
+
|
73
|
+
grpc_error *grpc_chttp2_perform_read(grpc_exec_ctx *exec_ctx,
|
74
|
+
grpc_chttp2_transport *t,
|
75
|
+
grpc_slice slice) {
|
76
|
+
uint8_t *beg = GRPC_SLICE_START_PTR(slice);
|
77
|
+
uint8_t *end = GRPC_SLICE_END_PTR(slice);
|
267
78
|
uint8_t *cur = beg;
|
268
79
|
grpc_error *err;
|
269
80
|
|
270
81
|
if (cur == end) return GRPC_ERROR_NONE;
|
271
82
|
|
272
|
-
switch (
|
83
|
+
switch (t->deframe_state) {
|
273
84
|
case GRPC_DTS_CLIENT_PREFIX_0:
|
274
85
|
case GRPC_DTS_CLIENT_PREFIX_1:
|
275
86
|
case GRPC_DTS_CLIENT_PREFIX_2:
|
@@ -294,25 +105,22 @@ grpc_error *grpc_chttp2_perform_read(
|
|
294
105
|
case GRPC_DTS_CLIENT_PREFIX_21:
|
295
106
|
case GRPC_DTS_CLIENT_PREFIX_22:
|
296
107
|
case GRPC_DTS_CLIENT_PREFIX_23:
|
297
|
-
while (cur != end &&
|
298
|
-
if (*cur != GRPC_CHTTP2_CLIENT_CONNECT_STRING[
|
299
|
-
->deframe_state]) {
|
108
|
+
while (cur != end && t->deframe_state != GRPC_DTS_FH_0) {
|
109
|
+
if (*cur != GRPC_CHTTP2_CLIENT_CONNECT_STRING[t->deframe_state]) {
|
300
110
|
char *msg;
|
301
111
|
gpr_asprintf(
|
302
112
|
&msg,
|
303
113
|
"Connect string mismatch: expected '%c' (%d) got '%c' (%d) "
|
304
114
|
"at byte %d",
|
305
|
-
GRPC_CHTTP2_CLIENT_CONNECT_STRING[
|
306
|
-
|
307
|
-
(int)
|
308
|
-
[transport_parsing->deframe_state],
|
309
|
-
*cur, (int)*cur, transport_parsing->deframe_state);
|
115
|
+
GRPC_CHTTP2_CLIENT_CONNECT_STRING[t->deframe_state],
|
116
|
+
(int)(uint8_t)GRPC_CHTTP2_CLIENT_CONNECT_STRING[t->deframe_state],
|
117
|
+
*cur, (int)*cur, t->deframe_state);
|
310
118
|
err = GRPC_ERROR_CREATE(msg);
|
311
119
|
gpr_free(msg);
|
312
120
|
return err;
|
313
121
|
}
|
314
122
|
++cur;
|
315
|
-
++
|
123
|
+
++t->deframe_state;
|
316
124
|
}
|
317
125
|
if (cur == end) {
|
318
126
|
return GRPC_ERROR_NONE;
|
@@ -321,100 +129,95 @@ grpc_error *grpc_chttp2_perform_read(
|
|
321
129
|
dts_fh_0:
|
322
130
|
case GRPC_DTS_FH_0:
|
323
131
|
GPR_ASSERT(cur < end);
|
324
|
-
|
132
|
+
t->incoming_frame_size = ((uint32_t)*cur) << 16;
|
325
133
|
if (++cur == end) {
|
326
|
-
|
134
|
+
t->deframe_state = GRPC_DTS_FH_1;
|
327
135
|
return GRPC_ERROR_NONE;
|
328
136
|
}
|
329
137
|
/* fallthrough */
|
330
138
|
case GRPC_DTS_FH_1:
|
331
139
|
GPR_ASSERT(cur < end);
|
332
|
-
|
140
|
+
t->incoming_frame_size |= ((uint32_t)*cur) << 8;
|
333
141
|
if (++cur == end) {
|
334
|
-
|
142
|
+
t->deframe_state = GRPC_DTS_FH_2;
|
335
143
|
return GRPC_ERROR_NONE;
|
336
144
|
}
|
337
145
|
/* fallthrough */
|
338
146
|
case GRPC_DTS_FH_2:
|
339
147
|
GPR_ASSERT(cur < end);
|
340
|
-
|
148
|
+
t->incoming_frame_size |= *cur;
|
341
149
|
if (++cur == end) {
|
342
|
-
|
150
|
+
t->deframe_state = GRPC_DTS_FH_3;
|
343
151
|
return GRPC_ERROR_NONE;
|
344
152
|
}
|
345
153
|
/* fallthrough */
|
346
154
|
case GRPC_DTS_FH_3:
|
347
155
|
GPR_ASSERT(cur < end);
|
348
|
-
|
156
|
+
t->incoming_frame_type = *cur;
|
349
157
|
if (++cur == end) {
|
350
|
-
|
158
|
+
t->deframe_state = GRPC_DTS_FH_4;
|
351
159
|
return GRPC_ERROR_NONE;
|
352
160
|
}
|
353
161
|
/* fallthrough */
|
354
162
|
case GRPC_DTS_FH_4:
|
355
163
|
GPR_ASSERT(cur < end);
|
356
|
-
|
164
|
+
t->incoming_frame_flags = *cur;
|
357
165
|
if (++cur == end) {
|
358
|
-
|
166
|
+
t->deframe_state = GRPC_DTS_FH_5;
|
359
167
|
return GRPC_ERROR_NONE;
|
360
168
|
}
|
361
169
|
/* fallthrough */
|
362
170
|
case GRPC_DTS_FH_5:
|
363
171
|
GPR_ASSERT(cur < end);
|
364
|
-
|
172
|
+
t->incoming_stream_id = (((uint32_t)*cur) & 0x7f) << 24;
|
365
173
|
if (++cur == end) {
|
366
|
-
|
174
|
+
t->deframe_state = GRPC_DTS_FH_6;
|
367
175
|
return GRPC_ERROR_NONE;
|
368
176
|
}
|
369
177
|
/* fallthrough */
|
370
178
|
case GRPC_DTS_FH_6:
|
371
179
|
GPR_ASSERT(cur < end);
|
372
|
-
|
180
|
+
t->incoming_stream_id |= ((uint32_t)*cur) << 16;
|
373
181
|
if (++cur == end) {
|
374
|
-
|
182
|
+
t->deframe_state = GRPC_DTS_FH_7;
|
375
183
|
return GRPC_ERROR_NONE;
|
376
184
|
}
|
377
185
|
/* fallthrough */
|
378
186
|
case GRPC_DTS_FH_7:
|
379
187
|
GPR_ASSERT(cur < end);
|
380
|
-
|
188
|
+
t->incoming_stream_id |= ((uint32_t)*cur) << 8;
|
381
189
|
if (++cur == end) {
|
382
|
-
|
190
|
+
t->deframe_state = GRPC_DTS_FH_8;
|
383
191
|
return GRPC_ERROR_NONE;
|
384
192
|
}
|
385
193
|
/* fallthrough */
|
386
194
|
case GRPC_DTS_FH_8:
|
387
195
|
GPR_ASSERT(cur < end);
|
388
|
-
|
389
|
-
|
390
|
-
err = init_frame_parser(exec_ctx,
|
196
|
+
t->incoming_stream_id |= ((uint32_t)*cur);
|
197
|
+
t->deframe_state = GRPC_DTS_FRAME;
|
198
|
+
err = init_frame_parser(exec_ctx, t);
|
391
199
|
if (err != GRPC_ERROR_NONE) {
|
392
200
|
return err;
|
393
201
|
}
|
394
|
-
if (
|
395
|
-
|
396
|
-
transport_parsing->last_incoming_stream_id) {
|
397
|
-
transport_parsing->last_incoming_stream_id =
|
398
|
-
transport_parsing->incoming_stream_id;
|
399
|
-
}
|
400
|
-
if (transport_parsing->incoming_frame_size == 0) {
|
401
|
-
err = parse_frame_slice(exec_ctx, transport_parsing, gpr_empty_slice(),
|
402
|
-
1);
|
202
|
+
if (t->incoming_frame_size == 0) {
|
203
|
+
err = parse_frame_slice(exec_ctx, t, gpr_empty_slice(), 1);
|
403
204
|
if (err != GRPC_ERROR_NONE) {
|
404
205
|
return err;
|
405
206
|
}
|
406
|
-
|
207
|
+
t->incoming_stream = NULL;
|
407
208
|
if (++cur == end) {
|
408
|
-
|
209
|
+
t->deframe_state = GRPC_DTS_FH_0;
|
409
210
|
return GRPC_ERROR_NONE;
|
410
211
|
}
|
411
212
|
goto dts_fh_0; /* loop */
|
412
|
-
} else if (
|
413
|
-
|
213
|
+
} else if (t->incoming_frame_size >
|
214
|
+
t->settings[GRPC_ACKED_SETTINGS]
|
215
|
+
[GRPC_CHTTP2_SETTINGS_MAX_FRAME_SIZE]) {
|
414
216
|
char *msg;
|
415
217
|
gpr_asprintf(&msg, "Frame size %d is larger than max frame size %d",
|
416
|
-
|
417
|
-
|
218
|
+
t->incoming_frame_size,
|
219
|
+
t->settings[GRPC_ACKED_SETTINGS]
|
220
|
+
[GRPC_CHTTP2_SETTINGS_MAX_FRAME_SIZE]);
|
418
221
|
err = GRPC_ERROR_CREATE(msg);
|
419
222
|
gpr_free(msg);
|
420
223
|
return err;
|
@@ -425,41 +228,39 @@ grpc_error *grpc_chttp2_perform_read(
|
|
425
228
|
/* fallthrough */
|
426
229
|
case GRPC_DTS_FRAME:
|
427
230
|
GPR_ASSERT(cur < end);
|
428
|
-
if ((uint32_t)(end - cur) ==
|
429
|
-
err = parse_frame_slice(
|
430
|
-
|
431
|
-
|
432
|
-
|
231
|
+
if ((uint32_t)(end - cur) == t->incoming_frame_size) {
|
232
|
+
err = parse_frame_slice(
|
233
|
+
exec_ctx, t, grpc_slice_sub_no_ref(slice, (size_t)(cur - beg),
|
234
|
+
(size_t)(end - beg)),
|
235
|
+
1);
|
433
236
|
if (err != GRPC_ERROR_NONE) {
|
434
237
|
return err;
|
435
238
|
}
|
436
|
-
|
437
|
-
|
239
|
+
t->deframe_state = GRPC_DTS_FH_0;
|
240
|
+
t->incoming_stream = NULL;
|
438
241
|
return GRPC_ERROR_NONE;
|
439
|
-
} else if ((uint32_t)(end - cur) >
|
440
|
-
transport_parsing->incoming_frame_size) {
|
242
|
+
} else if ((uint32_t)(end - cur) > t->incoming_frame_size) {
|
441
243
|
size_t cur_offset = (size_t)(cur - beg);
|
442
244
|
err = parse_frame_slice(
|
443
|
-
exec_ctx,
|
444
|
-
|
445
|
-
|
446
|
-
cur_offset + transport_parsing->incoming_frame_size),
|
245
|
+
exec_ctx, t,
|
246
|
+
grpc_slice_sub_no_ref(slice, cur_offset,
|
247
|
+
cur_offset + t->incoming_frame_size),
|
447
248
|
1);
|
448
249
|
if (err != GRPC_ERROR_NONE) {
|
449
250
|
return err;
|
450
251
|
}
|
451
|
-
cur +=
|
452
|
-
|
252
|
+
cur += t->incoming_frame_size;
|
253
|
+
t->incoming_stream = NULL;
|
453
254
|
goto dts_fh_0; /* loop */
|
454
255
|
} else {
|
455
|
-
err = parse_frame_slice(
|
456
|
-
|
457
|
-
|
458
|
-
|
256
|
+
err = parse_frame_slice(
|
257
|
+
exec_ctx, t, grpc_slice_sub_no_ref(slice, (size_t)(cur - beg),
|
258
|
+
(size_t)(end - beg)),
|
259
|
+
0);
|
459
260
|
if (err != GRPC_ERROR_NONE) {
|
460
261
|
return err;
|
461
262
|
}
|
462
|
-
|
263
|
+
t->incoming_frame_size -= (uint32_t)(end - cur);
|
463
264
|
return GRPC_ERROR_NONE;
|
464
265
|
}
|
465
266
|
GPR_UNREACHABLE_CODE(return 0);
|
@@ -468,175 +269,172 @@ grpc_error *grpc_chttp2_perform_read(
|
|
468
269
|
GPR_UNREACHABLE_CODE(return 0);
|
469
270
|
}
|
470
271
|
|
471
|
-
static grpc_error *init_frame_parser(
|
472
|
-
|
473
|
-
if (
|
474
|
-
|
272
|
+
static grpc_error *init_frame_parser(grpc_exec_ctx *exec_ctx,
|
273
|
+
grpc_chttp2_transport *t) {
|
274
|
+
if (t->is_first_frame &&
|
275
|
+
t->incoming_frame_type != GRPC_CHTTP2_FRAME_SETTINGS) {
|
475
276
|
char *msg;
|
476
277
|
gpr_asprintf(
|
477
278
|
&msg, "Expected SETTINGS frame as the first frame, got frame type %d",
|
478
|
-
|
279
|
+
t->incoming_frame_type);
|
479
280
|
grpc_error *err = GRPC_ERROR_CREATE(msg);
|
480
281
|
gpr_free(msg);
|
481
282
|
return err;
|
482
283
|
}
|
483
|
-
|
484
|
-
if (
|
485
|
-
if (
|
486
|
-
GRPC_CHTTP2_FRAME_CONTINUATION) {
|
284
|
+
t->is_first_frame = false;
|
285
|
+
if (t->expect_continuation_stream_id != 0) {
|
286
|
+
if (t->incoming_frame_type != GRPC_CHTTP2_FRAME_CONTINUATION) {
|
487
287
|
char *msg;
|
488
288
|
gpr_asprintf(&msg, "Expected CONTINUATION frame, got frame type %02x",
|
489
|
-
|
289
|
+
t->incoming_frame_type);
|
490
290
|
grpc_error *err = GRPC_ERROR_CREATE(msg);
|
491
291
|
gpr_free(msg);
|
492
292
|
return err;
|
493
293
|
}
|
494
|
-
if (
|
495
|
-
transport_parsing->incoming_stream_id) {
|
294
|
+
if (t->expect_continuation_stream_id != t->incoming_stream_id) {
|
496
295
|
char *msg;
|
497
296
|
gpr_asprintf(
|
498
297
|
&msg,
|
499
298
|
"Expected CONTINUATION frame for grpc_chttp2_stream %08x, got "
|
500
299
|
"grpc_chttp2_stream %08x",
|
501
|
-
|
502
|
-
transport_parsing->incoming_stream_id);
|
300
|
+
t->expect_continuation_stream_id, t->incoming_stream_id);
|
503
301
|
grpc_error *err = GRPC_ERROR_CREATE(msg);
|
504
302
|
gpr_free(msg);
|
505
303
|
return err;
|
506
304
|
}
|
507
|
-
return init_header_frame_parser(exec_ctx,
|
305
|
+
return init_header_frame_parser(exec_ctx, t, 1);
|
508
306
|
}
|
509
|
-
switch (
|
307
|
+
switch (t->incoming_frame_type) {
|
510
308
|
case GRPC_CHTTP2_FRAME_DATA:
|
511
|
-
return init_data_frame_parser(exec_ctx,
|
309
|
+
return init_data_frame_parser(exec_ctx, t);
|
512
310
|
case GRPC_CHTTP2_FRAME_HEADER:
|
513
|
-
return init_header_frame_parser(exec_ctx,
|
311
|
+
return init_header_frame_parser(exec_ctx, t, 0);
|
514
312
|
case GRPC_CHTTP2_FRAME_CONTINUATION:
|
515
313
|
return GRPC_ERROR_CREATE("Unexpected CONTINUATION frame");
|
516
314
|
case GRPC_CHTTP2_FRAME_RST_STREAM:
|
517
|
-
return init_rst_stream_parser(exec_ctx,
|
315
|
+
return init_rst_stream_parser(exec_ctx, t);
|
518
316
|
case GRPC_CHTTP2_FRAME_SETTINGS:
|
519
|
-
return init_settings_frame_parser(exec_ctx,
|
317
|
+
return init_settings_frame_parser(exec_ctx, t);
|
520
318
|
case GRPC_CHTTP2_FRAME_WINDOW_UPDATE:
|
521
|
-
return init_window_update_frame_parser(exec_ctx,
|
319
|
+
return init_window_update_frame_parser(exec_ctx, t);
|
522
320
|
case GRPC_CHTTP2_FRAME_PING:
|
523
|
-
return init_ping_parser(exec_ctx,
|
321
|
+
return init_ping_parser(exec_ctx, t);
|
524
322
|
case GRPC_CHTTP2_FRAME_GOAWAY:
|
525
|
-
return init_goaway_parser(exec_ctx,
|
323
|
+
return init_goaway_parser(exec_ctx, t);
|
526
324
|
default:
|
527
325
|
if (grpc_http_trace) {
|
528
|
-
gpr_log(GPR_ERROR, "Unknown frame type %02x",
|
529
|
-
transport_parsing->incoming_frame_type);
|
326
|
+
gpr_log(GPR_ERROR, "Unknown frame type %02x", t->incoming_frame_type);
|
530
327
|
}
|
531
|
-
return init_skip_frame_parser(exec_ctx,
|
328
|
+
return init_skip_frame_parser(exec_ctx, t, 0);
|
532
329
|
}
|
533
330
|
}
|
534
331
|
|
535
332
|
static grpc_error *skip_parser(grpc_exec_ctx *exec_ctx, void *parser,
|
536
|
-
|
537
|
-
|
538
|
-
gpr_slice slice, int is_last) {
|
333
|
+
grpc_chttp2_transport *t, grpc_chttp2_stream *s,
|
334
|
+
grpc_slice slice, int is_last) {
|
539
335
|
return GRPC_ERROR_NONE;
|
540
336
|
}
|
541
337
|
|
542
|
-
static void skip_header(void *tp, grpc_mdelem *md) {
|
338
|
+
static void skip_header(grpc_exec_ctx *exec_ctx, void *tp, grpc_mdelem *md) {
|
339
|
+
GRPC_MDELEM_UNREF(exec_ctx, md);
|
340
|
+
}
|
543
341
|
|
544
|
-
static grpc_error *init_skip_frame_parser(
|
545
|
-
|
546
|
-
|
342
|
+
static grpc_error *init_skip_frame_parser(grpc_exec_ctx *exec_ctx,
|
343
|
+
grpc_chttp2_transport *t,
|
344
|
+
int is_header) {
|
547
345
|
if (is_header) {
|
548
|
-
uint8_t is_eoh =
|
549
|
-
|
550
|
-
|
551
|
-
|
552
|
-
|
553
|
-
|
554
|
-
|
555
|
-
(uint8_t)(is_eoh ? transport_parsing->header_eof : 0);
|
346
|
+
uint8_t is_eoh = t->expect_continuation_stream_id != 0;
|
347
|
+
t->parser = grpc_chttp2_header_parser_parse;
|
348
|
+
t->parser_data = &t->hpack_parser;
|
349
|
+
t->hpack_parser.on_header = skip_header;
|
350
|
+
t->hpack_parser.on_header_user_data = NULL;
|
351
|
+
t->hpack_parser.is_boundary = is_eoh;
|
352
|
+
t->hpack_parser.is_eof = (uint8_t)(is_eoh ? t->header_eof : 0);
|
556
353
|
} else {
|
557
|
-
|
354
|
+
t->parser = skip_parser;
|
558
355
|
}
|
559
356
|
return GRPC_ERROR_NONE;
|
560
357
|
}
|
561
358
|
|
562
|
-
void grpc_chttp2_parsing_become_skip_parser(
|
563
|
-
|
564
|
-
init_skip_frame_parser(
|
565
|
-
|
566
|
-
transport_parsing->parser == grpc_chttp2_header_parser_parse);
|
359
|
+
void grpc_chttp2_parsing_become_skip_parser(grpc_exec_ctx *exec_ctx,
|
360
|
+
grpc_chttp2_transport *t) {
|
361
|
+
init_skip_frame_parser(exec_ctx, t,
|
362
|
+
t->parser == grpc_chttp2_header_parser_parse);
|
567
363
|
}
|
568
364
|
|
569
|
-
static grpc_error *update_incoming_window(
|
570
|
-
|
571
|
-
|
572
|
-
uint32_t incoming_frame_size =
|
573
|
-
if (incoming_frame_size >
|
574
|
-
char *msg;
|
575
|
-
gpr_asprintf(&msg, "frame of size %d overflows incoming window of %" PRId64,
|
576
|
-
transport_parsing->incoming_frame_size,
|
577
|
-
transport_parsing->incoming_window);
|
578
|
-
grpc_error *err = GRPC_ERROR_CREATE(msg);
|
579
|
-
gpr_free(msg);
|
580
|
-
return err;
|
581
|
-
}
|
582
|
-
|
583
|
-
if (incoming_frame_size > stream_parsing->incoming_window) {
|
365
|
+
static grpc_error *update_incoming_window(grpc_exec_ctx *exec_ctx,
|
366
|
+
grpc_chttp2_transport *t,
|
367
|
+
grpc_chttp2_stream *s) {
|
368
|
+
uint32_t incoming_frame_size = t->incoming_frame_size;
|
369
|
+
if (incoming_frame_size > t->incoming_window) {
|
584
370
|
char *msg;
|
585
371
|
gpr_asprintf(&msg, "frame of size %d overflows incoming window of %" PRId64,
|
586
|
-
|
587
|
-
stream_parsing->incoming_window);
|
372
|
+
t->incoming_frame_size, t->incoming_window);
|
588
373
|
grpc_error *err = GRPC_ERROR_CREATE(msg);
|
589
374
|
gpr_free(msg);
|
590
375
|
return err;
|
591
376
|
}
|
592
377
|
|
593
|
-
GRPC_CHTTP2_FLOW_DEBIT_TRANSPORT("parse",
|
378
|
+
GRPC_CHTTP2_FLOW_DEBIT_TRANSPORT("parse", t, incoming_window,
|
594
379
|
incoming_frame_size);
|
595
|
-
GRPC_CHTTP2_FLOW_DEBIT_STREAM("parse", transport_parsing, stream_parsing,
|
596
|
-
incoming_window, incoming_frame_size);
|
597
|
-
stream_parsing->received_bytes += incoming_frame_size;
|
598
380
|
|
599
|
-
|
381
|
+
if (s != NULL) {
|
382
|
+
if (incoming_frame_size > s->incoming_window) {
|
383
|
+
char *msg;
|
384
|
+
gpr_asprintf(&msg,
|
385
|
+
"frame of size %d overflows incoming window of %" PRId64,
|
386
|
+
t->incoming_frame_size, s->incoming_window);
|
387
|
+
grpc_error *err = GRPC_ERROR_CREATE(msg);
|
388
|
+
gpr_free(msg);
|
389
|
+
return err;
|
390
|
+
}
|
391
|
+
|
392
|
+
GRPC_CHTTP2_FLOW_DEBIT_STREAM("parse", t, s, incoming_window,
|
393
|
+
incoming_frame_size);
|
394
|
+
s->received_bytes += incoming_frame_size;
|
395
|
+
s->max_recv_bytes -=
|
396
|
+
(uint32_t)GPR_MIN(s->max_recv_bytes, incoming_frame_size);
|
397
|
+
}
|
600
398
|
|
601
399
|
return GRPC_ERROR_NONE;
|
602
400
|
}
|
603
401
|
|
604
|
-
static grpc_error *init_data_frame_parser(
|
605
|
-
|
606
|
-
|
607
|
-
grpc_chttp2_parsing_lookup_stream(
|
608
|
-
transport_parsing->incoming_stream_id);
|
402
|
+
static grpc_error *init_data_frame_parser(grpc_exec_ctx *exec_ctx,
|
403
|
+
grpc_chttp2_transport *t) {
|
404
|
+
grpc_chttp2_stream *s =
|
405
|
+
grpc_chttp2_parsing_lookup_stream(t, t->incoming_stream_id);
|
609
406
|
grpc_error *err = GRPC_ERROR_NONE;
|
610
|
-
|
611
|
-
|
407
|
+
err = update_incoming_window(exec_ctx, t, s);
|
408
|
+
if (err != GRPC_ERROR_NONE) {
|
409
|
+
goto error_handler;
|
612
410
|
}
|
613
|
-
|
614
|
-
|
615
|
-
return init_skip_frame_parser(exec_ctx, transport_parsing, 0);
|
411
|
+
if (s == NULL) {
|
412
|
+
return init_skip_frame_parser(exec_ctx, t, 0);
|
616
413
|
}
|
617
|
-
|
618
|
-
|
414
|
+
s->stats.incoming.framing_bytes += 9;
|
415
|
+
if (err == GRPC_ERROR_NONE && s->read_closed) {
|
416
|
+
return init_skip_frame_parser(exec_ctx, t, 0);
|
619
417
|
}
|
620
418
|
if (err == GRPC_ERROR_NONE) {
|
621
|
-
err = grpc_chttp2_data_parser_begin_frame(
|
622
|
-
|
623
|
-
stream_parsing->id);
|
419
|
+
err = grpc_chttp2_data_parser_begin_frame(&s->data_parser,
|
420
|
+
t->incoming_frame_flags, s->id);
|
624
421
|
}
|
422
|
+
error_handler:
|
625
423
|
if (err == GRPC_ERROR_NONE) {
|
626
|
-
|
627
|
-
|
628
|
-
|
424
|
+
t->incoming_stream = s;
|
425
|
+
t->parser = grpc_chttp2_data_parser_parse;
|
426
|
+
t->parser_data = &s->data_parser;
|
629
427
|
return GRPC_ERROR_NONE;
|
630
428
|
} else if (grpc_error_get_int(err, GRPC_ERROR_INT_STREAM_ID, NULL)) {
|
631
429
|
/* handle stream errors by closing the stream */
|
632
|
-
|
633
|
-
|
634
|
-
|
635
|
-
|
636
|
-
grpc_chttp2_rst_stream_create(
|
637
|
-
|
638
|
-
|
639
|
-
return init_skip_frame_parser(exec_ctx,
|
430
|
+
if (s != NULL) {
|
431
|
+
grpc_chttp2_mark_stream_closed(exec_ctx, t, s, true, false, err);
|
432
|
+
}
|
433
|
+
grpc_slice_buffer_add(
|
434
|
+
&t->qbuf, grpc_chttp2_rst_stream_create(t->incoming_stream_id,
|
435
|
+
GRPC_CHTTP2_PROTOCOL_ERROR,
|
436
|
+
&s->stats.outgoing));
|
437
|
+
return init_skip_frame_parser(exec_ctx, t, 0);
|
640
438
|
} else {
|
641
439
|
return err;
|
642
440
|
}
|
@@ -644,23 +442,22 @@ static grpc_error *init_data_frame_parser(
|
|
644
442
|
|
645
443
|
static void free_timeout(void *p) { gpr_free(p); }
|
646
444
|
|
647
|
-
static void on_initial_header(
|
648
|
-
|
649
|
-
|
650
|
-
|
445
|
+
static void on_initial_header(grpc_exec_ctx *exec_ctx, void *tp,
|
446
|
+
grpc_mdelem *md) {
|
447
|
+
grpc_chttp2_transport *t = tp;
|
448
|
+
grpc_chttp2_stream *s = t->incoming_stream;
|
651
449
|
|
652
450
|
GPR_TIMER_BEGIN("on_initial_header", 0);
|
653
451
|
|
654
|
-
GPR_ASSERT(
|
452
|
+
GPR_ASSERT(s != NULL);
|
655
453
|
|
656
454
|
GRPC_CHTTP2_IF_TRACING(gpr_log(
|
657
|
-
GPR_INFO, "HTTP:%d:HDR:%s: %s: %s",
|
658
|
-
transport_parsing->is_client ? "CLI" : "SVR",
|
455
|
+
GPR_INFO, "HTTP:%d:HDR:%s: %s: %s", s->id, t->is_client ? "CLI" : "SVR",
|
659
456
|
grpc_mdstr_as_c_string(md->key), grpc_mdstr_as_c_string(md->value)));
|
660
457
|
|
661
458
|
if (md->key == GRPC_MDSTR_GRPC_STATUS && md != GRPC_MDELEM_GRPC_STATUS_0) {
|
662
459
|
/* TODO(ctiller): check for a status like " 0" */
|
663
|
-
|
460
|
+
s->seen_error = true;
|
664
461
|
}
|
665
462
|
|
666
463
|
if (md->key == GRPC_MDSTR_GRPC_TIMEOUT) {
|
@@ -668,315 +465,283 @@ static void on_initial_header(void *tp, grpc_mdelem *md) {
|
|
668
465
|
if (!cached_timeout) {
|
669
466
|
/* not already parsed: parse it now, and store the result away */
|
670
467
|
cached_timeout = gpr_malloc(sizeof(gpr_timespec));
|
671
|
-
if (!
|
672
|
-
|
468
|
+
if (!grpc_http2_decode_timeout(grpc_mdstr_as_c_string(md->value),
|
469
|
+
cached_timeout)) {
|
673
470
|
gpr_log(GPR_ERROR, "Ignoring bad timeout value '%s'",
|
674
471
|
grpc_mdstr_as_c_string(md->value));
|
675
472
|
*cached_timeout = gpr_inf_future(GPR_TIMESPAN);
|
676
473
|
}
|
677
|
-
|
474
|
+
cached_timeout =
|
475
|
+
grpc_mdelem_set_user_data(md, free_timeout, cached_timeout);
|
678
476
|
}
|
679
477
|
grpc_chttp2_incoming_metadata_buffer_set_deadline(
|
680
|
-
&
|
478
|
+
&s->metadata_buffer[0],
|
681
479
|
gpr_time_add(gpr_now(GPR_CLOCK_MONOTONIC), *cached_timeout));
|
682
|
-
GRPC_MDELEM_UNREF(md);
|
480
|
+
GRPC_MDELEM_UNREF(exec_ctx, md);
|
683
481
|
} else {
|
684
|
-
const size_t new_size =
|
685
|
-
stream_parsing->metadata_buffer[0].size + GRPC_MDELEM_LENGTH(md);
|
686
|
-
grpc_chttp2_transport_global *transport_global =
|
687
|
-
&TRANSPORT_FROM_PARSING(transport_parsing)->global;
|
482
|
+
const size_t new_size = s->metadata_buffer[0].size + GRPC_MDELEM_LENGTH(md);
|
688
483
|
const size_t metadata_size_limit =
|
689
|
-
|
690
|
-
|
484
|
+
t->settings[GRPC_ACKED_SETTINGS]
|
485
|
+
[GRPC_CHTTP2_SETTINGS_MAX_HEADER_LIST_SIZE];
|
691
486
|
if (new_size > metadata_size_limit) {
|
692
|
-
|
693
|
-
|
694
|
-
|
695
|
-
|
696
|
-
|
697
|
-
|
698
|
-
|
699
|
-
|
700
|
-
|
487
|
+
gpr_log(GPR_DEBUG,
|
488
|
+
"received initial metadata size exceeds limit (%" PRIuPTR
|
489
|
+
" vs. %" PRIuPTR ")",
|
490
|
+
new_size, metadata_size_limit);
|
491
|
+
grpc_chttp2_cancel_stream(
|
492
|
+
exec_ctx, t, s,
|
493
|
+
grpc_error_set_int(
|
494
|
+
GRPC_ERROR_CREATE("received initial metadata size exceeds limit"),
|
495
|
+
GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_RESOURCE_EXHAUSTED));
|
496
|
+
grpc_chttp2_parsing_become_skip_parser(exec_ctx, t);
|
497
|
+
s->seen_error = true;
|
498
|
+
GRPC_MDELEM_UNREF(exec_ctx, md);
|
701
499
|
} else {
|
702
|
-
grpc_chttp2_incoming_metadata_buffer_add(
|
703
|
-
&stream_parsing->metadata_buffer[0], md);
|
500
|
+
grpc_chttp2_incoming_metadata_buffer_add(&s->metadata_buffer[0], md);
|
704
501
|
}
|
705
502
|
}
|
706
503
|
|
707
|
-
grpc_chttp2_list_add_parsing_seen_stream(transport_parsing, stream_parsing);
|
708
|
-
|
709
504
|
GPR_TIMER_END("on_initial_header", 0);
|
710
505
|
}
|
711
506
|
|
712
|
-
static void on_trailing_header(
|
713
|
-
|
714
|
-
|
715
|
-
|
507
|
+
static void on_trailing_header(grpc_exec_ctx *exec_ctx, void *tp,
|
508
|
+
grpc_mdelem *md) {
|
509
|
+
grpc_chttp2_transport *t = tp;
|
510
|
+
grpc_chttp2_stream *s = t->incoming_stream;
|
716
511
|
|
717
512
|
GPR_TIMER_BEGIN("on_trailing_header", 0);
|
718
513
|
|
719
|
-
GPR_ASSERT(
|
514
|
+
GPR_ASSERT(s != NULL);
|
720
515
|
|
721
516
|
GRPC_CHTTP2_IF_TRACING(gpr_log(
|
722
|
-
GPR_INFO, "HTTP:%d:TRL:%s: %s: %s",
|
723
|
-
transport_parsing->is_client ? "CLI" : "SVR",
|
517
|
+
GPR_INFO, "HTTP:%d:TRL:%s: %s: %s", s->id, t->is_client ? "CLI" : "SVR",
|
724
518
|
grpc_mdstr_as_c_string(md->key), grpc_mdstr_as_c_string(md->value)));
|
725
519
|
|
726
520
|
if (md->key == GRPC_MDSTR_GRPC_STATUS && md != GRPC_MDELEM_GRPC_STATUS_0) {
|
727
521
|
/* TODO(ctiller): check for a status like " 0" */
|
728
|
-
|
522
|
+
s->seen_error = true;
|
729
523
|
}
|
730
524
|
|
731
|
-
const size_t new_size =
|
732
|
-
stream_parsing->metadata_buffer[1].size + GRPC_MDELEM_LENGTH(md);
|
733
|
-
grpc_chttp2_transport_global *transport_global =
|
734
|
-
&TRANSPORT_FROM_PARSING(transport_parsing)->global;
|
525
|
+
const size_t new_size = s->metadata_buffer[1].size + GRPC_MDELEM_LENGTH(md);
|
735
526
|
const size_t metadata_size_limit =
|
736
|
-
|
737
|
-
|
527
|
+
t->settings[GRPC_ACKED_SETTINGS]
|
528
|
+
[GRPC_CHTTP2_SETTINGS_MAX_HEADER_LIST_SIZE];
|
738
529
|
if (new_size > metadata_size_limit) {
|
739
|
-
|
740
|
-
|
741
|
-
|
742
|
-
|
743
|
-
|
744
|
-
|
745
|
-
|
746
|
-
|
747
|
-
|
530
|
+
gpr_log(GPR_DEBUG,
|
531
|
+
"received trailing metadata size exceeds limit (%" PRIuPTR
|
532
|
+
" vs. %" PRIuPTR ")",
|
533
|
+
new_size, metadata_size_limit);
|
534
|
+
grpc_chttp2_cancel_stream(
|
535
|
+
exec_ctx, t, s,
|
536
|
+
grpc_error_set_int(
|
537
|
+
GRPC_ERROR_CREATE("received trailing metadata size exceeds limit"),
|
538
|
+
GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_RESOURCE_EXHAUSTED));
|
539
|
+
grpc_chttp2_parsing_become_skip_parser(exec_ctx, t);
|
540
|
+
s->seen_error = true;
|
541
|
+
GRPC_MDELEM_UNREF(exec_ctx, md);
|
748
542
|
} else {
|
749
|
-
grpc_chttp2_incoming_metadata_buffer_add(
|
750
|
-
&stream_parsing->metadata_buffer[1], md);
|
543
|
+
grpc_chttp2_incoming_metadata_buffer_add(&s->metadata_buffer[1], md);
|
751
544
|
}
|
752
545
|
|
753
|
-
grpc_chttp2_list_add_parsing_seen_stream(transport_parsing, stream_parsing);
|
754
|
-
|
755
546
|
GPR_TIMER_END("on_trailing_header", 0);
|
756
547
|
}
|
757
548
|
|
758
|
-
static grpc_error *init_header_frame_parser(
|
759
|
-
|
760
|
-
|
761
|
-
uint8_t is_eoh =
|
762
|
-
|
763
|
-
|
764
|
-
grpc_chttp2_stream_parsing *stream_parsing;
|
549
|
+
static grpc_error *init_header_frame_parser(grpc_exec_ctx *exec_ctx,
|
550
|
+
grpc_chttp2_transport *t,
|
551
|
+
int is_continuation) {
|
552
|
+
uint8_t is_eoh =
|
553
|
+
(t->incoming_frame_flags & GRPC_CHTTP2_DATA_FLAG_END_HEADERS) != 0;
|
554
|
+
grpc_chttp2_stream *s;
|
765
555
|
|
766
556
|
/* TODO(ctiller): when to increment header_frames_received? */
|
767
557
|
|
768
558
|
if (is_eoh) {
|
769
|
-
|
559
|
+
t->expect_continuation_stream_id = 0;
|
770
560
|
} else {
|
771
|
-
|
772
|
-
transport_parsing->incoming_stream_id;
|
561
|
+
t->expect_continuation_stream_id = t->incoming_stream_id;
|
773
562
|
}
|
774
563
|
|
775
564
|
if (!is_continuation) {
|
776
|
-
|
777
|
-
|
565
|
+
t->header_eof =
|
566
|
+
(t->incoming_frame_flags & GRPC_CHTTP2_DATA_FLAG_END_STREAM) != 0;
|
778
567
|
}
|
779
568
|
|
780
569
|
/* could be a new grpc_chttp2_stream or an existing grpc_chttp2_stream */
|
781
|
-
|
782
|
-
|
783
|
-
if (stream_parsing == NULL) {
|
570
|
+
s = grpc_chttp2_parsing_lookup_stream(t, t->incoming_stream_id);
|
571
|
+
if (s == NULL) {
|
784
572
|
if (is_continuation) {
|
785
|
-
|
786
|
-
|
787
|
-
|
573
|
+
GRPC_CHTTP2_IF_TRACING(
|
574
|
+
gpr_log(GPR_ERROR,
|
575
|
+
"grpc_chttp2_stream disbanded before CONTINUATION received"));
|
576
|
+
return init_skip_frame_parser(exec_ctx, t, 1);
|
788
577
|
}
|
789
|
-
if (
|
790
|
-
if ((
|
791
|
-
|
792
|
-
transport_parsing->next_stream_id) {
|
578
|
+
if (t->is_client) {
|
579
|
+
if ((t->incoming_stream_id & 1) &&
|
580
|
+
t->incoming_stream_id < t->next_stream_id) {
|
793
581
|
/* this is an old (probably cancelled) grpc_chttp2_stream */
|
794
582
|
} else {
|
795
|
-
gpr_log(
|
796
|
-
|
583
|
+
GRPC_CHTTP2_IF_TRACING(gpr_log(
|
584
|
+
GPR_ERROR, "ignoring new grpc_chttp2_stream creation on client"));
|
797
585
|
}
|
798
|
-
return init_skip_frame_parser(exec_ctx,
|
799
|
-
} else if (
|
800
|
-
|
801
|
-
|
802
|
-
|
803
|
-
|
804
|
-
|
805
|
-
|
806
|
-
|
807
|
-
|
808
|
-
|
809
|
-
|
810
|
-
|
811
|
-
|
812
|
-
return init_skip_frame_parser(exec_ctx,
|
586
|
+
return init_skip_frame_parser(exec_ctx, t, 1);
|
587
|
+
} else if (t->last_new_stream_id >= t->incoming_stream_id) {
|
588
|
+
GRPC_CHTTP2_IF_TRACING(gpr_log(
|
589
|
+
GPR_ERROR,
|
590
|
+
"ignoring out of order new grpc_chttp2_stream request on server; "
|
591
|
+
"last grpc_chttp2_stream "
|
592
|
+
"id=%d, new grpc_chttp2_stream id=%d",
|
593
|
+
t->last_new_stream_id, t->incoming_stream_id));
|
594
|
+
return init_skip_frame_parser(exec_ctx, t, 1);
|
595
|
+
} else if ((t->incoming_stream_id & 1) == 0) {
|
596
|
+
GRPC_CHTTP2_IF_TRACING(gpr_log(
|
597
|
+
GPR_ERROR,
|
598
|
+
"ignoring grpc_chttp2_stream with non-client generated index %d",
|
599
|
+
t->incoming_stream_id));
|
600
|
+
return init_skip_frame_parser(exec_ctx, t, 1);
|
813
601
|
}
|
814
|
-
|
815
|
-
|
816
|
-
|
817
|
-
if (
|
818
|
-
|
819
|
-
|
602
|
+
t->last_new_stream_id = t->incoming_stream_id;
|
603
|
+
s = t->incoming_stream =
|
604
|
+
grpc_chttp2_parsing_accept_stream(exec_ctx, t, t->incoming_stream_id);
|
605
|
+
if (s == NULL) {
|
606
|
+
GRPC_CHTTP2_IF_TRACING(
|
607
|
+
gpr_log(GPR_ERROR, "grpc_chttp2_stream not accepted"));
|
608
|
+
return init_skip_frame_parser(exec_ctx, t, 1);
|
820
609
|
}
|
821
|
-
via_accept = 1;
|
822
610
|
} else {
|
823
|
-
|
824
|
-
}
|
825
|
-
GPR_ASSERT(
|
826
|
-
|
827
|
-
if (
|
828
|
-
gpr_log(
|
829
|
-
|
830
|
-
|
831
|
-
|
832
|
-
|
833
|
-
|
834
|
-
|
611
|
+
t->incoming_stream = s;
|
612
|
+
}
|
613
|
+
GPR_ASSERT(s != NULL);
|
614
|
+
s->stats.incoming.framing_bytes += 9;
|
615
|
+
if (s->read_closed) {
|
616
|
+
GRPC_CHTTP2_IF_TRACING(gpr_log(
|
617
|
+
GPR_ERROR, "skipping already closed grpc_chttp2_stream header"));
|
618
|
+
t->incoming_stream = NULL;
|
619
|
+
return init_skip_frame_parser(exec_ctx, t, 1);
|
620
|
+
}
|
621
|
+
t->parser = grpc_chttp2_header_parser_parse;
|
622
|
+
t->parser_data = &t->hpack_parser;
|
623
|
+
switch (s->header_frames_received) {
|
835
624
|
case 0:
|
836
|
-
|
625
|
+
t->hpack_parser.on_header = on_initial_header;
|
837
626
|
break;
|
838
627
|
case 1:
|
839
|
-
|
628
|
+
t->hpack_parser.on_header = on_trailing_header;
|
840
629
|
break;
|
841
630
|
case 2:
|
842
631
|
gpr_log(GPR_ERROR, "too many header frames received");
|
843
|
-
return init_skip_frame_parser(exec_ctx,
|
632
|
+
return init_skip_frame_parser(exec_ctx, t, 1);
|
844
633
|
}
|
845
|
-
|
846
|
-
|
847
|
-
|
848
|
-
|
849
|
-
|
850
|
-
|
851
|
-
grpc_chttp2_hpack_parser_set_has_priority(&transport_parsing->hpack_parser);
|
634
|
+
t->hpack_parser.on_header_user_data = t;
|
635
|
+
t->hpack_parser.is_boundary = is_eoh;
|
636
|
+
t->hpack_parser.is_eof = (uint8_t)(is_eoh ? t->header_eof : 0);
|
637
|
+
if (!is_continuation &&
|
638
|
+
(t->incoming_frame_flags & GRPC_CHTTP2_FLAG_HAS_PRIORITY)) {
|
639
|
+
grpc_chttp2_hpack_parser_set_has_priority(&t->hpack_parser);
|
852
640
|
}
|
853
641
|
return GRPC_ERROR_NONE;
|
854
642
|
}
|
855
643
|
|
856
|
-
static grpc_error *init_window_update_frame_parser(
|
857
|
-
|
644
|
+
static grpc_error *init_window_update_frame_parser(grpc_exec_ctx *exec_ctx,
|
645
|
+
grpc_chttp2_transport *t) {
|
858
646
|
grpc_error *err = grpc_chttp2_window_update_parser_begin_frame(
|
859
|
-
&
|
860
|
-
|
861
|
-
transport_parsing->incoming_frame_flags);
|
647
|
+
&t->simple.window_update, t->incoming_frame_size,
|
648
|
+
t->incoming_frame_flags);
|
862
649
|
if (err != GRPC_ERROR_NONE) return err;
|
863
|
-
if (
|
864
|
-
|
865
|
-
|
866
|
-
|
867
|
-
|
868
|
-
return init_skip_frame_parser(exec_ctx, transport_parsing, 0);
|
650
|
+
if (t->incoming_stream_id != 0) {
|
651
|
+
grpc_chttp2_stream *s = t->incoming_stream =
|
652
|
+
grpc_chttp2_parsing_lookup_stream(t, t->incoming_stream_id);
|
653
|
+
if (s == NULL) {
|
654
|
+
return init_skip_frame_parser(exec_ctx, t, 0);
|
869
655
|
}
|
870
|
-
|
656
|
+
s->stats.incoming.framing_bytes += 9;
|
871
657
|
}
|
872
|
-
|
873
|
-
|
658
|
+
t->parser = grpc_chttp2_window_update_parser_parse;
|
659
|
+
t->parser_data = &t->simple.window_update;
|
874
660
|
return GRPC_ERROR_NONE;
|
875
661
|
}
|
876
662
|
|
877
|
-
static grpc_error *init_ping_parser(
|
878
|
-
|
663
|
+
static grpc_error *init_ping_parser(grpc_exec_ctx *exec_ctx,
|
664
|
+
grpc_chttp2_transport *t) {
|
879
665
|
grpc_error *err = grpc_chttp2_ping_parser_begin_frame(
|
880
|
-
&
|
881
|
-
transport_parsing->incoming_frame_flags);
|
666
|
+
&t->simple.ping, t->incoming_frame_size, t->incoming_frame_flags);
|
882
667
|
if (err != GRPC_ERROR_NONE) return err;
|
883
|
-
|
884
|
-
|
668
|
+
t->parser = grpc_chttp2_ping_parser_parse;
|
669
|
+
t->parser_data = &t->simple.ping;
|
885
670
|
return GRPC_ERROR_NONE;
|
886
671
|
}
|
887
672
|
|
888
|
-
static grpc_error *init_rst_stream_parser(
|
889
|
-
|
673
|
+
static grpc_error *init_rst_stream_parser(grpc_exec_ctx *exec_ctx,
|
674
|
+
grpc_chttp2_transport *t) {
|
890
675
|
grpc_error *err = grpc_chttp2_rst_stream_parser_begin_frame(
|
891
|
-
&
|
892
|
-
transport_parsing->incoming_frame_size,
|
893
|
-
transport_parsing->incoming_frame_flags);
|
676
|
+
&t->simple.rst_stream, t->incoming_frame_size, t->incoming_frame_flags);
|
894
677
|
if (err != GRPC_ERROR_NONE) return err;
|
895
|
-
|
896
|
-
|
897
|
-
|
898
|
-
|
899
|
-
|
900
|
-
|
901
|
-
|
902
|
-
|
903
|
-
transport_parsing->parser_data = &transport_parsing->simple.rst_stream;
|
678
|
+
grpc_chttp2_stream *s = t->incoming_stream =
|
679
|
+
grpc_chttp2_parsing_lookup_stream(t, t->incoming_stream_id);
|
680
|
+
if (!t->incoming_stream) {
|
681
|
+
return init_skip_frame_parser(exec_ctx, t, 0);
|
682
|
+
}
|
683
|
+
s->stats.incoming.framing_bytes += 9;
|
684
|
+
t->parser = grpc_chttp2_rst_stream_parser_parse;
|
685
|
+
t->parser_data = &t->simple.rst_stream;
|
904
686
|
return GRPC_ERROR_NONE;
|
905
687
|
}
|
906
688
|
|
907
|
-
static grpc_error *init_goaway_parser(
|
908
|
-
|
689
|
+
static grpc_error *init_goaway_parser(grpc_exec_ctx *exec_ctx,
|
690
|
+
grpc_chttp2_transport *t) {
|
909
691
|
grpc_error *err = grpc_chttp2_goaway_parser_begin_frame(
|
910
|
-
&
|
911
|
-
transport_parsing->incoming_frame_flags);
|
692
|
+
&t->goaway_parser, t->incoming_frame_size, t->incoming_frame_flags);
|
912
693
|
if (err != GRPC_ERROR_NONE) return err;
|
913
|
-
|
914
|
-
|
694
|
+
t->parser = grpc_chttp2_goaway_parser_parse;
|
695
|
+
t->parser_data = &t->goaway_parser;
|
915
696
|
return GRPC_ERROR_NONE;
|
916
697
|
}
|
917
698
|
|
918
|
-
static grpc_error *init_settings_frame_parser(
|
919
|
-
|
920
|
-
if (
|
699
|
+
static grpc_error *init_settings_frame_parser(grpc_exec_ctx *exec_ctx,
|
700
|
+
grpc_chttp2_transport *t) {
|
701
|
+
if (t->incoming_stream_id != 0) {
|
921
702
|
return GRPC_ERROR_CREATE("Settings frame received for grpc_chttp2_stream");
|
922
703
|
}
|
923
704
|
|
924
705
|
grpc_error *err = grpc_chttp2_settings_parser_begin_frame(
|
925
|
-
&
|
926
|
-
|
927
|
-
transport_parsing->incoming_frame_flags, transport_parsing->settings);
|
706
|
+
&t->simple.settings, t->incoming_frame_size, t->incoming_frame_flags,
|
707
|
+
t->settings[GRPC_PEER_SETTINGS]);
|
928
708
|
if (err != GRPC_ERROR_NONE) {
|
929
709
|
return err;
|
930
710
|
}
|
931
|
-
if (
|
932
|
-
|
711
|
+
if (t->incoming_frame_flags & GRPC_CHTTP2_FLAG_ACK) {
|
712
|
+
memcpy(t->settings[GRPC_ACKED_SETTINGS], t->settings[GRPC_SENT_SETTINGS],
|
713
|
+
GRPC_CHTTP2_NUM_SETTINGS * sizeof(uint32_t));
|
933
714
|
grpc_chttp2_hptbl_set_max_bytes(
|
934
|
-
&
|
935
|
-
|
936
|
-
|
937
|
-
|
938
|
-
transport_parsing
|
939
|
-
->last_sent_settings[GRPC_CHTTP2_SETTINGS_MAX_FRAME_SIZE];
|
715
|
+
exec_ctx, &t->hpack_parser.table,
|
716
|
+
t->settings[GRPC_ACKED_SETTINGS]
|
717
|
+
[GRPC_CHTTP2_SETTINGS_HEADER_TABLE_SIZE]);
|
718
|
+
t->sent_local_settings = 0;
|
940
719
|
}
|
941
|
-
|
942
|
-
|
720
|
+
t->parser = grpc_chttp2_settings_parser_parse;
|
721
|
+
t->parser_data = &t->simple.settings;
|
943
722
|
return GRPC_ERROR_NONE;
|
944
723
|
}
|
945
724
|
|
946
|
-
|
947
|
-
|
948
|
-
|
949
|
-
|
950
|
-
|
951
|
-
|
952
|
-
static grpc_error *parse_frame_slice(
|
953
|
-
grpc_exec_ctx *exec_ctx, grpc_chttp2_transport_parsing *transport_parsing,
|
954
|
-
gpr_slice slice, int is_last) {
|
955
|
-
grpc_chttp2_stream_parsing *stream_parsing =
|
956
|
-
transport_parsing->incoming_stream;
|
957
|
-
grpc_error *err = transport_parsing->parser(
|
958
|
-
exec_ctx, transport_parsing->parser_data, transport_parsing,
|
959
|
-
stream_parsing, slice, is_last);
|
725
|
+
static grpc_error *parse_frame_slice(grpc_exec_ctx *exec_ctx,
|
726
|
+
grpc_chttp2_transport *t, grpc_slice slice,
|
727
|
+
int is_last) {
|
728
|
+
grpc_chttp2_stream *s = t->incoming_stream;
|
729
|
+
grpc_error *err = t->parser(exec_ctx, t->parser_data, t, s, slice, is_last);
|
960
730
|
if (err == GRPC_ERROR_NONE) {
|
961
|
-
|
962
|
-
grpc_chttp2_list_add_parsing_seen_stream(transport_parsing,
|
963
|
-
stream_parsing);
|
964
|
-
}
|
965
|
-
return GRPC_ERROR_NONE;
|
731
|
+
return err;
|
966
732
|
} else if (grpc_error_get_int(err, GRPC_ERROR_INT_STREAM_ID, NULL)) {
|
967
733
|
if (grpc_http_trace) {
|
968
734
|
const char *msg = grpc_error_string(err);
|
969
735
|
gpr_log(GPR_ERROR, "%s", msg);
|
970
736
|
grpc_error_free_string(msg);
|
971
737
|
}
|
972
|
-
grpc_chttp2_parsing_become_skip_parser(exec_ctx,
|
973
|
-
if (
|
974
|
-
|
975
|
-
|
976
|
-
&
|
977
|
-
|
978
|
-
|
979
|
-
&stream_parsing->stats.outgoing));
|
738
|
+
grpc_chttp2_parsing_become_skip_parser(exec_ctx, t);
|
739
|
+
if (s) {
|
740
|
+
s->forced_close_error = err;
|
741
|
+
grpc_slice_buffer_add(
|
742
|
+
&t->qbuf, grpc_chttp2_rst_stream_create(t->incoming_stream_id,
|
743
|
+
GRPC_CHTTP2_PROTOCOL_ERROR,
|
744
|
+
&s->stats.outgoing));
|
980
745
|
} else {
|
981
746
|
GRPC_ERROR_UNREF(err);
|
982
747
|
}
|