grpc 1.36.0 → 1.38.0
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 +126 -92
- data/include/grpc/event_engine/README.md +38 -0
- data/include/grpc/event_engine/channel_args.h +28 -0
- data/include/grpc/event_engine/event_engine.h +336 -0
- data/include/grpc/event_engine/port.h +39 -0
- data/include/grpc/event_engine/slice_allocator.h +81 -0
- data/include/grpc/grpc.h +15 -1
- data/include/grpc/grpc_security_constants.h +14 -0
- data/include/grpc/impl/codegen/grpc_types.h +11 -0
- data/include/grpc/impl/codegen/port_platform.h +7 -0
- data/include/grpc/module.modulemap +14 -14
- data/src/core/ext/filters/client_channel/backup_poller.cc +3 -3
- data/src/core/ext/filters/client_channel/channel_connectivity.cc +177 -202
- data/src/core/ext/filters/client_channel/client_channel.cc +715 -3166
- data/src/core/ext/filters/client_channel/client_channel.h +489 -55
- data/src/core/ext/filters/client_channel/client_channel_channelz.h +1 -1
- data/src/core/ext/filters/client_channel/client_channel_factory.h +2 -1
- data/src/core/ext/filters/client_channel/client_channel_plugin.cc +4 -1
- data/src/core/ext/filters/client_channel/config_selector.h +9 -1
- data/src/core/ext/filters/client_channel/connector.h +1 -1
- data/src/core/ext/filters/client_channel/dynamic_filters.cc +18 -14
- data/src/core/ext/filters/client_channel/dynamic_filters.h +3 -3
- data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +24 -142
- data/src/core/ext/filters/client_channel/global_subchannel_pool.h +15 -10
- data/src/core/ext/filters/client_channel/health/health_check_client.cc +26 -27
- data/src/core/ext/filters/client_channel/health/health_check_client.h +27 -26
- data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +24 -21
- data/src/core/ext/filters/client_channel/lb_policy.cc +4 -1
- data/src/core/ext/filters/client_channel/lb_policy.h +4 -4
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +6 -6
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +46 -43
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +2 -1
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +5 -5
- data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +14 -12
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +23 -0
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +27 -0
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +4 -4
- data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +15 -15
- data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +36 -30
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +29 -44
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +32 -47
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +86 -63
- data/src/core/ext/filters/client_channel/lb_policy_factory.h +1 -1
- data/src/core/ext/filters/client_channel/lb_policy_registry.cc +4 -4
- data/src/core/ext/filters/client_channel/lb_policy_registry.h +1 -1
- data/src/core/ext/filters/client_channel/local_subchannel_pool.cc +27 -67
- data/src/core/ext/filters/client_channel/local_subchannel_pool.h +10 -9
- data/src/core/ext/filters/client_channel/resolver.cc +3 -0
- data/src/core/ext/filters/client_channel/resolver.h +2 -2
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +23 -15
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +1 -1
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +3 -3
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +4 -4
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +17 -15
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +38 -33
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +1 -1
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc +1 -1
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +1 -1
- data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +17 -9
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +20 -28
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +7 -5
- data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +31 -14
- data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +1 -1
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +334 -114
- data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +32 -239
- data/src/core/ext/filters/client_channel/resolver_result_parsing.h +20 -49
- data/src/core/ext/filters/client_channel/retry_filter.cc +2188 -0
- data/src/core/ext/filters/client_channel/retry_filter.h +30 -0
- data/src/core/ext/filters/client_channel/retry_service_config.cc +287 -0
- data/src/core/ext/filters/client_channel/retry_service_config.h +90 -0
- data/src/core/ext/filters/client_channel/server_address.cc +4 -1
- data/src/core/ext/filters/client_channel/service_config.cc +15 -14
- data/src/core/ext/filters/client_channel/service_config.h +7 -6
- data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +5 -4
- data/src/core/ext/filters/client_channel/service_config_parser.cc +6 -6
- data/src/core/ext/filters/client_channel/service_config_parser.h +7 -4
- data/src/core/ext/filters/client_channel/subchannel.cc +86 -162
- data/src/core/ext/filters/client_channel/subchannel.h +68 -99
- data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +16 -2
- data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +10 -8
- data/src/core/ext/filters/client_idle/client_idle_filter.cc +17 -16
- data/src/core/ext/filters/deadline/deadline_filter.cc +10 -10
- data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +501 -0
- data/src/core/ext/filters/fault_injection/fault_injection_filter.h +39 -0
- data/src/core/ext/filters/fault_injection/service_config_parser.cc +189 -0
- data/src/core/ext/filters/fault_injection/service_config_parser.h +85 -0
- data/src/core/ext/filters/http/client/http_client_filter.cc +28 -21
- data/src/core/ext/filters/http/client_authority_filter.cc +3 -3
- data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +23 -22
- data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +21 -21
- data/src/core/ext/filters/http/server/http_server_filter.cc +27 -23
- data/src/core/ext/filters/max_age/max_age_filter.cc +12 -10
- data/src/core/ext/filters/message_size/message_size_filter.cc +14 -11
- data/src/core/ext/filters/message_size/message_size_filter.h +1 -1
- data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc +5 -4
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +8 -8
- data/src/core/ext/transport/chttp2/client/chttp2_connector.h +7 -7
- data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +5 -4
- data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +2 -2
- data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +6 -5
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +485 -199
- data/src/core/ext/transport/chttp2/server/chttp2_server.h +2 -2
- data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +3 -4
- data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +3 -3
- data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +3 -4
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +167 -122
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +12 -1
- data/src/core/ext/transport/chttp2/transport/context_list.cc +4 -5
- data/src/core/ext/transport/chttp2/transport/context_list.h +4 -4
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +3 -3
- data/src/core/ext/transport/chttp2/transport/flow_control.h +8 -8
- data/src/core/ext/transport/chttp2/transport/frame_data.cc +13 -9
- data/src/core/ext/transport/chttp2/transport/frame_data.h +10 -10
- data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +7 -8
- data/src/core/ext/transport/chttp2/transport/frame_goaway.h +6 -6
- data/src/core/ext/transport/chttp2/transport/frame_ping.cc +7 -8
- data/src/core/ext/transport/chttp2/transport/frame_ping.h +7 -6
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +7 -7
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +6 -6
- data/src/core/ext/transport/chttp2/transport/frame_settings.cc +6 -5
- data/src/core/ext/transport/chttp2/transport/frame_settings.h +6 -6
- data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +4 -6
- data/src/core/ext/transport/chttp2/transport/frame_window_update.h +4 -6
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +1 -1
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +237 -208
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +10 -10
- data/src/core/ext/transport/chttp2/transport/hpack_table.cc +4 -3
- data/src/core/ext/transport/chttp2/transport/hpack_table.h +4 -4
- data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +2 -2
- data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +2 -2
- data/src/core/ext/transport/chttp2/transport/internal.h +32 -27
- data/src/core/ext/transport/chttp2/transport/parsing.cc +63 -56
- data/src/core/ext/transport/chttp2/transport/writing.cc +7 -3
- data/src/core/ext/transport/inproc/inproc_transport.cc +30 -29
- data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.c +406 -0
- data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.h +1459 -0
- data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c +350 -0
- data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h +1348 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +6 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +25 -0
- data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c +144 -0
- data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.h +488 -0
- data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c +141 -0
- data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h +452 -0
- data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +15 -0
- data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +44 -0
- data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.c +79 -0
- data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.h +268 -0
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c +78 -0
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h +281 -0
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c +41 -0
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h +113 -0
- data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +6 -5
- data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +13 -9
- data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c +93 -0
- data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h +323 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c +36 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.h +90 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.c +46 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.h +124 -0
- data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.c +33 -0
- data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.h +77 -0
- data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.c +354 -0
- data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.h +140 -0
- data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +383 -0
- data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.h +115 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +10 -7
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.h +5 -0
- data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.c +141 -0
- data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.h +70 -0
- data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.c +141 -0
- data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.h +70 -0
- data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +13 -7
- data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h +5 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3/fault.upbdefs.c +102 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3/fault.upbdefs.h +55 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.c +120 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.h +45 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c +76 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +21 -20
- data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c +130 -0
- data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.h +50 -0
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.c +56 -0
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/struct.upbdefs.c +63 -0
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/struct.upbdefs.h +40 -0
- data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.c +44 -0
- data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.h +35 -0
- data/src/core/ext/xds/certificate_provider_factory.h +1 -1
- data/src/core/ext/xds/certificate_provider_store.h +3 -3
- data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +3 -3
- data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +2 -2
- data/src/core/ext/xds/xds_api.cc +1649 -329
- data/src/core/ext/xds/xds_api.h +284 -44
- data/src/core/ext/xds/xds_bootstrap.cc +110 -156
- data/src/core/ext/xds/xds_bootstrap.h +24 -25
- data/src/core/ext/xds/xds_certificate_provider.cc +4 -4
- data/src/core/ext/xds/xds_certificate_provider.h +4 -4
- data/src/core/ext/xds/xds_channel_args.h +5 -2
- data/src/core/ext/xds/xds_client.cc +454 -177
- data/src/core/ext/xds/xds_client.h +62 -22
- data/src/core/ext/xds/xds_client_stats.h +5 -4
- data/src/core/ext/xds/xds_http_fault_filter.cc +226 -0
- data/src/core/ext/xds/xds_http_fault_filter.h +63 -0
- data/src/core/ext/xds/xds_http_filters.cc +114 -0
- data/src/core/ext/xds/xds_http_filters.h +130 -0
- data/src/core/ext/xds/xds_server_config_fetcher.cc +410 -131
- data/src/core/lib/{iomgr → address_utils}/parse_address.cc +17 -17
- data/src/core/lib/{iomgr → address_utils}/parse_address.h +7 -7
- data/src/core/lib/{iomgr → address_utils}/sockaddr_utils.cc +107 -4
- data/src/core/lib/{iomgr → address_utils}/sockaddr_utils.h +26 -6
- data/src/core/lib/channel/channel_stack.cc +22 -9
- data/src/core/lib/channel/channel_stack.h +17 -9
- data/src/core/lib/channel/channel_stack_builder.cc +2 -2
- data/src/core/lib/channel/channel_stack_builder.h +1 -1
- data/src/core/lib/channel/channelz.cc +108 -12
- data/src/core/lib/channel/channelz.h +30 -1
- data/src/core/lib/channel/channelz_registry.cc +14 -0
- data/src/core/lib/channel/connected_channel.cc +4 -4
- data/src/core/lib/channel/handshaker.cc +7 -45
- data/src/core/lib/channel/handshaker.h +5 -22
- data/src/core/lib/channel/status_util.cc +12 -2
- data/src/core/lib/channel/status_util.h +5 -0
- data/src/core/lib/event_engine/slice_allocator.cc +59 -0
- data/src/core/lib/event_engine/sockaddr.cc +38 -0
- data/src/core/lib/gpr/sync_abseil.cc +3 -6
- data/src/core/lib/gpr/sync_windows.cc +2 -2
- data/src/core/lib/gprpp/atomic.h +3 -3
- data/src/core/lib/gprpp/dual_ref_counted.h +3 -3
- data/src/core/lib/gprpp/ref_counted.h +28 -14
- data/src/core/lib/gprpp/ref_counted_ptr.h +2 -0
- data/src/core/lib/gprpp/status_helper.cc +407 -0
- data/src/core/lib/gprpp/status_helper.h +180 -0
- data/src/core/lib/gprpp/thd.h +1 -1
- data/src/core/lib/http/httpcli.cc +11 -11
- data/src/core/lib/http/httpcli_security_connector.cc +11 -7
- data/src/core/lib/http/parser.cc +16 -16
- data/src/core/lib/http/parser.h +4 -4
- data/src/core/lib/iomgr/buffer_list.cc +7 -9
- data/src/core/lib/iomgr/buffer_list.h +5 -6
- data/src/core/lib/iomgr/call_combiner.cc +15 -12
- data/src/core/lib/iomgr/call_combiner.h +12 -14
- data/src/core/lib/iomgr/cfstream_handle.cc +5 -5
- data/src/core/lib/iomgr/cfstream_handle.h +1 -1
- data/src/core/lib/iomgr/closure.h +7 -6
- data/src/core/lib/iomgr/combiner.cc +14 -12
- data/src/core/lib/iomgr/combiner.h +2 -2
- data/src/core/lib/iomgr/endpoint.cc +1 -1
- data/src/core/lib/iomgr/endpoint.h +2 -2
- data/src/core/lib/iomgr/endpoint_cfstream.cc +11 -13
- data/src/core/lib/iomgr/endpoint_pair_windows.cc +1 -1
- data/src/core/lib/iomgr/error.cc +167 -61
- data/src/core/lib/iomgr/error.h +218 -107
- data/src/core/lib/iomgr/error_cfstream.cc +3 -2
- data/src/core/lib/iomgr/error_cfstream.h +2 -2
- data/src/core/lib/iomgr/error_internal.h +5 -1
- data/src/core/lib/iomgr/ev_apple.cc +6 -6
- data/src/core/lib/iomgr/ev_epoll1_linux.cc +22 -22
- data/src/core/lib/iomgr/ev_epollex_linux.cc +48 -45
- data/src/core/lib/iomgr/ev_poll_posix.cc +26 -23
- data/src/core/lib/iomgr/ev_posix.cc +12 -11
- data/src/core/lib/iomgr/ev_posix.h +9 -9
- data/src/core/lib/iomgr/exec_ctx.cc +10 -6
- data/src/core/lib/iomgr/exec_ctx.h +1 -1
- data/src/core/lib/iomgr/executor.cc +8 -8
- data/src/core/lib/iomgr/executor.h +2 -2
- data/src/core/lib/iomgr/iomgr.cc +1 -1
- data/src/core/lib/iomgr/iomgr.h +1 -1
- data/src/core/lib/iomgr/iomgr_custom.cc +1 -1
- data/src/core/lib/iomgr/iomgr_internal.cc +2 -2
- data/src/core/lib/iomgr/iomgr_internal.h +3 -3
- data/src/core/lib/iomgr/iomgr_posix.cc +1 -1
- data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +2 -2
- data/src/core/lib/iomgr/iomgr_windows.cc +1 -1
- data/src/core/lib/iomgr/load_file.cc +4 -4
- data/src/core/lib/iomgr/load_file.h +2 -2
- data/src/core/lib/iomgr/lockfree_event.cc +5 -5
- data/src/core/lib/iomgr/lockfree_event.h +1 -1
- data/src/core/lib/iomgr/pollset.cc +5 -5
- data/src/core/lib/iomgr/pollset.h +9 -9
- data/src/core/lib/iomgr/pollset_custom.cc +5 -5
- data/src/core/lib/iomgr/pollset_windows.cc +5 -5
- data/src/core/lib/iomgr/port.h +1 -1
- data/src/core/lib/iomgr/python_util.h +1 -1
- data/src/core/lib/iomgr/resolve_address.cc +3 -3
- data/src/core/lib/iomgr/resolve_address.h +6 -6
- data/src/core/lib/iomgr/resolve_address_custom.cc +10 -9
- data/src/core/lib/iomgr/resolve_address_custom.h +3 -3
- data/src/core/lib/iomgr/resolve_address_posix.cc +3 -3
- data/src/core/lib/iomgr/resolve_address_windows.cc +4 -4
- data/src/core/lib/iomgr/resource_quota.cc +12 -11
- data/src/core/lib/iomgr/socket_utils_common_posix.cc +22 -20
- data/src/core/lib/iomgr/socket_utils_posix.h +20 -20
- data/src/core/lib/iomgr/tcp_client_cfstream.cc +4 -4
- data/src/core/lib/iomgr/tcp_client_custom.cc +5 -6
- data/src/core/lib/iomgr/tcp_client_posix.cc +15 -17
- data/src/core/lib/iomgr/tcp_client_posix.h +3 -4
- data/src/core/lib/iomgr/tcp_client_windows.cc +5 -5
- data/src/core/lib/iomgr/tcp_custom.cc +14 -16
- data/src/core/lib/iomgr/tcp_custom.h +13 -12
- data/src/core/lib/iomgr/tcp_posix.cc +37 -38
- data/src/core/lib/iomgr/tcp_server.cc +6 -6
- data/src/core/lib/iomgr/tcp_server.h +12 -11
- data/src/core/lib/iomgr/tcp_server_custom.cc +23 -21
- data/src/core/lib/iomgr/tcp_server_posix.cc +22 -21
- data/src/core/lib/iomgr/tcp_server_utils_posix.h +13 -12
- data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +19 -17
- data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +9 -9
- data/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc +4 -4
- data/src/core/lib/iomgr/tcp_server_windows.cc +26 -25
- data/src/core/lib/iomgr/tcp_uv.cc +27 -25
- data/src/core/lib/iomgr/tcp_windows.cc +13 -13
- data/src/core/lib/iomgr/tcp_windows.h +2 -2
- data/src/core/lib/iomgr/timer_custom.cc +2 -1
- data/src/core/lib/iomgr/timer_custom.h +1 -1
- data/src/core/lib/iomgr/timer_generic.cc +8 -8
- data/src/core/lib/iomgr/timer_manager.cc +1 -1
- data/src/core/lib/iomgr/udp_server.cc +21 -20
- data/src/core/lib/iomgr/unix_sockets_posix.cc +3 -3
- data/src/core/lib/iomgr/unix_sockets_posix.h +2 -2
- data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +10 -7
- data/src/core/lib/iomgr/wakeup_fd_eventfd.cc +3 -3
- data/src/core/lib/iomgr/wakeup_fd_nospecial.cc +1 -1
- data/src/core/lib/iomgr/wakeup_fd_pipe.cc +4 -4
- data/src/core/lib/iomgr/wakeup_fd_posix.cc +3 -3
- data/src/core/lib/iomgr/wakeup_fd_posix.h +8 -6
- data/src/core/lib/iomgr/work_serializer.h +17 -1
- data/src/core/lib/json/json.h +1 -1
- data/src/core/lib/json/json_reader.cc +4 -4
- data/src/core/lib/{security/authorization → matchers}/matchers.cc +47 -47
- data/src/core/lib/{security/authorization → matchers}/matchers.h +42 -40
- data/src/core/lib/security/credentials/composite/composite_credentials.cc +4 -4
- data/src/core/lib/security/credentials/composite/composite_credentials.h +2 -2
- data/src/core/lib/security/credentials/credentials.h +2 -2
- data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +17 -13
- data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +13 -11
- data/src/core/lib/security/credentials/external/aws_request_signer.cc +2 -1
- data/src/core/lib/security/credentials/external/aws_request_signer.h +1 -1
- data/src/core/lib/security/credentials/external/external_account_credentials.cc +15 -12
- data/src/core/lib/security/credentials/external/external_account_credentials.h +9 -8
- data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +5 -4
- data/src/core/lib/security/credentials/external/file_external_account_credentials.h +4 -3
- data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +8 -8
- data/src/core/lib/security/credentials/external/url_external_account_credentials.h +9 -7
- data/src/core/lib/security/credentials/fake/fake_credentials.cc +2 -2
- data/src/core/lib/security/credentials/fake/fake_credentials.h +2 -2
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +9 -9
- data/src/core/lib/security/credentials/iam/iam_credentials.cc +2 -2
- data/src/core/lib/security/credentials/iam/iam_credentials.h +2 -2
- data/src/core/lib/security/credentials/jwt/json_token.cc +2 -2
- data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +3 -3
- data/src/core/lib/security/credentials/jwt/jwt_credentials.h +2 -2
- data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +7 -5
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +21 -19
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +5 -5
- data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +5 -5
- data/src/core/lib/security/credentials/plugin/plugin_credentials.h +2 -2
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +8 -7
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +9 -9
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +19 -13
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +4 -0
- data/src/core/lib/security/credentials/xds/xds_credentials.cc +3 -3
- data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +13 -3
- data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +13 -3
- data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +2 -2
- data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +12 -2
- data/src/core/lib/security/security_connector/load_system_roots_linux.cc +1 -1
- data/src/core/lib/security/security_connector/local/local_security_connector.cc +14 -4
- data/src/core/lib/security/security_connector/security_connector.h +9 -4
- data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +16 -6
- data/src/core/lib/security/security_connector/ssl_utils.cc +28 -8
- data/src/core/lib/security/security_connector/ssl_utils.h +4 -4
- data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +62 -60
- data/src/core/lib/security/security_connector/tls/tls_security_connector.h +66 -48
- data/src/core/lib/security/transport/client_auth_filter.cc +18 -10
- data/src/core/lib/security/transport/secure_endpoint.cc +4 -4
- data/src/core/lib/security/transport/security_handshaker.cc +65 -34
- data/src/core/lib/security/transport/server_auth_filter.cc +24 -11
- data/src/core/lib/security/transport/tsi_error.cc +2 -1
- data/src/core/lib/security/transport/tsi_error.h +2 -1
- data/src/core/lib/security/util/json_util.cc +2 -2
- data/src/core/lib/security/util/json_util.h +1 -1
- data/src/core/lib/slice/slice_intern.cc +6 -7
- data/src/core/lib/surface/call.cc +46 -45
- data/src/core/lib/surface/call.h +2 -2
- data/src/core/lib/surface/channel.cc +6 -6
- data/src/core/lib/surface/channel.h +6 -5
- data/src/core/lib/surface/channel_ping.cc +1 -1
- data/src/core/lib/surface/completion_queue.cc +46 -47
- data/src/core/lib/surface/completion_queue.h +2 -1
- data/src/core/lib/surface/lame_client.cc +43 -24
- data/src/core/lib/surface/lame_client.h +4 -3
- data/src/core/lib/surface/server.cc +68 -55
- data/src/core/lib/surface/server.h +89 -29
- data/src/core/lib/surface/validate_metadata.cc +7 -7
- data/src/core/lib/surface/validate_metadata.h +3 -2
- data/src/core/lib/surface/version.cc +4 -2
- data/src/core/lib/transport/byte_stream.cc +5 -5
- data/src/core/lib/transport/byte_stream.h +8 -8
- data/src/core/lib/transport/connectivity_state.cc +1 -1
- data/src/core/lib/transport/error_utils.cc +19 -8
- data/src/core/lib/transport/error_utils.h +11 -5
- data/src/core/lib/transport/metadata_batch.cc +64 -37
- data/src/core/lib/transport/metadata_batch.h +33 -18
- data/src/core/lib/transport/transport.cc +4 -3
- data/src/core/lib/transport/transport.h +4 -4
- data/src/core/lib/transport/transport_op_string.cc +5 -5
- data/src/core/plugin_registry/grpc_plugin_registry.cc +6 -0
- data/src/core/tsi/alts/crypt/gsec.h +4 -0
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +6 -8
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +7 -6
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +1 -1
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h +2 -1
- data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +1 -3
- data/src/core/tsi/fake_transport_security.cc +10 -1
- data/src/core/tsi/ssl_transport_security.cc +32 -14
- data/src/core/tsi/ssl_transport_security.h +3 -4
- data/src/ruby/bin/math_services_pb.rb +1 -1
- data/src/ruby/ext/grpc/extconf.rb +9 -1
- data/src/ruby/ext/grpc/rb_channel.c +10 -1
- data/src/ruby/ext/grpc/rb_channel_credentials.c +11 -1
- data/src/ruby/ext/grpc/rb_channel_credentials.h +4 -0
- data/src/ruby/ext/grpc/rb_compression_options.c +1 -1
- data/src/ruby/ext/grpc/rb_enable_cpp.cc +1 -1
- data/src/ruby/ext/grpc/rb_grpc.c +4 -0
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +2 -0
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +4 -1
- data/src/ruby/ext/grpc/rb_server.c +13 -1
- data/src/ruby/ext/grpc/rb_server_credentials.c +19 -3
- data/src/ruby/ext/grpc/rb_server_credentials.h +4 -0
- data/src/ruby/ext/grpc/rb_xds_channel_credentials.c +215 -0
- data/src/ruby/ext/grpc/rb_xds_channel_credentials.h +35 -0
- data/src/ruby/ext/grpc/rb_xds_server_credentials.c +169 -0
- data/src/ruby/ext/grpc/rb_xds_server_credentials.h +35 -0
- data/src/ruby/lib/grpc/generic/client_stub.rb +4 -2
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/pb/grpc/health/v1/health_services_pb.rb +1 -1
- data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +6 -6
- data/src/ruby/spec/call_spec.rb +1 -1
- data/src/ruby/spec/channel_credentials_spec.rb +32 -0
- data/src/ruby/spec/channel_spec.rb +17 -6
- data/src/ruby/spec/client_auth_spec.rb +27 -1
- data/src/ruby/spec/errors_spec.rb +1 -1
- data/src/ruby/spec/generic/active_call_spec.rb +2 -2
- data/src/ruby/spec/generic/client_stub_spec.rb +4 -4
- data/src/ruby/spec/generic/rpc_server_spec.rb +1 -1
- data/src/ruby/spec/server_credentials_spec.rb +25 -0
- data/src/ruby/spec/server_spec.rb +22 -0
- data/third_party/abseil-cpp/absl/algorithm/container.h +3 -3
- data/third_party/abseil-cpp/absl/base/attributes.h +24 -4
- data/third_party/abseil-cpp/absl/base/call_once.h +2 -9
- data/third_party/abseil-cpp/absl/base/config.h +37 -9
- data/third_party/abseil-cpp/absl/base/dynamic_annotations.h +24 -10
- data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +4 -1
- data/third_party/abseil-cpp/absl/base/internal/endian.h +61 -0
- data/third_party/abseil-cpp/absl/base/internal/low_level_scheduling.h +2 -3
- data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +34 -32
- data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +16 -6
- data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +11 -2
- data/third_party/abseil-cpp/absl/base/internal/spinlock.h +14 -5
- data/third_party/abseil-cpp/absl/base/internal/spinlock_akaros.inc +2 -2
- data/third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc +3 -3
- data/third_party/abseil-cpp/absl/base/internal/spinlock_posix.inc +2 -2
- data/third_party/abseil-cpp/absl/base/internal/spinlock_wait.h +11 -11
- data/third_party/abseil-cpp/absl/base/internal/spinlock_win32.inc +5 -5
- data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +1 -1
- data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +5 -2
- data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +43 -42
- data/third_party/abseil-cpp/absl/base/internal/throw_delegate.cc +111 -7
- data/third_party/abseil-cpp/absl/base/internal/unaligned_access.h +0 -76
- data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +1 -3
- data/third_party/abseil-cpp/absl/base/log_severity.h +4 -4
- data/third_party/abseil-cpp/absl/base/macros.h +11 -0
- data/third_party/abseil-cpp/absl/base/optimization.h +10 -7
- data/third_party/abseil-cpp/absl/base/options.h +1 -1
- data/third_party/abseil-cpp/absl/base/port.h +0 -1
- data/third_party/abseil-cpp/absl/base/thread_annotations.h +1 -1
- data/third_party/abseil-cpp/absl/container/fixed_array.h +2 -2
- data/third_party/abseil-cpp/absl/container/inlined_vector.h +5 -3
- data/third_party/abseil-cpp/absl/container/internal/compressed_tuple.h +1 -1
- data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +5 -1
- data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +2 -1
- data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler_force_weak_definition.cc +2 -1
- data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +141 -66
- data/third_party/abseil-cpp/absl/container/internal/layout.h +4 -4
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +14 -1
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +136 -136
- data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +16 -12
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +5 -2
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +3 -12
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +6 -1
- data/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +3 -5
- data/third_party/abseil-cpp/absl/debugging/symbolize_darwin.inc +2 -2
- data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +2 -2
- data/third_party/abseil-cpp/absl/hash/internal/city.cc +15 -12
- data/third_party/abseil-cpp/absl/hash/internal/city.h +1 -19
- data/third_party/abseil-cpp/absl/hash/internal/hash.cc +25 -10
- data/third_party/abseil-cpp/absl/hash/internal/hash.h +86 -37
- data/third_party/abseil-cpp/absl/hash/internal/wyhash.cc +111 -0
- data/third_party/abseil-cpp/absl/hash/internal/wyhash.h +48 -0
- data/third_party/abseil-cpp/absl/meta/type_traits.h +16 -2
- data/third_party/abseil-cpp/absl/numeric/bits.h +177 -0
- data/third_party/abseil-cpp/absl/numeric/int128.cc +3 -3
- data/third_party/abseil-cpp/absl/numeric/internal/bits.h +358 -0
- data/third_party/abseil-cpp/absl/numeric/internal/representation.h +55 -0
- data/third_party/abseil-cpp/absl/status/internal/status_internal.h +18 -0
- data/third_party/abseil-cpp/absl/status/internal/statusor_internal.h +4 -7
- data/third_party/abseil-cpp/absl/status/status.cc +29 -22
- data/third_party/abseil-cpp/absl/status/status.h +81 -20
- data/third_party/abseil-cpp/absl/status/statusor.h +3 -3
- data/third_party/abseil-cpp/absl/strings/charconv.cc +5 -5
- data/third_party/abseil-cpp/absl/strings/cord.cc +326 -371
- data/third_party/abseil-cpp/absl/strings/cord.h +182 -64
- data/third_party/abseil-cpp/absl/strings/escaping.cc +4 -4
- data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc +6 -6
- data/third_party/abseil-cpp/absl/strings/internal/cord_internal.cc +83 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +387 -17
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_flat.h +146 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.cc +897 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.h +589 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring_reader.h +114 -0
- data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +14 -0
- data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +14 -0
- data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc +15 -1
- data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +19 -4
- data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +14 -0
- data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +36 -18
- data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.h +14 -0
- data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc +14 -0
- data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +14 -0
- data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +15 -40
- data/third_party/abseil-cpp/absl/strings/internal/string_constant.h +64 -0
- data/third_party/abseil-cpp/absl/strings/match.cc +6 -3
- data/third_party/abseil-cpp/absl/strings/match.h +16 -6
- data/third_party/abseil-cpp/absl/strings/numbers.cc +132 -4
- data/third_party/abseil-cpp/absl/strings/numbers.h +10 -10
- data/third_party/abseil-cpp/absl/strings/str_join.h +1 -1
- data/third_party/abseil-cpp/absl/strings/str_split.h +38 -4
- data/third_party/abseil-cpp/absl/synchronization/internal/futex.h +154 -0
- data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +2 -1
- data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.cc +2 -2
- data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +4 -4
- data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +1 -65
- data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +2 -6
- data/third_party/abseil-cpp/absl/synchronization/mutex.cc +71 -59
- data/third_party/abseil-cpp/absl/synchronization/mutex.h +79 -62
- data/third_party/abseil-cpp/absl/time/clock.cc +146 -130
- data/third_party/abseil-cpp/absl/time/clock.h +2 -2
- data/third_party/abseil-cpp/absl/time/duration.cc +3 -2
- data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +7 -11
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.cc +7 -1
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +4 -4
- data/third_party/abseil-cpp/absl/time/time.cc +4 -3
- data/third_party/abseil-cpp/absl/time/time.h +26 -24
- data/third_party/abseil-cpp/absl/types/internal/variant.h +1 -1
- data/third_party/abseil-cpp/absl/types/variant.h +9 -4
- data/third_party/boringssl-with-bazel/err_data.c +478 -462
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c +18 -8
- data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +1 -2
- data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_locl.h +5 -0
- data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_tls.c +1 -88
- data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/internal.h +14 -3
- data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/tls_cbc.c +119 -273
- data/third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux.c +11 -2
- data/third_party/boringssl-with-bazel/src/crypto/cpu-arm.c +3 -3
- data/third_party/boringssl-with-bazel/src/crypto/err/err.c +87 -80
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +1 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/cipher.c +32 -16
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_aes.c +25 -2
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digests.c +10 -2
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/md32_common.h +4 -43
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c +4 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c +0 -1
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/internal.h +0 -4
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +104 -93
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/internal.h +39 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md4/md4.c +43 -46
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md5/md5.c +43 -46
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cbc.c +33 -22
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cfb.c +9 -8
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ctr.c +9 -8
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm.c +17 -13
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/internal.h +1 -22
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ofb.c +2 -1
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +7 -5
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +26 -7
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/fips.c +79 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +14 -9
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha1.c +45 -48
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha256.c +38 -43
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +37 -45
- data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +103 -42
- data/third_party/boringssl-with-bazel/src/crypto/hpke/internal.h +58 -37
- data/third_party/boringssl-with-bazel/src/crypto/internal.h +65 -0
- data/third_party/boringssl-with-bazel/src/crypto/mem.c +14 -0
- data/third_party/boringssl-with-bazel/src/crypto/obj/obj.c +3 -3
- data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_x509.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +95 -48
- data/third_party/boringssl-with-bazel/src/crypto/rand_extra/rand_extra.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/thread_pthread.c +0 -28
- data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +19 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509/t_req.c +2 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_att.c +19 -25
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c +3 -30
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c +39 -89
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c +9 -16
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_algor.c +21 -17
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_attrib.c +21 -34
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c +5 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_pubkey.c +25 -22
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_val.c +2 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +3 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +2 -4
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_skey.c +1 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/aead.h +0 -3
- data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +120 -41
- data/third_party/boringssl-with-bazel/src/include/openssl/base.h +9 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +0 -4
- data/third_party/boringssl-with-bazel/src/include/openssl/cpu.h +22 -32
- data/third_party/boringssl-with-bazel/src/include/openssl/crypto.h +24 -4
- data/third_party/boringssl-with-bazel/src/include/openssl/ec.h +5 -2
- data/third_party/boringssl-with-bazel/src/include/openssl/ecdsa.h +19 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/err.h +3 -2
- data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +1 -38
- data/third_party/boringssl-with-bazel/src/{crypto/x509/x509_r2x.c → include/openssl/evp_errors.h} +41 -58
- data/third_party/boringssl-with-bazel/src/include/openssl/obj.h +24 -5
- data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +2 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/pkcs8.h +9 -1
- data/third_party/boringssl-with-bazel/src/include/openssl/rand.h +2 -2
- data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +210 -26
- data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +1 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +416 -122
- data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +2 -0
- data/third_party/boringssl-with-bazel/src/ssl/d1_both.cc +5 -0
- data/third_party/boringssl-with-bazel/src/ssl/encrypted_client_hello.cc +444 -0
- data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +244 -1
- data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +43 -12
- data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +149 -8
- data/third_party/boringssl-with-bazel/src/ssl/internal.h +220 -46
- data/third_party/boringssl-with-bazel/src/ssl/s3_both.cc +7 -1
- data/third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc +4 -6
- data/third_party/boringssl-with-bazel/src/ssl/ssl_key_share.cc +23 -26
- data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +74 -15
- data/third_party/boringssl-with-bazel/src/ssl/t1_lib.cc +131 -83
- data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +34 -4
- data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +205 -100
- data/third_party/boringssl-with-bazel/src/ssl/tls_method.cc +4 -2
- data/third_party/xxhash/xxhash.h +5443 -0
- metadata +128 -61
- data/src/core/lib/iomgr/poller/eventmanager_libuv.cc +0 -88
- data/src/core/lib/iomgr/poller/eventmanager_libuv.h +0 -88
- data/src/core/lib/security/authorization/authorization_engine.cc +0 -177
- data/src/core/lib/security/authorization/authorization_engine.h +0 -84
- data/src/core/lib/security/authorization/evaluate_args.cc +0 -148
- data/src/core/lib/security/authorization/evaluate_args.h +0 -59
- data/src/core/lib/security/authorization/mock_cel/activation.h +0 -57
- data/src/core/lib/security/authorization/mock_cel/cel_expr_builder_factory.h +0 -44
- data/src/core/lib/security/authorization/mock_cel/cel_expression.h +0 -69
- data/src/core/lib/security/authorization/mock_cel/cel_value.h +0 -99
- data/src/core/lib/security/authorization/mock_cel/evaluator_core.h +0 -67
- data/src/core/lib/security/authorization/mock_cel/flat_expr_builder.h +0 -57
- data/third_party/abseil-cpp/absl/base/internal/bits.h +0 -219
- data/third_party/abseil-cpp/absl/container/flat_hash_set.h +0 -504
- data/third_party/abseil-cpp/absl/synchronization/internal/mutex_nonprod.inc +0 -249
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/is_fips.c +0 -29
- data/third_party/upb/upb/json_decode.c +0 -1443
- data/third_party/upb/upb/json_decode.h +0 -23
- data/third_party/upb/upb/json_encode.c +0 -713
- data/third_party/upb/upb/json_encode.h +0 -36
@@ -1,249 +0,0 @@
|
|
1
|
-
// Do not include. This is an implementation detail of base/mutex.h.
|
2
|
-
//
|
3
|
-
// Declares three classes:
|
4
|
-
//
|
5
|
-
// base::internal::MutexImpl - implementation helper for Mutex
|
6
|
-
// base::internal::CondVarImpl - implementation helper for CondVar
|
7
|
-
// base::internal::SynchronizationStorage<T> - implementation helper for
|
8
|
-
// Mutex, CondVar
|
9
|
-
|
10
|
-
#include <type_traits>
|
11
|
-
|
12
|
-
#if defined(_WIN32)
|
13
|
-
#include <condition_variable>
|
14
|
-
#include <mutex>
|
15
|
-
#else
|
16
|
-
#include <pthread.h>
|
17
|
-
#endif
|
18
|
-
|
19
|
-
#include "absl/base/call_once.h"
|
20
|
-
#include "absl/time/time.h"
|
21
|
-
|
22
|
-
// Declare that Mutex::ReaderLock is actually Lock(). Intended primarily
|
23
|
-
// for tests, and even then as a last resort.
|
24
|
-
#ifdef ABSL_MUTEX_READER_LOCK_IS_EXCLUSIVE
|
25
|
-
#error ABSL_MUTEX_READER_LOCK_IS_EXCLUSIVE cannot be directly set
|
26
|
-
#else
|
27
|
-
#define ABSL_MUTEX_READER_LOCK_IS_EXCLUSIVE 1
|
28
|
-
#endif
|
29
|
-
|
30
|
-
// Declare that Mutex::EnableInvariantDebugging is not implemented.
|
31
|
-
// Intended primarily for tests, and even then as a last resort.
|
32
|
-
#ifdef ABSL_MUTEX_ENABLE_INVARIANT_DEBUGGING_NOT_IMPLEMENTED
|
33
|
-
#error ABSL_MUTEX_ENABLE_INVARIANT_DEBUGGING_NOT_IMPLEMENTED cannot be directly set
|
34
|
-
#else
|
35
|
-
#define ABSL_MUTEX_ENABLE_INVARIANT_DEBUGGING_NOT_IMPLEMENTED 1
|
36
|
-
#endif
|
37
|
-
|
38
|
-
namespace absl {
|
39
|
-
ABSL_NAMESPACE_BEGIN
|
40
|
-
class Condition;
|
41
|
-
|
42
|
-
namespace synchronization_internal {
|
43
|
-
|
44
|
-
class MutexImpl;
|
45
|
-
|
46
|
-
// Do not use this implementation detail of CondVar. Provides most of the
|
47
|
-
// implementation, but should not be placed directly in static storage
|
48
|
-
// because it will not linker initialize properly. See
|
49
|
-
// SynchronizationStorage<T> below for what we mean by linker
|
50
|
-
// initialization.
|
51
|
-
class CondVarImpl {
|
52
|
-
public:
|
53
|
-
CondVarImpl();
|
54
|
-
CondVarImpl(const CondVarImpl&) = delete;
|
55
|
-
CondVarImpl& operator=(const CondVarImpl&) = delete;
|
56
|
-
~CondVarImpl();
|
57
|
-
|
58
|
-
void Signal();
|
59
|
-
void SignalAll();
|
60
|
-
void Wait(MutexImpl* mutex);
|
61
|
-
bool WaitWithDeadline(MutexImpl* mutex, absl::Time deadline);
|
62
|
-
|
63
|
-
private:
|
64
|
-
#if defined(_WIN32)
|
65
|
-
std::condition_variable_any std_cv_;
|
66
|
-
#else
|
67
|
-
pthread_cond_t pthread_cv_;
|
68
|
-
#endif
|
69
|
-
};
|
70
|
-
|
71
|
-
// Do not use this implementation detail of Mutex. Provides most of the
|
72
|
-
// implementation, but should not be placed directly in static storage
|
73
|
-
// because it will not linker initialize properly. See
|
74
|
-
// SynchronizationStorage<T> below for what we mean by linker
|
75
|
-
// initialization.
|
76
|
-
class MutexImpl {
|
77
|
-
public:
|
78
|
-
MutexImpl();
|
79
|
-
MutexImpl(const MutexImpl&) = delete;
|
80
|
-
MutexImpl& operator=(const MutexImpl&) = delete;
|
81
|
-
~MutexImpl();
|
82
|
-
|
83
|
-
void Lock();
|
84
|
-
bool TryLock();
|
85
|
-
void Unlock();
|
86
|
-
void Await(const Condition& cond);
|
87
|
-
bool AwaitWithDeadline(const Condition& cond, absl::Time deadline);
|
88
|
-
|
89
|
-
private:
|
90
|
-
friend class CondVarImpl;
|
91
|
-
|
92
|
-
#if defined(_WIN32)
|
93
|
-
std::mutex std_mutex_;
|
94
|
-
#else
|
95
|
-
pthread_mutex_t pthread_mutex_;
|
96
|
-
#endif
|
97
|
-
|
98
|
-
// True if the underlying mutex is locked. If the destructor is entered
|
99
|
-
// while locked_, the underlying mutex is unlocked. Mutex supports
|
100
|
-
// destruction while locked, but the same is undefined behavior for both
|
101
|
-
// pthread_mutex_t and std::mutex.
|
102
|
-
bool locked_ = false;
|
103
|
-
|
104
|
-
// Signaled before releasing the lock, in support of Await.
|
105
|
-
CondVarImpl released_;
|
106
|
-
};
|
107
|
-
|
108
|
-
// Do not use this implementation detail of CondVar and Mutex. A storage
|
109
|
-
// space for T that supports a LinkerInitialized constructor. T must
|
110
|
-
// have a default constructor, which is called by the first call to
|
111
|
-
// get(). T's destructor is never called if the LinkerInitialized
|
112
|
-
// constructor is called.
|
113
|
-
//
|
114
|
-
// Objects constructed with the default constructor are constructed and
|
115
|
-
// destructed like any other object, and should never be allocated in
|
116
|
-
// static storage.
|
117
|
-
//
|
118
|
-
// Objects constructed with the LinkerInitialized constructor should
|
119
|
-
// always be in static storage. For such objects, calls to get() are always
|
120
|
-
// valid, except from signal handlers.
|
121
|
-
//
|
122
|
-
// Note that this implementation relies on undefined language behavior that
|
123
|
-
// are known to hold for the set of supported compilers. An analysis
|
124
|
-
// follows.
|
125
|
-
//
|
126
|
-
// From the C++11 standard:
|
127
|
-
//
|
128
|
-
// [basic.life] says an object has non-trivial initialization if it is of
|
129
|
-
// class type and it is initialized by a constructor other than a trivial
|
130
|
-
// default constructor. (the LinkerInitialized constructor is
|
131
|
-
// non-trivial)
|
132
|
-
//
|
133
|
-
// [basic.life] says the lifetime of an object with a non-trivial
|
134
|
-
// constructor begins when the call to the constructor is complete.
|
135
|
-
//
|
136
|
-
// [basic.life] says the lifetime of an object with non-trivial destructor
|
137
|
-
// ends when the call to the destructor begins.
|
138
|
-
//
|
139
|
-
// [basic.life] p5 specifies undefined behavior when accessing non-static
|
140
|
-
// members of an instance outside its
|
141
|
-
// lifetime. (SynchronizationStorage::get() access non-static members)
|
142
|
-
//
|
143
|
-
// So, LinkerInitialized object of SynchronizationStorage uses a
|
144
|
-
// non-trivial constructor, which is called at some point during dynamic
|
145
|
-
// initialization, and is therefore subject to order of dynamic
|
146
|
-
// initialization bugs, where get() is called before the object's
|
147
|
-
// constructor is, resulting in undefined behavior.
|
148
|
-
//
|
149
|
-
// Similarly, a LinkerInitialized SynchronizationStorage object has a
|
150
|
-
// non-trivial destructor, and so its lifetime ends at some point during
|
151
|
-
// destruction of objects with static storage duration [basic.start.term]
|
152
|
-
// p4. There is a window where other exit code could call get() after this
|
153
|
-
// occurs, resulting in undefined behavior.
|
154
|
-
//
|
155
|
-
// Combined, these statements imply that LinkerInitialized instances
|
156
|
-
// of SynchronizationStorage<T> rely on undefined behavior.
|
157
|
-
//
|
158
|
-
// However, in practice, the implementation works on all supported
|
159
|
-
// compilers. Specifically, we rely on:
|
160
|
-
//
|
161
|
-
// a) zero-initialization being sufficient to initialize
|
162
|
-
// LinkerInitialized instances for the purposes of calling
|
163
|
-
// get(), regardless of when the constructor is called. This is
|
164
|
-
// because the is_dynamic_ boolean is correctly zero-initialized to
|
165
|
-
// false.
|
166
|
-
//
|
167
|
-
// b) the LinkerInitialized constructor is a NOP, and immaterial to
|
168
|
-
// even to concurrent calls to get().
|
169
|
-
//
|
170
|
-
// c) the destructor being a NOP for LinkerInitialized objects
|
171
|
-
// (guaranteed by a check for !is_dynamic_), and so any concurrent and
|
172
|
-
// subsequent calls to get() functioning as if the destructor were not
|
173
|
-
// called, by virtue of the instances' storage remaining valid after the
|
174
|
-
// destructor runs.
|
175
|
-
//
|
176
|
-
// d) That a-c apply transitively when SynchronizationStorage<T> is the
|
177
|
-
// only member of a class allocated in static storage.
|
178
|
-
//
|
179
|
-
// Nothing in the language standard guarantees that a-d hold. In practice,
|
180
|
-
// these hold in all supported compilers.
|
181
|
-
//
|
182
|
-
// Future direction:
|
183
|
-
//
|
184
|
-
// Ideally, we would simply use std::mutex or a similar class, which when
|
185
|
-
// allocated statically would support use immediately after static
|
186
|
-
// initialization up until static storage is reclaimed (i.e. the properties
|
187
|
-
// we require of all "linker initialized" instances).
|
188
|
-
//
|
189
|
-
// Regarding construction in static storage, std::mutex is required to
|
190
|
-
// provide a constexpr default constructor [thread.mutex.class], which
|
191
|
-
// ensures the instance's lifetime begins with static initialization
|
192
|
-
// [basic.start.init], and so is immune to any problems caused by the order
|
193
|
-
// of dynamic initialization. However, as of this writing Microsoft's
|
194
|
-
// Visual Studio does not provide a constexpr constructor for std::mutex.
|
195
|
-
// See
|
196
|
-
// https://blogs.msdn.microsoft.com/vcblog/2015/06/02/constexpr-complete-for-vs-2015-rtm-c11-compiler-c17-stl/
|
197
|
-
//
|
198
|
-
// Regarding destruction of instances in static storage, [basic.life] does
|
199
|
-
// say an object ends when storage in which the occupies is released, in
|
200
|
-
// the case of non-trivial destructor. However, std::mutex is not specified
|
201
|
-
// to have a trivial destructor.
|
202
|
-
//
|
203
|
-
// So, we would need a class with a constexpr default constructor and a
|
204
|
-
// trivial destructor. Today, we can achieve neither desired property using
|
205
|
-
// std::mutex directly.
|
206
|
-
template <typename T>
|
207
|
-
class SynchronizationStorage {
|
208
|
-
public:
|
209
|
-
// Instances allocated on the heap or on the stack should use the default
|
210
|
-
// constructor.
|
211
|
-
SynchronizationStorage()
|
212
|
-
: destruct_(true), once_() {}
|
213
|
-
|
214
|
-
constexpr explicit SynchronizationStorage(absl::ConstInitType)
|
215
|
-
: destruct_(false), once_(), space_{{0}} {}
|
216
|
-
|
217
|
-
SynchronizationStorage(SynchronizationStorage&) = delete;
|
218
|
-
SynchronizationStorage& operator=(SynchronizationStorage&) = delete;
|
219
|
-
|
220
|
-
~SynchronizationStorage() {
|
221
|
-
if (destruct_) {
|
222
|
-
get()->~T();
|
223
|
-
}
|
224
|
-
}
|
225
|
-
|
226
|
-
// Retrieve the object in storage. This is fast and thread safe, but does
|
227
|
-
// incur the cost of absl::call_once().
|
228
|
-
T* get() {
|
229
|
-
absl::call_once(once_, SynchronizationStorage::Construct, this);
|
230
|
-
return reinterpret_cast<T*>(&space_);
|
231
|
-
}
|
232
|
-
|
233
|
-
private:
|
234
|
-
static void Construct(SynchronizationStorage<T>* self) {
|
235
|
-
new (&self->space_) T();
|
236
|
-
}
|
237
|
-
|
238
|
-
// When true, T's destructor is run when this is destructed.
|
239
|
-
const bool destruct_;
|
240
|
-
|
241
|
-
absl::once_flag once_;
|
242
|
-
|
243
|
-
// An aligned space for the T.
|
244
|
-
alignas(T) unsigned char space_[sizeof(T)];
|
245
|
-
};
|
246
|
-
|
247
|
-
} // namespace synchronization_internal
|
248
|
-
ABSL_NAMESPACE_END
|
249
|
-
} // namespace absl
|
@@ -1,29 +0,0 @@
|
|
1
|
-
/* Copyright (c) 2017, Google Inc.
|
2
|
-
*
|
3
|
-
* Permission to use, copy, modify, and/or distribute this software for any
|
4
|
-
* purpose with or without fee is hereby granted, provided that the above
|
5
|
-
* copyright notice and this permission notice appear in all copies.
|
6
|
-
*
|
7
|
-
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
8
|
-
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
9
|
-
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
10
|
-
* SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
11
|
-
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
|
12
|
-
* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
|
13
|
-
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
|
14
|
-
|
15
|
-
#include <openssl/crypto.h>
|
16
|
-
|
17
|
-
|
18
|
-
// This file exists in order to give the fipsmodule target, in non-FIPS mode,
|
19
|
-
// something to compile.
|
20
|
-
|
21
|
-
int FIPS_mode(void) {
|
22
|
-
#if defined(BORINGSSL_FIPS) && !defined(OPENSSL_ASAN)
|
23
|
-
return 1;
|
24
|
-
#else
|
25
|
-
return 0;
|
26
|
-
#endif
|
27
|
-
}
|
28
|
-
|
29
|
-
int FIPS_mode_set(int on) { return on == FIPS_mode(); }
|
@@ -1,1443 +0,0 @@
|
|
1
|
-
|
2
|
-
#include "upb/json_decode.h"
|
3
|
-
|
4
|
-
#include <errno.h>
|
5
|
-
#include <float.h>
|
6
|
-
#include <inttypes.h>
|
7
|
-
#include <limits.h>
|
8
|
-
#include <math.h>
|
9
|
-
#include <setjmp.h>
|
10
|
-
#include <stdlib.h>
|
11
|
-
#include <string.h>
|
12
|
-
|
13
|
-
#include "upb/encode.h"
|
14
|
-
#include "upb/reflection.h"
|
15
|
-
|
16
|
-
/* Special header, must be included last. */
|
17
|
-
#include "upb/port_def.inc"
|
18
|
-
|
19
|
-
typedef struct {
|
20
|
-
const char *ptr, *end;
|
21
|
-
upb_arena *arena; /* TODO: should we have a tmp arena for tmp data? */
|
22
|
-
const upb_symtab *any_pool;
|
23
|
-
int depth;
|
24
|
-
upb_status *status;
|
25
|
-
jmp_buf err;
|
26
|
-
int line;
|
27
|
-
const char *line_begin;
|
28
|
-
bool is_first;
|
29
|
-
int options;
|
30
|
-
const upb_fielddef *debug_field;
|
31
|
-
} jsondec;
|
32
|
-
|
33
|
-
enum { JD_OBJECT, JD_ARRAY, JD_STRING, JD_NUMBER, JD_TRUE, JD_FALSE, JD_NULL };
|
34
|
-
|
35
|
-
/* Forward declarations of mutually-recursive functions. */
|
36
|
-
static void jsondec_wellknown(jsondec *d, upb_msg *msg, const upb_msgdef *m);
|
37
|
-
static upb_msgval jsondec_value(jsondec *d, const upb_fielddef *f);
|
38
|
-
static void jsondec_wellknownvalue(jsondec *d, upb_msg *msg,
|
39
|
-
const upb_msgdef *m);
|
40
|
-
static void jsondec_object(jsondec *d, upb_msg *msg, const upb_msgdef *m);
|
41
|
-
|
42
|
-
static bool jsondec_streql(upb_strview str, const char *lit) {
|
43
|
-
return str.size == strlen(lit) && memcmp(str.data, lit, str.size) == 0;
|
44
|
-
}
|
45
|
-
|
46
|
-
static bool jsondec_isnullvalue(const upb_fielddef *f) {
|
47
|
-
return upb_fielddef_type(f) == UPB_TYPE_ENUM &&
|
48
|
-
strcmp(upb_enumdef_fullname(upb_fielddef_enumsubdef(f)),
|
49
|
-
"google.protobuf.NullValue") == 0;
|
50
|
-
}
|
51
|
-
|
52
|
-
static bool jsondec_isvalue(const upb_fielddef *f) {
|
53
|
-
return (upb_fielddef_type(f) == UPB_TYPE_MESSAGE &&
|
54
|
-
upb_msgdef_wellknowntype(upb_fielddef_msgsubdef(f)) ==
|
55
|
-
UPB_WELLKNOWN_VALUE) ||
|
56
|
-
jsondec_isnullvalue(f);
|
57
|
-
}
|
58
|
-
|
59
|
-
UPB_NORETURN static void jsondec_err(jsondec *d, const char *msg) {
|
60
|
-
upb_status_seterrf(d->status, "Error parsing JSON @%d:%d: %s", d->line,
|
61
|
-
(int)(d->ptr - d->line_begin), msg);
|
62
|
-
UPB_LONGJMP(d->err, 1);
|
63
|
-
}
|
64
|
-
|
65
|
-
UPB_NORETURN static void jsondec_errf(jsondec *d, const char *fmt, ...) {
|
66
|
-
va_list argp;
|
67
|
-
upb_status_seterrf(d->status, "Error parsing JSON @%d:%d: ", d->line,
|
68
|
-
(int)(d->ptr - d->line_begin));
|
69
|
-
va_start(argp, fmt);
|
70
|
-
upb_status_vappenderrf(d->status, fmt, argp);
|
71
|
-
va_end(argp);
|
72
|
-
UPB_LONGJMP(d->err, 1);
|
73
|
-
}
|
74
|
-
|
75
|
-
static void jsondec_skipws(jsondec *d) {
|
76
|
-
while (d->ptr != d->end) {
|
77
|
-
switch (*d->ptr) {
|
78
|
-
case '\n':
|
79
|
-
d->line++;
|
80
|
-
d->line_begin = d->ptr;
|
81
|
-
/* Fallthrough. */
|
82
|
-
case '\r':
|
83
|
-
case '\t':
|
84
|
-
case ' ':
|
85
|
-
d->ptr++;
|
86
|
-
break;
|
87
|
-
default:
|
88
|
-
return;
|
89
|
-
}
|
90
|
-
}
|
91
|
-
jsondec_err(d, "Unexpected EOF");
|
92
|
-
}
|
93
|
-
|
94
|
-
static bool jsondec_tryparsech(jsondec *d, char ch) {
|
95
|
-
if (d->ptr == d->end || *d->ptr != ch) return false;
|
96
|
-
d->ptr++;
|
97
|
-
return true;
|
98
|
-
}
|
99
|
-
|
100
|
-
static void jsondec_parselit(jsondec *d, const char *lit) {
|
101
|
-
size_t avail = d->end - d->ptr;
|
102
|
-
size_t len = strlen(lit);
|
103
|
-
if (avail < len || memcmp(d->ptr, lit, len) != 0) {
|
104
|
-
jsondec_errf(d, "Expected: '%s'", lit);
|
105
|
-
}
|
106
|
-
d->ptr += len;
|
107
|
-
}
|
108
|
-
|
109
|
-
static void jsondec_wsch(jsondec *d, char ch) {
|
110
|
-
jsondec_skipws(d);
|
111
|
-
if (!jsondec_tryparsech(d, ch)) {
|
112
|
-
jsondec_errf(d, "Expected: '%c'", ch);
|
113
|
-
}
|
114
|
-
}
|
115
|
-
|
116
|
-
static void jsondec_true(jsondec *d) { jsondec_parselit(d, "true"); }
|
117
|
-
static void jsondec_false(jsondec *d) { jsondec_parselit(d, "false"); }
|
118
|
-
static void jsondec_null(jsondec *d) { jsondec_parselit(d, "null"); }
|
119
|
-
|
120
|
-
static void jsondec_entrysep(jsondec *d) {
|
121
|
-
jsondec_skipws(d);
|
122
|
-
jsondec_parselit(d, ":");
|
123
|
-
}
|
124
|
-
|
125
|
-
static int jsondec_rawpeek(jsondec *d) {
|
126
|
-
switch (*d->ptr) {
|
127
|
-
case '{':
|
128
|
-
return JD_OBJECT;
|
129
|
-
case '[':
|
130
|
-
return JD_ARRAY;
|
131
|
-
case '"':
|
132
|
-
return JD_STRING;
|
133
|
-
case '-':
|
134
|
-
case '0':
|
135
|
-
case '1':
|
136
|
-
case '2':
|
137
|
-
case '3':
|
138
|
-
case '4':
|
139
|
-
case '5':
|
140
|
-
case '6':
|
141
|
-
case '7':
|
142
|
-
case '8':
|
143
|
-
case '9':
|
144
|
-
return JD_NUMBER;
|
145
|
-
case 't':
|
146
|
-
return JD_TRUE;
|
147
|
-
case 'f':
|
148
|
-
return JD_FALSE;
|
149
|
-
case 'n':
|
150
|
-
return JD_NULL;
|
151
|
-
default:
|
152
|
-
jsondec_errf(d, "Unexpected character: '%c'", *d->ptr);
|
153
|
-
}
|
154
|
-
}
|
155
|
-
|
156
|
-
/* JSON object/array **********************************************************/
|
157
|
-
|
158
|
-
/* These are used like so:
|
159
|
-
*
|
160
|
-
* jsondec_objstart(d);
|
161
|
-
* while (jsondec_objnext(d)) {
|
162
|
-
* ...
|
163
|
-
* }
|
164
|
-
* jsondec_objend(d) */
|
165
|
-
|
166
|
-
static int jsondec_peek(jsondec *d) {
|
167
|
-
jsondec_skipws(d);
|
168
|
-
return jsondec_rawpeek(d);
|
169
|
-
}
|
170
|
-
|
171
|
-
static void jsondec_push(jsondec *d) {
|
172
|
-
if (--d->depth < 0) {
|
173
|
-
jsondec_err(d, "Recursion limit exceeded");
|
174
|
-
}
|
175
|
-
d->is_first = true;
|
176
|
-
}
|
177
|
-
|
178
|
-
static bool jsondec_seqnext(jsondec *d, char end_ch) {
|
179
|
-
bool is_first = d->is_first;
|
180
|
-
d->is_first = false;
|
181
|
-
jsondec_skipws(d);
|
182
|
-
if (*d->ptr == end_ch) return false;
|
183
|
-
if (!is_first) jsondec_parselit(d, ",");
|
184
|
-
return true;
|
185
|
-
}
|
186
|
-
|
187
|
-
static void jsondec_arrstart(jsondec *d) {
|
188
|
-
jsondec_push(d);
|
189
|
-
jsondec_wsch(d, '[');
|
190
|
-
}
|
191
|
-
|
192
|
-
static void jsondec_arrend(jsondec *d) {
|
193
|
-
d->depth++;
|
194
|
-
jsondec_wsch(d, ']');
|
195
|
-
}
|
196
|
-
|
197
|
-
static bool jsondec_arrnext(jsondec *d) {
|
198
|
-
return jsondec_seqnext(d, ']');
|
199
|
-
}
|
200
|
-
|
201
|
-
static void jsondec_objstart(jsondec *d) {
|
202
|
-
jsondec_push(d);
|
203
|
-
jsondec_wsch(d, '{');
|
204
|
-
}
|
205
|
-
|
206
|
-
static void jsondec_objend(jsondec *d) {
|
207
|
-
d->depth++;
|
208
|
-
jsondec_wsch(d, '}');
|
209
|
-
}
|
210
|
-
|
211
|
-
static bool jsondec_objnext(jsondec *d) {
|
212
|
-
if (!jsondec_seqnext(d, '}')) return false;
|
213
|
-
if (jsondec_peek(d) != JD_STRING) {
|
214
|
-
jsondec_err(d, "Object must start with string");
|
215
|
-
}
|
216
|
-
return true;
|
217
|
-
}
|
218
|
-
|
219
|
-
/* JSON number ****************************************************************/
|
220
|
-
|
221
|
-
static bool jsondec_tryskipdigits(jsondec *d) {
|
222
|
-
const char *start = d->ptr;
|
223
|
-
|
224
|
-
while (d->ptr < d->end) {
|
225
|
-
if (*d->ptr < '0' || *d->ptr > '9') {
|
226
|
-
break;
|
227
|
-
}
|
228
|
-
d->ptr++;
|
229
|
-
}
|
230
|
-
|
231
|
-
return d->ptr != start;
|
232
|
-
}
|
233
|
-
|
234
|
-
static void jsondec_skipdigits(jsondec *d) {
|
235
|
-
if (!jsondec_tryskipdigits(d)) {
|
236
|
-
jsondec_err(d, "Expected one or more digits");
|
237
|
-
}
|
238
|
-
}
|
239
|
-
|
240
|
-
static double jsondec_number(jsondec *d) {
|
241
|
-
const char *start = d->ptr;
|
242
|
-
|
243
|
-
assert(jsondec_rawpeek(d) == JD_NUMBER);
|
244
|
-
|
245
|
-
/* Skip over the syntax of a number, as specified by JSON. */
|
246
|
-
if (*d->ptr == '-') d->ptr++;
|
247
|
-
|
248
|
-
if (jsondec_tryparsech(d, '0')) {
|
249
|
-
if (jsondec_tryskipdigits(d)) {
|
250
|
-
jsondec_err(d, "number cannot have leading zero");
|
251
|
-
}
|
252
|
-
} else {
|
253
|
-
jsondec_skipdigits(d);
|
254
|
-
}
|
255
|
-
|
256
|
-
if (d->ptr == d->end) goto parse;
|
257
|
-
if (jsondec_tryparsech(d, '.')) {
|
258
|
-
jsondec_skipdigits(d);
|
259
|
-
}
|
260
|
-
if (d->ptr == d->end) goto parse;
|
261
|
-
|
262
|
-
if (*d->ptr == 'e' || *d->ptr == 'E') {
|
263
|
-
d->ptr++;
|
264
|
-
if (d->ptr == d->end) {
|
265
|
-
jsondec_err(d, "Unexpected EOF in number");
|
266
|
-
}
|
267
|
-
if (*d->ptr == '+' || *d->ptr == '-') {
|
268
|
-
d->ptr++;
|
269
|
-
}
|
270
|
-
jsondec_skipdigits(d);
|
271
|
-
}
|
272
|
-
|
273
|
-
parse:
|
274
|
-
/* Having verified the syntax of a JSON number, use strtod() to parse
|
275
|
-
* (strtod() accepts a superset of JSON syntax). */
|
276
|
-
errno = 0;
|
277
|
-
{
|
278
|
-
char* end;
|
279
|
-
double val = strtod(start, &end);
|
280
|
-
assert(end == d->ptr);
|
281
|
-
|
282
|
-
/* Currently the min/max-val conformance tests fail if we check this. Does
|
283
|
-
* this mean the conformance tests are wrong or strtod() is wrong, or
|
284
|
-
* something else? Investigate further. */
|
285
|
-
/*
|
286
|
-
if (errno == ERANGE) {
|
287
|
-
jsondec_err(d, "Number out of range");
|
288
|
-
}
|
289
|
-
*/
|
290
|
-
|
291
|
-
if (val > DBL_MAX || val < -DBL_MAX) {
|
292
|
-
jsondec_err(d, "Number out of range");
|
293
|
-
}
|
294
|
-
|
295
|
-
return val;
|
296
|
-
}
|
297
|
-
}
|
298
|
-
|
299
|
-
/* JSON string ****************************************************************/
|
300
|
-
|
301
|
-
static char jsondec_escape(jsondec *d) {
|
302
|
-
switch (*d->ptr++) {
|
303
|
-
case '"':
|
304
|
-
return '\"';
|
305
|
-
case '\\':
|
306
|
-
return '\\';
|
307
|
-
case '/':
|
308
|
-
return '/';
|
309
|
-
case 'b':
|
310
|
-
return '\b';
|
311
|
-
case 'f':
|
312
|
-
return '\f';
|
313
|
-
case 'n':
|
314
|
-
return '\n';
|
315
|
-
case 'r':
|
316
|
-
return '\r';
|
317
|
-
case 't':
|
318
|
-
return '\t';
|
319
|
-
default:
|
320
|
-
jsondec_err(d, "Invalid escape char");
|
321
|
-
}
|
322
|
-
}
|
323
|
-
|
324
|
-
static uint32_t jsondec_codepoint(jsondec *d) {
|
325
|
-
uint32_t cp = 0;
|
326
|
-
const char *end;
|
327
|
-
|
328
|
-
if (d->end - d->ptr < 4) {
|
329
|
-
jsondec_err(d, "EOF inside string");
|
330
|
-
}
|
331
|
-
|
332
|
-
end = d->ptr + 4;
|
333
|
-
while (d->ptr < end) {
|
334
|
-
char ch = *d->ptr++;
|
335
|
-
if (ch >= '0' && ch <= '9') {
|
336
|
-
ch -= '0';
|
337
|
-
} else if (ch >= 'a' && ch <= 'f') {
|
338
|
-
ch = ch - 'a' + 10;
|
339
|
-
} else if (ch >= 'A' && ch <= 'F') {
|
340
|
-
ch = ch - 'A' + 10;
|
341
|
-
} else {
|
342
|
-
jsondec_err(d, "Invalid hex digit");
|
343
|
-
}
|
344
|
-
cp = (cp << 4) | ch;
|
345
|
-
}
|
346
|
-
|
347
|
-
return cp;
|
348
|
-
}
|
349
|
-
|
350
|
-
/* Parses a \uXXXX unicode escape (possibly a surrogate pair). */
|
351
|
-
static size_t jsondec_unicode(jsondec *d, char* out) {
|
352
|
-
uint32_t cp = jsondec_codepoint(d);
|
353
|
-
if (cp >= 0xd800 && cp <= 0xdbff) {
|
354
|
-
/* Surrogate pair: two 16-bit codepoints become a 32-bit codepoint. */
|
355
|
-
uint32_t high = cp;
|
356
|
-
uint32_t low;
|
357
|
-
jsondec_parselit(d, "\\u");
|
358
|
-
low = jsondec_codepoint(d);
|
359
|
-
if (low < 0xdc00 || low > 0xdfff) {
|
360
|
-
jsondec_err(d, "Invalid low surrogate");
|
361
|
-
}
|
362
|
-
cp = (high & 0x3ff) << 10;
|
363
|
-
cp |= (low & 0x3ff);
|
364
|
-
cp += 0x10000;
|
365
|
-
} else if (cp >= 0xdc00 && cp <= 0xdfff) {
|
366
|
-
jsondec_err(d, "Unpaired low surrogate");
|
367
|
-
}
|
368
|
-
|
369
|
-
/* Write to UTF-8 */
|
370
|
-
if (cp <= 0x7f) {
|
371
|
-
out[0] = cp;
|
372
|
-
return 1;
|
373
|
-
} else if (cp <= 0x07FF) {
|
374
|
-
out[0] = ((cp >> 6) & 0x1F) | 0xC0;
|
375
|
-
out[1] = ((cp >> 0) & 0x3F) | 0x80;
|
376
|
-
return 2;
|
377
|
-
} else if (cp <= 0xFFFF) {
|
378
|
-
out[0] = ((cp >> 12) & 0x0F) | 0xE0;
|
379
|
-
out[1] = ((cp >> 6) & 0x3F) | 0x80;
|
380
|
-
out[2] = ((cp >> 0) & 0x3F) | 0x80;
|
381
|
-
return 3;
|
382
|
-
} else if (cp < 0x10FFFF) {
|
383
|
-
out[0] = ((cp >> 18) & 0x07) | 0xF0;
|
384
|
-
out[1] = ((cp >> 12) & 0x3f) | 0x80;
|
385
|
-
out[2] = ((cp >> 6) & 0x3f) | 0x80;
|
386
|
-
out[3] = ((cp >> 0) & 0x3f) | 0x80;
|
387
|
-
return 4;
|
388
|
-
} else {
|
389
|
-
jsondec_err(d, "Invalid codepoint");
|
390
|
-
}
|
391
|
-
}
|
392
|
-
|
393
|
-
static void jsondec_resize(jsondec *d, char **buf, char **end, char **buf_end) {
|
394
|
-
size_t oldsize = *buf_end - *buf;
|
395
|
-
size_t len = *end - *buf;
|
396
|
-
size_t size = UPB_MAX(8, 2 * oldsize);
|
397
|
-
|
398
|
-
*buf = upb_arena_realloc(d->arena, *buf, len, size);
|
399
|
-
if (!*buf) jsondec_err(d, "Out of memory");
|
400
|
-
|
401
|
-
*end = *buf + len;
|
402
|
-
*buf_end = *buf + size;
|
403
|
-
}
|
404
|
-
|
405
|
-
static upb_strview jsondec_string(jsondec *d) {
|
406
|
-
char *buf = NULL;
|
407
|
-
char *end = NULL;
|
408
|
-
char *buf_end = NULL;
|
409
|
-
|
410
|
-
jsondec_skipws(d);
|
411
|
-
|
412
|
-
if (*d->ptr++ != '"') {
|
413
|
-
jsondec_err(d, "Expected string");
|
414
|
-
}
|
415
|
-
|
416
|
-
while (d->ptr < d->end) {
|
417
|
-
char ch = *d->ptr++;
|
418
|
-
|
419
|
-
if (end == buf_end) {
|
420
|
-
jsondec_resize(d, &buf, &end, &buf_end);
|
421
|
-
}
|
422
|
-
|
423
|
-
switch (ch) {
|
424
|
-
case '"': {
|
425
|
-
upb_strview ret;
|
426
|
-
ret.data = buf;
|
427
|
-
ret.size = end - buf;
|
428
|
-
*end = '\0'; /* Needed for possible strtod(). */
|
429
|
-
return ret;
|
430
|
-
}
|
431
|
-
case '\\':
|
432
|
-
if (d->ptr == d->end) goto eof;
|
433
|
-
if (*d->ptr == 'u') {
|
434
|
-
d->ptr++;
|
435
|
-
if (buf_end - end < 4) {
|
436
|
-
/* Allow space for maximum-sized code point (4 bytes). */
|
437
|
-
jsondec_resize(d, &buf, &end, &buf_end);
|
438
|
-
}
|
439
|
-
end += jsondec_unicode(d, end);
|
440
|
-
} else {
|
441
|
-
*end++ = jsondec_escape(d);
|
442
|
-
}
|
443
|
-
break;
|
444
|
-
default:
|
445
|
-
if ((unsigned char)*d->ptr < 0x20) {
|
446
|
-
jsondec_err(d, "Invalid char in JSON string");
|
447
|
-
}
|
448
|
-
*end++ = ch;
|
449
|
-
break;
|
450
|
-
}
|
451
|
-
}
|
452
|
-
|
453
|
-
eof:
|
454
|
-
jsondec_err(d, "EOF inside string");
|
455
|
-
}
|
456
|
-
|
457
|
-
static void jsondec_skipval(jsondec *d) {
|
458
|
-
switch (jsondec_peek(d)) {
|
459
|
-
case JD_OBJECT:
|
460
|
-
jsondec_objstart(d);
|
461
|
-
while (jsondec_objnext(d)) {
|
462
|
-
jsondec_string(d);
|
463
|
-
jsondec_entrysep(d);
|
464
|
-
jsondec_skipval(d);
|
465
|
-
}
|
466
|
-
jsondec_objend(d);
|
467
|
-
break;
|
468
|
-
case JD_ARRAY:
|
469
|
-
jsondec_arrstart(d);
|
470
|
-
while (jsondec_arrnext(d)) {
|
471
|
-
jsondec_skipval(d);
|
472
|
-
}
|
473
|
-
jsondec_arrend(d);
|
474
|
-
break;
|
475
|
-
case JD_TRUE:
|
476
|
-
jsondec_true(d);
|
477
|
-
break;
|
478
|
-
case JD_FALSE:
|
479
|
-
jsondec_false(d);
|
480
|
-
break;
|
481
|
-
case JD_NULL:
|
482
|
-
jsondec_null(d);
|
483
|
-
break;
|
484
|
-
case JD_STRING:
|
485
|
-
jsondec_string(d);
|
486
|
-
break;
|
487
|
-
case JD_NUMBER:
|
488
|
-
jsondec_number(d);
|
489
|
-
break;
|
490
|
-
}
|
491
|
-
}
|
492
|
-
|
493
|
-
/* Base64 decoding for bytes fields. ******************************************/
|
494
|
-
|
495
|
-
static unsigned int jsondec_base64_tablelookup(const char ch) {
|
496
|
-
/* Table includes the normal base64 chars plus the URL-safe variant. */
|
497
|
-
const signed char table[256] = {
|
498
|
-
-1, -1, -1, -1, -1, -1, -1,
|
499
|
-
-1, -1, -1, -1, -1, -1, -1,
|
500
|
-
-1, -1, -1, -1, -1, -1, -1,
|
501
|
-
-1, -1, -1, -1, -1, -1, -1,
|
502
|
-
-1, -1, -1, -1, -1, -1, -1,
|
503
|
-
-1, -1, -1, -1, -1, -1, -1,
|
504
|
-
-1, 62 /*+*/, -1, 62 /*-*/, -1, 63 /*/ */, 52 /*0*/,
|
505
|
-
53 /*1*/, 54 /*2*/, 55 /*3*/, 56 /*4*/, 57 /*5*/, 58 /*6*/, 59 /*7*/,
|
506
|
-
60 /*8*/, 61 /*9*/, -1, -1, -1, -1, -1,
|
507
|
-
-1, -1, 0 /*A*/, 1 /*B*/, 2 /*C*/, 3 /*D*/, 4 /*E*/,
|
508
|
-
5 /*F*/, 6 /*G*/, 07 /*H*/, 8 /*I*/, 9 /*J*/, 10 /*K*/, 11 /*L*/,
|
509
|
-
12 /*M*/, 13 /*N*/, 14 /*O*/, 15 /*P*/, 16 /*Q*/, 17 /*R*/, 18 /*S*/,
|
510
|
-
19 /*T*/, 20 /*U*/, 21 /*V*/, 22 /*W*/, 23 /*X*/, 24 /*Y*/, 25 /*Z*/,
|
511
|
-
-1, -1, -1, -1, 63 /*_*/, -1, 26 /*a*/,
|
512
|
-
27 /*b*/, 28 /*c*/, 29 /*d*/, 30 /*e*/, 31 /*f*/, 32 /*g*/, 33 /*h*/,
|
513
|
-
34 /*i*/, 35 /*j*/, 36 /*k*/, 37 /*l*/, 38 /*m*/, 39 /*n*/, 40 /*o*/,
|
514
|
-
41 /*p*/, 42 /*q*/, 43 /*r*/, 44 /*s*/, 45 /*t*/, 46 /*u*/, 47 /*v*/,
|
515
|
-
48 /*w*/, 49 /*x*/, 50 /*y*/, 51 /*z*/, -1, -1, -1,
|
516
|
-
-1, -1, -1, -1, -1, -1, -1,
|
517
|
-
-1, -1, -1, -1, -1, -1, -1,
|
518
|
-
-1, -1, -1, -1, -1, -1, -1,
|
519
|
-
-1, -1, -1, -1, -1, -1, -1,
|
520
|
-
-1, -1, -1, -1, -1, -1, -1,
|
521
|
-
-1, -1, -1, -1, -1, -1, -1,
|
522
|
-
-1, -1, -1, -1, -1, -1, -1,
|
523
|
-
-1, -1, -1, -1, -1, -1, -1,
|
524
|
-
-1, -1, -1, -1, -1, -1, -1,
|
525
|
-
-1, -1, -1, -1, -1, -1, -1,
|
526
|
-
-1, -1, -1, -1, -1, -1, -1,
|
527
|
-
-1, -1, -1, -1, -1, -1, -1,
|
528
|
-
-1, -1, -1, -1, -1, -1, -1,
|
529
|
-
-1, -1, -1, -1, -1, -1, -1,
|
530
|
-
-1, -1, -1, -1, -1, -1, -1,
|
531
|
-
-1, -1, -1, -1, -1, -1, -1,
|
532
|
-
-1, -1, -1, -1, -1, -1, -1,
|
533
|
-
-1, -1, -1, -1, -1, -1, -1,
|
534
|
-
-1, -1, -1, -1};
|
535
|
-
|
536
|
-
/* Sign-extend return value so high bit will be set on any unexpected char. */
|
537
|
-
return table[(unsigned)ch];
|
538
|
-
}
|
539
|
-
|
540
|
-
static char *jsondec_partialbase64(jsondec *d, const char *ptr, const char *end,
|
541
|
-
char *out) {
|
542
|
-
int32_t val = -1;
|
543
|
-
|
544
|
-
switch (end - ptr) {
|
545
|
-
case 2:
|
546
|
-
val = jsondec_base64_tablelookup(ptr[0]) << 18 |
|
547
|
-
jsondec_base64_tablelookup(ptr[1]) << 12;
|
548
|
-
out[0] = val >> 16;
|
549
|
-
out += 1;
|
550
|
-
break;
|
551
|
-
case 3:
|
552
|
-
val = jsondec_base64_tablelookup(ptr[0]) << 18 |
|
553
|
-
jsondec_base64_tablelookup(ptr[1]) << 12 |
|
554
|
-
jsondec_base64_tablelookup(ptr[2]) << 6;
|
555
|
-
out[0] = val >> 16;
|
556
|
-
out[1] = (val >> 8) & 0xff;
|
557
|
-
out += 2;
|
558
|
-
break;
|
559
|
-
}
|
560
|
-
|
561
|
-
if (val < 0) {
|
562
|
-
jsondec_err(d, "Corrupt base64");
|
563
|
-
}
|
564
|
-
|
565
|
-
return out;
|
566
|
-
}
|
567
|
-
|
568
|
-
static size_t jsondec_base64(jsondec *d, upb_strview str) {
|
569
|
-
/* We decode in place. This is safe because this is a new buffer (not
|
570
|
-
* aliasing the input) and because base64 decoding shrinks 4 bytes into 3. */
|
571
|
-
char *out = (char*)str.data;
|
572
|
-
const char *ptr = str.data;
|
573
|
-
const char *end = ptr + str.size;
|
574
|
-
const char *end4 = ptr + (str.size & -4); /* Round down to multiple of 4. */
|
575
|
-
|
576
|
-
for (; ptr < end4; ptr += 4, out += 3) {
|
577
|
-
int val = jsondec_base64_tablelookup(ptr[0]) << 18 |
|
578
|
-
jsondec_base64_tablelookup(ptr[1]) << 12 |
|
579
|
-
jsondec_base64_tablelookup(ptr[2]) << 6 |
|
580
|
-
jsondec_base64_tablelookup(ptr[3]) << 0;
|
581
|
-
|
582
|
-
if (val < 0) {
|
583
|
-
/* Junk chars or padding. Remove trailing padding, if any. */
|
584
|
-
if (end - ptr == 4 && ptr[3] == '=') {
|
585
|
-
if (ptr[2] == '=') {
|
586
|
-
end -= 2;
|
587
|
-
} else {
|
588
|
-
end -= 1;
|
589
|
-
}
|
590
|
-
}
|
591
|
-
break;
|
592
|
-
}
|
593
|
-
|
594
|
-
out[0] = val >> 16;
|
595
|
-
out[1] = (val >> 8) & 0xff;
|
596
|
-
out[2] = val & 0xff;
|
597
|
-
}
|
598
|
-
|
599
|
-
if (ptr < end) {
|
600
|
-
/* Process remaining chars. We do not require padding. */
|
601
|
-
out = jsondec_partialbase64(d, ptr, end, out);
|
602
|
-
}
|
603
|
-
|
604
|
-
return out - str.data;
|
605
|
-
}
|
606
|
-
|
607
|
-
/* Low-level integer parsing **************************************************/
|
608
|
-
|
609
|
-
/* We use these hand-written routines instead of strto[u]l() because the "long
|
610
|
-
* long" variants aren't in c89. Also our version allows setting a ptr limit. */
|
611
|
-
|
612
|
-
static const char *jsondec_buftouint64(jsondec *d, const char *ptr,
|
613
|
-
const char *end, uint64_t *val) {
|
614
|
-
uint64_t u64 = 0;
|
615
|
-
while (ptr < end) {
|
616
|
-
unsigned ch = *ptr - '0';
|
617
|
-
if (ch >= 10) break;
|
618
|
-
if (u64 > UINT64_MAX / 10 || u64 * 10 > UINT64_MAX - ch) {
|
619
|
-
jsondec_err(d, "Integer overflow");
|
620
|
-
}
|
621
|
-
u64 *= 10;
|
622
|
-
u64 += ch;
|
623
|
-
ptr++;
|
624
|
-
}
|
625
|
-
|
626
|
-
*val = u64;
|
627
|
-
return ptr;
|
628
|
-
}
|
629
|
-
|
630
|
-
static const char *jsondec_buftoint64(jsondec *d, const char *ptr,
|
631
|
-
const char *end, int64_t *val) {
|
632
|
-
bool neg = false;
|
633
|
-
uint64_t u64;
|
634
|
-
|
635
|
-
if (ptr != end && *ptr == '-') {
|
636
|
-
ptr++;
|
637
|
-
neg = true;
|
638
|
-
}
|
639
|
-
|
640
|
-
ptr = jsondec_buftouint64(d, ptr, end, &u64);
|
641
|
-
if (u64 > (uint64_t)INT64_MAX + neg) {
|
642
|
-
jsondec_err(d, "Integer overflow");
|
643
|
-
}
|
644
|
-
|
645
|
-
*val = neg ? -u64 : u64;
|
646
|
-
return ptr;
|
647
|
-
}
|
648
|
-
|
649
|
-
static uint64_t jsondec_strtouint64(jsondec *d, upb_strview str) {
|
650
|
-
const char *end = str.data + str.size;
|
651
|
-
uint64_t ret;
|
652
|
-
if (jsondec_buftouint64(d, str.data, end, &ret) != end) {
|
653
|
-
jsondec_err(d, "Non-number characters in quoted integer");
|
654
|
-
}
|
655
|
-
return ret;
|
656
|
-
}
|
657
|
-
|
658
|
-
static int64_t jsondec_strtoint64(jsondec *d, upb_strview str) {
|
659
|
-
const char *end = str.data + str.size;
|
660
|
-
int64_t ret;
|
661
|
-
if (jsondec_buftoint64(d, str.data, end, &ret) != end) {
|
662
|
-
jsondec_err(d, "Non-number characters in quoted integer");
|
663
|
-
}
|
664
|
-
return ret;
|
665
|
-
}
|
666
|
-
|
667
|
-
/* Primitive value types ******************************************************/
|
668
|
-
|
669
|
-
/* Parse INT32 or INT64 value. */
|
670
|
-
static upb_msgval jsondec_int(jsondec *d, const upb_fielddef *f) {
|
671
|
-
upb_msgval val;
|
672
|
-
|
673
|
-
switch (jsondec_peek(d)) {
|
674
|
-
case JD_NUMBER: {
|
675
|
-
double dbl = jsondec_number(d);
|
676
|
-
if (dbl > 9223372036854774784.0 || dbl < -9223372036854775808.0) {
|
677
|
-
jsondec_err(d, "JSON number is out of range.");
|
678
|
-
}
|
679
|
-
val.int64_val = dbl; /* must be guarded, overflow here is UB */
|
680
|
-
if (val.int64_val != dbl) {
|
681
|
-
jsondec_errf(d, "JSON number was not integral (%d != %" PRId64 ")", dbl,
|
682
|
-
val.int64_val);
|
683
|
-
}
|
684
|
-
break;
|
685
|
-
}
|
686
|
-
case JD_STRING: {
|
687
|
-
upb_strview str = jsondec_string(d);
|
688
|
-
val.int64_val = jsondec_strtoint64(d, str);
|
689
|
-
break;
|
690
|
-
}
|
691
|
-
default:
|
692
|
-
jsondec_err(d, "Expected number or string");
|
693
|
-
}
|
694
|
-
|
695
|
-
if (upb_fielddef_type(f) == UPB_TYPE_INT32) {
|
696
|
-
if (val.int64_val > INT32_MAX || val.int64_val < INT32_MIN) {
|
697
|
-
jsondec_err(d, "Integer out of range.");
|
698
|
-
}
|
699
|
-
val.int32_val = (int32_t)val.int64_val;
|
700
|
-
}
|
701
|
-
|
702
|
-
return val;
|
703
|
-
}
|
704
|
-
|
705
|
-
/* Parse UINT32 or UINT64 value. */
|
706
|
-
static upb_msgval jsondec_uint(jsondec *d, const upb_fielddef *f) {
|
707
|
-
upb_msgval val;
|
708
|
-
|
709
|
-
switch (jsondec_peek(d)) {
|
710
|
-
case JD_NUMBER: {
|
711
|
-
double dbl = jsondec_number(d);
|
712
|
-
if (dbl > 18446744073709549568.0 || dbl < 0) {
|
713
|
-
jsondec_err(d, "JSON number is out of range.");
|
714
|
-
}
|
715
|
-
val.uint64_val = dbl; /* must be guarded, overflow here is UB */
|
716
|
-
if (val.uint64_val != dbl) {
|
717
|
-
jsondec_errf(d, "JSON number was not integral (%d != %" PRIu64 ")", dbl,
|
718
|
-
val.uint64_val);
|
719
|
-
}
|
720
|
-
break;
|
721
|
-
}
|
722
|
-
case JD_STRING: {
|
723
|
-
upb_strview str = jsondec_string(d);
|
724
|
-
val.uint64_val = jsondec_strtouint64(d, str);
|
725
|
-
break;
|
726
|
-
}
|
727
|
-
default:
|
728
|
-
jsondec_err(d, "Expected number or string");
|
729
|
-
}
|
730
|
-
|
731
|
-
if (upb_fielddef_type(f) == UPB_TYPE_UINT32) {
|
732
|
-
if (val.uint64_val > UINT32_MAX) {
|
733
|
-
jsondec_err(d, "Integer out of range.");
|
734
|
-
}
|
735
|
-
val.uint32_val = (uint32_t)val.uint64_val;
|
736
|
-
}
|
737
|
-
|
738
|
-
return val;
|
739
|
-
}
|
740
|
-
|
741
|
-
/* Parse DOUBLE or FLOAT value. */
|
742
|
-
static upb_msgval jsondec_double(jsondec *d, const upb_fielddef *f) {
|
743
|
-
upb_strview str;
|
744
|
-
upb_msgval val;
|
745
|
-
|
746
|
-
switch (jsondec_peek(d)) {
|
747
|
-
case JD_NUMBER:
|
748
|
-
val.double_val = jsondec_number(d);
|
749
|
-
break;
|
750
|
-
case JD_STRING:
|
751
|
-
str = jsondec_string(d);
|
752
|
-
if (jsondec_streql(str, "NaN")) {
|
753
|
-
val.double_val = NAN;
|
754
|
-
} else if (jsondec_streql(str, "Infinity")) {
|
755
|
-
val.double_val = INFINITY;
|
756
|
-
} else if (jsondec_streql(str, "-Infinity")) {
|
757
|
-
val.double_val = -INFINITY;
|
758
|
-
} else {
|
759
|
-
val.double_val = strtod(str.data, NULL);
|
760
|
-
}
|
761
|
-
break;
|
762
|
-
default:
|
763
|
-
jsondec_err(d, "Expected number or string");
|
764
|
-
}
|
765
|
-
|
766
|
-
if (upb_fielddef_type(f) == UPB_TYPE_FLOAT) {
|
767
|
-
if (val.double_val != INFINITY && val.double_val != -INFINITY &&
|
768
|
-
(val.double_val > FLT_MAX || val.double_val < -FLT_MAX)) {
|
769
|
-
jsondec_err(d, "Float out of range");
|
770
|
-
}
|
771
|
-
val.float_val = val.double_val;
|
772
|
-
}
|
773
|
-
|
774
|
-
return val;
|
775
|
-
}
|
776
|
-
|
777
|
-
/* Parse STRING or BYTES value. */
|
778
|
-
static upb_msgval jsondec_strfield(jsondec *d, const upb_fielddef *f) {
|
779
|
-
upb_msgval val;
|
780
|
-
val.str_val = jsondec_string(d);
|
781
|
-
if (upb_fielddef_type(f) == UPB_TYPE_BYTES) {
|
782
|
-
val.str_val.size = jsondec_base64(d, val.str_val);
|
783
|
-
}
|
784
|
-
return val;
|
785
|
-
}
|
786
|
-
|
787
|
-
static upb_msgval jsondec_enum(jsondec *d, const upb_fielddef *f) {
|
788
|
-
switch (jsondec_peek(d)) {
|
789
|
-
case JD_STRING: {
|
790
|
-
const upb_enumdef *e = upb_fielddef_enumsubdef(f);
|
791
|
-
upb_strview str = jsondec_string(d);
|
792
|
-
upb_msgval val;
|
793
|
-
if (!upb_enumdef_ntoi(e, str.data, str.size, &val.int32_val)) {
|
794
|
-
if (d->options & UPB_JSONDEC_IGNOREUNKNOWN) {
|
795
|
-
val.int32_val = 0;
|
796
|
-
} else {
|
797
|
-
jsondec_errf(d, "Unknown enumerator: '" UPB_STRVIEW_FORMAT "'",
|
798
|
-
UPB_STRVIEW_ARGS(str));
|
799
|
-
}
|
800
|
-
}
|
801
|
-
return val;
|
802
|
-
}
|
803
|
-
case JD_NULL: {
|
804
|
-
if (jsondec_isnullvalue(f)) {
|
805
|
-
upb_msgval val;
|
806
|
-
jsondec_null(d);
|
807
|
-
val.int32_val = 0;
|
808
|
-
return val;
|
809
|
-
}
|
810
|
-
}
|
811
|
-
/* Fallthrough. */
|
812
|
-
default:
|
813
|
-
return jsondec_int(d, f);
|
814
|
-
}
|
815
|
-
}
|
816
|
-
|
817
|
-
static upb_msgval jsondec_bool(jsondec *d, const upb_fielddef *f) {
|
818
|
-
bool is_map_key = upb_fielddef_number(f) == 1 &&
|
819
|
-
upb_msgdef_mapentry(upb_fielddef_containingtype(f));
|
820
|
-
upb_msgval val;
|
821
|
-
|
822
|
-
if (is_map_key) {
|
823
|
-
upb_strview str = jsondec_string(d);
|
824
|
-
if (jsondec_streql(str, "true")) {
|
825
|
-
val.bool_val = true;
|
826
|
-
} else if (jsondec_streql(str, "false")) {
|
827
|
-
val.bool_val = false;
|
828
|
-
} else {
|
829
|
-
jsondec_err(d, "Invalid boolean map key");
|
830
|
-
}
|
831
|
-
} else {
|
832
|
-
switch (jsondec_peek(d)) {
|
833
|
-
case JD_TRUE:
|
834
|
-
val.bool_val = true;
|
835
|
-
jsondec_true(d);
|
836
|
-
break;
|
837
|
-
case JD_FALSE:
|
838
|
-
val.bool_val = false;
|
839
|
-
jsondec_false(d);
|
840
|
-
break;
|
841
|
-
default:
|
842
|
-
jsondec_err(d, "Expected true or false");
|
843
|
-
}
|
844
|
-
}
|
845
|
-
|
846
|
-
return val;
|
847
|
-
}
|
848
|
-
|
849
|
-
/* Composite types (array/message/map) ****************************************/
|
850
|
-
|
851
|
-
static void jsondec_array(jsondec *d, upb_msg *msg, const upb_fielddef *f) {
|
852
|
-
upb_array *arr = upb_msg_mutable(msg, f, d->arena).array;
|
853
|
-
|
854
|
-
jsondec_arrstart(d);
|
855
|
-
while (jsondec_arrnext(d)) {
|
856
|
-
upb_msgval elem = jsondec_value(d, f);
|
857
|
-
upb_array_append(arr, elem, d->arena);
|
858
|
-
}
|
859
|
-
jsondec_arrend(d);
|
860
|
-
}
|
861
|
-
|
862
|
-
static void jsondec_map(jsondec *d, upb_msg *msg, const upb_fielddef *f) {
|
863
|
-
upb_map *map = upb_msg_mutable(msg, f, d->arena).map;
|
864
|
-
const upb_msgdef *entry = upb_fielddef_msgsubdef(f);
|
865
|
-
const upb_fielddef *key_f = upb_msgdef_itof(entry, 1);
|
866
|
-
const upb_fielddef *val_f = upb_msgdef_itof(entry, 2);
|
867
|
-
|
868
|
-
jsondec_objstart(d);
|
869
|
-
while (jsondec_objnext(d)) {
|
870
|
-
upb_msgval key, val;
|
871
|
-
key = jsondec_value(d, key_f);
|
872
|
-
jsondec_entrysep(d);
|
873
|
-
val = jsondec_value(d, val_f);
|
874
|
-
upb_map_set(map, key, val, d->arena);
|
875
|
-
}
|
876
|
-
jsondec_objend(d);
|
877
|
-
}
|
878
|
-
|
879
|
-
static void jsondec_tomsg(jsondec *d, upb_msg *msg, const upb_msgdef *m) {
|
880
|
-
if (upb_msgdef_wellknowntype(m) == UPB_WELLKNOWN_UNSPECIFIED) {
|
881
|
-
jsondec_object(d, msg, m);
|
882
|
-
} else {
|
883
|
-
jsondec_wellknown(d, msg, m);
|
884
|
-
}
|
885
|
-
}
|
886
|
-
|
887
|
-
static upb_msgval jsondec_msg(jsondec *d, const upb_fielddef *f) {
|
888
|
-
const upb_msgdef *m = upb_fielddef_msgsubdef(f);
|
889
|
-
upb_msg *msg = upb_msg_new(m, d->arena);
|
890
|
-
upb_msgval val;
|
891
|
-
|
892
|
-
jsondec_tomsg(d, msg, m);
|
893
|
-
val.msg_val = msg;
|
894
|
-
return val;
|
895
|
-
}
|
896
|
-
|
897
|
-
static void jsondec_field(jsondec *d, upb_msg *msg, const upb_msgdef *m) {
|
898
|
-
upb_strview name;
|
899
|
-
const upb_fielddef *f;
|
900
|
-
const upb_fielddef *preserved;
|
901
|
-
|
902
|
-
name = jsondec_string(d);
|
903
|
-
jsondec_entrysep(d);
|
904
|
-
f = upb_msgdef_lookupjsonname(m, name.data, name.size);
|
905
|
-
|
906
|
-
if (!f) {
|
907
|
-
if ((d->options & UPB_JSONDEC_IGNOREUNKNOWN) == 0) {
|
908
|
-
jsondec_errf(d, "Unknown field: '" UPB_STRVIEW_FORMAT "'",
|
909
|
-
UPB_STRVIEW_ARGS(name));
|
910
|
-
}
|
911
|
-
jsondec_skipval(d);
|
912
|
-
return;
|
913
|
-
}
|
914
|
-
|
915
|
-
if (upb_fielddef_realcontainingoneof(f) &&
|
916
|
-
upb_msg_whichoneof(msg, upb_fielddef_containingoneof(f))) {
|
917
|
-
jsondec_err(d, "More than one field for this oneof.");
|
918
|
-
}
|
919
|
-
|
920
|
-
if (jsondec_peek(d) == JD_NULL && !jsondec_isvalue(f)) {
|
921
|
-
/* JSON "null" indicates a default value, so no need to set anything. */
|
922
|
-
jsondec_null(d);
|
923
|
-
return;
|
924
|
-
}
|
925
|
-
|
926
|
-
preserved = d->debug_field;
|
927
|
-
d->debug_field = f;
|
928
|
-
|
929
|
-
if (upb_fielddef_ismap(f)) {
|
930
|
-
jsondec_map(d, msg, f);
|
931
|
-
} else if (upb_fielddef_isseq(f)) {
|
932
|
-
jsondec_array(d, msg, f);
|
933
|
-
} else if (upb_fielddef_issubmsg(f)) {
|
934
|
-
upb_msg *submsg = upb_msg_mutable(msg, f, d->arena).msg;
|
935
|
-
const upb_msgdef *subm = upb_fielddef_msgsubdef(f);
|
936
|
-
jsondec_tomsg(d, submsg, subm);
|
937
|
-
} else {
|
938
|
-
upb_msgval val = jsondec_value(d, f);
|
939
|
-
upb_msg_set(msg, f, val, d->arena);
|
940
|
-
}
|
941
|
-
|
942
|
-
d->debug_field = preserved;
|
943
|
-
}
|
944
|
-
|
945
|
-
static void jsondec_object(jsondec *d, upb_msg *msg, const upb_msgdef *m) {
|
946
|
-
jsondec_objstart(d);
|
947
|
-
while (jsondec_objnext(d)) {
|
948
|
-
jsondec_field(d, msg, m);
|
949
|
-
}
|
950
|
-
jsondec_objend(d);
|
951
|
-
}
|
952
|
-
|
953
|
-
static upb_msgval jsondec_value(jsondec *d, const upb_fielddef *f) {
|
954
|
-
switch (upb_fielddef_type(f)) {
|
955
|
-
case UPB_TYPE_BOOL:
|
956
|
-
return jsondec_bool(d, f);
|
957
|
-
case UPB_TYPE_FLOAT:
|
958
|
-
case UPB_TYPE_DOUBLE:
|
959
|
-
return jsondec_double(d, f);
|
960
|
-
case UPB_TYPE_UINT32:
|
961
|
-
case UPB_TYPE_UINT64:
|
962
|
-
return jsondec_uint(d, f);
|
963
|
-
case UPB_TYPE_INT32:
|
964
|
-
case UPB_TYPE_INT64:
|
965
|
-
return jsondec_int(d, f);
|
966
|
-
case UPB_TYPE_STRING:
|
967
|
-
case UPB_TYPE_BYTES:
|
968
|
-
return jsondec_strfield(d, f);
|
969
|
-
case UPB_TYPE_ENUM:
|
970
|
-
return jsondec_enum(d, f);
|
971
|
-
case UPB_TYPE_MESSAGE:
|
972
|
-
return jsondec_msg(d, f);
|
973
|
-
default:
|
974
|
-
UPB_UNREACHABLE();
|
975
|
-
}
|
976
|
-
}
|
977
|
-
|
978
|
-
/* Well-known types ***********************************************************/
|
979
|
-
|
980
|
-
static int jsondec_tsdigits(jsondec *d, const char **ptr, size_t digits,
|
981
|
-
const char *after) {
|
982
|
-
uint64_t val;
|
983
|
-
const char *p = *ptr;
|
984
|
-
const char *end = p + digits;
|
985
|
-
size_t after_len = after ? strlen(after) : 0;
|
986
|
-
|
987
|
-
UPB_ASSERT(digits <= 9); /* int can't overflow. */
|
988
|
-
|
989
|
-
if (jsondec_buftouint64(d, p, end, &val) != end ||
|
990
|
-
(after_len && memcmp(end, after, after_len) != 0)) {
|
991
|
-
jsondec_err(d, "Malformed timestamp");
|
992
|
-
}
|
993
|
-
|
994
|
-
UPB_ASSERT(val < INT_MAX);
|
995
|
-
|
996
|
-
*ptr = end + after_len;
|
997
|
-
return (int)val;
|
998
|
-
}
|
999
|
-
|
1000
|
-
static int jsondec_nanos(jsondec *d, const char **ptr, const char *end) {
|
1001
|
-
uint64_t nanos = 0;
|
1002
|
-
const char *p = *ptr;
|
1003
|
-
|
1004
|
-
if (p != end && *p == '.') {
|
1005
|
-
const char *nano_end = jsondec_buftouint64(d, p + 1, end, &nanos);
|
1006
|
-
int digits = (int)(nano_end - p - 1);
|
1007
|
-
int exp_lg10 = 9 - digits;
|
1008
|
-
if (digits > 9) {
|
1009
|
-
jsondec_err(d, "Too many digits for partial seconds");
|
1010
|
-
}
|
1011
|
-
while (exp_lg10--) nanos *= 10;
|
1012
|
-
*ptr = nano_end;
|
1013
|
-
}
|
1014
|
-
|
1015
|
-
UPB_ASSERT(nanos < INT_MAX);
|
1016
|
-
|
1017
|
-
return (int)nanos;
|
1018
|
-
}
|
1019
|
-
|
1020
|
-
/* jsondec_epochdays(1970, 1, 1) == 1970-01-01 == 0. */
|
1021
|
-
int jsondec_epochdays(int y, int m, int d) {
|
1022
|
-
const uint32_t year_base = 4800; /* Before min year, multiple of 400. */
|
1023
|
-
const uint32_t m_adj = m - 3; /* March-based month. */
|
1024
|
-
const uint32_t carry = m_adj > (uint32_t)m ? 1 : 0;
|
1025
|
-
const uint32_t adjust = carry ? 12 : 0;
|
1026
|
-
const uint32_t y_adj = y + year_base - carry;
|
1027
|
-
const uint32_t month_days = ((m_adj + adjust) * 62719 + 769) / 2048;
|
1028
|
-
const uint32_t leap_days = y_adj / 4 - y_adj / 100 + y_adj / 400;
|
1029
|
-
return y_adj * 365 + leap_days + month_days + (d - 1) - 2472632;
|
1030
|
-
}
|
1031
|
-
|
1032
|
-
static int64_t jsondec_unixtime(int y, int m, int d, int h, int min, int s) {
|
1033
|
-
return (int64_t)jsondec_epochdays(y, m, d) * 86400 + h * 3600 + min * 60 + s;
|
1034
|
-
}
|
1035
|
-
|
1036
|
-
static void jsondec_timestamp(jsondec *d, upb_msg *msg, const upb_msgdef *m) {
|
1037
|
-
upb_msgval seconds;
|
1038
|
-
upb_msgval nanos;
|
1039
|
-
upb_strview str = jsondec_string(d);
|
1040
|
-
const char *ptr = str.data;
|
1041
|
-
const char *end = ptr + str.size;
|
1042
|
-
|
1043
|
-
if (str.size < 20) goto malformed;
|
1044
|
-
|
1045
|
-
{
|
1046
|
-
/* 1972-01-01T01:00:00 */
|
1047
|
-
int year = jsondec_tsdigits(d, &ptr, 4, "-");
|
1048
|
-
int mon = jsondec_tsdigits(d, &ptr, 2, "-");
|
1049
|
-
int day = jsondec_tsdigits(d, &ptr, 2, "T");
|
1050
|
-
int hour = jsondec_tsdigits(d, &ptr, 2, ":");
|
1051
|
-
int min = jsondec_tsdigits(d, &ptr, 2, ":");
|
1052
|
-
int sec = jsondec_tsdigits(d, &ptr, 2, NULL);
|
1053
|
-
|
1054
|
-
seconds.int64_val = jsondec_unixtime(year, mon, day, hour, min, sec);
|
1055
|
-
}
|
1056
|
-
|
1057
|
-
nanos.int32_val = jsondec_nanos(d, &ptr, end);
|
1058
|
-
|
1059
|
-
{
|
1060
|
-
/* [+-]08:00 or Z */
|
1061
|
-
int ofs = 0;
|
1062
|
-
bool neg = false;
|
1063
|
-
|
1064
|
-
if (ptr == end) goto malformed;
|
1065
|
-
|
1066
|
-
switch (*ptr++) {
|
1067
|
-
case '-':
|
1068
|
-
neg = true;
|
1069
|
-
/* fallthrough */
|
1070
|
-
case '+':
|
1071
|
-
if ((end - ptr) != 5) goto malformed;
|
1072
|
-
ofs = jsondec_tsdigits(d, &ptr, 2, ":00");
|
1073
|
-
ofs *= 60 * 60;
|
1074
|
-
seconds.int64_val += (neg ? ofs : -ofs);
|
1075
|
-
break;
|
1076
|
-
case 'Z':
|
1077
|
-
if (ptr != end) goto malformed;
|
1078
|
-
break;
|
1079
|
-
default:
|
1080
|
-
goto malformed;
|
1081
|
-
}
|
1082
|
-
}
|
1083
|
-
|
1084
|
-
if (seconds.int64_val < -62135596800) {
|
1085
|
-
jsondec_err(d, "Timestamp out of range");
|
1086
|
-
}
|
1087
|
-
|
1088
|
-
upb_msg_set(msg, upb_msgdef_itof(m, 1), seconds, d->arena);
|
1089
|
-
upb_msg_set(msg, upb_msgdef_itof(m, 2), nanos, d->arena);
|
1090
|
-
return;
|
1091
|
-
|
1092
|
-
malformed:
|
1093
|
-
jsondec_err(d, "Malformed timestamp");
|
1094
|
-
}
|
1095
|
-
|
1096
|
-
static void jsondec_duration(jsondec *d, upb_msg *msg, const upb_msgdef *m) {
|
1097
|
-
upb_msgval seconds;
|
1098
|
-
upb_msgval nanos;
|
1099
|
-
upb_strview str = jsondec_string(d);
|
1100
|
-
const char *ptr = str.data;
|
1101
|
-
const char *end = ptr + str.size;
|
1102
|
-
const int64_t max = (uint64_t)3652500 * 86400;
|
1103
|
-
|
1104
|
-
/* "3.000000001s", "3s", etc. */
|
1105
|
-
ptr = jsondec_buftoint64(d, ptr, end, &seconds.int64_val);
|
1106
|
-
nanos.int32_val = jsondec_nanos(d, &ptr, end);
|
1107
|
-
|
1108
|
-
if (end - ptr != 1 || *ptr != 's') {
|
1109
|
-
jsondec_err(d, "Malformed duration");
|
1110
|
-
}
|
1111
|
-
|
1112
|
-
if (seconds.int64_val < -max || seconds.int64_val > max) {
|
1113
|
-
jsondec_err(d, "Duration out of range");
|
1114
|
-
}
|
1115
|
-
|
1116
|
-
if (seconds.int64_val < 0) {
|
1117
|
-
nanos.int32_val = - nanos.int32_val;
|
1118
|
-
}
|
1119
|
-
|
1120
|
-
upb_msg_set(msg, upb_msgdef_itof(m, 1), seconds, d->arena);
|
1121
|
-
upb_msg_set(msg, upb_msgdef_itof(m, 2), nanos, d->arena);
|
1122
|
-
}
|
1123
|
-
|
1124
|
-
static void jsondec_listvalue(jsondec *d, upb_msg *msg, const upb_msgdef *m) {
|
1125
|
-
const upb_fielddef *values_f = upb_msgdef_itof(m, 1);
|
1126
|
-
const upb_msgdef *value_m = upb_fielddef_msgsubdef(values_f);
|
1127
|
-
upb_array *values = upb_msg_mutable(msg, values_f, d->arena).array;
|
1128
|
-
|
1129
|
-
jsondec_arrstart(d);
|
1130
|
-
while (jsondec_arrnext(d)) {
|
1131
|
-
upb_msg *value_msg = upb_msg_new(value_m, d->arena);
|
1132
|
-
upb_msgval value;
|
1133
|
-
value.msg_val = value_msg;
|
1134
|
-
upb_array_append(values, value, d->arena);
|
1135
|
-
jsondec_wellknownvalue(d, value_msg, value_m);
|
1136
|
-
}
|
1137
|
-
jsondec_arrend(d);
|
1138
|
-
}
|
1139
|
-
|
1140
|
-
static void jsondec_struct(jsondec *d, upb_msg *msg, const upb_msgdef *m) {
|
1141
|
-
const upb_fielddef *fields_f = upb_msgdef_itof(m, 1);
|
1142
|
-
const upb_msgdef *entry_m = upb_fielddef_msgsubdef(fields_f);
|
1143
|
-
const upb_fielddef *value_f = upb_msgdef_itof(entry_m, 2);
|
1144
|
-
const upb_msgdef *value_m = upb_fielddef_msgsubdef(value_f);
|
1145
|
-
upb_map *fields = upb_msg_mutable(msg, fields_f, d->arena).map;
|
1146
|
-
|
1147
|
-
jsondec_objstart(d);
|
1148
|
-
while (jsondec_objnext(d)) {
|
1149
|
-
upb_msgval key, value;
|
1150
|
-
upb_msg *value_msg = upb_msg_new(value_m, d->arena);
|
1151
|
-
key.str_val = jsondec_string(d);
|
1152
|
-
value.msg_val = value_msg;
|
1153
|
-
upb_map_set(fields, key, value, d->arena);
|
1154
|
-
jsondec_entrysep(d);
|
1155
|
-
jsondec_wellknownvalue(d, value_msg, value_m);
|
1156
|
-
}
|
1157
|
-
jsondec_objend(d);
|
1158
|
-
}
|
1159
|
-
|
1160
|
-
static void jsondec_wellknownvalue(jsondec *d, upb_msg *msg,
|
1161
|
-
const upb_msgdef *m) {
|
1162
|
-
upb_msgval val;
|
1163
|
-
const upb_fielddef *f;
|
1164
|
-
upb_msg *submsg;
|
1165
|
-
|
1166
|
-
switch (jsondec_peek(d)) {
|
1167
|
-
case JD_NUMBER:
|
1168
|
-
/* double number_value = 2; */
|
1169
|
-
f = upb_msgdef_itof(m, 2);
|
1170
|
-
val.double_val = jsondec_number(d);
|
1171
|
-
break;
|
1172
|
-
case JD_STRING:
|
1173
|
-
/* string string_value = 3; */
|
1174
|
-
f = upb_msgdef_itof(m, 3);
|
1175
|
-
val.str_val = jsondec_string(d);
|
1176
|
-
break;
|
1177
|
-
case JD_FALSE:
|
1178
|
-
/* bool bool_value = 4; */
|
1179
|
-
f = upb_msgdef_itof(m, 4);
|
1180
|
-
val.bool_val = false;
|
1181
|
-
jsondec_false(d);
|
1182
|
-
break;
|
1183
|
-
case JD_TRUE:
|
1184
|
-
/* bool bool_value = 4; */
|
1185
|
-
f = upb_msgdef_itof(m, 4);
|
1186
|
-
val.bool_val = true;
|
1187
|
-
jsondec_true(d);
|
1188
|
-
break;
|
1189
|
-
case JD_NULL:
|
1190
|
-
/* NullValue null_value = 1; */
|
1191
|
-
f = upb_msgdef_itof(m, 1);
|
1192
|
-
val.int32_val = 0;
|
1193
|
-
jsondec_null(d);
|
1194
|
-
break;
|
1195
|
-
/* Note: these cases return, because upb_msg_mutable() is enough. */
|
1196
|
-
case JD_OBJECT:
|
1197
|
-
/* Struct struct_value = 5; */
|
1198
|
-
f = upb_msgdef_itof(m, 5);
|
1199
|
-
submsg = upb_msg_mutable(msg, f, d->arena).msg;
|
1200
|
-
jsondec_struct(d, submsg, upb_fielddef_msgsubdef(f));
|
1201
|
-
return;
|
1202
|
-
case JD_ARRAY:
|
1203
|
-
/* ListValue list_value = 6; */
|
1204
|
-
f = upb_msgdef_itof(m, 6);
|
1205
|
-
submsg = upb_msg_mutable(msg, f, d->arena).msg;
|
1206
|
-
jsondec_listvalue(d, submsg, upb_fielddef_msgsubdef(f));
|
1207
|
-
return;
|
1208
|
-
default:
|
1209
|
-
UPB_UNREACHABLE();
|
1210
|
-
}
|
1211
|
-
|
1212
|
-
upb_msg_set(msg, f, val, d->arena);
|
1213
|
-
}
|
1214
|
-
|
1215
|
-
static upb_strview jsondec_mask(jsondec *d, const char *buf, const char *end) {
|
1216
|
-
/* FieldMask fields grow due to inserted '_' characters, so we can't do the
|
1217
|
-
* transform in place. */
|
1218
|
-
const char *ptr = buf;
|
1219
|
-
upb_strview ret;
|
1220
|
-
char *out;
|
1221
|
-
|
1222
|
-
ret.size = end - ptr;
|
1223
|
-
while (ptr < end) {
|
1224
|
-
ret.size += (*ptr >= 'A' && *ptr <= 'Z');
|
1225
|
-
ptr++;
|
1226
|
-
}
|
1227
|
-
|
1228
|
-
out = upb_arena_malloc(d->arena, ret.size);
|
1229
|
-
ptr = buf;
|
1230
|
-
ret.data = out;
|
1231
|
-
|
1232
|
-
while (ptr < end) {
|
1233
|
-
char ch = *ptr++;
|
1234
|
-
if (ch >= 'A' && ch <= 'Z') {
|
1235
|
-
*out++ = '_';
|
1236
|
-
*out++ = ch + 32;
|
1237
|
-
} else if (ch == '_') {
|
1238
|
-
jsondec_err(d, "field mask may not contain '_'");
|
1239
|
-
} else {
|
1240
|
-
*out++ = ch;
|
1241
|
-
}
|
1242
|
-
}
|
1243
|
-
|
1244
|
-
return ret;
|
1245
|
-
}
|
1246
|
-
|
1247
|
-
static void jsondec_fieldmask(jsondec *d, upb_msg *msg, const upb_msgdef *m) {
|
1248
|
-
/* repeated string paths = 1; */
|
1249
|
-
const upb_fielddef *paths_f = upb_msgdef_itof(m, 1);
|
1250
|
-
upb_array *arr = upb_msg_mutable(msg, paths_f, d->arena).array;
|
1251
|
-
upb_strview str = jsondec_string(d);
|
1252
|
-
const char *ptr = str.data;
|
1253
|
-
const char *end = ptr + str.size;
|
1254
|
-
upb_msgval val;
|
1255
|
-
|
1256
|
-
while (ptr < end) {
|
1257
|
-
const char *elem_end = memchr(ptr, ',', end - ptr);
|
1258
|
-
if (elem_end) {
|
1259
|
-
val.str_val = jsondec_mask(d, ptr, elem_end);
|
1260
|
-
ptr = elem_end + 1;
|
1261
|
-
} else {
|
1262
|
-
val.str_val = jsondec_mask(d, ptr, end);
|
1263
|
-
ptr = end;
|
1264
|
-
}
|
1265
|
-
upb_array_append(arr, val, d->arena);
|
1266
|
-
}
|
1267
|
-
}
|
1268
|
-
|
1269
|
-
static void jsondec_anyfield(jsondec *d, upb_msg *msg, const upb_msgdef *m) {
|
1270
|
-
if (upb_msgdef_wellknowntype(m) == UPB_WELLKNOWN_UNSPECIFIED) {
|
1271
|
-
/* For regular types: {"@type": "[user type]", "f1": <V1>, "f2": <V2>}
|
1272
|
-
* where f1, f2, etc. are the normal fields of this type. */
|
1273
|
-
jsondec_field(d, msg, m);
|
1274
|
-
} else {
|
1275
|
-
/* For well-known types: {"@type": "[well-known type]", "value": <X>}
|
1276
|
-
* where <X> is whatever encoding the WKT normally uses. */
|
1277
|
-
upb_strview str = jsondec_string(d);
|
1278
|
-
jsondec_entrysep(d);
|
1279
|
-
if (!jsondec_streql(str, "value")) {
|
1280
|
-
jsondec_err(d, "Key for well-known type must be 'value'");
|
1281
|
-
}
|
1282
|
-
jsondec_wellknown(d, msg, m);
|
1283
|
-
}
|
1284
|
-
}
|
1285
|
-
|
1286
|
-
static const upb_msgdef *jsondec_typeurl(jsondec *d, upb_msg *msg,
|
1287
|
-
const upb_msgdef *m) {
|
1288
|
-
const upb_fielddef *type_url_f = upb_msgdef_itof(m, 1);
|
1289
|
-
const upb_msgdef *type_m;
|
1290
|
-
upb_strview type_url = jsondec_string(d);
|
1291
|
-
const char *end = type_url.data + type_url.size;
|
1292
|
-
const char *ptr = end;
|
1293
|
-
upb_msgval val;
|
1294
|
-
|
1295
|
-
val.str_val = type_url;
|
1296
|
-
upb_msg_set(msg, type_url_f, val, d->arena);
|
1297
|
-
|
1298
|
-
/* Find message name after the last '/' */
|
1299
|
-
while (ptr > type_url.data && *--ptr != '/') {}
|
1300
|
-
|
1301
|
-
if (ptr == type_url.data || ptr == end) {
|
1302
|
-
jsondec_err(d, "Type url must have at least one '/' and non-empty host");
|
1303
|
-
}
|
1304
|
-
|
1305
|
-
ptr++;
|
1306
|
-
type_m = upb_symtab_lookupmsg2(d->any_pool, ptr, end - ptr);
|
1307
|
-
|
1308
|
-
if (!type_m) {
|
1309
|
-
jsondec_err(d, "Type was not found");
|
1310
|
-
}
|
1311
|
-
|
1312
|
-
return type_m;
|
1313
|
-
}
|
1314
|
-
|
1315
|
-
static void jsondec_any(jsondec *d, upb_msg *msg, const upb_msgdef *m) {
|
1316
|
-
/* string type_url = 1;
|
1317
|
-
* bytes value = 2; */
|
1318
|
-
const upb_fielddef *value_f = upb_msgdef_itof(m, 2);
|
1319
|
-
upb_msg *any_msg;
|
1320
|
-
const upb_msgdef *any_m = NULL;
|
1321
|
-
const char *pre_type_data = NULL;
|
1322
|
-
const char *pre_type_end = NULL;
|
1323
|
-
upb_msgval encoded;
|
1324
|
-
|
1325
|
-
jsondec_objstart(d);
|
1326
|
-
|
1327
|
-
/* Scan looking for "@type", which is not necessarily first. */
|
1328
|
-
while (!any_m && jsondec_objnext(d)) {
|
1329
|
-
const char *start = d->ptr;
|
1330
|
-
upb_strview name = jsondec_string(d);
|
1331
|
-
jsondec_entrysep(d);
|
1332
|
-
if (jsondec_streql(name, "@type")) {
|
1333
|
-
any_m = jsondec_typeurl(d, msg, m);
|
1334
|
-
if (pre_type_data) {
|
1335
|
-
pre_type_end = start;
|
1336
|
-
while (*pre_type_end != ',') pre_type_end--;
|
1337
|
-
}
|
1338
|
-
} else {
|
1339
|
-
if (!pre_type_data) pre_type_data = start;
|
1340
|
-
jsondec_skipval(d);
|
1341
|
-
}
|
1342
|
-
}
|
1343
|
-
|
1344
|
-
if (!any_m) {
|
1345
|
-
jsondec_err(d, "Any object didn't contain a '@type' field");
|
1346
|
-
}
|
1347
|
-
|
1348
|
-
any_msg = upb_msg_new(any_m, d->arena);
|
1349
|
-
|
1350
|
-
if (pre_type_data) {
|
1351
|
-
size_t len = pre_type_end - pre_type_data + 1;
|
1352
|
-
char *tmp = upb_arena_malloc(d->arena, len);
|
1353
|
-
const char *saved_ptr = d->ptr;
|
1354
|
-
const char *saved_end = d->end;
|
1355
|
-
memcpy(tmp, pre_type_data, len - 1);
|
1356
|
-
tmp[len - 1] = '}';
|
1357
|
-
d->ptr = tmp;
|
1358
|
-
d->end = tmp + len;
|
1359
|
-
d->is_first = true;
|
1360
|
-
while (jsondec_objnext(d)) {
|
1361
|
-
jsondec_anyfield(d, any_msg, any_m);
|
1362
|
-
}
|
1363
|
-
d->ptr = saved_ptr;
|
1364
|
-
d->end = saved_end;
|
1365
|
-
}
|
1366
|
-
|
1367
|
-
while (jsondec_objnext(d)) {
|
1368
|
-
jsondec_anyfield(d, any_msg, any_m);
|
1369
|
-
}
|
1370
|
-
|
1371
|
-
jsondec_objend(d);
|
1372
|
-
|
1373
|
-
encoded.str_val.data = upb_encode(any_msg, upb_msgdef_layout(any_m), d->arena,
|
1374
|
-
&encoded.str_val.size);
|
1375
|
-
upb_msg_set(msg, value_f, encoded, d->arena);
|
1376
|
-
}
|
1377
|
-
|
1378
|
-
static void jsondec_wrapper(jsondec *d, upb_msg *msg, const upb_msgdef *m) {
|
1379
|
-
const upb_fielddef *value_f = upb_msgdef_itof(m, 1);
|
1380
|
-
upb_msgval val = jsondec_value(d, value_f);
|
1381
|
-
upb_msg_set(msg, value_f, val, d->arena);
|
1382
|
-
}
|
1383
|
-
|
1384
|
-
static void jsondec_wellknown(jsondec *d, upb_msg *msg, const upb_msgdef *m) {
|
1385
|
-
switch (upb_msgdef_wellknowntype(m)) {
|
1386
|
-
case UPB_WELLKNOWN_ANY:
|
1387
|
-
jsondec_any(d, msg, m);
|
1388
|
-
break;
|
1389
|
-
case UPB_WELLKNOWN_FIELDMASK:
|
1390
|
-
jsondec_fieldmask(d, msg, m);
|
1391
|
-
break;
|
1392
|
-
case UPB_WELLKNOWN_DURATION:
|
1393
|
-
jsondec_duration(d, msg, m);
|
1394
|
-
break;
|
1395
|
-
case UPB_WELLKNOWN_TIMESTAMP:
|
1396
|
-
jsondec_timestamp(d, msg, m);
|
1397
|
-
break;
|
1398
|
-
case UPB_WELLKNOWN_VALUE:
|
1399
|
-
jsondec_wellknownvalue(d, msg, m);
|
1400
|
-
break;
|
1401
|
-
case UPB_WELLKNOWN_LISTVALUE:
|
1402
|
-
jsondec_listvalue(d, msg, m);
|
1403
|
-
break;
|
1404
|
-
case UPB_WELLKNOWN_STRUCT:
|
1405
|
-
jsondec_struct(d, msg, m);
|
1406
|
-
break;
|
1407
|
-
case UPB_WELLKNOWN_DOUBLEVALUE:
|
1408
|
-
case UPB_WELLKNOWN_FLOATVALUE:
|
1409
|
-
case UPB_WELLKNOWN_INT64VALUE:
|
1410
|
-
case UPB_WELLKNOWN_UINT64VALUE:
|
1411
|
-
case UPB_WELLKNOWN_INT32VALUE:
|
1412
|
-
case UPB_WELLKNOWN_UINT32VALUE:
|
1413
|
-
case UPB_WELLKNOWN_STRINGVALUE:
|
1414
|
-
case UPB_WELLKNOWN_BYTESVALUE:
|
1415
|
-
case UPB_WELLKNOWN_BOOLVALUE:
|
1416
|
-
jsondec_wrapper(d, msg, m);
|
1417
|
-
break;
|
1418
|
-
default:
|
1419
|
-
UPB_UNREACHABLE();
|
1420
|
-
}
|
1421
|
-
}
|
1422
|
-
|
1423
|
-
bool upb_json_decode(const char *buf, size_t size, upb_msg *msg,
|
1424
|
-
const upb_msgdef *m, const upb_symtab *any_pool,
|
1425
|
-
int options, upb_arena *arena, upb_status *status) {
|
1426
|
-
jsondec d;
|
1427
|
-
d.ptr = buf;
|
1428
|
-
d.end = buf + size;
|
1429
|
-
d.arena = arena;
|
1430
|
-
d.any_pool = any_pool;
|
1431
|
-
d.status = status;
|
1432
|
-
d.options = options;
|
1433
|
-
d.depth = 64;
|
1434
|
-
d.line = 1;
|
1435
|
-
d.line_begin = d.ptr;
|
1436
|
-
d.debug_field = NULL;
|
1437
|
-
d.is_first = false;
|
1438
|
-
|
1439
|
-
if (UPB_SETJMP(d.err)) return false;
|
1440
|
-
|
1441
|
-
jsondec_tomsg(&d, msg, m);
|
1442
|
-
return true;
|
1443
|
-
}
|