grpc 1.48.0-x86_64-linux → 1.49.0.pre1-x86_64-linux
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 +104 -41
- data/include/grpc/event_engine/event_engine.h +19 -16
- data/include/grpc/impl/codegen/grpc_types.h +3 -8
- data/include/grpc/impl/codegen/port_platform.h +0 -8
- data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +3 -3
- data/src/core/ext/filters/channel_idle/channel_idle_filter.h +2 -2
- data/src/core/ext/filters/client_channel/client_channel.cc +117 -200
- data/src/core/ext/filters/client_channel/client_channel.h +15 -8
- data/src/core/ext/filters/client_channel/client_channel_factory.cc +0 -29
- data/src/core/ext/filters/client_channel/client_channel_factory.h +2 -10
- data/src/core/ext/filters/client_channel/client_channel_plugin.cc +1 -1
- data/src/core/ext/filters/client_channel/config_selector.h +12 -4
- data/src/core/ext/filters/client_channel/connector.h +4 -5
- data/src/core/ext/filters/client_channel/http_proxy.cc +53 -65
- data/src/core/ext/filters/client_channel/http_proxy.h +12 -9
- data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +14 -12
- data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h +6 -6
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +100 -124
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +12 -3
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +5 -1
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +1 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +1 -2
- data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.h +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +169 -63
- data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.h +25 -1
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +15 -19
- data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +66 -78
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +44 -44
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +6 -5
- data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +65 -77
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +15 -14
- data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +19 -14
- data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +60 -67
- data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +40 -49
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +81 -97
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +53 -61
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +171 -102
- data/src/core/ext/filters/client_channel/proxy_mapper.h +13 -14
- data/src/core/ext/filters/client_channel/proxy_mapper_registry.cc +19 -16
- data/src/core/ext/filters/client_channel/proxy_mapper_registry.h +8 -7
- data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +4 -8
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +431 -145
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +170 -99
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +20 -7
- data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +17 -15
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +7 -17
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +11 -0
- data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +13 -14
- data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +3 -4
- data/src/core/ext/filters/client_channel/resolver/polling_resolver.h +5 -6
- data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +4 -13
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +162 -165
- data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +37 -30
- data/src/core/ext/filters/client_channel/resolver_result_parsing.h +7 -10
- data/src/core/ext/filters/client_channel/retry_filter.cc +0 -7
- data/src/core/ext/filters/client_channel/retry_service_config.cc +30 -19
- data/src/core/ext/filters/client_channel/retry_service_config.h +6 -9
- data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +6 -7
- data/src/core/ext/filters/client_channel/subchannel.cc +49 -89
- data/src/core/ext/filters/client_channel/subchannel.h +8 -8
- data/src/core/ext/filters/client_channel/subchannel_interface_internal.h +1 -1
- data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +6 -76
- data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +16 -25
- data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +3 -4
- data/src/core/ext/filters/deadline/deadline_filter.cc +6 -6
- data/src/core/ext/filters/deadline/deadline_filter.h +2 -3
- data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +1 -3
- data/src/core/ext/filters/fault_injection/fault_injection_filter.h +1 -1
- data/src/core/ext/filters/fault_injection/service_config_parser.cc +17 -12
- data/src/core/ext/filters/fault_injection/service_config_parser.h +4 -5
- data/src/core/ext/filters/http/client/http_client_filter.cc +2 -3
- data/src/core/ext/filters/http/client/http_client_filter.h +1 -1
- data/src/core/ext/filters/http/client_authority_filter.cc +1 -2
- data/src/core/ext/filters/http/client_authority_filter.h +1 -1
- data/src/core/ext/filters/http/server/http_server_filter.cc +2 -3
- data/src/core/ext/filters/http/server/http_server_filter.h +1 -1
- data/src/core/ext/filters/message_size/message_size_filter.cc +13 -7
- data/src/core/ext/filters/message_size/message_size_filter.h +3 -6
- data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +16 -12
- data/src/core/ext/filters/rbac/rbac_service_config_parser.h +4 -6
- data/src/core/ext/filters/server_config_selector/server_config_selector.h +5 -0
- data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +3 -5
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +35 -62
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +62 -89
- data/src/core/ext/transport/chttp2/server/chttp2_server.h +4 -6
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +130 -165
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +3 -2
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +67 -2
- data/src/core/ext/transport/chttp2/transport/flow_control.h +1 -0
- data/src/core/ext/transport/chttp2/transport/hpack_constants.h +7 -1
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +25 -8
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +4 -0
- data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +0 -1
- data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.h +8 -2
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +2 -10
- data/src/core/ext/transport/chttp2/transport/internal.h +2 -1
- data/src/core/ext/transport/inproc/inproc_transport.cc +40 -74
- data/src/core/ext/upb-generated/envoy/admin/v3/certs.upb.c +5 -5
- data/src/core/ext/upb-generated/envoy/admin/v3/certs.upb.h +30 -10
- data/src/core/ext/upb-generated/envoy/admin/v3/clusters.upb.c +4 -4
- data/src/core/ext/upb-generated/envoy/admin/v3/clusters.upb.h +24 -8
- data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.c +8 -327
- data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.h +83 -1723
- data/src/core/ext/upb-generated/envoy/admin/v3/config_dump_shared.upb.c +352 -0
- data/src/core/ext/upb-generated/envoy/admin/v3/config_dump_shared.upb.h +1768 -0
- data/src/core/ext/upb-generated/envoy/admin/v3/init_dump.upb.c +2 -2
- data/src/core/ext/upb-generated/envoy/admin/v3/init_dump.upb.h +12 -4
- data/src/core/ext/upb-generated/envoy/admin/v3/listeners.upb.c +6 -4
- data/src/core/ext/upb-generated/envoy/admin/v3/listeners.upb.h +33 -4
- data/src/core/ext/upb-generated/envoy/admin/v3/memory.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/admin/v3/memory.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/admin/v3/metrics.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/admin/v3/metrics.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/admin/v3/mutex_stats.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/admin/v3/server_info.upb.h +12 -4
- data/src/core/ext/upb-generated/envoy/admin/v3/tap.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/admin/v3/tap.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/annotations/resource.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +7 -3
- data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +14 -14
- data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +90 -30
- data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c +21 -19
- data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h +124 -34
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.c +3 -3
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.h +18 -6
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +23 -22
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +153 -48
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/config/common/matcher/v3/matcher.upb.c +11 -11
- data/src/core/ext/upb-generated/envoy/config/common/matcher/v3/matcher.upb.h +84 -28
- data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c +7 -7
- data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h +42 -14
- data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +25 -23
- data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +156 -48
- data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +7 -7
- data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +42 -14
- data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_method_list.upb.c +2 -2
- data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_method_list.upb.h +12 -4
- data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +12 -12
- data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +78 -26
- data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +9 -9
- data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +54 -18
- data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +21 -20
- data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +117 -44
- data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.c +2 -2
- data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.h +12 -4
- data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +3 -3
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h +18 -6
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +5 -5
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h +36 -12
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c +3 -3
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h +30 -10
- data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +37 -13
- data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +170 -15
- data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +5 -5
- data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +42 -14
- data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +7 -4
- data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +36 -4
- data/src/core/ext/upb-generated/envoy/config/metrics/v3/metrics_service.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/config/metrics/v3/metrics_service.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c +6 -6
- data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.h +48 -16
- data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c +8 -8
- data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h +54 -18
- data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +21 -9
- data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +100 -14
- data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +7 -22
- data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +36 -77
- data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +121 -76
- data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +647 -163
- data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c +3 -3
- data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h +18 -6
- data/src/core/ext/upb-generated/envoy/config/tap/v3/common.upb.c +34 -15
- data/src/core/ext/upb-generated/envoy/config/tap/v3/common.upb.h +161 -22
- data/src/core/ext/upb-generated/envoy/config/trace/v3/datadog.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/config/trace/v3/datadog.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/config/trace/v3/dynamic_ot.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/config/trace/v3/dynamic_ot.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +2 -2
- data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h +12 -4
- data/src/core/ext/upb-generated/envoy/config/trace/v3/lightstep.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/config/trace/v3/lightstep.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/config/trace/v3/opencensus.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/config/trace/v3/opencensus.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/config/trace/v3/opentelemetry.upb.c +46 -0
- data/src/core/ext/upb-generated/envoy/config/trace/v3/opentelemetry.upb.h +98 -0
- data/src/core/ext/upb-generated/envoy/config/trace/v3/service.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/config/trace/v3/service.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/config/trace/v3/skywalking.upb.c +2 -2
- data/src/core/ext/upb-generated/envoy/config/trace/v3/skywalking.upb.h +12 -4
- data/src/core/ext/upb-generated/envoy/config/trace/v3/trace.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/config/trace/v3/trace.upb.h +1 -0
- data/src/core/ext/upb-generated/envoy/config/trace/v3/xray.upb.c +2 -2
- data/src/core/ext/upb-generated/envoy/config/trace/v3/xray.upb.h +12 -4
- data/src/core/ext/upb-generated/envoy/config/trace/v3/zipkin.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/config/trace/v3/zipkin.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.c +2 -2
- data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.h +30 -10
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c +2 -2
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h +18 -6
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.c +11 -4
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.h +58 -4
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +35 -27
- data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +177 -52
- data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +10 -8
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +66 -14
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +3 -3
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +18 -6
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +5 -5
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +42 -14
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upb.c +2 -2
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upb.h +12 -4
- data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +131 -16
- data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +632 -12
- data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +2 -2
- data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.h +12 -4
- data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c +5 -5
- data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h +30 -10
- data/src/core/ext/upb-generated/envoy/type/http/v3/cookie.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/type/http/v3/cookie.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.c +4 -4
- data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.h +24 -8
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/http_inputs.upb.c +4 -4
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/http_inputs.upb.h +24 -8
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c +2 -2
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h +12 -4
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +3 -3
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.h +18 -6
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.h +12 -4
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.c +2 -2
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.h +12 -4
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.c +3 -3
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.h +18 -6
- data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.c +7 -7
- data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.h +42 -14
- data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.c +5 -5
- data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.h +30 -10
- data/src/core/ext/upb-generated/envoy/type/v3/hash_policy.upb.c +3 -3
- data/src/core/ext/upb-generated/envoy/type/v3/hash_policy.upb.h +18 -6
- data/src/core/ext/upb-generated/envoy/type/v3/http_status.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/type/v3/http_status.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.h +12 -4
- data/src/core/ext/upb-generated/envoy/type/v3/range.upb.c +2 -2
- data/src/core/ext/upb-generated/envoy/type/v3/range.upb.h +18 -6
- data/src/core/ext/upb-generated/envoy/type/v3/ratelimit_strategy.upb.c +63 -0
- data/src/core/ext/upb-generated/envoy/type/v3/ratelimit_strategy.upb.h +202 -0
- data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/type/v3/token_bucket.upb.h +6 -2
- data/src/core/ext/upb-generated/google/api/annotations.upb.h +1 -1
- data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.c +11 -11
- data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.h +66 -22
- data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +9 -9
- data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +72 -24
- data/src/core/ext/upb-generated/google/api/http.upb.c +3 -3
- data/src/core/ext/upb-generated/google/api/http.upb.h +18 -6
- data/src/core/ext/upb-generated/google/api/httpbody.upb.c +1 -1
- data/src/core/ext/upb-generated/google/api/httpbody.upb.h +6 -2
- data/src/core/ext/upb-generated/google/protobuf/any.upb.c +1 -1
- data/src/core/ext/upb-generated/google/protobuf/any.upb.h +6 -2
- data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +44 -43
- data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +177 -55
- data/src/core/ext/upb-generated/google/protobuf/duration.upb.c +1 -1
- data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +6 -2
- data/src/core/ext/upb-generated/google/protobuf/empty.upb.c +1 -1
- data/src/core/ext/upb-generated/google/protobuf/empty.upb.h +6 -2
- data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +2 -2
- data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +18 -6
- data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.c +1 -1
- data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +6 -2
- data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.c +6 -6
- data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +54 -18
- data/src/core/ext/upb-generated/google/rpc/status.upb.c +1 -1
- data/src/core/ext/upb-generated/google/rpc/status.upb.h +6 -2
- data/src/core/ext/upb-generated/opencensus/proto/trace/v1/trace_config.upb.c +2 -2
- data/src/core/ext/upb-generated/opencensus/proto/trace/v1/trace_config.upb.h +24 -8
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +6 -2
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +7 -7
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +60 -20
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c +1 -1
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +12 -4
- data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c +2 -2
- data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +12 -4
- data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c +6 -6
- data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +54 -18
- data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c +2 -2
- data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h +12 -4
- data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.c +7 -7
- data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.h +42 -14
- data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.c +3 -3
- data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +23 -11
- data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +1 -1
- data/src/core/ext/upb-generated/udpa/annotations/security.upb.h +7 -3
- data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +7 -3
- data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.c +1 -1
- data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.h +7 -3
- data/src/core/ext/upb-generated/validate/validate.upb.c +22 -22
- data/src/core/ext/upb-generated/validate/validate.upb.h +139 -47
- data/src/core/ext/upb-generated/xds/annotations/v3/migrate.upb.c +3 -3
- data/src/core/ext/upb-generated/xds/annotations/v3/migrate.upb.h +23 -11
- data/src/core/ext/upb-generated/xds/annotations/v3/security.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/annotations/v3/security.upb.h +7 -3
- data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.c +3 -3
- data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.h +27 -11
- data/src/core/ext/upb-generated/xds/annotations/v3/versioning.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/annotations/v3/versioning.upb.h +7 -3
- data/src/core/ext/upb-generated/xds/core/v3/authority.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/core/v3/authority.upb.h +6 -2
- data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +2 -2
- data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.h +12 -4
- data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.h +6 -2
- data/src/core/ext/upb-generated/xds/core/v3/extension.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/core/v3/extension.upb.h +6 -2
- data/src/core/ext/upb-generated/xds/core/v3/resource.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/core/v3/resource.upb.h +6 -2
- data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.h +12 -4
- data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.h +6 -2
- data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +6 -2
- data/src/core/ext/upb-generated/xds/service/orca/v3/orca.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/service/orca/v3/orca.upb.h +6 -2
- data/src/core/ext/upb-generated/xds/type/matcher/v3/matcher.upb.c +6 -6
- data/src/core/ext/upb-generated/xds/type/matcher/v3/matcher.upb.h +54 -18
- data/src/core/ext/upb-generated/xds/type/matcher/v3/regex.upb.c +2 -2
- data/src/core/ext/upb-generated/xds/type/matcher/v3/regex.upb.h +12 -4
- data/src/core/ext/upb-generated/xds/type/matcher/v3/string.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/type/matcher/v3/string.upb.h +12 -4
- data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.h +6 -2
- data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.c +67 -274
- data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.h +0 -85
- data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump_shared.upbdefs.c +256 -0
- data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump_shared.upbdefs.h +115 -0
- data/src/core/ext/upbdefs-generated/envoy/admin/v3/listeners.upbdefs.c +14 -11
- data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c +107 -107
- data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +191 -187
- data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +156 -154
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +186 -183
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +136 -134
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c +16 -16
- data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c +162 -139
- data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h +5 -0
- data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c +39 -31
- data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.c +12 -8
- data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.h +5 -0
- data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c +72 -75
- data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.h +0 -5
- data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +713 -670
- data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h +10 -0
- data/src/core/ext/upbdefs-generated/envoy/config/tap/v3/common.upbdefs.c +150 -139
- data/src/core/ext/upbdefs-generated/envoy/config/tap/v3/common.upbdefs.h +5 -0
- data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/opentelemetry.upbdefs.c +47 -0
- data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/opentelemetry.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/trace.upbdefs.c +16 -12
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.c +46 -25
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +477 -466
- data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +21 -18
- data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c +153 -84
- data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c +113 -113
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c +29 -28
- data/src/core/ext/upbdefs-generated/envoy/type/v3/ratelimit_strategy.upbdefs.c +69 -0
- data/src/core/ext/upbdefs-generated/envoy/type/v3/ratelimit_strategy.upbdefs.h +40 -0
- data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c +92 -90
- data/src/core/ext/xds/upb_utils.h +0 -21
- data/src/core/ext/xds/xds_api.cc +53 -86
- data/src/core/ext/xds/xds_api.h +19 -28
- data/src/core/ext/xds/xds_bootstrap.cc +39 -52
- data/src/core/ext/xds/xds_bootstrap.h +28 -8
- data/src/core/ext/xds/xds_certificate_provider.h +9 -0
- data/src/core/ext/xds/xds_channel_stack_modifier.cc +6 -4
- data/src/core/ext/xds/xds_channel_stack_modifier.h +8 -0
- data/src/core/ext/xds/xds_client.cc +555 -1214
- data/src/core/ext/xds/xds_client.h +16 -44
- data/src/core/ext/xds/xds_client_grpc.cc +291 -0
- data/src/core/ext/xds/xds_client_grpc.h +102 -0
- data/src/core/ext/xds/xds_cluster.cc +92 -103
- data/src/core/ext/xds/xds_cluster.h +6 -5
- data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +10 -14
- data/src/core/ext/xds/xds_cluster_specifier_plugin.h +1 -0
- data/src/core/ext/xds/xds_common_types.cc +134 -110
- data/src/core/ext/xds/xds_common_types.h +6 -7
- data/src/core/ext/xds/xds_endpoint.cc +80 -80
- data/src/core/ext/xds/xds_endpoint.h +4 -4
- data/src/core/ext/xds/xds_http_fault_filter.cc +4 -11
- data/src/core/ext/xds/xds_http_fault_filter.h +3 -3
- data/src/core/ext/xds/xds_http_filters.h +3 -3
- data/src/core/ext/xds/xds_http_rbac_filter.cc +39 -58
- data/src/core/ext/xds/xds_http_rbac_filter.h +3 -3
- data/src/core/ext/xds/xds_lb_policy_registry.cc +17 -20
- data/src/core/ext/xds/xds_lb_policy_registry.h +4 -4
- data/src/core/ext/xds/xds_listener.cc +329 -299
- data/src/core/ext/xds/xds_listener.h +4 -4
- data/src/core/ext/xds/xds_resource_type.h +13 -2
- data/src/core/ext/xds/xds_route_config.cc +180 -177
- data/src/core/ext/xds/xds_route_config.h +31 -17
- data/src/core/ext/xds/xds_routing.cc +3 -6
- data/src/core/ext/xds/xds_routing.h +7 -9
- data/src/core/ext/xds/xds_server_config_fetcher.cc +76 -81
- data/src/core/ext/xds/xds_transport.h +86 -0
- data/src/core/ext/xds/xds_transport_grpc.cc +349 -0
- data/src/core/ext/xds/xds_transport_grpc.h +135 -0
- data/src/core/lib/address_utils/parse_address.cc +19 -17
- data/src/core/lib/address_utils/parse_address.h +8 -5
- data/src/core/lib/avl/avl.h +47 -25
- data/src/core/lib/channel/call_tracer.h +1 -1
- data/src/core/lib/channel/channel_args.cc +88 -19
- data/src/core/lib/channel/channel_args.h +113 -62
- data/src/core/lib/channel/channel_stack.cc +0 -1
- data/src/core/lib/channel/channel_stack_builder.cc +3 -3
- data/src/core/lib/channel/channel_stack_builder.h +2 -2
- data/src/core/lib/channel/channel_stack_builder_impl.cc +2 -4
- data/src/core/lib/channel/channelz.cc +27 -37
- data/src/core/lib/channel/channelz.h +9 -0
- data/src/core/lib/channel/promise_based_filter.h +0 -1
- data/src/core/lib/config/core_configuration.h +48 -35
- data/src/core/lib/debug/stats.cc +12 -15
- data/src/core/lib/debug/stats.h +11 -3
- data/src/core/lib/event_engine/{event_engine.cc → default_event_engine.cc} +9 -5
- data/src/core/lib/event_engine/{event_engine_factory.h → default_event_engine.h} +4 -8
- data/src/core/lib/event_engine/default_event_engine_factory.cc +20 -3
- data/src/core/lib/event_engine/default_event_engine_factory.h +33 -0
- data/src/core/lib/event_engine/executor/executor.h +38 -0
- data/src/core/lib/event_engine/executor/threaded_executor.cc +36 -0
- data/src/core/lib/event_engine/executor/threaded_executor.h +44 -0
- data/src/core/lib/event_engine/forkable.cc +98 -0
- data/src/core/lib/event_engine/forkable.h +61 -0
- data/src/core/lib/event_engine/poller.h +54 -0
- data/src/core/lib/event_engine/{iomgr_engine/iomgr_engine.cc → posix_engine/posix_engine.cc} +30 -47
- data/src/core/lib/event_engine/{iomgr_engine/iomgr_engine.h → posix_engine/posix_engine.h} +27 -28
- data/src/core/lib/event_engine/{iomgr_engine → posix_engine}/timer.cc +4 -5
- data/src/core/lib/event_engine/{iomgr_engine → posix_engine}/timer.h +8 -8
- data/src/core/lib/event_engine/{iomgr_engine → posix_engine}/timer_heap.cc +4 -4
- data/src/core/lib/event_engine/{iomgr_engine → posix_engine}/timer_heap.h +5 -5
- data/src/core/lib/event_engine/{iomgr_engine → posix_engine}/timer_manager.cc +46 -10
- data/src/core/lib/event_engine/{iomgr_engine → posix_engine}/timer_manager.h +17 -8
- data/src/core/lib/event_engine/promise.h +11 -2
- data/src/core/lib/event_engine/socket_notifier.h +55 -0
- data/src/core/lib/event_engine/{iomgr_engine/thread_pool.cc → thread_pool.cc} +49 -14
- data/src/core/lib/event_engine/{iomgr_engine/thread_pool.h → thread_pool.h} +21 -10
- data/src/core/lib/event_engine/utils.cc +49 -0
- data/src/core/lib/event_engine/utils.h +40 -0
- data/src/core/lib/event_engine/windows/iocp.cc +149 -0
- data/src/core/lib/event_engine/windows/iocp.h +68 -0
- data/src/core/lib/event_engine/windows/win_socket.cc +196 -0
- data/src/core/lib/event_engine/windows/win_socket.h +120 -0
- data/src/core/lib/event_engine/windows/windows_engine.cc +159 -0
- data/src/core/lib/event_engine/windows/windows_engine.h +120 -0
- data/src/core/lib/gpr/time.cc +11 -9
- data/src/core/lib/gpr/useful.h +29 -0
- data/src/core/lib/gprpp/bitset.h +3 -13
- data/src/core/lib/gprpp/debug_location.h +39 -7
- data/src/core/lib/gprpp/manual_constructor.h +0 -1
- data/src/core/lib/gprpp/no_destruct.h +94 -0
- data/src/core/lib/gprpp/ref_counted_ptr.h +0 -1
- data/src/core/lib/gprpp/status_helper.cc +1 -0
- data/src/core/lib/gprpp/table.h +0 -1
- data/src/core/lib/{event_engine/iomgr_engine → gprpp}/time_averaged_stats.cc +3 -5
- data/src/core/lib/{event_engine/iomgr_engine → gprpp}/time_averaged_stats.h +5 -7
- data/src/core/lib/{iomgr → gprpp}/work_serializer.cc +34 -18
- data/src/core/lib/{iomgr → gprpp}/work_serializer.h +21 -27
- data/src/core/lib/http/httpcli.cc +12 -24
- data/src/core/lib/http/httpcli_security_connector.cc +11 -11
- data/src/core/lib/iomgr/call_combiner.cc +0 -26
- data/src/core/lib/iomgr/closure.h +0 -9
- data/src/core/lib/iomgr/combiner.cc +0 -20
- data/src/core/lib/iomgr/endpoint_pair_posix.cc +2 -1
- data/src/core/lib/iomgr/error.cc +0 -773
- data/src/core/lib/iomgr/error.h +0 -145
- data/src/core/lib/iomgr/error_cfstream.cc +0 -5
- data/src/core/lib/iomgr/ev_poll_posix.cc +17 -9
- data/src/core/lib/iomgr/exec_ctx.cc +0 -12
- data/src/core/lib/iomgr/executor.cc +0 -10
- data/src/core/lib/iomgr/executor.h +0 -3
- data/src/core/lib/iomgr/lockfree_event.cc +0 -17
- data/src/core/lib/iomgr/port.h +3 -0
- data/src/core/lib/iomgr/resolve_address.h +29 -6
- data/src/core/lib/iomgr/resolve_address_posix.cc +38 -8
- data/src/core/lib/iomgr/resolve_address_posix.h +19 -5
- data/src/core/lib/iomgr/resolve_address_windows.cc +40 -10
- data/src/core/lib/iomgr/resolve_address_windows.h +19 -5
- data/src/core/lib/iomgr/socket_windows.h +0 -2
- data/src/core/lib/iomgr/tcp_posix.cc +118 -6
- data/src/core/lib/iomgr/timer_generic.cc +6 -8
- data/src/core/lib/json/json.h +19 -22
- data/src/core/lib/json/json_args.h +34 -0
- data/src/core/lib/json/json_object_loader.cc +233 -0
- data/src/core/lib/json/json_object_loader.h +618 -0
- data/src/core/lib/json/json_reader.cc +86 -62
- data/src/core/lib/json/json_util.cc +8 -36
- data/src/core/{ext/filters/client_channel → lib/load_balancing}/lb_policy.cc +3 -44
- data/src/core/{ext/filters/client_channel → lib/load_balancing}/lb_policy.h +15 -24
- data/src/core/lib/load_balancing/lb_policy_factory.h +49 -0
- data/src/core/{ext/filters/client_channel → lib/load_balancing}/lb_policy_registry.cc +49 -72
- data/src/core/{ext/filters/client_channel → lib/load_balancing}/lb_policy_registry.h +27 -27
- data/src/core/{ext/filters/client_channel → lib/load_balancing}/subchannel_interface.h +6 -6
- data/src/core/lib/promise/activity.h +56 -8
- data/src/core/lib/promise/arena_promise.h +84 -81
- data/src/core/lib/promise/context.h +0 -1
- data/src/core/lib/promise/detail/basic_seq.h +43 -23
- data/src/core/lib/promise/detail/promise_factory.h +0 -1
- data/src/core/lib/promise/map.h +0 -1
- data/src/core/lib/promise/seq.h +25 -4
- data/src/core/lib/promise/sleep.cc +38 -42
- data/src/core/lib/promise/sleep.h +27 -24
- data/src/core/lib/promise/try_seq.h +26 -6
- data/src/core/lib/resolver/resolver.cc +0 -47
- data/src/core/lib/resolver/resolver.h +2 -12
- data/src/core/lib/resolver/resolver_factory.h +2 -3
- data/src/core/lib/resolver/resolver_registry.cc +1 -1
- data/src/core/lib/resolver/resolver_registry.h +2 -3
- data/src/core/lib/resolver/server_address.cc +11 -15
- data/src/core/lib/resolver/server_address.h +4 -8
- data/src/core/lib/resource_quota/api.cc +1 -1
- data/src/core/lib/resource_quota/arena.cc +21 -1
- data/src/core/lib/resource_quota/arena.h +24 -2
- data/src/core/lib/resource_quota/memory_quota.cc +157 -17
- data/src/core/lib/resource_quota/memory_quota.h +98 -17
- data/src/core/lib/resource_quota/periodic_update.cc +79 -0
- data/src/core/lib/resource_quota/periodic_update.h +71 -0
- data/src/core/lib/security/authorization/evaluate_args.cc +10 -7
- data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +1 -2
- data/src/core/lib/security/authorization/grpc_server_authz_filter.h +1 -1
- data/src/core/lib/security/authorization/matchers.cc +13 -10
- data/src/core/lib/security/authorization/rbac_policy.cc +0 -1
- data/src/core/lib/security/credentials/alts/alts_credentials.cc +2 -3
- data/src/core/lib/security/credentials/alts/alts_credentials.h +3 -4
- data/src/core/lib/security/credentials/composite/composite_credentials.cc +3 -7
- data/src/core/lib/security/credentials/composite/composite_credentials.h +2 -4
- data/src/core/lib/security/credentials/credentials.h +16 -12
- data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +18 -11
- data/src/core/lib/security/credentials/external/external_account_credentials.cc +32 -23
- data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +5 -6
- data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +4 -6
- data/src/core/lib/security/credentials/fake/fake_credentials.cc +3 -12
- data/src/core/lib/security/credentials/fake/fake_credentials.h +0 -4
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +29 -26
- data/src/core/lib/security/credentials/google_default/google_default_credentials.h +1 -3
- data/src/core/lib/security/credentials/iam/iam_credentials.cc +0 -1
- data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +3 -3
- data/src/core/lib/security/credentials/insecure/insecure_credentials.h +3 -4
- data/src/core/lib/security/credentials/jwt/json_token.cc +12 -3
- data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +4 -8
- data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +11 -13
- data/src/core/lib/security/credentials/local/local_credentials.cc +3 -4
- data/src/core/lib/security/credentials/local/local_credentials.h +3 -4
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +17 -18
- data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +0 -1
- data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +13 -21
- data/src/core/lib/security/credentials/ssl/ssl_credentials.h +3 -4
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +6 -0
- data/src/core/lib/security/credentials/tls/tls_credentials.cc +13 -25
- data/src/core/lib/security/credentials/tls/tls_credentials.h +3 -4
- data/src/core/lib/security/credentials/xds/xds_credentials.cc +13 -30
- data/src/core/lib/security/credentials/xds/xds_credentials.h +3 -3
- data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +10 -18
- data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +26 -38
- data/src/core/lib/security/security_connector/fake/fake_security_connector.h +2 -2
- data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +5 -5
- data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +6 -5
- data/src/core/lib/security/security_connector/local/local_security_connector.cc +13 -11
- data/src/core/lib/security/security_connector/local/local_security_connector.h +2 -2
- data/src/core/lib/security/security_connector/security_connector.h +5 -3
- data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +5 -4
- data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +5 -5
- data/src/core/lib/security/security_connector/tls/tls_security_connector.h +5 -5
- data/src/core/lib/security/transport/auth_filters.h +1 -1
- data/src/core/lib/security/transport/client_auth_filter.cc +3 -4
- data/src/core/lib/security/transport/security_handshaker.cc +32 -44
- data/src/core/lib/security/transport/security_handshaker.h +2 -1
- data/src/core/lib/service_config/service_config.h +11 -0
- data/src/core/lib/service_config/service_config_impl.cc +98 -97
- data/src/core/lib/service_config/service_config_impl.h +11 -13
- data/src/core/lib/service_config/service_config_parser.cc +26 -27
- data/src/core/lib/service_config/service_config_parser.h +10 -22
- data/src/core/lib/slice/percent_encoding.cc +4 -13
- data/src/core/lib/slice/slice.cc +10 -4
- data/src/core/lib/surface/call.cc +8 -2
- data/src/core/lib/surface/channel.cc +6 -6
- data/src/core/lib/surface/channel.h +1 -1
- data/src/core/lib/surface/completion_queue.cc +0 -2
- data/src/core/lib/surface/completion_queue.h +0 -3
- data/src/core/lib/surface/init.cc +2 -6
- data/src/core/lib/surface/lame_client.cc +2 -3
- data/src/core/lib/surface/lame_client.h +1 -1
- data/src/core/lib/surface/server.cc +7 -12
- data/src/core/lib/surface/server.h +7 -7
- data/src/core/lib/surface/validate_metadata.cc +4 -14
- data/src/core/lib/surface/version.cc +2 -2
- data/src/core/lib/transport/connectivity_state.cc +0 -1
- data/src/core/lib/transport/connectivity_state.h +1 -1
- data/src/core/lib/transport/error_utils.cc +0 -36
- data/src/core/lib/transport/handshaker.cc +7 -9
- data/src/core/lib/transport/handshaker.h +4 -5
- data/src/core/lib/transport/handshaker_factory.h +2 -3
- data/src/core/lib/transport/handshaker_registry.cc +2 -1
- data/src/core/lib/transport/handshaker_registry.h +2 -4
- data/src/core/lib/transport/http_connect_handshaker.cc +16 -16
- data/src/core/lib/transport/metadata_batch.cc +5 -0
- data/src/core/lib/transport/metadata_batch.h +52 -7
- data/src/core/lib/transport/parsed_metadata.h +0 -1
- data/src/core/lib/transport/tcp_connect_handshaker.cc +12 -18
- data/src/core/lib/transport/transport.h +0 -7
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +40 -21
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +1 -1
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +14 -7
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h +1 -1
- data/src/core/tsi/fake_transport_security.cc +53 -30
- data/src/core/tsi/local_transport_security.cc +9 -5
- data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +10 -1
- data/src/core/tsi/ssl_transport_security.cc +47 -23
- data/src/core/tsi/transport_security.cc +18 -6
- data/src/core/tsi/transport_security.h +2 -1
- data/src/core/tsi/transport_security_interface.h +17 -5
- data/src/ruby/ext/grpc/extconf.rb +2 -0
- data/src/ruby/ext/grpc/rb_loader.c +6 -2
- data/src/ruby/lib/grpc/2.5/grpc_c.so +0 -0
- data/src/ruby/lib/grpc/2.6/grpc_c.so +0 -0
- data/src/ruby/lib/grpc/2.7/grpc_c.so +0 -0
- data/src/ruby/lib/grpc/3.0/grpc_c.so +0 -0
- data/src/ruby/lib/grpc/3.1/grpc_c.so +0 -0
- data/src/ruby/lib/grpc/grpc_c.so +0 -0
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +4 -0
- data/third_party/abseil-cpp/absl/functional/any_invocable.h +313 -0
- data/third_party/abseil-cpp/absl/functional/internal/any_invocable.h +857 -0
- data/third_party/upb/third_party/utf8_range/utf8_range.h +1 -1
- data/third_party/upb/upb/arena.c +277 -0
- data/third_party/upb/upb/arena.h +225 -0
- data/third_party/upb/upb/array.c +114 -0
- data/third_party/upb/upb/array.h +83 -0
- data/third_party/upb/upb/collections.h +36 -0
- data/third_party/upb/upb/decode.c +161 -65
- data/third_party/upb/upb/decode.h +1 -0
- data/third_party/upb/upb/decode_fast.c +1 -1
- data/third_party/upb/upb/def.c +10 -2
- data/third_party/upb/upb/def.h +8 -1
- data/third_party/upb/upb/def.hpp +7 -4
- data/third_party/upb/upb/encode.c +29 -20
- data/third_party/upb/upb/encode.h +16 -6
- data/third_party/upb/upb/extension_registry.c +93 -0
- data/third_party/upb/upb/extension_registry.h +84 -0
- data/third_party/upb/upb/{decode_internal.h → internal/decode.h} +5 -5
- data/third_party/upb/upb/internal/table.h +385 -0
- data/third_party/upb/upb/{upb_internal.h → internal/upb.h} +3 -3
- data/third_party/upb/upb/internal/vsnprintf_compat.h +52 -0
- data/third_party/upb/upb/json_decode.c +1512 -0
- data/third_party/upb/upb/json_decode.h +47 -0
- data/third_party/upb/upb/json_encode.c +7 -3
- data/third_party/upb/upb/json_encode.h +6 -3
- data/third_party/upb/upb/map.c +108 -0
- data/third_party/upb/upb/map.h +117 -0
- data/third_party/upb/upb/message_value.h +66 -0
- data/third_party/upb/upb/mini_table.c +1147 -0
- data/third_party/upb/upb/mini_table.h +189 -0
- data/third_party/upb/upb/mini_table.hpp +112 -0
- data/third_party/upb/upb/msg.c +2 -62
- data/third_party/upb/upb/msg.h +2 -45
- data/third_party/upb/upb/msg_internal.h +28 -22
- data/third_party/upb/upb/port_def.inc +2 -1
- data/third_party/upb/upb/port_undef.inc +1 -0
- data/third_party/upb/upb/reflection.c +2 -159
- data/third_party/upb/upb/reflection.h +2 -112
- data/third_party/upb/upb/status.c +86 -0
- data/third_party/upb/upb/status.h +66 -0
- data/third_party/upb/upb/table.c +2 -2
- data/third_party/upb/upb/table_internal.h +3 -352
- data/third_party/upb/upb/text_encode.c +3 -2
- data/third_party/upb/upb/upb.c +4 -290
- data/third_party/upb/upb/upb.h +7 -196
- metadata +90 -38
- data/src/core/ext/filters/client_channel/lb_policy_factory.h +0 -50
- data/src/core/lib/iomgr/error_internal.h +0 -66
- data/src/core/lib/iomgr/executor/mpmcqueue.cc +0 -182
- data/src/core/lib/iomgr/executor/mpmcqueue.h +0 -171
- data/src/core/lib/iomgr/executor/threadpool.cc +0 -136
- data/src/core/lib/iomgr/executor/threadpool.h +0 -150
- data/src/core/lib/iomgr/time_averaged_stats.cc +0 -64
- data/src/core/lib/iomgr/time_averaged_stats.h +0 -72
- data/src/core/lib/promise/detail/switch.h +0 -1455
@@ -0,0 +1,1512 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright (c) 2009-2021, Google LLC
|
3
|
+
* All rights reserved.
|
4
|
+
*
|
5
|
+
* Redistribution and use in source and binary forms, with or without
|
6
|
+
* modification, are permitted provided that the following conditions are met:
|
7
|
+
* * Redistributions of source code must retain the above copyright
|
8
|
+
* notice, this list of conditions and the following disclaimer.
|
9
|
+
* * Redistributions in binary form must reproduce the above copyright
|
10
|
+
* notice, this list of conditions and the following disclaimer in the
|
11
|
+
* documentation and/or other materials provided with the distribution.
|
12
|
+
* * Neither the name of Google LLC nor the
|
13
|
+
* names of its contributors may be used to endorse or promote products
|
14
|
+
* derived from this software without specific prior written permission.
|
15
|
+
*
|
16
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
17
|
+
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
18
|
+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
19
|
+
* ARE DISCLAIMED. IN NO EVENT SHALL Google LLC BE LIABLE FOR ANY DIRECT,
|
20
|
+
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
21
|
+
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
22
|
+
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
23
|
+
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
24
|
+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
25
|
+
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
26
|
+
*/
|
27
|
+
|
28
|
+
#include "upb/json_decode.h"
|
29
|
+
|
30
|
+
#include <errno.h>
|
31
|
+
#include <float.h>
|
32
|
+
#include <inttypes.h>
|
33
|
+
#include <limits.h>
|
34
|
+
#include <math.h>
|
35
|
+
#include <setjmp.h>
|
36
|
+
#include <stdlib.h>
|
37
|
+
#include <string.h>
|
38
|
+
|
39
|
+
#include "upb/encode.h"
|
40
|
+
#include "upb/reflection.h"
|
41
|
+
|
42
|
+
/* Special header, must be included last. */
|
43
|
+
#include "upb/port_def.inc"
|
44
|
+
|
45
|
+
typedef struct {
|
46
|
+
const char *ptr, *end;
|
47
|
+
upb_Arena* arena; /* TODO: should we have a tmp arena for tmp data? */
|
48
|
+
const upb_DefPool* symtab;
|
49
|
+
int depth;
|
50
|
+
upb_Status* status;
|
51
|
+
jmp_buf err;
|
52
|
+
int line;
|
53
|
+
const char* line_begin;
|
54
|
+
bool is_first;
|
55
|
+
int options;
|
56
|
+
const upb_FieldDef* debug_field;
|
57
|
+
} jsondec;
|
58
|
+
|
59
|
+
enum { JD_OBJECT, JD_ARRAY, JD_STRING, JD_NUMBER, JD_TRUE, JD_FALSE, JD_NULL };
|
60
|
+
|
61
|
+
/* Forward declarations of mutually-recursive functions. */
|
62
|
+
static void jsondec_wellknown(jsondec* d, upb_Message* msg,
|
63
|
+
const upb_MessageDef* m);
|
64
|
+
static upb_MessageValue jsondec_value(jsondec* d, const upb_FieldDef* f);
|
65
|
+
static void jsondec_wellknownvalue(jsondec* d, upb_Message* msg,
|
66
|
+
const upb_MessageDef* m);
|
67
|
+
static void jsondec_object(jsondec* d, upb_Message* msg,
|
68
|
+
const upb_MessageDef* m);
|
69
|
+
|
70
|
+
static bool jsondec_streql(upb_StringView str, const char* lit) {
|
71
|
+
return str.size == strlen(lit) && memcmp(str.data, lit, str.size) == 0;
|
72
|
+
}
|
73
|
+
|
74
|
+
static bool jsondec_isnullvalue(const upb_FieldDef* f) {
|
75
|
+
return upb_FieldDef_CType(f) == kUpb_CType_Enum &&
|
76
|
+
strcmp(upb_EnumDef_FullName(upb_FieldDef_EnumSubDef(f)),
|
77
|
+
"google.protobuf.NullValue") == 0;
|
78
|
+
}
|
79
|
+
|
80
|
+
static bool jsondec_isvalue(const upb_FieldDef* f) {
|
81
|
+
return (upb_FieldDef_CType(f) == kUpb_CType_Message &&
|
82
|
+
upb_MessageDef_WellKnownType(upb_FieldDef_MessageSubDef(f)) ==
|
83
|
+
kUpb_WellKnown_Value) ||
|
84
|
+
jsondec_isnullvalue(f);
|
85
|
+
}
|
86
|
+
|
87
|
+
UPB_NORETURN static void jsondec_err(jsondec* d, const char* msg) {
|
88
|
+
upb_Status_SetErrorFormat(d->status, "Error parsing JSON @%d:%d: %s", d->line,
|
89
|
+
(int)(d->ptr - d->line_begin), msg);
|
90
|
+
UPB_LONGJMP(d->err, 1);
|
91
|
+
}
|
92
|
+
|
93
|
+
UPB_PRINTF(2, 3)
|
94
|
+
UPB_NORETURN static void jsondec_errf(jsondec* d, const char* fmt, ...) {
|
95
|
+
va_list argp;
|
96
|
+
upb_Status_SetErrorFormat(d->status, "Error parsing JSON @%d:%d: ", d->line,
|
97
|
+
(int)(d->ptr - d->line_begin));
|
98
|
+
va_start(argp, fmt);
|
99
|
+
upb_Status_VAppendErrorFormat(d->status, fmt, argp);
|
100
|
+
va_end(argp);
|
101
|
+
UPB_LONGJMP(d->err, 1);
|
102
|
+
}
|
103
|
+
|
104
|
+
static void jsondec_skipws(jsondec* d) {
|
105
|
+
while (d->ptr != d->end) {
|
106
|
+
switch (*d->ptr) {
|
107
|
+
case '\n':
|
108
|
+
d->line++;
|
109
|
+
d->line_begin = d->ptr;
|
110
|
+
/* Fallthrough. */
|
111
|
+
case '\r':
|
112
|
+
case '\t':
|
113
|
+
case ' ':
|
114
|
+
d->ptr++;
|
115
|
+
break;
|
116
|
+
default:
|
117
|
+
return;
|
118
|
+
}
|
119
|
+
}
|
120
|
+
jsondec_err(d, "Unexpected EOF");
|
121
|
+
}
|
122
|
+
|
123
|
+
static bool jsondec_tryparsech(jsondec* d, char ch) {
|
124
|
+
if (d->ptr == d->end || *d->ptr != ch) return false;
|
125
|
+
d->ptr++;
|
126
|
+
return true;
|
127
|
+
}
|
128
|
+
|
129
|
+
static void jsondec_parselit(jsondec* d, const char* lit) {
|
130
|
+
size_t avail = d->end - d->ptr;
|
131
|
+
size_t len = strlen(lit);
|
132
|
+
if (avail < len || memcmp(d->ptr, lit, len) != 0) {
|
133
|
+
jsondec_errf(d, "Expected: '%s'", lit);
|
134
|
+
}
|
135
|
+
d->ptr += len;
|
136
|
+
}
|
137
|
+
|
138
|
+
static void jsondec_wsch(jsondec* d, char ch) {
|
139
|
+
jsondec_skipws(d);
|
140
|
+
if (!jsondec_tryparsech(d, ch)) {
|
141
|
+
jsondec_errf(d, "Expected: '%c'", ch);
|
142
|
+
}
|
143
|
+
}
|
144
|
+
|
145
|
+
static void jsondec_true(jsondec* d) { jsondec_parselit(d, "true"); }
|
146
|
+
static void jsondec_false(jsondec* d) { jsondec_parselit(d, "false"); }
|
147
|
+
static void jsondec_null(jsondec* d) { jsondec_parselit(d, "null"); }
|
148
|
+
|
149
|
+
static void jsondec_entrysep(jsondec* d) {
|
150
|
+
jsondec_skipws(d);
|
151
|
+
jsondec_parselit(d, ":");
|
152
|
+
}
|
153
|
+
|
154
|
+
static int jsondec_rawpeek(jsondec* d) {
|
155
|
+
switch (*d->ptr) {
|
156
|
+
case '{':
|
157
|
+
return JD_OBJECT;
|
158
|
+
case '[':
|
159
|
+
return JD_ARRAY;
|
160
|
+
case '"':
|
161
|
+
return JD_STRING;
|
162
|
+
case '-':
|
163
|
+
case '0':
|
164
|
+
case '1':
|
165
|
+
case '2':
|
166
|
+
case '3':
|
167
|
+
case '4':
|
168
|
+
case '5':
|
169
|
+
case '6':
|
170
|
+
case '7':
|
171
|
+
case '8':
|
172
|
+
case '9':
|
173
|
+
return JD_NUMBER;
|
174
|
+
case 't':
|
175
|
+
return JD_TRUE;
|
176
|
+
case 'f':
|
177
|
+
return JD_FALSE;
|
178
|
+
case 'n':
|
179
|
+
return JD_NULL;
|
180
|
+
default:
|
181
|
+
jsondec_errf(d, "Unexpected character: '%c'", *d->ptr);
|
182
|
+
}
|
183
|
+
}
|
184
|
+
|
185
|
+
/* JSON object/array **********************************************************/
|
186
|
+
|
187
|
+
/* These are used like so:
|
188
|
+
*
|
189
|
+
* jsondec_objstart(d);
|
190
|
+
* while (jsondec_objnext(d)) {
|
191
|
+
* ...
|
192
|
+
* }
|
193
|
+
* jsondec_objend(d) */
|
194
|
+
|
195
|
+
static int jsondec_peek(jsondec* d) {
|
196
|
+
jsondec_skipws(d);
|
197
|
+
return jsondec_rawpeek(d);
|
198
|
+
}
|
199
|
+
|
200
|
+
static void jsondec_push(jsondec* d) {
|
201
|
+
if (--d->depth < 0) {
|
202
|
+
jsondec_err(d, "Recursion limit exceeded");
|
203
|
+
}
|
204
|
+
d->is_first = true;
|
205
|
+
}
|
206
|
+
|
207
|
+
static bool jsondec_seqnext(jsondec* d, char end_ch) {
|
208
|
+
bool is_first = d->is_first;
|
209
|
+
d->is_first = false;
|
210
|
+
jsondec_skipws(d);
|
211
|
+
if (*d->ptr == end_ch) return false;
|
212
|
+
if (!is_first) jsondec_parselit(d, ",");
|
213
|
+
return true;
|
214
|
+
}
|
215
|
+
|
216
|
+
static void jsondec_arrstart(jsondec* d) {
|
217
|
+
jsondec_push(d);
|
218
|
+
jsondec_wsch(d, '[');
|
219
|
+
}
|
220
|
+
|
221
|
+
static void jsondec_arrend(jsondec* d) {
|
222
|
+
d->depth++;
|
223
|
+
jsondec_wsch(d, ']');
|
224
|
+
}
|
225
|
+
|
226
|
+
static bool jsondec_arrnext(jsondec* d) { return jsondec_seqnext(d, ']'); }
|
227
|
+
|
228
|
+
static void jsondec_objstart(jsondec* d) {
|
229
|
+
jsondec_push(d);
|
230
|
+
jsondec_wsch(d, '{');
|
231
|
+
}
|
232
|
+
|
233
|
+
static void jsondec_objend(jsondec* d) {
|
234
|
+
d->depth++;
|
235
|
+
jsondec_wsch(d, '}');
|
236
|
+
}
|
237
|
+
|
238
|
+
static bool jsondec_objnext(jsondec* d) {
|
239
|
+
if (!jsondec_seqnext(d, '}')) return false;
|
240
|
+
if (jsondec_peek(d) != JD_STRING) {
|
241
|
+
jsondec_err(d, "Object must start with string");
|
242
|
+
}
|
243
|
+
return true;
|
244
|
+
}
|
245
|
+
|
246
|
+
/* JSON number ****************************************************************/
|
247
|
+
|
248
|
+
static bool jsondec_tryskipdigits(jsondec* d) {
|
249
|
+
const char* start = d->ptr;
|
250
|
+
|
251
|
+
while (d->ptr < d->end) {
|
252
|
+
if (*d->ptr < '0' || *d->ptr > '9') {
|
253
|
+
break;
|
254
|
+
}
|
255
|
+
d->ptr++;
|
256
|
+
}
|
257
|
+
|
258
|
+
return d->ptr != start;
|
259
|
+
}
|
260
|
+
|
261
|
+
static void jsondec_skipdigits(jsondec* d) {
|
262
|
+
if (!jsondec_tryskipdigits(d)) {
|
263
|
+
jsondec_err(d, "Expected one or more digits");
|
264
|
+
}
|
265
|
+
}
|
266
|
+
|
267
|
+
static double jsondec_number(jsondec* d) {
|
268
|
+
const char* start = d->ptr;
|
269
|
+
|
270
|
+
assert(jsondec_rawpeek(d) == JD_NUMBER);
|
271
|
+
|
272
|
+
/* Skip over the syntax of a number, as specified by JSON. */
|
273
|
+
if (*d->ptr == '-') d->ptr++;
|
274
|
+
|
275
|
+
if (jsondec_tryparsech(d, '0')) {
|
276
|
+
if (jsondec_tryskipdigits(d)) {
|
277
|
+
jsondec_err(d, "number cannot have leading zero");
|
278
|
+
}
|
279
|
+
} else {
|
280
|
+
jsondec_skipdigits(d);
|
281
|
+
}
|
282
|
+
|
283
|
+
if (d->ptr == d->end) goto parse;
|
284
|
+
if (jsondec_tryparsech(d, '.')) {
|
285
|
+
jsondec_skipdigits(d);
|
286
|
+
}
|
287
|
+
if (d->ptr == d->end) goto parse;
|
288
|
+
|
289
|
+
if (*d->ptr == 'e' || *d->ptr == 'E') {
|
290
|
+
d->ptr++;
|
291
|
+
if (d->ptr == d->end) {
|
292
|
+
jsondec_err(d, "Unexpected EOF in number");
|
293
|
+
}
|
294
|
+
if (*d->ptr == '+' || *d->ptr == '-') {
|
295
|
+
d->ptr++;
|
296
|
+
}
|
297
|
+
jsondec_skipdigits(d);
|
298
|
+
}
|
299
|
+
|
300
|
+
parse:
|
301
|
+
/* Having verified the syntax of a JSON number, use strtod() to parse
|
302
|
+
* (strtod() accepts a superset of JSON syntax). */
|
303
|
+
errno = 0;
|
304
|
+
{
|
305
|
+
char* end;
|
306
|
+
double val = strtod(start, &end);
|
307
|
+
assert(end == d->ptr);
|
308
|
+
|
309
|
+
/* Currently the min/max-val conformance tests fail if we check this. Does
|
310
|
+
* this mean the conformance tests are wrong or strtod() is wrong, or
|
311
|
+
* something else? Investigate further. */
|
312
|
+
/*
|
313
|
+
if (errno == ERANGE) {
|
314
|
+
jsondec_err(d, "Number out of range");
|
315
|
+
}
|
316
|
+
*/
|
317
|
+
|
318
|
+
if (val > DBL_MAX || val < -DBL_MAX) {
|
319
|
+
jsondec_err(d, "Number out of range");
|
320
|
+
}
|
321
|
+
|
322
|
+
return val;
|
323
|
+
}
|
324
|
+
}
|
325
|
+
|
326
|
+
/* JSON string ****************************************************************/
|
327
|
+
|
328
|
+
static char jsondec_escape(jsondec* d) {
|
329
|
+
switch (*d->ptr++) {
|
330
|
+
case '"':
|
331
|
+
return '\"';
|
332
|
+
case '\\':
|
333
|
+
return '\\';
|
334
|
+
case '/':
|
335
|
+
return '/';
|
336
|
+
case 'b':
|
337
|
+
return '\b';
|
338
|
+
case 'f':
|
339
|
+
return '\f';
|
340
|
+
case 'n':
|
341
|
+
return '\n';
|
342
|
+
case 'r':
|
343
|
+
return '\r';
|
344
|
+
case 't':
|
345
|
+
return '\t';
|
346
|
+
default:
|
347
|
+
jsondec_err(d, "Invalid escape char");
|
348
|
+
}
|
349
|
+
}
|
350
|
+
|
351
|
+
static uint32_t jsondec_codepoint(jsondec* d) {
|
352
|
+
uint32_t cp = 0;
|
353
|
+
const char* end;
|
354
|
+
|
355
|
+
if (d->end - d->ptr < 4) {
|
356
|
+
jsondec_err(d, "EOF inside string");
|
357
|
+
}
|
358
|
+
|
359
|
+
end = d->ptr + 4;
|
360
|
+
while (d->ptr < end) {
|
361
|
+
char ch = *d->ptr++;
|
362
|
+
if (ch >= '0' && ch <= '9') {
|
363
|
+
ch -= '0';
|
364
|
+
} else if (ch >= 'a' && ch <= 'f') {
|
365
|
+
ch = ch - 'a' + 10;
|
366
|
+
} else if (ch >= 'A' && ch <= 'F') {
|
367
|
+
ch = ch - 'A' + 10;
|
368
|
+
} else {
|
369
|
+
jsondec_err(d, "Invalid hex digit");
|
370
|
+
}
|
371
|
+
cp = (cp << 4) | ch;
|
372
|
+
}
|
373
|
+
|
374
|
+
return cp;
|
375
|
+
}
|
376
|
+
|
377
|
+
/* Parses a \uXXXX unicode escape (possibly a surrogate pair). */
|
378
|
+
static size_t jsondec_unicode(jsondec* d, char* out) {
|
379
|
+
uint32_t cp = jsondec_codepoint(d);
|
380
|
+
if (cp >= 0xd800 && cp <= 0xdbff) {
|
381
|
+
/* Surrogate pair: two 16-bit codepoints become a 32-bit codepoint. */
|
382
|
+
uint32_t high = cp;
|
383
|
+
uint32_t low;
|
384
|
+
jsondec_parselit(d, "\\u");
|
385
|
+
low = jsondec_codepoint(d);
|
386
|
+
if (low < 0xdc00 || low > 0xdfff) {
|
387
|
+
jsondec_err(d, "Invalid low surrogate");
|
388
|
+
}
|
389
|
+
cp = (high & 0x3ff) << 10;
|
390
|
+
cp |= (low & 0x3ff);
|
391
|
+
cp += 0x10000;
|
392
|
+
} else if (cp >= 0xdc00 && cp <= 0xdfff) {
|
393
|
+
jsondec_err(d, "Unpaired low surrogate");
|
394
|
+
}
|
395
|
+
|
396
|
+
/* Write to UTF-8 */
|
397
|
+
if (cp <= 0x7f) {
|
398
|
+
out[0] = cp;
|
399
|
+
return 1;
|
400
|
+
} else if (cp <= 0x07FF) {
|
401
|
+
out[0] = ((cp >> 6) & 0x1F) | 0xC0;
|
402
|
+
out[1] = ((cp >> 0) & 0x3F) | 0x80;
|
403
|
+
return 2;
|
404
|
+
} else if (cp <= 0xFFFF) {
|
405
|
+
out[0] = ((cp >> 12) & 0x0F) | 0xE0;
|
406
|
+
out[1] = ((cp >> 6) & 0x3F) | 0x80;
|
407
|
+
out[2] = ((cp >> 0) & 0x3F) | 0x80;
|
408
|
+
return 3;
|
409
|
+
} else if (cp < 0x10FFFF) {
|
410
|
+
out[0] = ((cp >> 18) & 0x07) | 0xF0;
|
411
|
+
out[1] = ((cp >> 12) & 0x3f) | 0x80;
|
412
|
+
out[2] = ((cp >> 6) & 0x3f) | 0x80;
|
413
|
+
out[3] = ((cp >> 0) & 0x3f) | 0x80;
|
414
|
+
return 4;
|
415
|
+
} else {
|
416
|
+
jsondec_err(d, "Invalid codepoint");
|
417
|
+
}
|
418
|
+
}
|
419
|
+
|
420
|
+
static void jsondec_resize(jsondec* d, char** buf, char** end, char** buf_end) {
|
421
|
+
size_t oldsize = *buf_end - *buf;
|
422
|
+
size_t len = *end - *buf;
|
423
|
+
size_t size = UPB_MAX(8, 2 * oldsize);
|
424
|
+
|
425
|
+
*buf = upb_Arena_Realloc(d->arena, *buf, len, size);
|
426
|
+
if (!*buf) jsondec_err(d, "Out of memory");
|
427
|
+
|
428
|
+
*end = *buf + len;
|
429
|
+
*buf_end = *buf + size;
|
430
|
+
}
|
431
|
+
|
432
|
+
static upb_StringView jsondec_string(jsondec* d) {
|
433
|
+
char* buf = NULL;
|
434
|
+
char* end = NULL;
|
435
|
+
char* buf_end = NULL;
|
436
|
+
|
437
|
+
jsondec_skipws(d);
|
438
|
+
|
439
|
+
if (*d->ptr++ != '"') {
|
440
|
+
jsondec_err(d, "Expected string");
|
441
|
+
}
|
442
|
+
|
443
|
+
while (d->ptr < d->end) {
|
444
|
+
char ch = *d->ptr++;
|
445
|
+
|
446
|
+
if (end == buf_end) {
|
447
|
+
jsondec_resize(d, &buf, &end, &buf_end);
|
448
|
+
}
|
449
|
+
|
450
|
+
switch (ch) {
|
451
|
+
case '"': {
|
452
|
+
upb_StringView ret;
|
453
|
+
ret.data = buf;
|
454
|
+
ret.size = end - buf;
|
455
|
+
*end = '\0'; /* Needed for possible strtod(). */
|
456
|
+
return ret;
|
457
|
+
}
|
458
|
+
case '\\':
|
459
|
+
if (d->ptr == d->end) goto eof;
|
460
|
+
if (*d->ptr == 'u') {
|
461
|
+
d->ptr++;
|
462
|
+
if (buf_end - end < 4) {
|
463
|
+
/* Allow space for maximum-sized code point (4 bytes). */
|
464
|
+
jsondec_resize(d, &buf, &end, &buf_end);
|
465
|
+
}
|
466
|
+
end += jsondec_unicode(d, end);
|
467
|
+
} else {
|
468
|
+
*end++ = jsondec_escape(d);
|
469
|
+
}
|
470
|
+
break;
|
471
|
+
default:
|
472
|
+
if ((unsigned char)*d->ptr < 0x20) {
|
473
|
+
jsondec_err(d, "Invalid char in JSON string");
|
474
|
+
}
|
475
|
+
*end++ = ch;
|
476
|
+
break;
|
477
|
+
}
|
478
|
+
}
|
479
|
+
|
480
|
+
eof:
|
481
|
+
jsondec_err(d, "EOF inside string");
|
482
|
+
}
|
483
|
+
|
484
|
+
static void jsondec_skipval(jsondec* d) {
|
485
|
+
switch (jsondec_peek(d)) {
|
486
|
+
case JD_OBJECT:
|
487
|
+
jsondec_objstart(d);
|
488
|
+
while (jsondec_objnext(d)) {
|
489
|
+
jsondec_string(d);
|
490
|
+
jsondec_entrysep(d);
|
491
|
+
jsondec_skipval(d);
|
492
|
+
}
|
493
|
+
jsondec_objend(d);
|
494
|
+
break;
|
495
|
+
case JD_ARRAY:
|
496
|
+
jsondec_arrstart(d);
|
497
|
+
while (jsondec_arrnext(d)) {
|
498
|
+
jsondec_skipval(d);
|
499
|
+
}
|
500
|
+
jsondec_arrend(d);
|
501
|
+
break;
|
502
|
+
case JD_TRUE:
|
503
|
+
jsondec_true(d);
|
504
|
+
break;
|
505
|
+
case JD_FALSE:
|
506
|
+
jsondec_false(d);
|
507
|
+
break;
|
508
|
+
case JD_NULL:
|
509
|
+
jsondec_null(d);
|
510
|
+
break;
|
511
|
+
case JD_STRING:
|
512
|
+
jsondec_string(d);
|
513
|
+
break;
|
514
|
+
case JD_NUMBER:
|
515
|
+
jsondec_number(d);
|
516
|
+
break;
|
517
|
+
}
|
518
|
+
}
|
519
|
+
|
520
|
+
/* Base64 decoding for bytes fields. ******************************************/
|
521
|
+
|
522
|
+
static unsigned int jsondec_base64_tablelookup(const char ch) {
|
523
|
+
/* Table includes the normal base64 chars plus the URL-safe variant. */
|
524
|
+
const signed char table[256] = {
|
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, 62 /*+*/, -1, 62 /*-*/, -1, 63 /*/ */, 52 /*0*/,
|
532
|
+
53 /*1*/, 54 /*2*/, 55 /*3*/, 56 /*4*/, 57 /*5*/, 58 /*6*/, 59 /*7*/,
|
533
|
+
60 /*8*/, 61 /*9*/, -1, -1, -1, -1, -1,
|
534
|
+
-1, -1, 0 /*A*/, 1 /*B*/, 2 /*C*/, 3 /*D*/, 4 /*E*/,
|
535
|
+
5 /*F*/, 6 /*G*/, 07 /*H*/, 8 /*I*/, 9 /*J*/, 10 /*K*/, 11 /*L*/,
|
536
|
+
12 /*M*/, 13 /*N*/, 14 /*O*/, 15 /*P*/, 16 /*Q*/, 17 /*R*/, 18 /*S*/,
|
537
|
+
19 /*T*/, 20 /*U*/, 21 /*V*/, 22 /*W*/, 23 /*X*/, 24 /*Y*/, 25 /*Z*/,
|
538
|
+
-1, -1, -1, -1, 63 /*_*/, -1, 26 /*a*/,
|
539
|
+
27 /*b*/, 28 /*c*/, 29 /*d*/, 30 /*e*/, 31 /*f*/, 32 /*g*/, 33 /*h*/,
|
540
|
+
34 /*i*/, 35 /*j*/, 36 /*k*/, 37 /*l*/, 38 /*m*/, 39 /*n*/, 40 /*o*/,
|
541
|
+
41 /*p*/, 42 /*q*/, 43 /*r*/, 44 /*s*/, 45 /*t*/, 46 /*u*/, 47 /*v*/,
|
542
|
+
48 /*w*/, 49 /*x*/, 50 /*y*/, 51 /*z*/, -1, -1, -1,
|
543
|
+
-1, -1, -1, -1, -1, -1, -1,
|
544
|
+
-1, -1, -1, -1, -1, -1, -1,
|
545
|
+
-1, -1, -1, -1, -1, -1, -1,
|
546
|
+
-1, -1, -1, -1, -1, -1, -1,
|
547
|
+
-1, -1, -1, -1, -1, -1, -1,
|
548
|
+
-1, -1, -1, -1, -1, -1, -1,
|
549
|
+
-1, -1, -1, -1, -1, -1, -1,
|
550
|
+
-1, -1, -1, -1, -1, -1, -1,
|
551
|
+
-1, -1, -1, -1, -1, -1, -1,
|
552
|
+
-1, -1, -1, -1, -1, -1, -1,
|
553
|
+
-1, -1, -1, -1, -1, -1, -1,
|
554
|
+
-1, -1, -1, -1, -1, -1, -1,
|
555
|
+
-1, -1, -1, -1, -1, -1, -1,
|
556
|
+
-1, -1, -1, -1, -1, -1, -1,
|
557
|
+
-1, -1, -1, -1, -1, -1, -1,
|
558
|
+
-1, -1, -1, -1, -1, -1, -1,
|
559
|
+
-1, -1, -1, -1, -1, -1, -1,
|
560
|
+
-1, -1, -1, -1, -1, -1, -1,
|
561
|
+
-1, -1, -1, -1};
|
562
|
+
|
563
|
+
/* Sign-extend return value so high bit will be set on any unexpected char. */
|
564
|
+
return table[(unsigned)ch];
|
565
|
+
}
|
566
|
+
|
567
|
+
static char* jsondec_partialbase64(jsondec* d, const char* ptr, const char* end,
|
568
|
+
char* out) {
|
569
|
+
int32_t val = -1;
|
570
|
+
|
571
|
+
switch (end - ptr) {
|
572
|
+
case 2:
|
573
|
+
val = jsondec_base64_tablelookup(ptr[0]) << 18 |
|
574
|
+
jsondec_base64_tablelookup(ptr[1]) << 12;
|
575
|
+
out[0] = val >> 16;
|
576
|
+
out += 1;
|
577
|
+
break;
|
578
|
+
case 3:
|
579
|
+
val = jsondec_base64_tablelookup(ptr[0]) << 18 |
|
580
|
+
jsondec_base64_tablelookup(ptr[1]) << 12 |
|
581
|
+
jsondec_base64_tablelookup(ptr[2]) << 6;
|
582
|
+
out[0] = val >> 16;
|
583
|
+
out[1] = (val >> 8) & 0xff;
|
584
|
+
out += 2;
|
585
|
+
break;
|
586
|
+
}
|
587
|
+
|
588
|
+
if (val < 0) {
|
589
|
+
jsondec_err(d, "Corrupt base64");
|
590
|
+
}
|
591
|
+
|
592
|
+
return out;
|
593
|
+
}
|
594
|
+
|
595
|
+
static size_t jsondec_base64(jsondec* d, upb_StringView str) {
|
596
|
+
/* We decode in place. This is safe because this is a new buffer (not
|
597
|
+
* aliasing the input) and because base64 decoding shrinks 4 bytes into 3. */
|
598
|
+
char* out = (char*)str.data;
|
599
|
+
const char* ptr = str.data;
|
600
|
+
const char* end = ptr + str.size;
|
601
|
+
const char* end4 = ptr + (str.size & -4); /* Round down to multiple of 4. */
|
602
|
+
|
603
|
+
for (; ptr < end4; ptr += 4, out += 3) {
|
604
|
+
int val = jsondec_base64_tablelookup(ptr[0]) << 18 |
|
605
|
+
jsondec_base64_tablelookup(ptr[1]) << 12 |
|
606
|
+
jsondec_base64_tablelookup(ptr[2]) << 6 |
|
607
|
+
jsondec_base64_tablelookup(ptr[3]) << 0;
|
608
|
+
|
609
|
+
if (val < 0) {
|
610
|
+
/* Junk chars or padding. Remove trailing padding, if any. */
|
611
|
+
if (end - ptr == 4 && ptr[3] == '=') {
|
612
|
+
if (ptr[2] == '=') {
|
613
|
+
end -= 2;
|
614
|
+
} else {
|
615
|
+
end -= 1;
|
616
|
+
}
|
617
|
+
}
|
618
|
+
break;
|
619
|
+
}
|
620
|
+
|
621
|
+
out[0] = val >> 16;
|
622
|
+
out[1] = (val >> 8) & 0xff;
|
623
|
+
out[2] = val & 0xff;
|
624
|
+
}
|
625
|
+
|
626
|
+
if (ptr < end) {
|
627
|
+
/* Process remaining chars. We do not require padding. */
|
628
|
+
out = jsondec_partialbase64(d, ptr, end, out);
|
629
|
+
}
|
630
|
+
|
631
|
+
return out - str.data;
|
632
|
+
}
|
633
|
+
|
634
|
+
/* Low-level integer parsing **************************************************/
|
635
|
+
|
636
|
+
/* We use these hand-written routines instead of strto[u]l() because the "long
|
637
|
+
* long" variants aren't in c89. Also our version allows setting a ptr limit. */
|
638
|
+
|
639
|
+
static const char* jsondec_buftouint64(jsondec* d, const char* ptr,
|
640
|
+
const char* end, uint64_t* val) {
|
641
|
+
uint64_t u64 = 0;
|
642
|
+
while (ptr < end) {
|
643
|
+
unsigned ch = *ptr - '0';
|
644
|
+
if (ch >= 10) break;
|
645
|
+
if (u64 > UINT64_MAX / 10 || u64 * 10 > UINT64_MAX - ch) {
|
646
|
+
jsondec_err(d, "Integer overflow");
|
647
|
+
}
|
648
|
+
u64 *= 10;
|
649
|
+
u64 += ch;
|
650
|
+
ptr++;
|
651
|
+
}
|
652
|
+
|
653
|
+
*val = u64;
|
654
|
+
return ptr;
|
655
|
+
}
|
656
|
+
|
657
|
+
static const char* jsondec_buftoint64(jsondec* d, const char* ptr,
|
658
|
+
const char* end, int64_t* val) {
|
659
|
+
bool neg = false;
|
660
|
+
uint64_t u64;
|
661
|
+
|
662
|
+
if (ptr != end && *ptr == '-') {
|
663
|
+
ptr++;
|
664
|
+
neg = true;
|
665
|
+
}
|
666
|
+
|
667
|
+
ptr = jsondec_buftouint64(d, ptr, end, &u64);
|
668
|
+
if (u64 > (uint64_t)INT64_MAX + neg) {
|
669
|
+
jsondec_err(d, "Integer overflow");
|
670
|
+
}
|
671
|
+
|
672
|
+
*val = neg ? -u64 : u64;
|
673
|
+
return ptr;
|
674
|
+
}
|
675
|
+
|
676
|
+
static uint64_t jsondec_strtouint64(jsondec* d, upb_StringView str) {
|
677
|
+
const char* end = str.data + str.size;
|
678
|
+
uint64_t ret;
|
679
|
+
if (jsondec_buftouint64(d, str.data, end, &ret) != end) {
|
680
|
+
jsondec_err(d, "Non-number characters in quoted integer");
|
681
|
+
}
|
682
|
+
return ret;
|
683
|
+
}
|
684
|
+
|
685
|
+
static int64_t jsondec_strtoint64(jsondec* d, upb_StringView str) {
|
686
|
+
const char* end = str.data + str.size;
|
687
|
+
int64_t ret;
|
688
|
+
if (jsondec_buftoint64(d, str.data, end, &ret) != end) {
|
689
|
+
jsondec_err(d, "Non-number characters in quoted integer");
|
690
|
+
}
|
691
|
+
return ret;
|
692
|
+
}
|
693
|
+
|
694
|
+
/* Primitive value types ******************************************************/
|
695
|
+
|
696
|
+
/* Parse INT32 or INT64 value. */
|
697
|
+
static upb_MessageValue jsondec_int(jsondec* d, const upb_FieldDef* f) {
|
698
|
+
upb_MessageValue val;
|
699
|
+
|
700
|
+
switch (jsondec_peek(d)) {
|
701
|
+
case JD_NUMBER: {
|
702
|
+
double dbl = jsondec_number(d);
|
703
|
+
if (dbl > 9223372036854774784.0 || dbl < -9223372036854775808.0) {
|
704
|
+
jsondec_err(d, "JSON number is out of range.");
|
705
|
+
}
|
706
|
+
val.int64_val = dbl; /* must be guarded, overflow here is UB */
|
707
|
+
if (val.int64_val != dbl) {
|
708
|
+
jsondec_errf(d, "JSON number was not integral (%f != %" PRId64 ")", dbl,
|
709
|
+
val.int64_val);
|
710
|
+
}
|
711
|
+
break;
|
712
|
+
}
|
713
|
+
case JD_STRING: {
|
714
|
+
upb_StringView str = jsondec_string(d);
|
715
|
+
val.int64_val = jsondec_strtoint64(d, str);
|
716
|
+
break;
|
717
|
+
}
|
718
|
+
default:
|
719
|
+
jsondec_err(d, "Expected number or string");
|
720
|
+
}
|
721
|
+
|
722
|
+
if (upb_FieldDef_CType(f) == kUpb_CType_Int32 ||
|
723
|
+
upb_FieldDef_CType(f) == kUpb_CType_Enum) {
|
724
|
+
if (val.int64_val > INT32_MAX || val.int64_val < INT32_MIN) {
|
725
|
+
jsondec_err(d, "Integer out of range.");
|
726
|
+
}
|
727
|
+
val.int32_val = (int32_t)val.int64_val;
|
728
|
+
}
|
729
|
+
|
730
|
+
return val;
|
731
|
+
}
|
732
|
+
|
733
|
+
/* Parse UINT32 or UINT64 value. */
|
734
|
+
static upb_MessageValue jsondec_uint(jsondec* d, const upb_FieldDef* f) {
|
735
|
+
upb_MessageValue val = {0};
|
736
|
+
|
737
|
+
switch (jsondec_peek(d)) {
|
738
|
+
case JD_NUMBER: {
|
739
|
+
double dbl = jsondec_number(d);
|
740
|
+
if (dbl > 18446744073709549568.0 || dbl < 0) {
|
741
|
+
jsondec_err(d, "JSON number is out of range.");
|
742
|
+
}
|
743
|
+
val.uint64_val = dbl; /* must be guarded, overflow here is UB */
|
744
|
+
if (val.uint64_val != dbl) {
|
745
|
+
jsondec_errf(d, "JSON number was not integral (%f != %" PRIu64 ")", dbl,
|
746
|
+
val.uint64_val);
|
747
|
+
}
|
748
|
+
break;
|
749
|
+
}
|
750
|
+
case JD_STRING: {
|
751
|
+
upb_StringView str = jsondec_string(d);
|
752
|
+
val.uint64_val = jsondec_strtouint64(d, str);
|
753
|
+
break;
|
754
|
+
}
|
755
|
+
default:
|
756
|
+
jsondec_err(d, "Expected number or string");
|
757
|
+
}
|
758
|
+
|
759
|
+
if (upb_FieldDef_CType(f) == kUpb_CType_UInt32) {
|
760
|
+
if (val.uint64_val > UINT32_MAX) {
|
761
|
+
jsondec_err(d, "Integer out of range.");
|
762
|
+
}
|
763
|
+
val.uint32_val = (uint32_t)val.uint64_val;
|
764
|
+
}
|
765
|
+
|
766
|
+
return val;
|
767
|
+
}
|
768
|
+
|
769
|
+
/* Parse DOUBLE or FLOAT value. */
|
770
|
+
static upb_MessageValue jsondec_double(jsondec* d, const upb_FieldDef* f) {
|
771
|
+
upb_StringView str;
|
772
|
+
upb_MessageValue val = {0};
|
773
|
+
|
774
|
+
switch (jsondec_peek(d)) {
|
775
|
+
case JD_NUMBER:
|
776
|
+
val.double_val = jsondec_number(d);
|
777
|
+
break;
|
778
|
+
case JD_STRING:
|
779
|
+
str = jsondec_string(d);
|
780
|
+
if (jsondec_streql(str, "NaN")) {
|
781
|
+
val.double_val = NAN;
|
782
|
+
} else if (jsondec_streql(str, "Infinity")) {
|
783
|
+
val.double_val = INFINITY;
|
784
|
+
} else if (jsondec_streql(str, "-Infinity")) {
|
785
|
+
val.double_val = -INFINITY;
|
786
|
+
} else {
|
787
|
+
val.double_val = strtod(str.data, NULL);
|
788
|
+
}
|
789
|
+
break;
|
790
|
+
default:
|
791
|
+
jsondec_err(d, "Expected number or string");
|
792
|
+
}
|
793
|
+
|
794
|
+
if (upb_FieldDef_CType(f) == kUpb_CType_Float) {
|
795
|
+
if (val.double_val != INFINITY && val.double_val != -INFINITY &&
|
796
|
+
(val.double_val > FLT_MAX || val.double_val < -FLT_MAX)) {
|
797
|
+
jsondec_err(d, "Float out of range");
|
798
|
+
}
|
799
|
+
val.float_val = val.double_val;
|
800
|
+
}
|
801
|
+
|
802
|
+
return val;
|
803
|
+
}
|
804
|
+
|
805
|
+
/* Parse STRING or BYTES value. */
|
806
|
+
static upb_MessageValue jsondec_strfield(jsondec* d, const upb_FieldDef* f) {
|
807
|
+
upb_MessageValue val;
|
808
|
+
val.str_val = jsondec_string(d);
|
809
|
+
if (upb_FieldDef_CType(f) == kUpb_CType_Bytes) {
|
810
|
+
val.str_val.size = jsondec_base64(d, val.str_val);
|
811
|
+
}
|
812
|
+
return val;
|
813
|
+
}
|
814
|
+
|
815
|
+
static upb_MessageValue jsondec_enum(jsondec* d, const upb_FieldDef* f) {
|
816
|
+
switch (jsondec_peek(d)) {
|
817
|
+
case JD_STRING: {
|
818
|
+
upb_StringView str = jsondec_string(d);
|
819
|
+
const upb_EnumDef* e = upb_FieldDef_EnumSubDef(f);
|
820
|
+
const upb_EnumValueDef* ev =
|
821
|
+
upb_EnumDef_FindValueByNameWithSize(e, str.data, str.size);
|
822
|
+
upb_MessageValue val;
|
823
|
+
if (ev) {
|
824
|
+
val.int32_val = upb_EnumValueDef_Number(ev);
|
825
|
+
} else {
|
826
|
+
if (d->options & upb_JsonDecode_IgnoreUnknown) {
|
827
|
+
val.int32_val = 0;
|
828
|
+
} else {
|
829
|
+
jsondec_errf(d, "Unknown enumerator: '" UPB_STRINGVIEW_FORMAT "'",
|
830
|
+
UPB_STRINGVIEW_ARGS(str));
|
831
|
+
}
|
832
|
+
}
|
833
|
+
return val;
|
834
|
+
}
|
835
|
+
case JD_NULL: {
|
836
|
+
if (jsondec_isnullvalue(f)) {
|
837
|
+
upb_MessageValue val;
|
838
|
+
jsondec_null(d);
|
839
|
+
val.int32_val = 0;
|
840
|
+
return val;
|
841
|
+
}
|
842
|
+
}
|
843
|
+
/* Fallthrough. */
|
844
|
+
default:
|
845
|
+
return jsondec_int(d, f);
|
846
|
+
}
|
847
|
+
}
|
848
|
+
|
849
|
+
static upb_MessageValue jsondec_bool(jsondec* d, const upb_FieldDef* f) {
|
850
|
+
bool is_map_key = upb_FieldDef_Number(f) == 1 &&
|
851
|
+
upb_MessageDef_IsMapEntry(upb_FieldDef_ContainingType(f));
|
852
|
+
upb_MessageValue val;
|
853
|
+
|
854
|
+
if (is_map_key) {
|
855
|
+
upb_StringView str = jsondec_string(d);
|
856
|
+
if (jsondec_streql(str, "true")) {
|
857
|
+
val.bool_val = true;
|
858
|
+
} else if (jsondec_streql(str, "false")) {
|
859
|
+
val.bool_val = false;
|
860
|
+
} else {
|
861
|
+
jsondec_err(d, "Invalid boolean map key");
|
862
|
+
}
|
863
|
+
} else {
|
864
|
+
switch (jsondec_peek(d)) {
|
865
|
+
case JD_TRUE:
|
866
|
+
val.bool_val = true;
|
867
|
+
jsondec_true(d);
|
868
|
+
break;
|
869
|
+
case JD_FALSE:
|
870
|
+
val.bool_val = false;
|
871
|
+
jsondec_false(d);
|
872
|
+
break;
|
873
|
+
default:
|
874
|
+
jsondec_err(d, "Expected true or false");
|
875
|
+
}
|
876
|
+
}
|
877
|
+
|
878
|
+
return val;
|
879
|
+
}
|
880
|
+
|
881
|
+
/* Composite types (array/message/map) ****************************************/
|
882
|
+
|
883
|
+
static void jsondec_array(jsondec* d, upb_Message* msg, const upb_FieldDef* f) {
|
884
|
+
upb_Array* arr = upb_Message_Mutable(msg, f, d->arena).array;
|
885
|
+
|
886
|
+
jsondec_arrstart(d);
|
887
|
+
while (jsondec_arrnext(d)) {
|
888
|
+
upb_MessageValue elem = jsondec_value(d, f);
|
889
|
+
upb_Array_Append(arr, elem, d->arena);
|
890
|
+
}
|
891
|
+
jsondec_arrend(d);
|
892
|
+
}
|
893
|
+
|
894
|
+
static void jsondec_map(jsondec* d, upb_Message* msg, const upb_FieldDef* f) {
|
895
|
+
upb_Map* map = upb_Message_Mutable(msg, f, d->arena).map;
|
896
|
+
const upb_MessageDef* entry = upb_FieldDef_MessageSubDef(f);
|
897
|
+
const upb_FieldDef* key_f = upb_MessageDef_FindFieldByNumber(entry, 1);
|
898
|
+
const upb_FieldDef* val_f = upb_MessageDef_FindFieldByNumber(entry, 2);
|
899
|
+
|
900
|
+
jsondec_objstart(d);
|
901
|
+
while (jsondec_objnext(d)) {
|
902
|
+
upb_MessageValue key, val;
|
903
|
+
key = jsondec_value(d, key_f);
|
904
|
+
jsondec_entrysep(d);
|
905
|
+
val = jsondec_value(d, val_f);
|
906
|
+
upb_Map_Set(map, key, val, d->arena);
|
907
|
+
}
|
908
|
+
jsondec_objend(d);
|
909
|
+
}
|
910
|
+
|
911
|
+
static void jsondec_tomsg(jsondec* d, upb_Message* msg,
|
912
|
+
const upb_MessageDef* m) {
|
913
|
+
if (upb_MessageDef_WellKnownType(m) == kUpb_WellKnown_Unspecified) {
|
914
|
+
jsondec_object(d, msg, m);
|
915
|
+
} else {
|
916
|
+
jsondec_wellknown(d, msg, m);
|
917
|
+
}
|
918
|
+
}
|
919
|
+
|
920
|
+
static upb_MessageValue jsondec_msg(jsondec* d, const upb_FieldDef* f) {
|
921
|
+
const upb_MessageDef* m = upb_FieldDef_MessageSubDef(f);
|
922
|
+
upb_Message* msg = upb_Message_New(m, d->arena);
|
923
|
+
upb_MessageValue val;
|
924
|
+
|
925
|
+
jsondec_tomsg(d, msg, m);
|
926
|
+
val.msg_val = msg;
|
927
|
+
return val;
|
928
|
+
}
|
929
|
+
|
930
|
+
static void jsondec_field(jsondec* d, upb_Message* msg,
|
931
|
+
const upb_MessageDef* m) {
|
932
|
+
upb_StringView name;
|
933
|
+
const upb_FieldDef* f;
|
934
|
+
const upb_FieldDef* preserved;
|
935
|
+
|
936
|
+
name = jsondec_string(d);
|
937
|
+
jsondec_entrysep(d);
|
938
|
+
|
939
|
+
if (name.size >= 2 && name.data[0] == '[' &&
|
940
|
+
name.data[name.size - 1] == ']') {
|
941
|
+
f = upb_DefPool_FindExtensionByNameWithSize(d->symtab, name.data + 1,
|
942
|
+
name.size - 2);
|
943
|
+
if (f && upb_FieldDef_ContainingType(f) != m) {
|
944
|
+
jsondec_errf(
|
945
|
+
d, "Extension %s extends message %s, but was seen in message %s",
|
946
|
+
upb_FieldDef_FullName(f),
|
947
|
+
upb_MessageDef_FullName(upb_FieldDef_ContainingType(f)),
|
948
|
+
upb_MessageDef_FullName(m));
|
949
|
+
}
|
950
|
+
} else {
|
951
|
+
f = upb_MessageDef_FindByJsonNameWithSize(m, name.data, name.size);
|
952
|
+
}
|
953
|
+
|
954
|
+
if (!f) {
|
955
|
+
if ((d->options & upb_JsonDecode_IgnoreUnknown) == 0) {
|
956
|
+
jsondec_errf(d, "No such field: " UPB_STRINGVIEW_FORMAT,
|
957
|
+
UPB_STRINGVIEW_ARGS(name));
|
958
|
+
}
|
959
|
+
jsondec_skipval(d);
|
960
|
+
return;
|
961
|
+
}
|
962
|
+
|
963
|
+
if (jsondec_peek(d) == JD_NULL && !jsondec_isvalue(f)) {
|
964
|
+
/* JSON "null" indicates a default value, so no need to set anything. */
|
965
|
+
jsondec_null(d);
|
966
|
+
return;
|
967
|
+
}
|
968
|
+
|
969
|
+
if (upb_FieldDef_RealContainingOneof(f) &&
|
970
|
+
upb_Message_WhichOneof(msg, upb_FieldDef_ContainingOneof(f))) {
|
971
|
+
jsondec_err(d, "More than one field for this oneof.");
|
972
|
+
}
|
973
|
+
|
974
|
+
preserved = d->debug_field;
|
975
|
+
d->debug_field = f;
|
976
|
+
|
977
|
+
if (upb_FieldDef_IsMap(f)) {
|
978
|
+
jsondec_map(d, msg, f);
|
979
|
+
} else if (upb_FieldDef_IsRepeated(f)) {
|
980
|
+
jsondec_array(d, msg, f);
|
981
|
+
} else if (upb_FieldDef_IsSubMessage(f)) {
|
982
|
+
upb_Message* submsg = upb_Message_Mutable(msg, f, d->arena).msg;
|
983
|
+
const upb_MessageDef* subm = upb_FieldDef_MessageSubDef(f);
|
984
|
+
jsondec_tomsg(d, submsg, subm);
|
985
|
+
} else {
|
986
|
+
upb_MessageValue val = jsondec_value(d, f);
|
987
|
+
upb_Message_Set(msg, f, val, d->arena);
|
988
|
+
}
|
989
|
+
|
990
|
+
d->debug_field = preserved;
|
991
|
+
}
|
992
|
+
|
993
|
+
static void jsondec_object(jsondec* d, upb_Message* msg,
|
994
|
+
const upb_MessageDef* m) {
|
995
|
+
jsondec_objstart(d);
|
996
|
+
while (jsondec_objnext(d)) {
|
997
|
+
jsondec_field(d, msg, m);
|
998
|
+
}
|
999
|
+
jsondec_objend(d);
|
1000
|
+
}
|
1001
|
+
|
1002
|
+
static upb_MessageValue jsondec_value(jsondec* d, const upb_FieldDef* f) {
|
1003
|
+
switch (upb_FieldDef_CType(f)) {
|
1004
|
+
case kUpb_CType_Bool:
|
1005
|
+
return jsondec_bool(d, f);
|
1006
|
+
case kUpb_CType_Float:
|
1007
|
+
case kUpb_CType_Double:
|
1008
|
+
return jsondec_double(d, f);
|
1009
|
+
case kUpb_CType_UInt32:
|
1010
|
+
case kUpb_CType_UInt64:
|
1011
|
+
return jsondec_uint(d, f);
|
1012
|
+
case kUpb_CType_Int32:
|
1013
|
+
case kUpb_CType_Int64:
|
1014
|
+
return jsondec_int(d, f);
|
1015
|
+
case kUpb_CType_String:
|
1016
|
+
case kUpb_CType_Bytes:
|
1017
|
+
return jsondec_strfield(d, f);
|
1018
|
+
case kUpb_CType_Enum:
|
1019
|
+
return jsondec_enum(d, f);
|
1020
|
+
case kUpb_CType_Message:
|
1021
|
+
return jsondec_msg(d, f);
|
1022
|
+
default:
|
1023
|
+
UPB_UNREACHABLE();
|
1024
|
+
}
|
1025
|
+
}
|
1026
|
+
|
1027
|
+
/* Well-known types ***********************************************************/
|
1028
|
+
|
1029
|
+
static int jsondec_tsdigits(jsondec* d, const char** ptr, size_t digits,
|
1030
|
+
const char* after) {
|
1031
|
+
uint64_t val;
|
1032
|
+
const char* p = *ptr;
|
1033
|
+
const char* end = p + digits;
|
1034
|
+
size_t after_len = after ? strlen(after) : 0;
|
1035
|
+
|
1036
|
+
UPB_ASSERT(digits <= 9); /* int can't overflow. */
|
1037
|
+
|
1038
|
+
if (jsondec_buftouint64(d, p, end, &val) != end ||
|
1039
|
+
(after_len && memcmp(end, after, after_len) != 0)) {
|
1040
|
+
jsondec_err(d, "Malformed timestamp");
|
1041
|
+
}
|
1042
|
+
|
1043
|
+
UPB_ASSERT(val < INT_MAX);
|
1044
|
+
|
1045
|
+
*ptr = end + after_len;
|
1046
|
+
return (int)val;
|
1047
|
+
}
|
1048
|
+
|
1049
|
+
static int jsondec_nanos(jsondec* d, const char** ptr, const char* end) {
|
1050
|
+
uint64_t nanos = 0;
|
1051
|
+
const char* p = *ptr;
|
1052
|
+
|
1053
|
+
if (p != end && *p == '.') {
|
1054
|
+
const char* nano_end = jsondec_buftouint64(d, p + 1, end, &nanos);
|
1055
|
+
int digits = (int)(nano_end - p - 1);
|
1056
|
+
int exp_lg10 = 9 - digits;
|
1057
|
+
if (digits > 9) {
|
1058
|
+
jsondec_err(d, "Too many digits for partial seconds");
|
1059
|
+
}
|
1060
|
+
while (exp_lg10--) nanos *= 10;
|
1061
|
+
*ptr = nano_end;
|
1062
|
+
}
|
1063
|
+
|
1064
|
+
UPB_ASSERT(nanos < INT_MAX);
|
1065
|
+
|
1066
|
+
return (int)nanos;
|
1067
|
+
}
|
1068
|
+
|
1069
|
+
/* jsondec_epochdays(1970, 1, 1) == 1970-01-01 == 0. */
|
1070
|
+
int jsondec_epochdays(int y, int m, int d) {
|
1071
|
+
const uint32_t year_base = 4800; /* Before min year, multiple of 400. */
|
1072
|
+
const uint32_t m_adj = m - 3; /* March-based month. */
|
1073
|
+
const uint32_t carry = m_adj > (uint32_t)m ? 1 : 0;
|
1074
|
+
const uint32_t adjust = carry ? 12 : 0;
|
1075
|
+
const uint32_t y_adj = y + year_base - carry;
|
1076
|
+
const uint32_t month_days = ((m_adj + adjust) * 62719 + 769) / 2048;
|
1077
|
+
const uint32_t leap_days = y_adj / 4 - y_adj / 100 + y_adj / 400;
|
1078
|
+
return y_adj * 365 + leap_days + month_days + (d - 1) - 2472632;
|
1079
|
+
}
|
1080
|
+
|
1081
|
+
static int64_t jsondec_unixtime(int y, int m, int d, int h, int min, int s) {
|
1082
|
+
return (int64_t)jsondec_epochdays(y, m, d) * 86400 + h * 3600 + min * 60 + s;
|
1083
|
+
}
|
1084
|
+
|
1085
|
+
static void jsondec_timestamp(jsondec* d, upb_Message* msg,
|
1086
|
+
const upb_MessageDef* m) {
|
1087
|
+
upb_MessageValue seconds;
|
1088
|
+
upb_MessageValue nanos;
|
1089
|
+
upb_StringView str = jsondec_string(d);
|
1090
|
+
const char* ptr = str.data;
|
1091
|
+
const char* end = ptr + str.size;
|
1092
|
+
|
1093
|
+
if (str.size < 20) goto malformed;
|
1094
|
+
|
1095
|
+
{
|
1096
|
+
/* 1972-01-01T01:00:00 */
|
1097
|
+
int year = jsondec_tsdigits(d, &ptr, 4, "-");
|
1098
|
+
int mon = jsondec_tsdigits(d, &ptr, 2, "-");
|
1099
|
+
int day = jsondec_tsdigits(d, &ptr, 2, "T");
|
1100
|
+
int hour = jsondec_tsdigits(d, &ptr, 2, ":");
|
1101
|
+
int min = jsondec_tsdigits(d, &ptr, 2, ":");
|
1102
|
+
int sec = jsondec_tsdigits(d, &ptr, 2, NULL);
|
1103
|
+
|
1104
|
+
seconds.int64_val = jsondec_unixtime(year, mon, day, hour, min, sec);
|
1105
|
+
}
|
1106
|
+
|
1107
|
+
nanos.int32_val = jsondec_nanos(d, &ptr, end);
|
1108
|
+
|
1109
|
+
{
|
1110
|
+
/* [+-]08:00 or Z */
|
1111
|
+
int ofs_hour = 0;
|
1112
|
+
int ofs_min = 0;
|
1113
|
+
bool neg = false;
|
1114
|
+
|
1115
|
+
if (ptr == end) goto malformed;
|
1116
|
+
|
1117
|
+
switch (*ptr++) {
|
1118
|
+
case '-':
|
1119
|
+
neg = true;
|
1120
|
+
/* fallthrough */
|
1121
|
+
case '+':
|
1122
|
+
if ((end - ptr) != 5) goto malformed;
|
1123
|
+
ofs_hour = jsondec_tsdigits(d, &ptr, 2, ":");
|
1124
|
+
ofs_min = jsondec_tsdigits(d, &ptr, 2, NULL);
|
1125
|
+
ofs_min = ((ofs_hour * 60) + ofs_min) * 60;
|
1126
|
+
seconds.int64_val += (neg ? ofs_min : -ofs_min);
|
1127
|
+
break;
|
1128
|
+
case 'Z':
|
1129
|
+
if (ptr != end) goto malformed;
|
1130
|
+
break;
|
1131
|
+
default:
|
1132
|
+
goto malformed;
|
1133
|
+
}
|
1134
|
+
}
|
1135
|
+
|
1136
|
+
if (seconds.int64_val < -62135596800) {
|
1137
|
+
jsondec_err(d, "Timestamp out of range");
|
1138
|
+
}
|
1139
|
+
|
1140
|
+
upb_Message_Set(msg, upb_MessageDef_FindFieldByNumber(m, 1), seconds,
|
1141
|
+
d->arena);
|
1142
|
+
upb_Message_Set(msg, upb_MessageDef_FindFieldByNumber(m, 2), nanos, d->arena);
|
1143
|
+
return;
|
1144
|
+
|
1145
|
+
malformed:
|
1146
|
+
jsondec_err(d, "Malformed timestamp");
|
1147
|
+
}
|
1148
|
+
|
1149
|
+
static void jsondec_duration(jsondec* d, upb_Message* msg,
|
1150
|
+
const upb_MessageDef* m) {
|
1151
|
+
upb_MessageValue seconds;
|
1152
|
+
upb_MessageValue nanos;
|
1153
|
+
upb_StringView str = jsondec_string(d);
|
1154
|
+
const char* ptr = str.data;
|
1155
|
+
const char* end = ptr + str.size;
|
1156
|
+
const int64_t max = (uint64_t)3652500 * 86400;
|
1157
|
+
|
1158
|
+
/* "3.000000001s", "3s", etc. */
|
1159
|
+
ptr = jsondec_buftoint64(d, ptr, end, &seconds.int64_val);
|
1160
|
+
nanos.int32_val = jsondec_nanos(d, &ptr, end);
|
1161
|
+
|
1162
|
+
if (end - ptr != 1 || *ptr != 's') {
|
1163
|
+
jsondec_err(d, "Malformed duration");
|
1164
|
+
}
|
1165
|
+
|
1166
|
+
if (seconds.int64_val < -max || seconds.int64_val > max) {
|
1167
|
+
jsondec_err(d, "Duration out of range");
|
1168
|
+
}
|
1169
|
+
|
1170
|
+
if (seconds.int64_val < 0) {
|
1171
|
+
nanos.int32_val = -nanos.int32_val;
|
1172
|
+
}
|
1173
|
+
|
1174
|
+
upb_Message_Set(msg, upb_MessageDef_FindFieldByNumber(m, 1), seconds,
|
1175
|
+
d->arena);
|
1176
|
+
upb_Message_Set(msg, upb_MessageDef_FindFieldByNumber(m, 2), nanos, d->arena);
|
1177
|
+
}
|
1178
|
+
|
1179
|
+
static void jsondec_listvalue(jsondec* d, upb_Message* msg,
|
1180
|
+
const upb_MessageDef* m) {
|
1181
|
+
const upb_FieldDef* values_f = upb_MessageDef_FindFieldByNumber(m, 1);
|
1182
|
+
const upb_MessageDef* value_m = upb_FieldDef_MessageSubDef(values_f);
|
1183
|
+
upb_Array* values = upb_Message_Mutable(msg, values_f, d->arena).array;
|
1184
|
+
|
1185
|
+
jsondec_arrstart(d);
|
1186
|
+
while (jsondec_arrnext(d)) {
|
1187
|
+
upb_Message* value_msg = upb_Message_New(value_m, d->arena);
|
1188
|
+
upb_MessageValue value;
|
1189
|
+
value.msg_val = value_msg;
|
1190
|
+
upb_Array_Append(values, value, d->arena);
|
1191
|
+
jsondec_wellknownvalue(d, value_msg, value_m);
|
1192
|
+
}
|
1193
|
+
jsondec_arrend(d);
|
1194
|
+
}
|
1195
|
+
|
1196
|
+
static void jsondec_struct(jsondec* d, upb_Message* msg,
|
1197
|
+
const upb_MessageDef* m) {
|
1198
|
+
const upb_FieldDef* fields_f = upb_MessageDef_FindFieldByNumber(m, 1);
|
1199
|
+
const upb_MessageDef* entry_m = upb_FieldDef_MessageSubDef(fields_f);
|
1200
|
+
const upb_FieldDef* value_f = upb_MessageDef_FindFieldByNumber(entry_m, 2);
|
1201
|
+
const upb_MessageDef* value_m = upb_FieldDef_MessageSubDef(value_f);
|
1202
|
+
upb_Map* fields = upb_Message_Mutable(msg, fields_f, d->arena).map;
|
1203
|
+
|
1204
|
+
jsondec_objstart(d);
|
1205
|
+
while (jsondec_objnext(d)) {
|
1206
|
+
upb_MessageValue key, value;
|
1207
|
+
upb_Message* value_msg = upb_Message_New(value_m, d->arena);
|
1208
|
+
key.str_val = jsondec_string(d);
|
1209
|
+
value.msg_val = value_msg;
|
1210
|
+
upb_Map_Set(fields, key, value, d->arena);
|
1211
|
+
jsondec_entrysep(d);
|
1212
|
+
jsondec_wellknownvalue(d, value_msg, value_m);
|
1213
|
+
}
|
1214
|
+
jsondec_objend(d);
|
1215
|
+
}
|
1216
|
+
|
1217
|
+
static void jsondec_wellknownvalue(jsondec* d, upb_Message* msg,
|
1218
|
+
const upb_MessageDef* m) {
|
1219
|
+
upb_MessageValue val;
|
1220
|
+
const upb_FieldDef* f;
|
1221
|
+
upb_Message* submsg;
|
1222
|
+
|
1223
|
+
switch (jsondec_peek(d)) {
|
1224
|
+
case JD_NUMBER:
|
1225
|
+
/* double number_value = 2; */
|
1226
|
+
f = upb_MessageDef_FindFieldByNumber(m, 2);
|
1227
|
+
val.double_val = jsondec_number(d);
|
1228
|
+
break;
|
1229
|
+
case JD_STRING:
|
1230
|
+
/* string string_value = 3; */
|
1231
|
+
f = upb_MessageDef_FindFieldByNumber(m, 3);
|
1232
|
+
val.str_val = jsondec_string(d);
|
1233
|
+
break;
|
1234
|
+
case JD_FALSE:
|
1235
|
+
/* bool bool_value = 4; */
|
1236
|
+
f = upb_MessageDef_FindFieldByNumber(m, 4);
|
1237
|
+
val.bool_val = false;
|
1238
|
+
jsondec_false(d);
|
1239
|
+
break;
|
1240
|
+
case JD_TRUE:
|
1241
|
+
/* bool bool_value = 4; */
|
1242
|
+
f = upb_MessageDef_FindFieldByNumber(m, 4);
|
1243
|
+
val.bool_val = true;
|
1244
|
+
jsondec_true(d);
|
1245
|
+
break;
|
1246
|
+
case JD_NULL:
|
1247
|
+
/* NullValue null_value = 1; */
|
1248
|
+
f = upb_MessageDef_FindFieldByNumber(m, 1);
|
1249
|
+
val.int32_val = 0;
|
1250
|
+
jsondec_null(d);
|
1251
|
+
break;
|
1252
|
+
/* Note: these cases return, because upb_Message_Mutable() is enough. */
|
1253
|
+
case JD_OBJECT:
|
1254
|
+
/* Struct struct_value = 5; */
|
1255
|
+
f = upb_MessageDef_FindFieldByNumber(m, 5);
|
1256
|
+
submsg = upb_Message_Mutable(msg, f, d->arena).msg;
|
1257
|
+
jsondec_struct(d, submsg, upb_FieldDef_MessageSubDef(f));
|
1258
|
+
return;
|
1259
|
+
case JD_ARRAY:
|
1260
|
+
/* ListValue list_value = 6; */
|
1261
|
+
f = upb_MessageDef_FindFieldByNumber(m, 6);
|
1262
|
+
submsg = upb_Message_Mutable(msg, f, d->arena).msg;
|
1263
|
+
jsondec_listvalue(d, submsg, upb_FieldDef_MessageSubDef(f));
|
1264
|
+
return;
|
1265
|
+
default:
|
1266
|
+
UPB_UNREACHABLE();
|
1267
|
+
}
|
1268
|
+
|
1269
|
+
upb_Message_Set(msg, f, val, d->arena);
|
1270
|
+
}
|
1271
|
+
|
1272
|
+
static upb_StringView jsondec_mask(jsondec* d, const char* buf,
|
1273
|
+
const char* end) {
|
1274
|
+
/* FieldMask fields grow due to inserted '_' characters, so we can't do the
|
1275
|
+
* transform in place. */
|
1276
|
+
const char* ptr = buf;
|
1277
|
+
upb_StringView ret;
|
1278
|
+
char* out;
|
1279
|
+
|
1280
|
+
ret.size = end - ptr;
|
1281
|
+
while (ptr < end) {
|
1282
|
+
ret.size += (*ptr >= 'A' && *ptr <= 'Z');
|
1283
|
+
ptr++;
|
1284
|
+
}
|
1285
|
+
|
1286
|
+
out = upb_Arena_Malloc(d->arena, ret.size);
|
1287
|
+
ptr = buf;
|
1288
|
+
ret.data = out;
|
1289
|
+
|
1290
|
+
while (ptr < end) {
|
1291
|
+
char ch = *ptr++;
|
1292
|
+
if (ch >= 'A' && ch <= 'Z') {
|
1293
|
+
*out++ = '_';
|
1294
|
+
*out++ = ch + 32;
|
1295
|
+
} else if (ch == '_') {
|
1296
|
+
jsondec_err(d, "field mask may not contain '_'");
|
1297
|
+
} else {
|
1298
|
+
*out++ = ch;
|
1299
|
+
}
|
1300
|
+
}
|
1301
|
+
|
1302
|
+
return ret;
|
1303
|
+
}
|
1304
|
+
|
1305
|
+
static void jsondec_fieldmask(jsondec* d, upb_Message* msg,
|
1306
|
+
const upb_MessageDef* m) {
|
1307
|
+
/* repeated string paths = 1; */
|
1308
|
+
const upb_FieldDef* paths_f = upb_MessageDef_FindFieldByNumber(m, 1);
|
1309
|
+
upb_Array* arr = upb_Message_Mutable(msg, paths_f, d->arena).array;
|
1310
|
+
upb_StringView str = jsondec_string(d);
|
1311
|
+
const char* ptr = str.data;
|
1312
|
+
const char* end = ptr + str.size;
|
1313
|
+
upb_MessageValue val;
|
1314
|
+
|
1315
|
+
while (ptr < end) {
|
1316
|
+
const char* elem_end = memchr(ptr, ',', end - ptr);
|
1317
|
+
if (elem_end) {
|
1318
|
+
val.str_val = jsondec_mask(d, ptr, elem_end);
|
1319
|
+
ptr = elem_end + 1;
|
1320
|
+
} else {
|
1321
|
+
val.str_val = jsondec_mask(d, ptr, end);
|
1322
|
+
ptr = end;
|
1323
|
+
}
|
1324
|
+
upb_Array_Append(arr, val, d->arena);
|
1325
|
+
}
|
1326
|
+
}
|
1327
|
+
|
1328
|
+
static void jsondec_anyfield(jsondec* d, upb_Message* msg,
|
1329
|
+
const upb_MessageDef* m) {
|
1330
|
+
if (upb_MessageDef_WellKnownType(m) == kUpb_WellKnown_Unspecified) {
|
1331
|
+
/* For regular types: {"@type": "[user type]", "f1": <V1>, "f2": <V2>}
|
1332
|
+
* where f1, f2, etc. are the normal fields of this type. */
|
1333
|
+
jsondec_field(d, msg, m);
|
1334
|
+
} else {
|
1335
|
+
/* For well-known types: {"@type": "[well-known type]", "value": <X>}
|
1336
|
+
* where <X> is whatever encoding the WKT normally uses. */
|
1337
|
+
upb_StringView str = jsondec_string(d);
|
1338
|
+
jsondec_entrysep(d);
|
1339
|
+
if (!jsondec_streql(str, "value")) {
|
1340
|
+
jsondec_err(d, "Key for well-known type must be 'value'");
|
1341
|
+
}
|
1342
|
+
jsondec_wellknown(d, msg, m);
|
1343
|
+
}
|
1344
|
+
}
|
1345
|
+
|
1346
|
+
static const upb_MessageDef* jsondec_typeurl(jsondec* d, upb_Message* msg,
|
1347
|
+
const upb_MessageDef* m) {
|
1348
|
+
const upb_FieldDef* type_url_f = upb_MessageDef_FindFieldByNumber(m, 1);
|
1349
|
+
const upb_MessageDef* type_m;
|
1350
|
+
upb_StringView type_url = jsondec_string(d);
|
1351
|
+
const char* end = type_url.data + type_url.size;
|
1352
|
+
const char* ptr = end;
|
1353
|
+
upb_MessageValue val;
|
1354
|
+
|
1355
|
+
val.str_val = type_url;
|
1356
|
+
upb_Message_Set(msg, type_url_f, val, d->arena);
|
1357
|
+
|
1358
|
+
/* Find message name after the last '/' */
|
1359
|
+
while (ptr > type_url.data && *--ptr != '/') {
|
1360
|
+
}
|
1361
|
+
|
1362
|
+
if (ptr == type_url.data || ptr == end) {
|
1363
|
+
jsondec_err(d, "Type url must have at least one '/' and non-empty host");
|
1364
|
+
}
|
1365
|
+
|
1366
|
+
ptr++;
|
1367
|
+
type_m = upb_DefPool_FindMessageByNameWithSize(d->symtab, ptr, end - ptr);
|
1368
|
+
|
1369
|
+
if (!type_m) {
|
1370
|
+
jsondec_err(d, "Type was not found");
|
1371
|
+
}
|
1372
|
+
|
1373
|
+
return type_m;
|
1374
|
+
}
|
1375
|
+
|
1376
|
+
static void jsondec_any(jsondec* d, upb_Message* msg, const upb_MessageDef* m) {
|
1377
|
+
/* string type_url = 1;
|
1378
|
+
* bytes value = 2; */
|
1379
|
+
const upb_FieldDef* value_f = upb_MessageDef_FindFieldByNumber(m, 2);
|
1380
|
+
upb_Message* any_msg;
|
1381
|
+
const upb_MessageDef* any_m = NULL;
|
1382
|
+
const char* pre_type_data = NULL;
|
1383
|
+
const char* pre_type_end = NULL;
|
1384
|
+
upb_MessageValue encoded;
|
1385
|
+
|
1386
|
+
jsondec_objstart(d);
|
1387
|
+
|
1388
|
+
/* Scan looking for "@type", which is not necessarily first. */
|
1389
|
+
while (!any_m && jsondec_objnext(d)) {
|
1390
|
+
const char* start = d->ptr;
|
1391
|
+
upb_StringView name = jsondec_string(d);
|
1392
|
+
jsondec_entrysep(d);
|
1393
|
+
if (jsondec_streql(name, "@type")) {
|
1394
|
+
any_m = jsondec_typeurl(d, msg, m);
|
1395
|
+
if (pre_type_data) {
|
1396
|
+
pre_type_end = start;
|
1397
|
+
while (*pre_type_end != ',') pre_type_end--;
|
1398
|
+
}
|
1399
|
+
} else {
|
1400
|
+
if (!pre_type_data) pre_type_data = start;
|
1401
|
+
jsondec_skipval(d);
|
1402
|
+
}
|
1403
|
+
}
|
1404
|
+
|
1405
|
+
if (!any_m) {
|
1406
|
+
jsondec_err(d, "Any object didn't contain a '@type' field");
|
1407
|
+
}
|
1408
|
+
|
1409
|
+
any_msg = upb_Message_New(any_m, d->arena);
|
1410
|
+
|
1411
|
+
if (pre_type_data) {
|
1412
|
+
size_t len = pre_type_end - pre_type_data + 1;
|
1413
|
+
char* tmp = upb_Arena_Malloc(d->arena, len);
|
1414
|
+
const char* saved_ptr = d->ptr;
|
1415
|
+
const char* saved_end = d->end;
|
1416
|
+
memcpy(tmp, pre_type_data, len - 1);
|
1417
|
+
tmp[len - 1] = '}';
|
1418
|
+
d->ptr = tmp;
|
1419
|
+
d->end = tmp + len;
|
1420
|
+
d->is_first = true;
|
1421
|
+
while (jsondec_objnext(d)) {
|
1422
|
+
jsondec_anyfield(d, any_msg, any_m);
|
1423
|
+
}
|
1424
|
+
d->ptr = saved_ptr;
|
1425
|
+
d->end = saved_end;
|
1426
|
+
}
|
1427
|
+
|
1428
|
+
while (jsondec_objnext(d)) {
|
1429
|
+
jsondec_anyfield(d, any_msg, any_m);
|
1430
|
+
}
|
1431
|
+
|
1432
|
+
jsondec_objend(d);
|
1433
|
+
|
1434
|
+
upb_EncodeStatus status =
|
1435
|
+
upb_Encode(any_msg, upb_MessageDef_MiniTable(any_m), 0, d->arena,
|
1436
|
+
(char**)&encoded.str_val.data, &encoded.str_val.size);
|
1437
|
+
// TODO(b/235839510): We should fail gracefully here on a bad return status.
|
1438
|
+
UPB_ASSERT(status == kUpb_EncodeStatus_Ok);
|
1439
|
+
upb_Message_Set(msg, value_f, encoded, d->arena);
|
1440
|
+
}
|
1441
|
+
|
1442
|
+
static void jsondec_wrapper(jsondec* d, upb_Message* msg,
|
1443
|
+
const upb_MessageDef* m) {
|
1444
|
+
const upb_FieldDef* value_f = upb_MessageDef_FindFieldByNumber(m, 1);
|
1445
|
+
upb_MessageValue val = jsondec_value(d, value_f);
|
1446
|
+
upb_Message_Set(msg, value_f, val, d->arena);
|
1447
|
+
}
|
1448
|
+
|
1449
|
+
static void jsondec_wellknown(jsondec* d, upb_Message* msg,
|
1450
|
+
const upb_MessageDef* m) {
|
1451
|
+
switch (upb_MessageDef_WellKnownType(m)) {
|
1452
|
+
case kUpb_WellKnown_Any:
|
1453
|
+
jsondec_any(d, msg, m);
|
1454
|
+
break;
|
1455
|
+
case kUpb_WellKnown_FieldMask:
|
1456
|
+
jsondec_fieldmask(d, msg, m);
|
1457
|
+
break;
|
1458
|
+
case kUpb_WellKnown_Duration:
|
1459
|
+
jsondec_duration(d, msg, m);
|
1460
|
+
break;
|
1461
|
+
case kUpb_WellKnown_Timestamp:
|
1462
|
+
jsondec_timestamp(d, msg, m);
|
1463
|
+
break;
|
1464
|
+
case kUpb_WellKnown_Value:
|
1465
|
+
jsondec_wellknownvalue(d, msg, m);
|
1466
|
+
break;
|
1467
|
+
case kUpb_WellKnown_ListValue:
|
1468
|
+
jsondec_listvalue(d, msg, m);
|
1469
|
+
break;
|
1470
|
+
case kUpb_WellKnown_Struct:
|
1471
|
+
jsondec_struct(d, msg, m);
|
1472
|
+
break;
|
1473
|
+
case kUpb_WellKnown_DoubleValue:
|
1474
|
+
case kUpb_WellKnown_FloatValue:
|
1475
|
+
case kUpb_WellKnown_Int64Value:
|
1476
|
+
case kUpb_WellKnown_UInt64Value:
|
1477
|
+
case kUpb_WellKnown_Int32Value:
|
1478
|
+
case kUpb_WellKnown_UInt32Value:
|
1479
|
+
case kUpb_WellKnown_StringValue:
|
1480
|
+
case kUpb_WellKnown_BytesValue:
|
1481
|
+
case kUpb_WellKnown_BoolValue:
|
1482
|
+
jsondec_wrapper(d, msg, m);
|
1483
|
+
break;
|
1484
|
+
default:
|
1485
|
+
UPB_UNREACHABLE();
|
1486
|
+
}
|
1487
|
+
}
|
1488
|
+
|
1489
|
+
bool upb_JsonDecode(const char* buf, size_t size, upb_Message* msg,
|
1490
|
+
const upb_MessageDef* m, const upb_DefPool* symtab,
|
1491
|
+
int options, upb_Arena* arena, upb_Status* status) {
|
1492
|
+
jsondec d;
|
1493
|
+
|
1494
|
+
if (size == 0) return true;
|
1495
|
+
|
1496
|
+
d.ptr = buf;
|
1497
|
+
d.end = buf + size;
|
1498
|
+
d.arena = arena;
|
1499
|
+
d.symtab = symtab;
|
1500
|
+
d.status = status;
|
1501
|
+
d.options = options;
|
1502
|
+
d.depth = 64;
|
1503
|
+
d.line = 1;
|
1504
|
+
d.line_begin = d.ptr;
|
1505
|
+
d.debug_field = NULL;
|
1506
|
+
d.is_first = false;
|
1507
|
+
|
1508
|
+
if (UPB_SETJMP(d.err)) return false;
|
1509
|
+
|
1510
|
+
jsondec_tomsg(&d, msg, m);
|
1511
|
+
return true;
|
1512
|
+
}
|