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,4 +41,7 @@ extern const grpc_channel_filter grpc_http_client_filter;
|
|
41
41
|
/* Channel arg to override the http2 :scheme header */
|
42
42
|
#define GRPC_ARG_HTTP2_SCHEME "grpc.http2_scheme"
|
43
43
|
|
44
|
+
/* Channel arg to determine maximum size of payload eligable for GET request */
|
45
|
+
#define GRPC_ARG_MAX_PAYLOAD_SIZE_FOR_GET "grpc.max_payload_size_for_get"
|
46
|
+
|
44
47
|
#endif /* GRPC_CORE_LIB_CHANNEL_HTTP_CLIENT_FILTER_H */
|
@@ -37,11 +37,15 @@
|
|
37
37
|
#include <grpc/support/log.h>
|
38
38
|
#include <string.h>
|
39
39
|
#include "src/core/lib/profiling/timers.h"
|
40
|
+
#include "src/core/lib/slice/percent_encoding.h"
|
41
|
+
#include "src/core/lib/slice/slice_internal.h"
|
40
42
|
#include "src/core/lib/transport/static_metadata.h"
|
41
43
|
|
42
44
|
#define EXPECTED_CONTENT_TYPE "application/grpc"
|
43
45
|
#define EXPECTED_CONTENT_TYPE_LENGTH sizeof(EXPECTED_CONTENT_TYPE) - 1
|
44
46
|
|
47
|
+
extern int grpc_http_trace;
|
48
|
+
|
45
49
|
typedef struct call_data {
|
46
50
|
uint8_t seen_path;
|
47
51
|
uint8_t seen_method;
|
@@ -49,43 +53,76 @@ typedef struct call_data {
|
|
49
53
|
uint8_t seen_scheme;
|
50
54
|
uint8_t seen_te_trailers;
|
51
55
|
uint8_t seen_authority;
|
56
|
+
uint8_t seen_payload_bin;
|
52
57
|
grpc_linked_mdelem status;
|
53
58
|
grpc_linked_mdelem content_type;
|
54
59
|
|
60
|
+
/* flag to ensure payload_bin is delivered only once */
|
61
|
+
uint8_t payload_bin_delivered;
|
62
|
+
|
55
63
|
grpc_metadata_batch *recv_initial_metadata;
|
56
64
|
bool *recv_idempotent_request;
|
65
|
+
bool *recv_cacheable_request;
|
57
66
|
/** Closure to call when finished with the hs_on_recv hook */
|
58
67
|
grpc_closure *on_done_recv;
|
68
|
+
/** Closure to call when we retrieve read message from the payload-bin header
|
69
|
+
*/
|
70
|
+
grpc_closure *recv_message_ready;
|
71
|
+
grpc_closure *on_complete;
|
72
|
+
grpc_byte_stream **pp_recv_message;
|
73
|
+
grpc_slice_buffer read_slice_buffer;
|
74
|
+
grpc_slice_buffer_stream read_stream;
|
75
|
+
|
59
76
|
/** Receive closures are chained: we inject this closure as the on_done_recv
|
60
77
|
up-call on transport_op, and remember to call our on_done_recv member
|
61
78
|
after handling it. */
|
62
79
|
grpc_closure hs_on_recv;
|
80
|
+
grpc_closure hs_on_complete;
|
81
|
+
grpc_closure hs_recv_message_ready;
|
63
82
|
} call_data;
|
64
83
|
|
65
84
|
typedef struct channel_data { uint8_t unused; } channel_data;
|
66
85
|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
86
|
+
static grpc_mdelem *server_filter_outgoing_metadata(grpc_exec_ctx *exec_ctx,
|
87
|
+
void *user_data,
|
88
|
+
grpc_mdelem *md) {
|
89
|
+
if (md->key == GRPC_MDSTR_GRPC_MESSAGE) {
|
90
|
+
grpc_slice pct_encoded_msg = grpc_percent_encode_slice(
|
91
|
+
md->value->slice, grpc_compatible_percent_encoding_unreserved_bytes);
|
92
|
+
if (grpc_slice_is_equivalent(pct_encoded_msg, md->value->slice)) {
|
93
|
+
grpc_slice_unref_internal(exec_ctx, pct_encoded_msg);
|
94
|
+
return md;
|
95
|
+
} else {
|
96
|
+
return grpc_mdelem_from_metadata_strings(
|
97
|
+
exec_ctx, GRPC_MDSTR_GRPC_MESSAGE,
|
98
|
+
grpc_mdstr_from_slice(exec_ctx, pct_encoded_msg));
|
99
|
+
}
|
100
|
+
} else {
|
101
|
+
return md;
|
102
|
+
}
|
103
|
+
}
|
71
104
|
|
72
|
-
static grpc_mdelem *server_filter(
|
73
|
-
|
74
|
-
grpc_call_element *elem =
|
105
|
+
static grpc_mdelem *server_filter(grpc_exec_ctx *exec_ctx, void *user_data,
|
106
|
+
grpc_mdelem *md) {
|
107
|
+
grpc_call_element *elem = user_data;
|
75
108
|
call_data *calld = elem->call_data;
|
76
109
|
|
77
110
|
/* Check if it is one of the headers we care about. */
|
78
111
|
if (md == GRPC_MDELEM_TE_TRAILERS || md == GRPC_MDELEM_METHOD_POST ||
|
79
|
-
md == GRPC_MDELEM_METHOD_PUT || md ==
|
80
|
-
md == GRPC_MDELEM_SCHEME_HTTPS ||
|
112
|
+
md == GRPC_MDELEM_METHOD_PUT || md == GRPC_MDELEM_METHOD_GET ||
|
113
|
+
md == GRPC_MDELEM_SCHEME_HTTP || md == GRPC_MDELEM_SCHEME_HTTPS ||
|
81
114
|
md == GRPC_MDELEM_CONTENT_TYPE_APPLICATION_SLASH_GRPC) {
|
82
115
|
/* swallow it */
|
83
116
|
if (md == GRPC_MDELEM_METHOD_POST) {
|
84
117
|
calld->seen_method = 1;
|
85
118
|
*calld->recv_idempotent_request = false;
|
119
|
+
*calld->recv_cacheable_request = false;
|
86
120
|
} else if (md == GRPC_MDELEM_METHOD_PUT) {
|
87
121
|
calld->seen_method = 1;
|
88
122
|
*calld->recv_idempotent_request = true;
|
123
|
+
} else if (md == GRPC_MDELEM_METHOD_GET) {
|
124
|
+
calld->seen_method = 1;
|
125
|
+
*calld->recv_cacheable_request = true;
|
89
126
|
} else if (md->key == GRPC_MDSTR_SCHEME) {
|
90
127
|
calld->seen_scheme = 1;
|
91
128
|
} else if (md == GRPC_MDELEM_TE_TRAILERS) {
|
@@ -118,7 +155,7 @@ static grpc_mdelem *server_filter(void *user_data, grpc_mdelem *md) {
|
|
118
155
|
/* swallow it and error everything out. */
|
119
156
|
/* TODO(klempner): We ought to generate more descriptive error messages
|
120
157
|
on the wire here. */
|
121
|
-
grpc_call_element_send_cancel(
|
158
|
+
grpc_call_element_send_cancel(exec_ctx, elem);
|
122
159
|
return NULL;
|
123
160
|
} else if (md->key == GRPC_MDSTR_PATH) {
|
124
161
|
if (calld->seen_path) {
|
@@ -134,9 +171,18 @@ static grpc_mdelem *server_filter(void *user_data, grpc_mdelem *md) {
|
|
134
171
|
/* translate host to :authority since :authority may be
|
135
172
|
omitted */
|
136
173
|
grpc_mdelem *authority = grpc_mdelem_from_metadata_strings(
|
137
|
-
GRPC_MDSTR_AUTHORITY, GRPC_MDSTR_REF(md->value));
|
174
|
+
exec_ctx, GRPC_MDSTR_AUTHORITY, GRPC_MDSTR_REF(md->value));
|
138
175
|
calld->seen_authority = 1;
|
139
176
|
return authority;
|
177
|
+
} else if (md->key == GRPC_MDSTR_GRPC_PAYLOAD_BIN) {
|
178
|
+
/* Retrieve the payload from the value of the 'grpc-internal-payload-bin'
|
179
|
+
header field */
|
180
|
+
calld->seen_payload_bin = 1;
|
181
|
+
grpc_slice_buffer_add(&calld->read_slice_buffer,
|
182
|
+
grpc_slice_ref_internal(md->value->slice));
|
183
|
+
grpc_slice_buffer_stream_init(&calld->read_stream,
|
184
|
+
&calld->read_slice_buffer, 0);
|
185
|
+
return NULL;
|
140
186
|
} else {
|
141
187
|
return md;
|
142
188
|
}
|
@@ -147,10 +193,8 @@ static void hs_on_recv(grpc_exec_ctx *exec_ctx, void *user_data,
|
|
147
193
|
grpc_call_element *elem = user_data;
|
148
194
|
call_data *calld = elem->call_data;
|
149
195
|
if (err == GRPC_ERROR_NONE) {
|
150
|
-
|
151
|
-
|
152
|
-
a.exec_ctx = exec_ctx;
|
153
|
-
grpc_metadata_batch_filter(calld->recv_initial_metadata, server_filter, &a);
|
196
|
+
grpc_metadata_batch_filter(exec_ctx, calld->recv_initial_metadata,
|
197
|
+
server_filter, elem);
|
154
198
|
/* Have we seen the required http2 transport headers?
|
155
199
|
(:method, :scheme, content-type, with :path and :authority covered
|
156
200
|
at the channel level right now) */
|
@@ -180,6 +224,11 @@ static void hs_on_recv(grpc_exec_ctx *exec_ctx, void *user_data,
|
|
180
224
|
err, GRPC_ERROR_CREATE("Missing te: trailers header"));
|
181
225
|
}
|
182
226
|
/* Error this call out */
|
227
|
+
if (grpc_http_trace) {
|
228
|
+
const char *error_str = grpc_error_string(err);
|
229
|
+
gpr_log(GPR_ERROR, "Invalid http2 headers: %s", error_str);
|
230
|
+
grpc_error_free_string(error_str);
|
231
|
+
}
|
183
232
|
grpc_call_element_send_cancel(exec_ctx, elem);
|
184
233
|
}
|
185
234
|
} else {
|
@@ -189,7 +238,37 @@ static void hs_on_recv(grpc_exec_ctx *exec_ctx, void *user_data,
|
|
189
238
|
GRPC_ERROR_UNREF(err);
|
190
239
|
}
|
191
240
|
|
192
|
-
static void
|
241
|
+
static void hs_on_complete(grpc_exec_ctx *exec_ctx, void *user_data,
|
242
|
+
grpc_error *err) {
|
243
|
+
grpc_call_element *elem = user_data;
|
244
|
+
call_data *calld = elem->call_data;
|
245
|
+
/* Call recv_message_ready if we got the payload via the header field */
|
246
|
+
if (calld->seen_payload_bin && calld->recv_message_ready != NULL) {
|
247
|
+
*calld->pp_recv_message = calld->payload_bin_delivered
|
248
|
+
? NULL
|
249
|
+
: (grpc_byte_stream *)&calld->read_stream;
|
250
|
+
calld->recv_message_ready->cb(exec_ctx, calld->recv_message_ready->cb_arg,
|
251
|
+
err);
|
252
|
+
calld->recv_message_ready = NULL;
|
253
|
+
calld->payload_bin_delivered = true;
|
254
|
+
}
|
255
|
+
calld->on_complete->cb(exec_ctx, calld->on_complete->cb_arg, err);
|
256
|
+
}
|
257
|
+
|
258
|
+
static void hs_recv_message_ready(grpc_exec_ctx *exec_ctx, void *user_data,
|
259
|
+
grpc_error *err) {
|
260
|
+
grpc_call_element *elem = user_data;
|
261
|
+
call_data *calld = elem->call_data;
|
262
|
+
if (calld->seen_payload_bin) {
|
263
|
+
/* do nothing. This is probably a GET request, and payload will be returned
|
264
|
+
in hs_on_complete callback. */
|
265
|
+
} else {
|
266
|
+
calld->recv_message_ready->cb(exec_ctx, calld->recv_message_ready->cb_arg,
|
267
|
+
err);
|
268
|
+
}
|
269
|
+
}
|
270
|
+
|
271
|
+
static void hs_mutate_op(grpc_exec_ctx *exec_ctx, grpc_call_element *elem,
|
193
272
|
grpc_transport_stream_op *op) {
|
194
273
|
/* grab pointers to our data from the call element */
|
195
274
|
call_data *calld = elem->call_data;
|
@@ -206,11 +285,30 @@ static void hs_mutate_op(grpc_call_element *elem,
|
|
206
285
|
if (op->recv_initial_metadata) {
|
207
286
|
/* substitute our callback for the higher callback */
|
208
287
|
GPR_ASSERT(op->recv_idempotent_request != NULL);
|
288
|
+
GPR_ASSERT(op->recv_cacheable_request != NULL);
|
209
289
|
calld->recv_initial_metadata = op->recv_initial_metadata;
|
210
290
|
calld->recv_idempotent_request = op->recv_idempotent_request;
|
291
|
+
calld->recv_cacheable_request = op->recv_cacheable_request;
|
211
292
|
calld->on_done_recv = op->recv_initial_metadata_ready;
|
212
293
|
op->recv_initial_metadata_ready = &calld->hs_on_recv;
|
213
294
|
}
|
295
|
+
|
296
|
+
if (op->recv_message) {
|
297
|
+
calld->recv_message_ready = op->recv_message_ready;
|
298
|
+
calld->pp_recv_message = op->recv_message;
|
299
|
+
if (op->recv_message_ready) {
|
300
|
+
op->recv_message_ready = &calld->hs_recv_message_ready;
|
301
|
+
}
|
302
|
+
if (op->on_complete) {
|
303
|
+
calld->on_complete = op->on_complete;
|
304
|
+
op->on_complete = &calld->hs_on_complete;
|
305
|
+
}
|
306
|
+
}
|
307
|
+
|
308
|
+
if (op->send_trailing_metadata) {
|
309
|
+
grpc_metadata_batch_filter(exec_ctx, op->send_trailing_metadata,
|
310
|
+
server_filter_outgoing_metadata, elem);
|
311
|
+
}
|
214
312
|
}
|
215
313
|
|
216
314
|
static void hs_start_transport_op(grpc_exec_ctx *exec_ctx,
|
@@ -218,30 +316,43 @@ static void hs_start_transport_op(grpc_exec_ctx *exec_ctx,
|
|
218
316
|
grpc_transport_stream_op *op) {
|
219
317
|
GRPC_CALL_LOG_OP(GPR_INFO, elem, op);
|
220
318
|
GPR_TIMER_BEGIN("hs_start_transport_op", 0);
|
221
|
-
hs_mutate_op(elem, op);
|
319
|
+
hs_mutate_op(exec_ctx, elem, op);
|
222
320
|
grpc_call_next_op(exec_ctx, elem, op);
|
223
321
|
GPR_TIMER_END("hs_start_transport_op", 0);
|
224
322
|
}
|
225
323
|
|
226
324
|
/* Constructor for call_data */
|
227
|
-
static
|
228
|
-
|
325
|
+
static grpc_error *init_call_elem(grpc_exec_ctx *exec_ctx,
|
326
|
+
grpc_call_element *elem,
|
327
|
+
grpc_call_element_args *args) {
|
229
328
|
/* grab pointers to our data from the call element */
|
230
329
|
call_data *calld = elem->call_data;
|
231
330
|
/* initialize members */
|
232
331
|
memset(calld, 0, sizeof(*calld));
|
233
|
-
grpc_closure_init(&calld->hs_on_recv, hs_on_recv, elem
|
332
|
+
grpc_closure_init(&calld->hs_on_recv, hs_on_recv, elem,
|
333
|
+
grpc_schedule_on_exec_ctx);
|
334
|
+
grpc_closure_init(&calld->hs_on_complete, hs_on_complete, elem,
|
335
|
+
grpc_schedule_on_exec_ctx);
|
336
|
+
grpc_closure_init(&calld->hs_recv_message_ready, hs_recv_message_ready, elem,
|
337
|
+
grpc_schedule_on_exec_ctx);
|
338
|
+
grpc_slice_buffer_init(&calld->read_slice_buffer);
|
339
|
+
return GRPC_ERROR_NONE;
|
234
340
|
}
|
235
341
|
|
236
342
|
/* Destructor for call_data */
|
237
343
|
static void destroy_call_elem(grpc_exec_ctx *exec_ctx, grpc_call_element *elem,
|
238
|
-
const
|
344
|
+
const grpc_call_final_info *final_info,
|
345
|
+
void *ignored) {
|
346
|
+
call_data *calld = elem->call_data;
|
347
|
+
grpc_slice_buffer_destroy_internal(exec_ctx, &calld->read_slice_buffer);
|
348
|
+
}
|
239
349
|
|
240
350
|
/* Constructor for channel_data */
|
241
|
-
static
|
242
|
-
|
243
|
-
|
351
|
+
static grpc_error *init_channel_elem(grpc_exec_ctx *exec_ctx,
|
352
|
+
grpc_channel_element *elem,
|
353
|
+
grpc_channel_element_args *args) {
|
244
354
|
GPR_ASSERT(!args->is_last);
|
355
|
+
return GRPC_ERROR_NONE;
|
245
356
|
}
|
246
357
|
|
247
358
|
/* Destructor for channel data */
|
@@ -259,4 +370,5 @@ const grpc_channel_filter grpc_http_server_filter = {
|
|
259
370
|
init_channel_elem,
|
260
371
|
destroy_channel_elem,
|
261
372
|
grpc_call_next_get_peer,
|
373
|
+
grpc_channel_next_get_info,
|
262
374
|
"http-server"};
|
@@ -0,0 +1,261 @@
|
|
1
|
+
//
|
2
|
+
// Copyright 2016, Google Inc.
|
3
|
+
// All rights reserved.
|
4
|
+
//
|
5
|
+
// Redistribution and use in source and binary forms, with or without
|
6
|
+
// modification, are permitted provided that the following conditions are
|
7
|
+
// met:
|
8
|
+
//
|
9
|
+
// * Redistributions of source code must retain the above copyright
|
10
|
+
// notice, this list of conditions and the following disclaimer.
|
11
|
+
// * Redistributions in binary form must reproduce the above
|
12
|
+
// copyright notice, this list of conditions and the following disclaimer
|
13
|
+
// in the documentation and/or other materials provided with the
|
14
|
+
// distribution.
|
15
|
+
// * Neither the name of Google Inc. nor the names of its
|
16
|
+
// contributors may be used to endorse or promote products derived from
|
17
|
+
// this software without specific prior written permission.
|
18
|
+
//
|
19
|
+
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
20
|
+
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
21
|
+
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
22
|
+
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
23
|
+
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
24
|
+
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
25
|
+
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
26
|
+
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
27
|
+
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
28
|
+
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
29
|
+
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
30
|
+
//
|
31
|
+
|
32
|
+
#include "src/core/lib/channel/message_size_filter.h"
|
33
|
+
|
34
|
+
#include <limits.h>
|
35
|
+
#include <string.h>
|
36
|
+
|
37
|
+
#include <grpc/impl/codegen/grpc_types.h>
|
38
|
+
#include <grpc/support/alloc.h>
|
39
|
+
#include <grpc/support/log.h>
|
40
|
+
#include <grpc/support/string_util.h>
|
41
|
+
|
42
|
+
#include "src/core/lib/channel/channel_args.h"
|
43
|
+
#include "src/core/lib/support/string.h"
|
44
|
+
#include "src/core/lib/transport/service_config.h"
|
45
|
+
|
46
|
+
typedef struct message_size_limits {
|
47
|
+
int max_send_size;
|
48
|
+
int max_recv_size;
|
49
|
+
} message_size_limits;
|
50
|
+
|
51
|
+
static void* message_size_limits_copy(void* value) {
|
52
|
+
void* new_value = gpr_malloc(sizeof(message_size_limits));
|
53
|
+
memcpy(new_value, value, sizeof(message_size_limits));
|
54
|
+
return new_value;
|
55
|
+
}
|
56
|
+
|
57
|
+
static void message_size_limits_free(grpc_exec_ctx* exec_ctx, void* value) {
|
58
|
+
gpr_free(value);
|
59
|
+
}
|
60
|
+
|
61
|
+
static const grpc_mdstr_hash_table_vtable message_size_limits_vtable = {
|
62
|
+
message_size_limits_free, message_size_limits_copy};
|
63
|
+
|
64
|
+
static void* message_size_limits_create_from_json(const grpc_json* json) {
|
65
|
+
int max_request_message_bytes = -1;
|
66
|
+
int max_response_message_bytes = -1;
|
67
|
+
for (grpc_json* field = json->child; field != NULL; field = field->next) {
|
68
|
+
if (field->key == NULL) continue;
|
69
|
+
if (strcmp(field->key, "maxRequestMessageBytes") == 0) {
|
70
|
+
if (max_request_message_bytes >= 0) return NULL; // Duplicate.
|
71
|
+
if (field->type != GRPC_JSON_STRING) return NULL;
|
72
|
+
max_request_message_bytes = gpr_parse_nonnegative_int(field->value);
|
73
|
+
if (max_request_message_bytes == -1) return NULL;
|
74
|
+
} else if (strcmp(field->key, "maxResponseMessageBytes") == 0) {
|
75
|
+
if (max_response_message_bytes >= 0) return NULL; // Duplicate.
|
76
|
+
if (field->type != GRPC_JSON_STRING) return NULL;
|
77
|
+
max_response_message_bytes = gpr_parse_nonnegative_int(field->value);
|
78
|
+
if (max_response_message_bytes == -1) return NULL;
|
79
|
+
}
|
80
|
+
}
|
81
|
+
message_size_limits* value = gpr_malloc(sizeof(message_size_limits));
|
82
|
+
value->max_send_size = max_request_message_bytes;
|
83
|
+
value->max_recv_size = max_response_message_bytes;
|
84
|
+
return value;
|
85
|
+
}
|
86
|
+
|
87
|
+
typedef struct call_data {
|
88
|
+
int max_send_size;
|
89
|
+
int max_recv_size;
|
90
|
+
// Receive closures are chained: we inject this closure as the
|
91
|
+
// recv_message_ready up-call on transport_stream_op, and remember to
|
92
|
+
// call our next_recv_message_ready member after handling it.
|
93
|
+
grpc_closure recv_message_ready;
|
94
|
+
// Used by recv_message_ready.
|
95
|
+
grpc_byte_stream** recv_message;
|
96
|
+
// Original recv_message_ready callback, invoked after our own.
|
97
|
+
grpc_closure* next_recv_message_ready;
|
98
|
+
} call_data;
|
99
|
+
|
100
|
+
typedef struct channel_data {
|
101
|
+
int max_send_size;
|
102
|
+
int max_recv_size;
|
103
|
+
// Maps path names to message_size_limits structs.
|
104
|
+
grpc_mdstr_hash_table* method_limit_table;
|
105
|
+
} channel_data;
|
106
|
+
|
107
|
+
// Callback invoked when we receive a message. Here we check the max
|
108
|
+
// receive message size.
|
109
|
+
static void recv_message_ready(grpc_exec_ctx* exec_ctx, void* user_data,
|
110
|
+
grpc_error* error) {
|
111
|
+
grpc_call_element* elem = user_data;
|
112
|
+
call_data* calld = elem->call_data;
|
113
|
+
if (*calld->recv_message != NULL && calld->max_recv_size >= 0 &&
|
114
|
+
(*calld->recv_message)->length > (size_t)calld->max_recv_size) {
|
115
|
+
char* message_string;
|
116
|
+
gpr_asprintf(&message_string,
|
117
|
+
"Received message larger than max (%u vs. %d)",
|
118
|
+
(*calld->recv_message)->length, calld->max_recv_size);
|
119
|
+
grpc_error* new_error = grpc_error_set_int(
|
120
|
+
GRPC_ERROR_CREATE(message_string), GRPC_ERROR_INT_GRPC_STATUS,
|
121
|
+
GRPC_STATUS_INVALID_ARGUMENT);
|
122
|
+
if (error == GRPC_ERROR_NONE) {
|
123
|
+
error = new_error;
|
124
|
+
} else {
|
125
|
+
error = grpc_error_add_child(error, new_error);
|
126
|
+
GRPC_ERROR_UNREF(new_error);
|
127
|
+
}
|
128
|
+
gpr_free(message_string);
|
129
|
+
}
|
130
|
+
// Invoke the next callback.
|
131
|
+
grpc_closure_sched(exec_ctx, calld->next_recv_message_ready, error);
|
132
|
+
}
|
133
|
+
|
134
|
+
// Start transport stream op.
|
135
|
+
static void start_transport_stream_op(grpc_exec_ctx* exec_ctx,
|
136
|
+
grpc_call_element* elem,
|
137
|
+
grpc_transport_stream_op* op) {
|
138
|
+
call_data* calld = elem->call_data;
|
139
|
+
// Check max send message size.
|
140
|
+
if (op->send_message != NULL && calld->max_send_size >= 0 &&
|
141
|
+
op->send_message->length > (size_t)calld->max_send_size) {
|
142
|
+
char* message_string;
|
143
|
+
gpr_asprintf(&message_string, "Sent message larger than max (%u vs. %d)",
|
144
|
+
op->send_message->length, calld->max_send_size);
|
145
|
+
grpc_slice message = grpc_slice_from_copied_string(message_string);
|
146
|
+
gpr_free(message_string);
|
147
|
+
grpc_call_element_send_close_with_message(
|
148
|
+
exec_ctx, elem, GRPC_STATUS_INVALID_ARGUMENT, &message);
|
149
|
+
}
|
150
|
+
// Inject callback for receiving a message.
|
151
|
+
if (op->recv_message_ready != NULL) {
|
152
|
+
calld->next_recv_message_ready = op->recv_message_ready;
|
153
|
+
calld->recv_message = op->recv_message;
|
154
|
+
op->recv_message_ready = &calld->recv_message_ready;
|
155
|
+
}
|
156
|
+
// Chain to the next filter.
|
157
|
+
grpc_call_next_op(exec_ctx, elem, op);
|
158
|
+
}
|
159
|
+
|
160
|
+
// Constructor for call_data.
|
161
|
+
static grpc_error* init_call_elem(grpc_exec_ctx* exec_ctx,
|
162
|
+
grpc_call_element* elem,
|
163
|
+
grpc_call_element_args* args) {
|
164
|
+
channel_data* chand = elem->channel_data;
|
165
|
+
call_data* calld = elem->call_data;
|
166
|
+
calld->next_recv_message_ready = NULL;
|
167
|
+
grpc_closure_init(&calld->recv_message_ready, recv_message_ready, elem,
|
168
|
+
grpc_schedule_on_exec_ctx);
|
169
|
+
// Get max sizes from channel data, then merge in per-method config values.
|
170
|
+
// Note: Per-method config is only available on the client, so we
|
171
|
+
// apply the max request size to the send limit and the max response
|
172
|
+
// size to the receive limit.
|
173
|
+
calld->max_send_size = chand->max_send_size;
|
174
|
+
calld->max_recv_size = chand->max_recv_size;
|
175
|
+
if (chand->method_limit_table != NULL) {
|
176
|
+
message_size_limits* limits = grpc_method_config_table_get(
|
177
|
+
exec_ctx, chand->method_limit_table, args->path);
|
178
|
+
if (limits != NULL) {
|
179
|
+
if (limits->max_send_size >= 0 &&
|
180
|
+
(limits->max_send_size < calld->max_send_size ||
|
181
|
+
calld->max_send_size < 0)) {
|
182
|
+
calld->max_send_size = limits->max_send_size;
|
183
|
+
}
|
184
|
+
if (limits->max_recv_size >= 0 &&
|
185
|
+
(limits->max_recv_size < calld->max_recv_size ||
|
186
|
+
calld->max_recv_size < 0)) {
|
187
|
+
calld->max_recv_size = limits->max_recv_size;
|
188
|
+
}
|
189
|
+
}
|
190
|
+
}
|
191
|
+
return GRPC_ERROR_NONE;
|
192
|
+
}
|
193
|
+
|
194
|
+
// Destructor for call_data.
|
195
|
+
static void destroy_call_elem(grpc_exec_ctx* exec_ctx, grpc_call_element* elem,
|
196
|
+
const grpc_call_final_info* final_info,
|
197
|
+
void* ignored) {}
|
198
|
+
|
199
|
+
// Constructor for channel_data.
|
200
|
+
static grpc_error* init_channel_elem(grpc_exec_ctx* exec_ctx,
|
201
|
+
grpc_channel_element* elem,
|
202
|
+
grpc_channel_element_args* args) {
|
203
|
+
GPR_ASSERT(!args->is_last);
|
204
|
+
channel_data* chand = elem->channel_data;
|
205
|
+
memset(chand, 0, sizeof(*chand));
|
206
|
+
chand->max_send_size = GRPC_DEFAULT_MAX_SEND_MESSAGE_LENGTH;
|
207
|
+
chand->max_recv_size = GRPC_DEFAULT_MAX_RECV_MESSAGE_LENGTH;
|
208
|
+
for (size_t i = 0; i < args->channel_args->num_args; ++i) {
|
209
|
+
if (strcmp(args->channel_args->args[i].key,
|
210
|
+
GRPC_ARG_MAX_SEND_MESSAGE_LENGTH) == 0) {
|
211
|
+
const grpc_integer_options options = {
|
212
|
+
GRPC_DEFAULT_MAX_SEND_MESSAGE_LENGTH, 0, INT_MAX};
|
213
|
+
chand->max_send_size =
|
214
|
+
grpc_channel_arg_get_integer(&args->channel_args->args[i], options);
|
215
|
+
}
|
216
|
+
if (strcmp(args->channel_args->args[i].key,
|
217
|
+
GRPC_ARG_MAX_RECEIVE_MESSAGE_LENGTH) == 0) {
|
218
|
+
const grpc_integer_options options = {
|
219
|
+
GRPC_DEFAULT_MAX_RECV_MESSAGE_LENGTH, 0, INT_MAX};
|
220
|
+
chand->max_recv_size =
|
221
|
+
grpc_channel_arg_get_integer(&args->channel_args->args[i], options);
|
222
|
+
}
|
223
|
+
}
|
224
|
+
// Get method config table from channel args.
|
225
|
+
const grpc_arg* channel_arg =
|
226
|
+
grpc_channel_args_find(args->channel_args, GRPC_ARG_SERVICE_CONFIG);
|
227
|
+
if (channel_arg != NULL) {
|
228
|
+
GPR_ASSERT(channel_arg->type == GRPC_ARG_STRING);
|
229
|
+
grpc_service_config* service_config =
|
230
|
+
grpc_service_config_create(channel_arg->value.string);
|
231
|
+
if (service_config != NULL) {
|
232
|
+
chand->method_limit_table =
|
233
|
+
grpc_service_config_create_method_config_table(
|
234
|
+
exec_ctx, service_config, message_size_limits_create_from_json,
|
235
|
+
&message_size_limits_vtable);
|
236
|
+
grpc_service_config_destroy(service_config);
|
237
|
+
}
|
238
|
+
}
|
239
|
+
return GRPC_ERROR_NONE;
|
240
|
+
}
|
241
|
+
|
242
|
+
// Destructor for channel_data.
|
243
|
+
static void destroy_channel_elem(grpc_exec_ctx* exec_ctx,
|
244
|
+
grpc_channel_element* elem) {
|
245
|
+
channel_data* chand = elem->channel_data;
|
246
|
+
grpc_mdstr_hash_table_unref(exec_ctx, chand->method_limit_table);
|
247
|
+
}
|
248
|
+
|
249
|
+
const grpc_channel_filter grpc_message_size_filter = {
|
250
|
+
start_transport_stream_op,
|
251
|
+
grpc_channel_next_op,
|
252
|
+
sizeof(call_data),
|
253
|
+
init_call_elem,
|
254
|
+
grpc_call_stack_ignore_set_pollset_or_pollset_set,
|
255
|
+
destroy_call_elem,
|
256
|
+
sizeof(channel_data),
|
257
|
+
init_channel_elem,
|
258
|
+
destroy_channel_elem,
|
259
|
+
grpc_call_next_get_peer,
|
260
|
+
grpc_channel_next_get_info,
|
261
|
+
"message_size"};
|