grpc 1.32.0 → 1.36.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of grpc might be problematic. Click here for more details.

Files changed (1031) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +1086 -3054
  3. data/etc/roots.pem +257 -573
  4. data/include/grpc/compression.h +1 -1
  5. data/include/grpc/grpc.h +15 -7
  6. data/include/grpc/grpc_security.h +227 -171
  7. data/include/grpc/impl/codegen/atm_windows.h +4 -0
  8. data/include/grpc/impl/codegen/byte_buffer.h +1 -1
  9. data/include/grpc/impl/codegen/grpc_types.h +10 -8
  10. data/include/grpc/impl/codegen/log.h +0 -2
  11. data/include/grpc/impl/codegen/port_platform.h +22 -55
  12. data/include/grpc/impl/codegen/sync_windows.h +4 -0
  13. data/include/grpc/slice_buffer.h +3 -3
  14. data/include/grpc/support/sync.h +3 -3
  15. data/include/grpc/support/time.h +7 -7
  16. data/src/core/ext/filters/client_channel/backend_metric.cc +2 -4
  17. data/src/core/ext/filters/client_channel/client_channel.cc +2788 -1535
  18. data/src/core/ext/filters/client_channel/client_channel.h +0 -6
  19. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +1 -1
  20. data/src/core/ext/filters/client_channel/config_selector.cc +0 -4
  21. data/src/core/ext/filters/client_channel/config_selector.h +40 -8
  22. data/src/core/ext/filters/client_channel/dynamic_filters.cc +186 -0
  23. data/src/core/ext/filters/client_channel/dynamic_filters.h +99 -0
  24. data/src/core/ext/filters/client_channel/health/health_check_client.cc +10 -7
  25. data/src/core/ext/filters/client_channel/health/health_check_client.h +4 -4
  26. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +7 -8
  27. data/src/core/ext/filters/client_channel/http_proxy.cc +21 -20
  28. data/src/core/ext/filters/client_channel/lb_policy.cc +6 -2
  29. data/src/core/ext/filters/client_channel/lb_policy.h +6 -7
  30. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +48 -35
  31. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +7 -5
  32. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +4 -3
  33. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h +1 -1
  34. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +204 -195
  35. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +1 -2
  36. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +1 -2
  37. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +3 -1
  38. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +3 -3
  39. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +1 -1
  40. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +5 -5
  41. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +58 -26
  42. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +5 -5
  43. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +14 -34
  44. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +6 -6
  45. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +478 -145
  46. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +52 -24
  47. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_args.h +29 -0
  48. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +810 -0
  49. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +722 -0
  50. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +1384 -0
  51. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +8 -1
  52. data/src/core/ext/filters/client_channel/resolver.cc +4 -5
  53. data/src/core/ext/filters/client_channel/resolver.h +5 -13
  54. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +43 -59
  55. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +1 -32
  56. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +3 -3
  57. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +443 -17
  58. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +5 -0
  59. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +22 -23
  60. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +21 -18
  61. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +1 -1
  62. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +362 -0
  63. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +37 -30
  64. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +566 -366
  65. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h +28 -0
  66. data/src/core/ext/filters/client_channel/resolver_factory.h +6 -6
  67. data/src/core/ext/filters/client_channel/resolver_registry.cc +40 -39
  68. data/src/core/ext/filters/client_channel/resolver_registry.h +2 -2
  69. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +29 -74
  70. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +12 -10
  71. data/src/core/ext/filters/client_channel/retry_throttle.cc +5 -3
  72. data/src/core/ext/filters/client_channel/retry_throttle.h +4 -2
  73. data/src/core/ext/filters/client_channel/server_address.cc +86 -0
  74. data/src/core/ext/filters/client_channel/server_address.h +52 -36
  75. data/src/core/ext/filters/client_channel/service_config.cc +18 -13
  76. data/src/core/ext/filters/client_channel/service_config.h +8 -5
  77. data/src/core/ext/filters/client_channel/service_config_call_data.h +19 -1
  78. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +2 -2
  79. data/src/core/ext/filters/client_channel/service_config_parser.cc +8 -6
  80. data/src/core/ext/filters/client_channel/service_config_parser.h +8 -5
  81. data/src/core/ext/filters/client_channel/subchannel.cc +53 -66
  82. data/src/core/ext/filters/client_channel/subchannel.h +14 -20
  83. data/src/core/ext/filters/client_channel/subchannel_interface.h +41 -5
  84. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +6 -2
  85. data/src/core/ext/filters/deadline/deadline_filter.cc +87 -79
  86. data/src/core/ext/filters/deadline/deadline_filter.h +7 -11
  87. data/src/core/ext/filters/http/client/http_client_filter.cc +1 -1
  88. data/src/core/ext/filters/http/client_authority_filter.cc +6 -6
  89. data/src/core/ext/filters/http/http_filters_plugin.cc +6 -3
  90. data/src/core/ext/filters/http/server/http_server_filter.cc +3 -3
  91. data/src/core/ext/filters/max_age/max_age_filter.cc +36 -33
  92. data/src/core/ext/filters/message_size/message_size_filter.cc +3 -2
  93. data/src/core/ext/filters/message_size/message_size_filter.h +2 -1
  94. data/src/core/ext/filters/workarounds/workaround_utils.cc +1 -1
  95. data/src/core/ext/transport/chttp2/client/authority.cc +3 -3
  96. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +1 -1
  97. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +1 -1
  98. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +20 -8
  99. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +21 -10
  100. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +26 -14
  101. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +226 -95
  102. data/src/core/ext/transport/chttp2/server/chttp2_server.h +11 -2
  103. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +11 -1
  104. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +12 -5
  105. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +62 -18
  106. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +7 -7
  107. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +28 -42
  108. data/src/core/ext/transport/chttp2/transport/flow_control.cc +10 -2
  109. data/src/core/ext/transport/chttp2/transport/flow_control.h +13 -3
  110. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +2 -1
  111. data/src/core/ext/transport/chttp2/transport/frame_settings.h +2 -1
  112. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +6 -6
  113. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +12 -8
  114. data/src/core/ext/transport/chttp2/transport/internal.h +5 -1
  115. data/src/core/ext/transport/chttp2/transport/parsing.cc +18 -3
  116. data/src/core/ext/transport/chttp2/transport/writing.cc +2 -3
  117. data/src/core/ext/transport/inproc/inproc_transport.cc +42 -8
  118. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h +1 -0
  119. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.c +1 -1
  120. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +7 -0
  121. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +52 -33
  122. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +199 -34
  123. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.c +13 -13
  124. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.h +44 -17
  125. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +171 -98
  126. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +625 -202
  127. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.c +3 -3
  128. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.h +13 -5
  129. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.c +24 -23
  130. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +62 -21
  131. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c +36 -24
  132. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h +133 -39
  133. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.c +4 -4
  134. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.h +15 -6
  135. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +70 -45
  136. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +275 -78
  137. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +31 -24
  138. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +107 -47
  139. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.c +1 -1
  140. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.h +7 -0
  141. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.c +53 -0
  142. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.h +149 -0
  143. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +74 -28
  144. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +248 -43
  145. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +41 -41
  146. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +172 -89
  147. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.c +4 -4
  148. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h +17 -9
  149. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +63 -39
  150. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +254 -60
  151. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +1 -2
  152. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +7 -0
  153. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.c +2 -2
  154. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h +9 -2
  155. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c +42 -0
  156. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h +126 -0
  157. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +13 -14
  158. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h +59 -36
  159. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +16 -16
  160. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h +61 -29
  161. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c +26 -26
  162. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h +101 -66
  163. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.c +2 -2
  164. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h +11 -3
  165. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +49 -27
  166. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +204 -48
  167. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +47 -26
  168. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +181 -48
  169. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +2 -3
  170. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +13 -0
  171. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +21 -17
  172. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +96 -33
  173. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +15 -13
  174. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +70 -37
  175. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +352 -199
  176. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +1334 -443
  177. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c +8 -7
  178. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h +34 -10
  179. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +3 -4
  180. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h +17 -3
  181. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c +29 -0
  182. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.h +67 -0
  183. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +129 -80
  184. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +525 -166
  185. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c +0 -1
  186. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.h +1 -0
  187. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +26 -24
  188. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +121 -64
  189. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +7 -6
  190. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +29 -8
  191. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +70 -29
  192. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +296 -63
  193. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.c +1 -1
  194. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.h +7 -0
  195. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.c +1 -1
  196. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.h +7 -0
  197. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +51 -34
  198. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +188 -75
  199. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.c +1 -4
  200. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.h +7 -0
  201. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.c +1 -4
  202. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.h +7 -0
  203. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +7 -8
  204. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.h +31 -16
  205. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.c +1 -3
  206. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.h +7 -0
  207. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.c +1 -1
  208. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.h +7 -0
  209. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c +5 -5
  210. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h +25 -11
  211. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c +1 -1
  212. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h +7 -0
  213. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.c +1 -1
  214. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.h +7 -0
  215. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +6 -6
  216. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.h +29 -8
  217. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +4 -4
  218. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.h +22 -3
  219. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.c +3 -3
  220. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.h +19 -0
  221. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.c +7 -7
  222. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.h +46 -3
  223. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.c +8 -8
  224. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.h +41 -8
  225. data/src/core/ext/upb-generated/envoy/type/v3/http.upb.h +1 -0
  226. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.c +3 -3
  227. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.h +15 -2
  228. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.c +3 -3
  229. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.h +19 -0
  230. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.c +1 -1
  231. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.h +7 -0
  232. data/src/core/ext/upb-generated/google/api/annotations.upb.h +1 -0
  233. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.c +242 -0
  234. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.h +830 -0
  235. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +54 -37
  236. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +171 -59
  237. data/src/core/ext/upb-generated/google/api/http.upb.c +3 -3
  238. data/src/core/ext/upb-generated/google/api/http.upb.h +25 -6
  239. data/src/core/ext/upb-generated/google/protobuf/any.upb.c +1 -1
  240. data/src/core/ext/upb-generated/google/protobuf/any.upb.h +7 -0
  241. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +90 -90
  242. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +455 -292
  243. data/src/core/ext/upb-generated/google/protobuf/duration.upb.c +1 -1
  244. data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +7 -0
  245. data/src/core/ext/upb-generated/google/protobuf/empty.upb.c +1 -1
  246. data/src/core/ext/upb-generated/google/protobuf/empty.upb.h +7 -0
  247. data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +4 -4
  248. data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +22 -3
  249. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.c +1 -1
  250. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +7 -0
  251. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.c +9 -9
  252. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +55 -0
  253. data/src/core/ext/upb-generated/google/rpc/status.upb.c +1 -1
  254. data/src/core/ext/upb-generated/google/rpc/status.upb.h +10 -3
  255. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c +4 -4
  256. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +11 -3
  257. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +41 -41
  258. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +149 -76
  259. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c +5 -5
  260. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +21 -6
  261. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c +2 -2
  262. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +13 -0
  263. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c +17 -17
  264. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +82 -25
  265. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.c +3 -3
  266. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +19 -0
  267. data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +31 -0
  268. data/src/core/ext/upb-generated/udpa/annotations/security.upb.h +64 -0
  269. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h +1 -0
  270. data/src/core/ext/upb-generated/udpa/annotations/status.upb.c +2 -2
  271. data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +9 -2
  272. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.c +1 -1
  273. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.h +7 -0
  274. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c +3 -3
  275. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h +7 -0
  276. data/src/core/ext/upb-generated/validate/validate.upb.c +64 -64
  277. data/src/core/ext/upb-generated/validate/validate.upb.h +296 -157
  278. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.c +28 -0
  279. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.h +60 -0
  280. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +52 -0
  281. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.h +143 -0
  282. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +42 -0
  283. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.h +84 -0
  284. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.c +36 -0
  285. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.h +94 -0
  286. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +54 -0
  287. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.h +166 -0
  288. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +36 -0
  289. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.h +85 -0
  290. data/src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c +38 -0
  291. data/src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.h +30 -0
  292. data/src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.c +41 -0
  293. data/src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.h +35 -0
  294. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c +251 -0
  295. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.h +105 -0
  296. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.c +100 -0
  297. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.h +45 -0
  298. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +543 -0
  299. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h +145 -0
  300. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.c +53 -0
  301. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.h +35 -0
  302. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c +136 -0
  303. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.h +35 -0
  304. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.c +127 -0
  305. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.h +65 -0
  306. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.c +56 -0
  307. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.h +35 -0
  308. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +272 -0
  309. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h +135 -0
  310. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c +143 -0
  311. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.h +55 -0
  312. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.c +56 -0
  313. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.h +35 -0
  314. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.c +66 -0
  315. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.h +40 -0
  316. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.c +263 -0
  317. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.h +100 -0
  318. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +233 -0
  319. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.h +70 -0
  320. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.c +56 -0
  321. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.h +35 -0
  322. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +228 -0
  323. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.h +80 -0
  324. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c +43 -0
  325. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.h +35 -0
  326. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c +59 -0
  327. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.h +35 -0
  328. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c +68 -0
  329. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.h +35 -0
  330. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c +107 -0
  331. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.h +50 -0
  332. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +113 -0
  333. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.h +50 -0
  334. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.c +146 -0
  335. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.h +55 -0
  336. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.c +50 -0
  337. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.h +35 -0
  338. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c +195 -0
  339. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h +55 -0
  340. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c +193 -0
  341. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.h +65 -0
  342. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c +59 -0
  343. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.h +40 -0
  344. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c +101 -0
  345. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.h +40 -0
  346. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +938 -0
  347. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h +285 -0
  348. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.c +71 -0
  349. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.h +45 -0
  350. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c +61 -0
  351. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.h +40 -0
  352. data/src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.c +51 -0
  353. data/src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.h +35 -0
  354. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +504 -0
  355. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h +115 -0
  356. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c +44 -0
  357. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.h +30 -0
  358. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +170 -0
  359. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.h +55 -0
  360. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c +97 -0
  361. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.h +45 -0
  362. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +246 -0
  363. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.h +60 -0
  364. data/src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.c +72 -0
  365. data/src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.h +35 -0
  366. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.c +60 -0
  367. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.h +35 -0
  368. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c +142 -0
  369. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.h +65 -0
  370. data/src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.c +73 -0
  371. data/src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.h +35 -0
  372. data/src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.c +72 -0
  373. data/src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.h +35 -0
  374. data/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.c +80 -0
  375. data/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.h +40 -0
  376. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.c +80 -0
  377. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.h +35 -0
  378. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.c +74 -0
  379. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.h +35 -0
  380. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.c +64 -0
  381. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.h +40 -0
  382. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.c +54 -0
  383. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.h +35 -0
  384. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.c +53 -0
  385. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.h +35 -0
  386. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c +73 -0
  387. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.h +45 -0
  388. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.c +69 -0
  389. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.h +40 -0
  390. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.c +81 -0
  391. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.h +45 -0
  392. data/src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.c +92 -0
  393. data/src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.h +65 -0
  394. data/src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.c +95 -0
  395. data/src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.h +55 -0
  396. data/src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.c +34 -0
  397. data/src/core/ext/{upb-generated/gogoproto/gogo.upb.h → upbdefs-generated/envoy/type/v3/http.upbdefs.h} +10 -9
  398. data/src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.c +59 -0
  399. data/src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.h +40 -0
  400. data/src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.c +54 -0
  401. data/src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.h +45 -0
  402. data/src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.c +47 -0
  403. data/src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.h +35 -0
  404. data/src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.c +40 -0
  405. data/src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.h +30 -0
  406. data/src/core/ext/upbdefs-generated/google/api/http.upbdefs.c +61 -0
  407. data/src/core/ext/upbdefs-generated/google/api/http.upbdefs.h +45 -0
  408. data/src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c +39 -0
  409. data/src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.h +35 -0
  410. data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c +386 -0
  411. data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.h +165 -0
  412. data/src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c +40 -0
  413. data/src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.h +35 -0
  414. data/src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c +37 -0
  415. data/src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.h +35 -0
  416. data/src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c +65 -0
  417. data/src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.h +50 -0
  418. data/src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.c +40 -0
  419. data/src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.h +35 -0
  420. data/src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c +66 -0
  421. data/src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.h +75 -0
  422. data/src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c +42 -0
  423. data/src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.h +35 -0
  424. data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c +70 -0
  425. data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.h +45 -0
  426. data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c +56 -0
  427. data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.h +35 -0
  428. data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c +33 -0
  429. data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.h +30 -0
  430. data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c +49 -0
  431. data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.h +35 -0
  432. data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c +43 -0
  433. data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.h +35 -0
  434. data/src/core/ext/upbdefs-generated/validate/validate.upbdefs.c +310 -0
  435. data/src/core/ext/upbdefs-generated/validate/validate.upbdefs.h +145 -0
  436. data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c +42 -0
  437. data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.h +35 -0
  438. data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c +62 -0
  439. data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.h +40 -0
  440. data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c +45 -0
  441. data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.h +40 -0
  442. data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c +49 -0
  443. data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.h +35 -0
  444. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c +67 -0
  445. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.h +40 -0
  446. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c +50 -0
  447. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.h +35 -0
  448. data/src/core/ext/xds/certificate_provider_factory.h +61 -0
  449. data/src/core/ext/xds/certificate_provider_registry.cc +103 -0
  450. data/src/core/ext/xds/certificate_provider_registry.h +57 -0
  451. data/src/core/ext/xds/certificate_provider_store.cc +87 -0
  452. data/src/core/ext/xds/certificate_provider_store.h +112 -0
  453. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +144 -0
  454. data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +69 -0
  455. data/src/core/ext/xds/xds_api.cc +1149 -1058
  456. data/src/core/ext/xds/xds_api.h +215 -144
  457. data/src/core/ext/xds/xds_bootstrap.cc +228 -62
  458. data/src/core/ext/xds/xds_bootstrap.h +35 -12
  459. data/src/core/ext/xds/xds_certificate_provider.cc +405 -0
  460. data/src/core/ext/xds/xds_certificate_provider.h +151 -0
  461. data/src/core/ext/xds/xds_channel_args.h +6 -3
  462. data/src/core/ext/xds/xds_client.cc +620 -495
  463. data/src/core/ext/xds/xds_client.h +121 -58
  464. data/src/core/ext/xds/xds_client_stats.cc +61 -17
  465. data/src/core/ext/xds/xds_client_stats.h +35 -7
  466. data/src/core/ext/xds/xds_server_config_fetcher.cc +267 -0
  467. data/src/core/lib/channel/channel_args.cc +9 -8
  468. data/src/core/lib/channel/channel_args.h +0 -1
  469. data/src/core/lib/channel/channel_trace.cc +4 -2
  470. data/src/core/lib/channel/channel_trace.h +1 -1
  471. data/src/core/lib/channel/channelz.cc +23 -59
  472. data/src/core/lib/channel/channelz.h +13 -22
  473. data/src/core/lib/channel/channelz_registry.cc +12 -11
  474. data/src/core/lib/channel/channelz_registry.h +3 -1
  475. data/src/core/lib/channel/handshaker.cc +4 -7
  476. data/src/core/lib/channel/handshaker.h +3 -3
  477. data/src/core/lib/compression/compression.cc +8 -4
  478. data/src/core/lib/compression/compression_args.cc +3 -2
  479. data/src/core/lib/compression/compression_internal.cc +10 -5
  480. data/src/core/lib/compression/compression_internal.h +2 -1
  481. data/src/core/lib/compression/stream_compression_identity.cc +1 -3
  482. data/src/core/lib/debug/stats.h +2 -2
  483. data/src/core/lib/debug/stats_data.cc +1 -0
  484. data/src/core/lib/debug/stats_data.h +13 -13
  485. data/src/core/lib/gpr/alloc.cc +3 -2
  486. data/src/core/lib/gpr/cpu_iphone.cc +10 -2
  487. data/src/core/lib/gpr/log.cc +59 -17
  488. data/src/core/lib/gpr/log_linux.cc +19 -3
  489. data/src/core/lib/gpr/log_posix.cc +15 -1
  490. data/src/core/lib/gpr/log_windows.cc +18 -4
  491. data/src/core/lib/gpr/murmur_hash.cc +1 -1
  492. data/src/core/lib/gpr/spinlock.h +10 -2
  493. data/src/core/lib/gpr/string.cc +23 -22
  494. data/src/core/lib/gpr/string.h +5 -6
  495. data/src/core/lib/gpr/sync.cc +4 -4
  496. data/src/core/lib/gpr/time.cc +12 -12
  497. data/src/core/lib/gpr/time_precise.cc +5 -2
  498. data/src/core/lib/gpr/time_precise.h +6 -2
  499. data/src/core/lib/gpr/tls.h +4 -0
  500. data/src/core/lib/gpr/tls_msvc.h +2 -0
  501. data/src/core/lib/gpr/tls_stdcpp.h +48 -0
  502. data/src/core/lib/gpr/useful.h +5 -4
  503. data/src/core/lib/gprpp/arena.h +3 -2
  504. data/src/core/lib/gprpp/dual_ref_counted.h +331 -0
  505. data/src/core/lib/gprpp/examine_stack.cc +43 -0
  506. data/src/core/lib/gprpp/examine_stack.h +46 -0
  507. data/src/core/lib/gprpp/fork.cc +2 -2
  508. data/src/core/lib/gprpp/manual_constructor.h +1 -1
  509. data/src/core/lib/gprpp/mpscq.cc +2 -2
  510. data/src/core/lib/gprpp/orphanable.h +4 -8
  511. data/src/core/lib/gprpp/ref_counted.h +91 -68
  512. data/src/core/lib/gprpp/ref_counted_ptr.h +166 -7
  513. data/src/core/lib/{security/authorization/mock_cel/statusor.h → gprpp/stat.h} +13 -25
  514. data/src/core/lib/gprpp/stat_posix.cc +49 -0
  515. data/src/core/lib/gprpp/stat_windows.cc +48 -0
  516. data/src/core/lib/gprpp/sync.h +129 -40
  517. data/src/core/lib/gprpp/thd.h +2 -2
  518. data/src/core/lib/gprpp/thd_posix.cc +42 -37
  519. data/src/core/lib/gprpp/thd_windows.cc +3 -1
  520. data/src/core/lib/gprpp/time_util.cc +77 -0
  521. data/src/core/lib/gprpp/time_util.h +42 -0
  522. data/src/core/lib/http/httpcli.cc +1 -1
  523. data/src/core/lib/http/httpcli.h +2 -3
  524. data/src/core/lib/http/httpcli_security_connector.cc +3 -3
  525. data/src/core/lib/http/parser.cc +47 -27
  526. data/src/core/lib/iomgr/call_combiner.cc +8 -5
  527. data/src/core/lib/iomgr/combiner.cc +2 -1
  528. data/src/core/lib/iomgr/endpoint.h +1 -1
  529. data/src/core/lib/iomgr/endpoint_cfstream.cc +9 -5
  530. data/src/core/lib/iomgr/error.cc +17 -12
  531. data/src/core/lib/iomgr/error_internal.h +1 -1
  532. data/src/core/lib/iomgr/ev_apple.cc +10 -7
  533. data/src/core/lib/iomgr/ev_epoll1_linux.cc +20 -13
  534. data/src/core/lib/iomgr/ev_epollex_linux.cc +29 -21
  535. data/src/core/lib/iomgr/ev_poll_posix.cc +9 -7
  536. data/src/core/lib/iomgr/exec_ctx.cc +1 -1
  537. data/src/core/lib/iomgr/exec_ctx.h +16 -12
  538. data/src/core/lib/iomgr/executor.cc +2 -1
  539. data/src/core/lib/iomgr/executor.h +1 -1
  540. data/src/core/lib/iomgr/executor/mpmcqueue.h +5 -5
  541. data/src/core/lib/iomgr/executor/threadpool.h +4 -4
  542. data/src/core/lib/iomgr/iomgr.cc +1 -1
  543. data/src/core/lib/iomgr/iomgr_posix.cc +0 -1
  544. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +0 -1
  545. data/src/core/lib/iomgr/load_file.h +1 -1
  546. data/src/core/lib/iomgr/lockfree_event.cc +19 -14
  547. data/src/core/lib/iomgr/lockfree_event.h +2 -2
  548. data/src/core/lib/iomgr/parse_address.cc +127 -43
  549. data/src/core/lib/iomgr/parse_address.h +32 -8
  550. data/src/core/lib/iomgr/poller/eventmanager_libuv.cc +2 -1
  551. data/src/core/lib/iomgr/poller/eventmanager_libuv.h +1 -1
  552. data/src/core/lib/iomgr/pollset_set_custom.cc +1 -1
  553. data/src/core/lib/iomgr/python_util.h +4 -4
  554. data/src/core/lib/iomgr/resolve_address.cc +4 -4
  555. data/src/core/lib/iomgr/resolve_address_posix.cc +1 -5
  556. data/src/core/lib/iomgr/resource_quota.cc +4 -4
  557. data/src/core/lib/iomgr/sockaddr_utils.cc +11 -11
  558. data/src/core/lib/iomgr/sockaddr_utils.h +1 -1
  559. data/src/core/lib/iomgr/socket_factory_posix.cc +3 -2
  560. data/src/core/lib/iomgr/socket_mutator.cc +3 -2
  561. data/src/core/lib/iomgr/socket_utils_common_posix.cc +1 -0
  562. data/src/core/lib/iomgr/tcp_client.cc +3 -3
  563. data/src/core/lib/iomgr/tcp_client_custom.cc +7 -6
  564. data/src/core/lib/iomgr/tcp_client_posix.cc +1 -1
  565. data/src/core/lib/iomgr/tcp_custom.cc +22 -17
  566. data/src/core/lib/iomgr/tcp_posix.cc +16 -12
  567. data/src/core/lib/iomgr/tcp_server_custom.cc +28 -22
  568. data/src/core/lib/iomgr/timer_custom.cc +5 -5
  569. data/src/core/lib/iomgr/timer_generic.cc +3 -3
  570. data/src/core/lib/iomgr/timer_manager.cc +2 -2
  571. data/src/core/lib/iomgr/udp_server.cc +1 -2
  572. data/src/core/lib/iomgr/udp_server.h +1 -2
  573. data/src/core/lib/iomgr/unix_sockets_posix.cc +32 -21
  574. data/src/core/lib/iomgr/unix_sockets_posix.h +5 -0
  575. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +7 -0
  576. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +2 -2
  577. data/src/core/lib/json/json.h +12 -2
  578. data/src/core/lib/json/json_reader.cc +8 -4
  579. data/src/core/lib/json/json_util.cc +58 -0
  580. data/src/core/lib/json/json_util.h +204 -0
  581. data/src/core/lib/json/json_writer.cc +2 -1
  582. data/src/core/lib/security/authorization/evaluate_args.cc +5 -10
  583. data/src/core/lib/security/authorization/evaluate_args.h +1 -1
  584. data/src/core/lib/security/authorization/matchers.cc +339 -0
  585. data/src/core/lib/security/authorization/matchers.h +158 -0
  586. data/src/core/lib/security/authorization/mock_cel/activation.h +1 -1
  587. data/src/core/lib/security/authorization/mock_cel/cel_expr_builder_factory.h +3 -1
  588. data/src/core/lib/security/authorization/mock_cel/cel_expression.h +5 -4
  589. data/src/core/lib/security/authorization/mock_cel/cel_value.h +13 -7
  590. data/src/core/lib/security/authorization/mock_cel/evaluator_core.h +6 -6
  591. data/src/core/lib/security/authorization/mock_cel/flat_expr_builder.h +10 -9
  592. data/src/core/lib/security/context/security_context.cc +4 -3
  593. data/src/core/lib/security/context/security_context.h +3 -1
  594. data/src/core/lib/security/credentials/alts/alts_credentials.cc +2 -1
  595. data/src/core/lib/security/credentials/alts/alts_credentials.h +1 -1
  596. data/src/core/lib/security/credentials/alts/check_gcp_environment.cc +1 -1
  597. data/src/core/lib/security/credentials/credentials.cc +7 -7
  598. data/src/core/lib/security/credentials/credentials.h +5 -4
  599. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +413 -0
  600. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +80 -0
  601. data/src/core/lib/security/credentials/external/aws_request_signer.cc +213 -0
  602. data/src/core/lib/security/credentials/external/aws_request_signer.h +72 -0
  603. data/src/core/lib/security/credentials/external/external_account_credentials.cc +497 -0
  604. data/src/core/lib/security/credentials/external/external_account_credentials.h +120 -0
  605. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +135 -0
  606. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +48 -0
  607. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +213 -0
  608. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +58 -0
  609. data/src/core/lib/security/credentials/fake/fake_credentials.cc +3 -2
  610. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +25 -18
  611. data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +64 -0
  612. data/src/core/lib/security/credentials/jwt/json_token.cc +3 -3
  613. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +4 -3
  614. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +5 -4
  615. data/src/core/lib/security/credentials/local/local_credentials.cc +2 -1
  616. data/src/core/lib/security/credentials/local/local_credentials.h +1 -1
  617. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +39 -46
  618. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +5 -4
  619. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +1 -1
  620. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +7 -6
  621. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +2 -2
  622. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +346 -0
  623. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +213 -0
  624. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +399 -0
  625. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +138 -0
  626. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +78 -150
  627. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +57 -187
  628. data/src/core/lib/security/credentials/tls/tls_credentials.cc +18 -13
  629. data/src/core/lib/security/credentials/tls/tls_credentials.h +3 -3
  630. data/src/core/lib/security/credentials/tls/tls_utils.cc +91 -0
  631. data/src/core/lib/security/credentials/tls/tls_utils.h +38 -0
  632. data/src/core/lib/security/credentials/xds/xds_credentials.cc +244 -0
  633. data/src/core/lib/security/credentials/xds/xds_credentials.h +69 -0
  634. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +1 -1
  635. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +9 -13
  636. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +121 -0
  637. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +87 -0
  638. data/src/core/lib/security/security_connector/load_system_roots.h +4 -0
  639. data/src/core/lib/security/security_connector/load_system_roots_linux.h +2 -0
  640. data/src/core/lib/security/security_connector/local/local_security_connector.cc +3 -3
  641. data/src/core/lib/security/security_connector/security_connector.cc +4 -3
  642. data/src/core/lib/security/security_connector/security_connector.h +4 -2
  643. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +4 -4
  644. data/src/core/lib/security/security_connector/ssl_utils.cc +5 -2
  645. data/src/core/lib/security/security_connector/ssl_utils.h +19 -19
  646. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +354 -279
  647. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +105 -61
  648. data/src/core/lib/security/transport/secure_endpoint.cc +2 -2
  649. data/src/core/lib/security/transport/security_handshaker.cc +4 -6
  650. data/src/core/lib/security/transport/server_auth_filter.cc +2 -1
  651. data/src/core/lib/security/util/json_util.h +1 -0
  652. data/src/core/lib/slice/slice.cc +7 -4
  653. data/src/core/lib/slice/slice_buffer.cc +2 -1
  654. data/src/core/lib/slice/slice_intern.cc +7 -8
  655. data/src/core/lib/slice/slice_internal.h +2 -2
  656. data/src/core/lib/surface/call.cc +41 -32
  657. data/src/core/lib/surface/call_details.cc +8 -8
  658. data/src/core/lib/surface/channel.cc +25 -41
  659. data/src/core/lib/surface/channel.h +9 -3
  660. data/src/core/lib/surface/channel_init.cc +1 -1
  661. data/src/core/lib/surface/completion_queue.cc +30 -24
  662. data/src/core/lib/surface/completion_queue.h +16 -16
  663. data/src/core/lib/surface/init.cc +45 -29
  664. data/src/core/lib/surface/lame_client.cc +20 -46
  665. data/src/core/lib/surface/lame_client.h +4 -0
  666. data/src/core/lib/surface/server.cc +66 -20
  667. data/src/core/lib/surface/server.h +42 -7
  668. data/src/core/lib/surface/validate_metadata.h +3 -0
  669. data/src/core/lib/surface/version.cc +2 -2
  670. data/src/core/lib/transport/authority_override.cc +6 -4
  671. data/src/core/lib/transport/authority_override.h +7 -2
  672. data/src/core/lib/transport/bdp_estimator.cc +1 -1
  673. data/src/core/lib/transport/bdp_estimator.h +2 -1
  674. data/src/core/lib/transport/byte_stream.h +3 -3
  675. data/src/core/lib/transport/connectivity_state.h +11 -9
  676. data/src/core/lib/transport/error_utils.h +1 -1
  677. data/src/core/lib/transport/metadata.cc +16 -2
  678. data/src/core/lib/transport/metadata.h +2 -2
  679. data/src/core/lib/transport/metadata_batch.h +4 -4
  680. data/src/core/lib/transport/static_metadata.cc +1 -1
  681. data/src/core/lib/transport/status_metadata.cc +4 -3
  682. data/src/core/lib/transport/timeout_encoding.cc +4 -4
  683. data/src/core/lib/transport/transport.cc +5 -3
  684. data/src/core/lib/transport/transport.h +8 -8
  685. data/src/core/lib/uri/uri_parser.cc +131 -249
  686. data/src/core/lib/uri/uri_parser.h +57 -21
  687. data/src/core/plugin_registry/grpc_plugin_registry.cc +47 -20
  688. data/src/core/tsi/alts/crypt/gsec.cc +5 -4
  689. data/src/core/tsi/alts/frame_protector/frame_handler.cc +8 -6
  690. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +18 -21
  691. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +43 -47
  692. data/src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.cc +8 -6
  693. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +4 -4
  694. data/src/core/tsi/fake_transport_security.cc +7 -4
  695. data/src/core/tsi/local_transport_security.cc +5 -1
  696. data/src/core/tsi/local_transport_security.h +6 -7
  697. data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +1 -1
  698. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +0 -2
  699. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +3 -2
  700. data/src/core/tsi/ssl_transport_security.cc +75 -58
  701. data/src/core/tsi/ssl_transport_security.h +6 -6
  702. data/src/core/tsi/transport_security.cc +10 -8
  703. data/src/core/tsi/transport_security_interface.h +1 -1
  704. data/src/ruby/ext/grpc/extconf.rb +1 -1
  705. data/src/ruby/ext/grpc/rb_event_thread.c +2 -0
  706. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +36 -16
  707. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +70 -40
  708. data/src/ruby/lib/grpc/version.rb +1 -1
  709. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +35 -0
  710. data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +18 -0
  711. data/src/ruby/spec/pb/codegen/package_option_spec.rb +2 -6
  712. data/third_party/abseil-cpp/absl/algorithm/container.h +59 -22
  713. data/third_party/abseil-cpp/absl/base/attributes.h +99 -38
  714. data/third_party/abseil-cpp/absl/base/call_once.h +1 -1
  715. data/third_party/abseil-cpp/absl/base/casts.h +9 -6
  716. data/third_party/abseil-cpp/absl/base/config.h +60 -17
  717. data/third_party/abseil-cpp/absl/base/dynamic_annotations.h +428 -335
  718. data/third_party/abseil-cpp/absl/base/internal/bits.h +17 -16
  719. data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +5 -0
  720. data/third_party/abseil-cpp/absl/base/internal/dynamic_annotations.h +398 -0
  721. data/third_party/abseil-cpp/absl/base/internal/invoke.h +4 -4
  722. data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.cc +1 -1
  723. data/third_party/abseil-cpp/absl/base/internal/low_level_scheduling.h +29 -1
  724. data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +2 -2
  725. data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +7 -5
  726. data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +25 -38
  727. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +19 -25
  728. data/third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc +8 -0
  729. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +28 -5
  730. data/third_party/abseil-cpp/absl/base/internal/sysinfo.h +8 -0
  731. data/third_party/abseil-cpp/absl/base/internal/tsan_mutex_interface.h +3 -1
  732. data/third_party/abseil-cpp/absl/base/internal/unaligned_access.h +2 -2
  733. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +3 -3
  734. data/third_party/abseil-cpp/absl/base/macros.h +36 -109
  735. data/third_party/abseil-cpp/absl/base/optimization.h +61 -1
  736. data/third_party/abseil-cpp/absl/base/options.h +31 -4
  737. data/third_party/abseil-cpp/absl/base/policy_checks.h +1 -1
  738. data/third_party/abseil-cpp/absl/base/thread_annotations.h +94 -39
  739. data/third_party/abseil-cpp/absl/container/fixed_array.h +42 -25
  740. data/third_party/abseil-cpp/absl/container/flat_hash_map.h +606 -0
  741. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +2 -1
  742. data/third_party/abseil-cpp/absl/container/inlined_vector.h +33 -36
  743. data/third_party/abseil-cpp/absl/container/internal/common.h +6 -2
  744. data/third_party/abseil-cpp/absl/container/internal/compressed_tuple.h +33 -8
  745. data/third_party/abseil-cpp/absl/container/internal/container_memory.h +49 -29
  746. data/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h +15 -0
  747. data/third_party/abseil-cpp/absl/container/internal/hash_policy_traits.h +24 -7
  748. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +2 -1
  749. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +35 -11
  750. data/third_party/abseil-cpp/absl/container/internal/have_sse.h +10 -9
  751. data/third_party/abseil-cpp/absl/container/internal/layout.h +7 -5
  752. data/third_party/abseil-cpp/absl/container/internal/raw_hash_map.h +197 -0
  753. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +55 -34
  754. data/third_party/abseil-cpp/absl/debugging/internal/address_is_readable.cc +5 -4
  755. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +66 -16
  756. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +4 -0
  757. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +13 -4
  758. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +43 -24
  759. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +12 -3
  760. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_win32-inl.inc +10 -2
  761. data/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +22 -1
  762. data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +0 -21
  763. data/third_party/abseil-cpp/absl/debugging/symbolize.cc +12 -1
  764. data/third_party/abseil-cpp/absl/debugging/symbolize_darwin.inc +101 -0
  765. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +100 -20
  766. data/third_party/abseil-cpp/absl/functional/bind_front.h +184 -0
  767. data/third_party/abseil-cpp/absl/functional/function_ref.h +1 -1
  768. data/third_party/abseil-cpp/absl/functional/internal/front_binder.h +95 -0
  769. data/third_party/abseil-cpp/absl/functional/internal/function_ref.h +2 -2
  770. data/third_party/abseil-cpp/absl/hash/hash.h +6 -5
  771. data/third_party/abseil-cpp/absl/hash/internal/hash.h +73 -65
  772. data/third_party/abseil-cpp/absl/memory/memory.h +4 -0
  773. data/third_party/abseil-cpp/absl/meta/type_traits.h +2 -8
  774. data/third_party/abseil-cpp/absl/numeric/int128.cc +13 -27
  775. data/third_party/abseil-cpp/absl/numeric/int128.h +16 -15
  776. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +51 -0
  777. data/third_party/abseil-cpp/absl/status/internal/statusor_internal.h +399 -0
  778. data/third_party/abseil-cpp/absl/status/status.cc +4 -6
  779. data/third_party/abseil-cpp/absl/status/status.h +502 -113
  780. data/third_party/abseil-cpp/absl/status/status_payload_printer.cc +5 -10
  781. data/third_party/abseil-cpp/absl/status/statusor.cc +71 -0
  782. data/third_party/abseil-cpp/absl/status/statusor.h +760 -0
  783. data/third_party/abseil-cpp/absl/strings/charconv.cc +2 -2
  784. data/third_party/abseil-cpp/absl/strings/cord.cc +91 -112
  785. data/third_party/abseil-cpp/absl/strings/cord.h +360 -205
  786. data/third_party/abseil-cpp/absl/strings/escaping.cc +9 -9
  787. data/third_party/abseil-cpp/absl/strings/internal/char_map.h +1 -1
  788. data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.cc +1 -1
  789. data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.h +2 -2
  790. data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc +2 -2
  791. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +45 -23
  792. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +222 -136
  793. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +136 -64
  794. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc +1 -1
  795. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +14 -21
  796. data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +7 -14
  797. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +31 -7
  798. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.h +147 -135
  799. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +999 -87
  800. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.h +3 -3
  801. data/third_party/abseil-cpp/absl/strings/internal/str_format/output.h +4 -12
  802. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc +8 -6
  803. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +13 -11
  804. data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +2 -2
  805. data/third_party/abseil-cpp/absl/strings/str_cat.cc +4 -4
  806. data/third_party/abseil-cpp/absl/strings/str_cat.h +1 -1
  807. data/third_party/abseil-cpp/absl/strings/str_format.h +289 -13
  808. data/third_party/abseil-cpp/absl/strings/str_split.cc +2 -2
  809. data/third_party/abseil-cpp/absl/strings/str_split.h +1 -0
  810. data/third_party/abseil-cpp/absl/strings/string_view.h +26 -19
  811. data/third_party/abseil-cpp/absl/strings/substitute.cc +5 -5
  812. data/third_party/abseil-cpp/absl/strings/substitute.h +32 -29
  813. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +3 -3
  814. data/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.cc +4 -3
  815. data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +28 -28
  816. data/third_party/abseil-cpp/absl/synchronization/internal/mutex_nonprod.inc +4 -16
  817. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +1 -1
  818. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +8 -0
  819. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +2 -2
  820. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +75 -64
  821. data/third_party/abseil-cpp/absl/synchronization/mutex.h +15 -6
  822. data/third_party/abseil-cpp/absl/time/civil_time.cc +9 -9
  823. data/third_party/abseil-cpp/absl/time/clock.cc +3 -3
  824. data/third_party/abseil-cpp/absl/time/duration.cc +90 -59
  825. data/third_party/abseil-cpp/absl/time/format.cc +43 -36
  826. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +26 -16
  827. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +4 -2
  828. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/zone_info_source.h +1 -1
  829. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +136 -29
  830. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.cc +13 -21
  831. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.h +1 -1
  832. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc +136 -129
  833. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.h +4 -5
  834. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.cc +8 -7
  835. data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +6 -6
  836. data/third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc +2 -1
  837. data/third_party/abseil-cpp/absl/time/time.h +15 -16
  838. data/third_party/abseil-cpp/absl/types/internal/variant.h +4 -4
  839. data/third_party/abseil-cpp/absl/types/optional.h +9 -9
  840. data/third_party/abseil-cpp/absl/types/span.h +49 -36
  841. data/third_party/abseil-cpp/absl/utility/utility.h +2 -2
  842. data/third_party/address_sorting/include/address_sorting/address_sorting.h +2 -0
  843. data/third_party/boringssl-with-bazel/err_data.c +728 -720
  844. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c +3 -3
  845. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_enum.c +2 -2
  846. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_int.c +5 -5
  847. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +3 -10
  848. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_octet.c +3 -3
  849. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c +4 -2
  850. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_utctm.c +2 -2
  851. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +15 -20
  852. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_locl.h +30 -0
  853. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c +28 -79
  854. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +39 -85
  855. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c +5 -16
  856. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_new.c +10 -61
  857. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_typ.c +0 -2
  858. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_utl.c +2 -2
  859. data/third_party/boringssl-with-bazel/src/crypto/bio/bio.c +2 -0
  860. data/third_party/boringssl-with-bazel/src/crypto/bio/socket_helper.c +4 -0
  861. data/third_party/boringssl-with-bazel/src/crypto/blake2/blake2.c +158 -0
  862. data/third_party/boringssl-with-bazel/src/crypto/bn_extra/bn_asn1.c +3 -10
  863. data/third_party/boringssl-with-bazel/src/crypto/bytestring/ber.c +8 -9
  864. data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbs.c +60 -45
  865. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_chacha20poly1305.c +6 -81
  866. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/internal.h +87 -0
  867. data/third_party/boringssl-with-bazel/src/crypto/cpu-aarch64-win.c +41 -0
  868. data/third_party/boringssl-with-bazel/src/crypto/{dh → dh_extra}/dh_asn1.c +0 -0
  869. data/third_party/boringssl-with-bazel/src/crypto/{dh → dh_extra}/params.c +179 -0
  870. data/third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.c +25 -0
  871. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +9 -43
  872. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa_asn1.c +55 -4
  873. data/third_party/boringssl-with-bazel/src/crypto/dsa/internal.h +34 -0
  874. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_asn1.c +2 -17
  875. data/third_party/boringssl-with-bazel/src/crypto/evp/evp.c +4 -0
  876. data/third_party/boringssl-with-bazel/src/crypto/evp/p_dsa_asn1.c +6 -2
  877. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +3 -1
  878. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/bn.c +13 -20
  879. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/div.c +2 -3
  880. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +9 -1
  881. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_aes.c +173 -35
  882. data/third_party/boringssl-with-bazel/src/crypto/{dh → fipsmodule/dh}/check.c +0 -0
  883. data/third_party/boringssl-with-bazel/src/crypto/{dh → fipsmodule/dh}/dh.c +136 -213
  884. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digest.c +2 -0
  885. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c +12 -0
  886. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c +9 -1
  887. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/internal.h +28 -0
  888. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +128 -38
  889. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +0 -7
  890. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/internal.h +4 -0
  891. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa.c +30 -10
  892. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +107 -54
  893. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +155 -2
  894. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +112 -36
  895. data/third_party/boringssl-with-bazel/src/crypto/hpke/internal.h +63 -9
  896. data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305.c +10 -7
  897. data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_arm.c +13 -11
  898. data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_vec.c +4 -0
  899. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/passive.c +34 -0
  900. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/rand_extra.c +4 -0
  901. data/third_party/boringssl-with-bazel/src/crypto/stack/stack.c +7 -13
  902. data/third_party/boringssl-with-bazel/src/crypto/trust_token/internal.h +118 -49
  903. data/third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c +267 -95
  904. data/third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.c +210 -34
  905. data/third_party/boringssl-with-bazel/src/crypto/trust_token/voprf.c +766 -0
  906. data/third_party/boringssl-with-bazel/src/crypto/x509/a_strex.c +3 -3
  907. data/third_party/boringssl-with-bazel/src/crypto/x509/algorithm.c +6 -4
  908. data/third_party/boringssl-with-bazel/src/crypto/x509/rsa_pss.c +5 -1
  909. data/third_party/boringssl-with-bazel/src/crypto/x509/t_crl.c +3 -3
  910. data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509.c +1 -1
  911. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c +8 -3
  912. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_ext.c +27 -21
  913. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_obj.c +1 -1
  914. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_r2x.c +1 -1
  915. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c +32 -11
  916. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_trs.c +3 -3
  917. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_txt.c +67 -67
  918. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_v3.c +4 -4
  919. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +29 -35
  920. data/third_party/boringssl-with-bazel/src/crypto/x509/x509cset.c +42 -25
  921. data/third_party/boringssl-with-bazel/src/crypto/x509/x509name.c +9 -8
  922. data/third_party/boringssl-with-bazel/src/crypto/x509/x_all.c +10 -10
  923. data/third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c +3 -4
  924. data/third_party/boringssl-with-bazel/src/crypto/x509/x_name.c +28 -40
  925. data/third_party/boringssl-with-bazel/src/crypto/x509/x_pkey.c +2 -2
  926. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +38 -3
  927. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509a.c +2 -2
  928. data/third_party/boringssl-with-bazel/src/crypto/x509v3/ext_dat.h +1 -4
  929. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_data.c +5 -3
  930. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akey.c +3 -3
  931. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c +25 -24
  932. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bitst.c +3 -3
  933. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_conf.c +32 -28
  934. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +2 -2
  935. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_enum.c +2 -1
  936. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_genn.c +42 -22
  937. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ia5.c +3 -4
  938. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_info.c +1 -1
  939. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c +25 -36
  940. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c +2 -2
  941. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +55 -8
  942. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_skey.c +7 -7
  943. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c +6 -6
  944. data/third_party/boringssl-with-bazel/src/include/openssl/aead.h +24 -0
  945. data/third_party/boringssl-with-bazel/src/include/openssl/arm_arch.h +10 -8
  946. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +652 -546
  947. data/third_party/boringssl-with-bazel/src/include/openssl/asn1t.h +0 -167
  948. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +15 -7
  949. data/third_party/boringssl-with-bazel/src/include/openssl/bio.h +4 -0
  950. data/third_party/boringssl-with-bazel/src/include/openssl/blake2.h +62 -0
  951. data/third_party/boringssl-with-bazel/src/include/openssl/bytestring.h +22 -7
  952. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +21 -0
  953. data/third_party/boringssl-with-bazel/src/include/openssl/crypto.h +1 -1
  954. data/third_party/boringssl-with-bazel/src/include/openssl/des.h +6 -0
  955. data/third_party/boringssl-with-bazel/src/include/openssl/dh.h +62 -20
  956. data/third_party/boringssl-with-bazel/src/include/openssl/digest.h +10 -0
  957. data/third_party/boringssl-with-bazel/src/include/openssl/ec.h +15 -0
  958. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +16 -3
  959. data/third_party/boringssl-with-bazel/src/include/openssl/opensslconf.h +3 -0
  960. data/third_party/boringssl-with-bazel/src/include/openssl/pem.h +202 -134
  961. data/third_party/boringssl-with-bazel/src/include/openssl/rand.h +3 -0
  962. data/third_party/boringssl-with-bazel/src/include/openssl/span.h +2 -1
  963. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +106 -27
  964. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +31 -8
  965. data/third_party/boringssl-with-bazel/src/include/openssl/trust_token.h +42 -14
  966. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +462 -163
  967. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +593 -440
  968. data/third_party/boringssl-with-bazel/src/ssl/bio_ssl.cc +18 -5
  969. data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +35 -0
  970. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +22 -21
  971. data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +13 -23
  972. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +11 -6
  973. data/third_party/boringssl-with-bazel/src/ssl/internal.h +82 -26
  974. data/third_party/boringssl-with-bazel/src/ssl/s3_lib.cc +0 -1
  975. data/third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc +49 -9
  976. data/third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc +8 -9
  977. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +87 -14
  978. data/third_party/boringssl-with-bazel/src/ssl/ssl_session.cc +18 -22
  979. data/third_party/boringssl-with-bazel/src/ssl/ssl_transcript.cc +2 -2
  980. data/third_party/boringssl-with-bazel/src/ssl/t1_enc.cc +5 -7
  981. data/third_party/boringssl-with-bazel/src/ssl/t1_lib.cc +537 -34
  982. data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +1 -2
  983. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +59 -21
  984. data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +48 -15
  985. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +194 -58
  986. data/third_party/upb/third_party/wyhash/wyhash.h +145 -0
  987. data/third_party/upb/upb/decode.c +248 -167
  988. data/third_party/upb/upb/decode.h +20 -1
  989. data/third_party/upb/upb/decode.int.h +163 -0
  990. data/third_party/upb/upb/decode_fast.c +1040 -0
  991. data/third_party/upb/upb/decode_fast.h +126 -0
  992. data/third_party/upb/upb/def.c +2178 -0
  993. data/third_party/upb/upb/def.h +315 -0
  994. data/third_party/upb/upb/def.hpp +439 -0
  995. data/third_party/upb/upb/encode.c +227 -169
  996. data/third_party/upb/upb/encode.h +27 -2
  997. data/third_party/upb/upb/json_decode.c +1443 -0
  998. data/third_party/upb/upb/json_decode.h +23 -0
  999. data/third_party/upb/upb/json_encode.c +713 -0
  1000. data/third_party/upb/upb/json_encode.h +36 -0
  1001. data/third_party/upb/upb/msg.c +167 -88
  1002. data/third_party/upb/upb/msg.h +174 -34
  1003. data/third_party/upb/upb/port_def.inc +74 -61
  1004. data/third_party/upb/upb/port_undef.inc +3 -7
  1005. data/third_party/upb/upb/reflection.c +408 -0
  1006. data/third_party/upb/upb/reflection.h +168 -0
  1007. data/third_party/upb/upb/table.c +34 -197
  1008. data/third_party/upb/upb/table.int.h +14 -5
  1009. data/third_party/upb/upb/text_encode.c +421 -0
  1010. data/third_party/upb/upb/text_encode.h +38 -0
  1011. data/third_party/upb/upb/upb.c +18 -41
  1012. data/third_party/upb/upb/upb.h +36 -7
  1013. data/third_party/upb/upb/upb.hpp +4 -4
  1014. data/third_party/upb/upb/upb.int.h +29 -0
  1015. metadata +309 -63
  1016. data/src/core/ext/filters/client_channel/lb_policy/xds/eds.cc +0 -946
  1017. data/src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc +0 -537
  1018. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc +0 -1141
  1019. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +0 -485
  1020. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +0 -68
  1021. data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +0 -354
  1022. data/src/core/ext/filters/client_channel/resolving_lb_policy.h +0 -142
  1023. data/src/core/ext/upb-generated/gogoproto/gogo.upb.c +0 -17
  1024. data/src/core/ext/xds/xds_channel.h +0 -46
  1025. data/src/core/ext/xds/xds_channel_secure.cc +0 -103
  1026. data/src/core/lib/gprpp/map.h +0 -53
  1027. data/src/core/lib/iomgr/iomgr_posix.h +0 -26
  1028. data/third_party/abseil-cpp/absl/base/dynamic_annotations.cc +0 -129
  1029. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pku.c +0 -110
  1030. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_sxnet.c +0 -274
  1031. data/third_party/upb/upb/port.c +0 -26
@@ -7,12 +7,37 @@
7
7
 
8
8
  #include "upb/msg.h"
9
9
 
10
+ /* Must be last. */
11
+ #include "upb/port_def.inc"
12
+
10
13
  #ifdef __cplusplus
11
14
  extern "C" {
12
15
  #endif
13
16
 
14
- char *upb_encode(const void *msg, const upb_msglayout *l, upb_arena *arena,
15
- size_t *size);
17
+ enum {
18
+ /* If set, the results of serializing will be deterministic across all
19
+ * instances of this binary. There are no guarantees across different
20
+ * binary builds.
21
+ *
22
+ * If your proto contains maps, the encoder will need to malloc()/free()
23
+ * memory during encode. */
24
+ UPB_ENCODE_DETERMINISTIC = 1,
25
+
26
+ /* When set, unknown fields are not printed. */
27
+ UPB_ENCODE_SKIPUNKNOWN = 2,
28
+ };
29
+
30
+ #define UPB_ENCODE_MAXDEPTH(depth) ((depth) << 16)
31
+
32
+ char *upb_encode_ex(const void *msg, const upb_msglayout *l, int options,
33
+ upb_arena *arena, size_t *size);
34
+
35
+ UPB_INLINE char *upb_encode(const void *msg, const upb_msglayout *l,
36
+ upb_arena *arena, size_t *size) {
37
+ return upb_encode_ex(msg, l, 0, arena, size);
38
+ }
39
+
40
+ #include "upb/port_undef.inc"
16
41
 
17
42
  #ifdef __cplusplus
18
43
  } /* extern "C" */
@@ -0,0 +1,1443 @@
1
+
2
+ #include "upb/json_decode.h"
3
+
4
+ #include <errno.h>
5
+ #include <float.h>
6
+ #include <inttypes.h>
7
+ #include <limits.h>
8
+ #include <math.h>
9
+ #include <setjmp.h>
10
+ #include <stdlib.h>
11
+ #include <string.h>
12
+
13
+ #include "upb/encode.h"
14
+ #include "upb/reflection.h"
15
+
16
+ /* Special header, must be included last. */
17
+ #include "upb/port_def.inc"
18
+
19
+ typedef struct {
20
+ const char *ptr, *end;
21
+ upb_arena *arena; /* TODO: should we have a tmp arena for tmp data? */
22
+ const upb_symtab *any_pool;
23
+ int depth;
24
+ upb_status *status;
25
+ jmp_buf err;
26
+ int line;
27
+ const char *line_begin;
28
+ bool is_first;
29
+ int options;
30
+ const upb_fielddef *debug_field;
31
+ } jsondec;
32
+
33
+ enum { JD_OBJECT, JD_ARRAY, JD_STRING, JD_NUMBER, JD_TRUE, JD_FALSE, JD_NULL };
34
+
35
+ /* Forward declarations of mutually-recursive functions. */
36
+ static void jsondec_wellknown(jsondec *d, upb_msg *msg, const upb_msgdef *m);
37
+ static upb_msgval jsondec_value(jsondec *d, const upb_fielddef *f);
38
+ static void jsondec_wellknownvalue(jsondec *d, upb_msg *msg,
39
+ const upb_msgdef *m);
40
+ static void jsondec_object(jsondec *d, upb_msg *msg, const upb_msgdef *m);
41
+
42
+ static bool jsondec_streql(upb_strview str, const char *lit) {
43
+ return str.size == strlen(lit) && memcmp(str.data, lit, str.size) == 0;
44
+ }
45
+
46
+ static bool jsondec_isnullvalue(const upb_fielddef *f) {
47
+ return upb_fielddef_type(f) == UPB_TYPE_ENUM &&
48
+ strcmp(upb_enumdef_fullname(upb_fielddef_enumsubdef(f)),
49
+ "google.protobuf.NullValue") == 0;
50
+ }
51
+
52
+ static bool jsondec_isvalue(const upb_fielddef *f) {
53
+ return (upb_fielddef_type(f) == UPB_TYPE_MESSAGE &&
54
+ upb_msgdef_wellknowntype(upb_fielddef_msgsubdef(f)) ==
55
+ UPB_WELLKNOWN_VALUE) ||
56
+ jsondec_isnullvalue(f);
57
+ }
58
+
59
+ UPB_NORETURN static void jsondec_err(jsondec *d, const char *msg) {
60
+ upb_status_seterrf(d->status, "Error parsing JSON @%d:%d: %s", d->line,
61
+ (int)(d->ptr - d->line_begin), msg);
62
+ UPB_LONGJMP(d->err, 1);
63
+ }
64
+
65
+ UPB_NORETURN static void jsondec_errf(jsondec *d, const char *fmt, ...) {
66
+ va_list argp;
67
+ upb_status_seterrf(d->status, "Error parsing JSON @%d:%d: ", d->line,
68
+ (int)(d->ptr - d->line_begin));
69
+ va_start(argp, fmt);
70
+ upb_status_vappenderrf(d->status, fmt, argp);
71
+ va_end(argp);
72
+ UPB_LONGJMP(d->err, 1);
73
+ }
74
+
75
+ static void jsondec_skipws(jsondec *d) {
76
+ while (d->ptr != d->end) {
77
+ switch (*d->ptr) {
78
+ case '\n':
79
+ d->line++;
80
+ d->line_begin = d->ptr;
81
+ /* Fallthrough. */
82
+ case '\r':
83
+ case '\t':
84
+ case ' ':
85
+ d->ptr++;
86
+ break;
87
+ default:
88
+ return;
89
+ }
90
+ }
91
+ jsondec_err(d, "Unexpected EOF");
92
+ }
93
+
94
+ static bool jsondec_tryparsech(jsondec *d, char ch) {
95
+ if (d->ptr == d->end || *d->ptr != ch) return false;
96
+ d->ptr++;
97
+ return true;
98
+ }
99
+
100
+ static void jsondec_parselit(jsondec *d, const char *lit) {
101
+ size_t avail = d->end - d->ptr;
102
+ size_t len = strlen(lit);
103
+ if (avail < len || memcmp(d->ptr, lit, len) != 0) {
104
+ jsondec_errf(d, "Expected: '%s'", lit);
105
+ }
106
+ d->ptr += len;
107
+ }
108
+
109
+ static void jsondec_wsch(jsondec *d, char ch) {
110
+ jsondec_skipws(d);
111
+ if (!jsondec_tryparsech(d, ch)) {
112
+ jsondec_errf(d, "Expected: '%c'", ch);
113
+ }
114
+ }
115
+
116
+ static void jsondec_true(jsondec *d) { jsondec_parselit(d, "true"); }
117
+ static void jsondec_false(jsondec *d) { jsondec_parselit(d, "false"); }
118
+ static void jsondec_null(jsondec *d) { jsondec_parselit(d, "null"); }
119
+
120
+ static void jsondec_entrysep(jsondec *d) {
121
+ jsondec_skipws(d);
122
+ jsondec_parselit(d, ":");
123
+ }
124
+
125
+ static int jsondec_rawpeek(jsondec *d) {
126
+ switch (*d->ptr) {
127
+ case '{':
128
+ return JD_OBJECT;
129
+ case '[':
130
+ return JD_ARRAY;
131
+ case '"':
132
+ return JD_STRING;
133
+ case '-':
134
+ case '0':
135
+ case '1':
136
+ case '2':
137
+ case '3':
138
+ case '4':
139
+ case '5':
140
+ case '6':
141
+ case '7':
142
+ case '8':
143
+ case '9':
144
+ return JD_NUMBER;
145
+ case 't':
146
+ return JD_TRUE;
147
+ case 'f':
148
+ return JD_FALSE;
149
+ case 'n':
150
+ return JD_NULL;
151
+ default:
152
+ jsondec_errf(d, "Unexpected character: '%c'", *d->ptr);
153
+ }
154
+ }
155
+
156
+ /* JSON object/array **********************************************************/
157
+
158
+ /* These are used like so:
159
+ *
160
+ * jsondec_objstart(d);
161
+ * while (jsondec_objnext(d)) {
162
+ * ...
163
+ * }
164
+ * jsondec_objend(d) */
165
+
166
+ static int jsondec_peek(jsondec *d) {
167
+ jsondec_skipws(d);
168
+ return jsondec_rawpeek(d);
169
+ }
170
+
171
+ static void jsondec_push(jsondec *d) {
172
+ if (--d->depth < 0) {
173
+ jsondec_err(d, "Recursion limit exceeded");
174
+ }
175
+ d->is_first = true;
176
+ }
177
+
178
+ static bool jsondec_seqnext(jsondec *d, char end_ch) {
179
+ bool is_first = d->is_first;
180
+ d->is_first = false;
181
+ jsondec_skipws(d);
182
+ if (*d->ptr == end_ch) return false;
183
+ if (!is_first) jsondec_parselit(d, ",");
184
+ return true;
185
+ }
186
+
187
+ static void jsondec_arrstart(jsondec *d) {
188
+ jsondec_push(d);
189
+ jsondec_wsch(d, '[');
190
+ }
191
+
192
+ static void jsondec_arrend(jsondec *d) {
193
+ d->depth++;
194
+ jsondec_wsch(d, ']');
195
+ }
196
+
197
+ static bool jsondec_arrnext(jsondec *d) {
198
+ return jsondec_seqnext(d, ']');
199
+ }
200
+
201
+ static void jsondec_objstart(jsondec *d) {
202
+ jsondec_push(d);
203
+ jsondec_wsch(d, '{');
204
+ }
205
+
206
+ static void jsondec_objend(jsondec *d) {
207
+ d->depth++;
208
+ jsondec_wsch(d, '}');
209
+ }
210
+
211
+ static bool jsondec_objnext(jsondec *d) {
212
+ if (!jsondec_seqnext(d, '}')) return false;
213
+ if (jsondec_peek(d) != JD_STRING) {
214
+ jsondec_err(d, "Object must start with string");
215
+ }
216
+ return true;
217
+ }
218
+
219
+ /* JSON number ****************************************************************/
220
+
221
+ static bool jsondec_tryskipdigits(jsondec *d) {
222
+ const char *start = d->ptr;
223
+
224
+ while (d->ptr < d->end) {
225
+ if (*d->ptr < '0' || *d->ptr > '9') {
226
+ break;
227
+ }
228
+ d->ptr++;
229
+ }
230
+
231
+ return d->ptr != start;
232
+ }
233
+
234
+ static void jsondec_skipdigits(jsondec *d) {
235
+ if (!jsondec_tryskipdigits(d)) {
236
+ jsondec_err(d, "Expected one or more digits");
237
+ }
238
+ }
239
+
240
+ static double jsondec_number(jsondec *d) {
241
+ const char *start = d->ptr;
242
+
243
+ assert(jsondec_rawpeek(d) == JD_NUMBER);
244
+
245
+ /* Skip over the syntax of a number, as specified by JSON. */
246
+ if (*d->ptr == '-') d->ptr++;
247
+
248
+ if (jsondec_tryparsech(d, '0')) {
249
+ if (jsondec_tryskipdigits(d)) {
250
+ jsondec_err(d, "number cannot have leading zero");
251
+ }
252
+ } else {
253
+ jsondec_skipdigits(d);
254
+ }
255
+
256
+ if (d->ptr == d->end) goto parse;
257
+ if (jsondec_tryparsech(d, '.')) {
258
+ jsondec_skipdigits(d);
259
+ }
260
+ if (d->ptr == d->end) goto parse;
261
+
262
+ if (*d->ptr == 'e' || *d->ptr == 'E') {
263
+ d->ptr++;
264
+ if (d->ptr == d->end) {
265
+ jsondec_err(d, "Unexpected EOF in number");
266
+ }
267
+ if (*d->ptr == '+' || *d->ptr == '-') {
268
+ d->ptr++;
269
+ }
270
+ jsondec_skipdigits(d);
271
+ }
272
+
273
+ parse:
274
+ /* Having verified the syntax of a JSON number, use strtod() to parse
275
+ * (strtod() accepts a superset of JSON syntax). */
276
+ errno = 0;
277
+ {
278
+ char* end;
279
+ double val = strtod(start, &end);
280
+ assert(end == d->ptr);
281
+
282
+ /* Currently the min/max-val conformance tests fail if we check this. Does
283
+ * this mean the conformance tests are wrong or strtod() is wrong, or
284
+ * something else? Investigate further. */
285
+ /*
286
+ if (errno == ERANGE) {
287
+ jsondec_err(d, "Number out of range");
288
+ }
289
+ */
290
+
291
+ if (val > DBL_MAX || val < -DBL_MAX) {
292
+ jsondec_err(d, "Number out of range");
293
+ }
294
+
295
+ return val;
296
+ }
297
+ }
298
+
299
+ /* JSON string ****************************************************************/
300
+
301
+ static char jsondec_escape(jsondec *d) {
302
+ switch (*d->ptr++) {
303
+ case '"':
304
+ return '\"';
305
+ case '\\':
306
+ return '\\';
307
+ case '/':
308
+ return '/';
309
+ case 'b':
310
+ return '\b';
311
+ case 'f':
312
+ return '\f';
313
+ case 'n':
314
+ return '\n';
315
+ case 'r':
316
+ return '\r';
317
+ case 't':
318
+ return '\t';
319
+ default:
320
+ jsondec_err(d, "Invalid escape char");
321
+ }
322
+ }
323
+
324
+ static uint32_t jsondec_codepoint(jsondec *d) {
325
+ uint32_t cp = 0;
326
+ const char *end;
327
+
328
+ if (d->end - d->ptr < 4) {
329
+ jsondec_err(d, "EOF inside string");
330
+ }
331
+
332
+ end = d->ptr + 4;
333
+ while (d->ptr < end) {
334
+ char ch = *d->ptr++;
335
+ if (ch >= '0' && ch <= '9') {
336
+ ch -= '0';
337
+ } else if (ch >= 'a' && ch <= 'f') {
338
+ ch = ch - 'a' + 10;
339
+ } else if (ch >= 'A' && ch <= 'F') {
340
+ ch = ch - 'A' + 10;
341
+ } else {
342
+ jsondec_err(d, "Invalid hex digit");
343
+ }
344
+ cp = (cp << 4) | ch;
345
+ }
346
+
347
+ return cp;
348
+ }
349
+
350
+ /* Parses a \uXXXX unicode escape (possibly a surrogate pair). */
351
+ static size_t jsondec_unicode(jsondec *d, char* out) {
352
+ uint32_t cp = jsondec_codepoint(d);
353
+ if (cp >= 0xd800 && cp <= 0xdbff) {
354
+ /* Surrogate pair: two 16-bit codepoints become a 32-bit codepoint. */
355
+ uint32_t high = cp;
356
+ uint32_t low;
357
+ jsondec_parselit(d, "\\u");
358
+ low = jsondec_codepoint(d);
359
+ if (low < 0xdc00 || low > 0xdfff) {
360
+ jsondec_err(d, "Invalid low surrogate");
361
+ }
362
+ cp = (high & 0x3ff) << 10;
363
+ cp |= (low & 0x3ff);
364
+ cp += 0x10000;
365
+ } else if (cp >= 0xdc00 && cp <= 0xdfff) {
366
+ jsondec_err(d, "Unpaired low surrogate");
367
+ }
368
+
369
+ /* Write to UTF-8 */
370
+ if (cp <= 0x7f) {
371
+ out[0] = cp;
372
+ return 1;
373
+ } else if (cp <= 0x07FF) {
374
+ out[0] = ((cp >> 6) & 0x1F) | 0xC0;
375
+ out[1] = ((cp >> 0) & 0x3F) | 0x80;
376
+ return 2;
377
+ } else if (cp <= 0xFFFF) {
378
+ out[0] = ((cp >> 12) & 0x0F) | 0xE0;
379
+ out[1] = ((cp >> 6) & 0x3F) | 0x80;
380
+ out[2] = ((cp >> 0) & 0x3F) | 0x80;
381
+ return 3;
382
+ } else if (cp < 0x10FFFF) {
383
+ out[0] = ((cp >> 18) & 0x07) | 0xF0;
384
+ out[1] = ((cp >> 12) & 0x3f) | 0x80;
385
+ out[2] = ((cp >> 6) & 0x3f) | 0x80;
386
+ out[3] = ((cp >> 0) & 0x3f) | 0x80;
387
+ return 4;
388
+ } else {
389
+ jsondec_err(d, "Invalid codepoint");
390
+ }
391
+ }
392
+
393
+ static void jsondec_resize(jsondec *d, char **buf, char **end, char **buf_end) {
394
+ size_t oldsize = *buf_end - *buf;
395
+ size_t len = *end - *buf;
396
+ size_t size = UPB_MAX(8, 2 * oldsize);
397
+
398
+ *buf = upb_arena_realloc(d->arena, *buf, len, size);
399
+ if (!*buf) jsondec_err(d, "Out of memory");
400
+
401
+ *end = *buf + len;
402
+ *buf_end = *buf + size;
403
+ }
404
+
405
+ static upb_strview jsondec_string(jsondec *d) {
406
+ char *buf = NULL;
407
+ char *end = NULL;
408
+ char *buf_end = NULL;
409
+
410
+ jsondec_skipws(d);
411
+
412
+ if (*d->ptr++ != '"') {
413
+ jsondec_err(d, "Expected string");
414
+ }
415
+
416
+ while (d->ptr < d->end) {
417
+ char ch = *d->ptr++;
418
+
419
+ if (end == buf_end) {
420
+ jsondec_resize(d, &buf, &end, &buf_end);
421
+ }
422
+
423
+ switch (ch) {
424
+ case '"': {
425
+ upb_strview ret;
426
+ ret.data = buf;
427
+ ret.size = end - buf;
428
+ *end = '\0'; /* Needed for possible strtod(). */
429
+ return ret;
430
+ }
431
+ case '\\':
432
+ if (d->ptr == d->end) goto eof;
433
+ if (*d->ptr == 'u') {
434
+ d->ptr++;
435
+ if (buf_end - end < 4) {
436
+ /* Allow space for maximum-sized code point (4 bytes). */
437
+ jsondec_resize(d, &buf, &end, &buf_end);
438
+ }
439
+ end += jsondec_unicode(d, end);
440
+ } else {
441
+ *end++ = jsondec_escape(d);
442
+ }
443
+ break;
444
+ default:
445
+ if ((unsigned char)*d->ptr < 0x20) {
446
+ jsondec_err(d, "Invalid char in JSON string");
447
+ }
448
+ *end++ = ch;
449
+ break;
450
+ }
451
+ }
452
+
453
+ eof:
454
+ jsondec_err(d, "EOF inside string");
455
+ }
456
+
457
+ static void jsondec_skipval(jsondec *d) {
458
+ switch (jsondec_peek(d)) {
459
+ case JD_OBJECT:
460
+ jsondec_objstart(d);
461
+ while (jsondec_objnext(d)) {
462
+ jsondec_string(d);
463
+ jsondec_entrysep(d);
464
+ jsondec_skipval(d);
465
+ }
466
+ jsondec_objend(d);
467
+ break;
468
+ case JD_ARRAY:
469
+ jsondec_arrstart(d);
470
+ while (jsondec_arrnext(d)) {
471
+ jsondec_skipval(d);
472
+ }
473
+ jsondec_arrend(d);
474
+ break;
475
+ case JD_TRUE:
476
+ jsondec_true(d);
477
+ break;
478
+ case JD_FALSE:
479
+ jsondec_false(d);
480
+ break;
481
+ case JD_NULL:
482
+ jsondec_null(d);
483
+ break;
484
+ case JD_STRING:
485
+ jsondec_string(d);
486
+ break;
487
+ case JD_NUMBER:
488
+ jsondec_number(d);
489
+ break;
490
+ }
491
+ }
492
+
493
+ /* Base64 decoding for bytes fields. ******************************************/
494
+
495
+ static unsigned int jsondec_base64_tablelookup(const char ch) {
496
+ /* Table includes the normal base64 chars plus the URL-safe variant. */
497
+ const signed char table[256] = {
498
+ -1, -1, -1, -1, -1, -1, -1,
499
+ -1, -1, -1, -1, -1, -1, -1,
500
+ -1, -1, -1, -1, -1, -1, -1,
501
+ -1, -1, -1, -1, -1, -1, -1,
502
+ -1, -1, -1, -1, -1, -1, -1,
503
+ -1, -1, -1, -1, -1, -1, -1,
504
+ -1, 62 /*+*/, -1, 62 /*-*/, -1, 63 /*/ */, 52 /*0*/,
505
+ 53 /*1*/, 54 /*2*/, 55 /*3*/, 56 /*4*/, 57 /*5*/, 58 /*6*/, 59 /*7*/,
506
+ 60 /*8*/, 61 /*9*/, -1, -1, -1, -1, -1,
507
+ -1, -1, 0 /*A*/, 1 /*B*/, 2 /*C*/, 3 /*D*/, 4 /*E*/,
508
+ 5 /*F*/, 6 /*G*/, 07 /*H*/, 8 /*I*/, 9 /*J*/, 10 /*K*/, 11 /*L*/,
509
+ 12 /*M*/, 13 /*N*/, 14 /*O*/, 15 /*P*/, 16 /*Q*/, 17 /*R*/, 18 /*S*/,
510
+ 19 /*T*/, 20 /*U*/, 21 /*V*/, 22 /*W*/, 23 /*X*/, 24 /*Y*/, 25 /*Z*/,
511
+ -1, -1, -1, -1, 63 /*_*/, -1, 26 /*a*/,
512
+ 27 /*b*/, 28 /*c*/, 29 /*d*/, 30 /*e*/, 31 /*f*/, 32 /*g*/, 33 /*h*/,
513
+ 34 /*i*/, 35 /*j*/, 36 /*k*/, 37 /*l*/, 38 /*m*/, 39 /*n*/, 40 /*o*/,
514
+ 41 /*p*/, 42 /*q*/, 43 /*r*/, 44 /*s*/, 45 /*t*/, 46 /*u*/, 47 /*v*/,
515
+ 48 /*w*/, 49 /*x*/, 50 /*y*/, 51 /*z*/, -1, -1, -1,
516
+ -1, -1, -1, -1, -1, -1, -1,
517
+ -1, -1, -1, -1, -1, -1, -1,
518
+ -1, -1, -1, -1, -1, -1, -1,
519
+ -1, -1, -1, -1, -1, -1, -1,
520
+ -1, -1, -1, -1, -1, -1, -1,
521
+ -1, -1, -1, -1, -1, -1, -1,
522
+ -1, -1, -1, -1, -1, -1, -1,
523
+ -1, -1, -1, -1, -1, -1, -1,
524
+ -1, -1, -1, -1, -1, -1, -1,
525
+ -1, -1, -1, -1, -1, -1, -1,
526
+ -1, -1, -1, -1, -1, -1, -1,
527
+ -1, -1, -1, -1, -1, -1, -1,
528
+ -1, -1, -1, -1, -1, -1, -1,
529
+ -1, -1, -1, -1, -1, -1, -1,
530
+ -1, -1, -1, -1, -1, -1, -1,
531
+ -1, -1, -1, -1, -1, -1, -1,
532
+ -1, -1, -1, -1, -1, -1, -1,
533
+ -1, -1, -1, -1, -1, -1, -1,
534
+ -1, -1, -1, -1};
535
+
536
+ /* Sign-extend return value so high bit will be set on any unexpected char. */
537
+ return table[(unsigned)ch];
538
+ }
539
+
540
+ static char *jsondec_partialbase64(jsondec *d, const char *ptr, const char *end,
541
+ char *out) {
542
+ int32_t val = -1;
543
+
544
+ switch (end - ptr) {
545
+ case 2:
546
+ val = jsondec_base64_tablelookup(ptr[0]) << 18 |
547
+ jsondec_base64_tablelookup(ptr[1]) << 12;
548
+ out[0] = val >> 16;
549
+ out += 1;
550
+ break;
551
+ case 3:
552
+ val = jsondec_base64_tablelookup(ptr[0]) << 18 |
553
+ jsondec_base64_tablelookup(ptr[1]) << 12 |
554
+ jsondec_base64_tablelookup(ptr[2]) << 6;
555
+ out[0] = val >> 16;
556
+ out[1] = (val >> 8) & 0xff;
557
+ out += 2;
558
+ break;
559
+ }
560
+
561
+ if (val < 0) {
562
+ jsondec_err(d, "Corrupt base64");
563
+ }
564
+
565
+ return out;
566
+ }
567
+
568
+ static size_t jsondec_base64(jsondec *d, upb_strview str) {
569
+ /* We decode in place. This is safe because this is a new buffer (not
570
+ * aliasing the input) and because base64 decoding shrinks 4 bytes into 3. */
571
+ char *out = (char*)str.data;
572
+ const char *ptr = str.data;
573
+ const char *end = ptr + str.size;
574
+ const char *end4 = ptr + (str.size & -4); /* Round down to multiple of 4. */
575
+
576
+ for (; ptr < end4; ptr += 4, out += 3) {
577
+ int val = jsondec_base64_tablelookup(ptr[0]) << 18 |
578
+ jsondec_base64_tablelookup(ptr[1]) << 12 |
579
+ jsondec_base64_tablelookup(ptr[2]) << 6 |
580
+ jsondec_base64_tablelookup(ptr[3]) << 0;
581
+
582
+ if (val < 0) {
583
+ /* Junk chars or padding. Remove trailing padding, if any. */
584
+ if (end - ptr == 4 && ptr[3] == '=') {
585
+ if (ptr[2] == '=') {
586
+ end -= 2;
587
+ } else {
588
+ end -= 1;
589
+ }
590
+ }
591
+ break;
592
+ }
593
+
594
+ out[0] = val >> 16;
595
+ out[1] = (val >> 8) & 0xff;
596
+ out[2] = val & 0xff;
597
+ }
598
+
599
+ if (ptr < end) {
600
+ /* Process remaining chars. We do not require padding. */
601
+ out = jsondec_partialbase64(d, ptr, end, out);
602
+ }
603
+
604
+ return out - str.data;
605
+ }
606
+
607
+ /* Low-level integer parsing **************************************************/
608
+
609
+ /* We use these hand-written routines instead of strto[u]l() because the "long
610
+ * long" variants aren't in c89. Also our version allows setting a ptr limit. */
611
+
612
+ static const char *jsondec_buftouint64(jsondec *d, const char *ptr,
613
+ const char *end, uint64_t *val) {
614
+ uint64_t u64 = 0;
615
+ while (ptr < end) {
616
+ unsigned ch = *ptr - '0';
617
+ if (ch >= 10) break;
618
+ if (u64 > UINT64_MAX / 10 || u64 * 10 > UINT64_MAX - ch) {
619
+ jsondec_err(d, "Integer overflow");
620
+ }
621
+ u64 *= 10;
622
+ u64 += ch;
623
+ ptr++;
624
+ }
625
+
626
+ *val = u64;
627
+ return ptr;
628
+ }
629
+
630
+ static const char *jsondec_buftoint64(jsondec *d, const char *ptr,
631
+ const char *end, int64_t *val) {
632
+ bool neg = false;
633
+ uint64_t u64;
634
+
635
+ if (ptr != end && *ptr == '-') {
636
+ ptr++;
637
+ neg = true;
638
+ }
639
+
640
+ ptr = jsondec_buftouint64(d, ptr, end, &u64);
641
+ if (u64 > (uint64_t)INT64_MAX + neg) {
642
+ jsondec_err(d, "Integer overflow");
643
+ }
644
+
645
+ *val = neg ? -u64 : u64;
646
+ return ptr;
647
+ }
648
+
649
+ static uint64_t jsondec_strtouint64(jsondec *d, upb_strview str) {
650
+ const char *end = str.data + str.size;
651
+ uint64_t ret;
652
+ if (jsondec_buftouint64(d, str.data, end, &ret) != end) {
653
+ jsondec_err(d, "Non-number characters in quoted integer");
654
+ }
655
+ return ret;
656
+ }
657
+
658
+ static int64_t jsondec_strtoint64(jsondec *d, upb_strview str) {
659
+ const char *end = str.data + str.size;
660
+ int64_t ret;
661
+ if (jsondec_buftoint64(d, str.data, end, &ret) != end) {
662
+ jsondec_err(d, "Non-number characters in quoted integer");
663
+ }
664
+ return ret;
665
+ }
666
+
667
+ /* Primitive value types ******************************************************/
668
+
669
+ /* Parse INT32 or INT64 value. */
670
+ static upb_msgval jsondec_int(jsondec *d, const upb_fielddef *f) {
671
+ upb_msgval val;
672
+
673
+ switch (jsondec_peek(d)) {
674
+ case JD_NUMBER: {
675
+ double dbl = jsondec_number(d);
676
+ if (dbl > 9223372036854774784.0 || dbl < -9223372036854775808.0) {
677
+ jsondec_err(d, "JSON number is out of range.");
678
+ }
679
+ val.int64_val = dbl; /* must be guarded, overflow here is UB */
680
+ if (val.int64_val != dbl) {
681
+ jsondec_errf(d, "JSON number was not integral (%d != %" PRId64 ")", dbl,
682
+ val.int64_val);
683
+ }
684
+ break;
685
+ }
686
+ case JD_STRING: {
687
+ upb_strview str = jsondec_string(d);
688
+ val.int64_val = jsondec_strtoint64(d, str);
689
+ break;
690
+ }
691
+ default:
692
+ jsondec_err(d, "Expected number or string");
693
+ }
694
+
695
+ if (upb_fielddef_type(f) == UPB_TYPE_INT32) {
696
+ if (val.int64_val > INT32_MAX || val.int64_val < INT32_MIN) {
697
+ jsondec_err(d, "Integer out of range.");
698
+ }
699
+ val.int32_val = (int32_t)val.int64_val;
700
+ }
701
+
702
+ return val;
703
+ }
704
+
705
+ /* Parse UINT32 or UINT64 value. */
706
+ static upb_msgval jsondec_uint(jsondec *d, const upb_fielddef *f) {
707
+ upb_msgval val;
708
+
709
+ switch (jsondec_peek(d)) {
710
+ case JD_NUMBER: {
711
+ double dbl = jsondec_number(d);
712
+ if (dbl > 18446744073709549568.0 || dbl < 0) {
713
+ jsondec_err(d, "JSON number is out of range.");
714
+ }
715
+ val.uint64_val = dbl; /* must be guarded, overflow here is UB */
716
+ if (val.uint64_val != dbl) {
717
+ jsondec_errf(d, "JSON number was not integral (%d != %" PRIu64 ")", dbl,
718
+ val.uint64_val);
719
+ }
720
+ break;
721
+ }
722
+ case JD_STRING: {
723
+ upb_strview str = jsondec_string(d);
724
+ val.uint64_val = jsondec_strtouint64(d, str);
725
+ break;
726
+ }
727
+ default:
728
+ jsondec_err(d, "Expected number or string");
729
+ }
730
+
731
+ if (upb_fielddef_type(f) == UPB_TYPE_UINT32) {
732
+ if (val.uint64_val > UINT32_MAX) {
733
+ jsondec_err(d, "Integer out of range.");
734
+ }
735
+ val.uint32_val = (uint32_t)val.uint64_val;
736
+ }
737
+
738
+ return val;
739
+ }
740
+
741
+ /* Parse DOUBLE or FLOAT value. */
742
+ static upb_msgval jsondec_double(jsondec *d, const upb_fielddef *f) {
743
+ upb_strview str;
744
+ upb_msgval val;
745
+
746
+ switch (jsondec_peek(d)) {
747
+ case JD_NUMBER:
748
+ val.double_val = jsondec_number(d);
749
+ break;
750
+ case JD_STRING:
751
+ str = jsondec_string(d);
752
+ if (jsondec_streql(str, "NaN")) {
753
+ val.double_val = NAN;
754
+ } else if (jsondec_streql(str, "Infinity")) {
755
+ val.double_val = INFINITY;
756
+ } else if (jsondec_streql(str, "-Infinity")) {
757
+ val.double_val = -INFINITY;
758
+ } else {
759
+ val.double_val = strtod(str.data, NULL);
760
+ }
761
+ break;
762
+ default:
763
+ jsondec_err(d, "Expected number or string");
764
+ }
765
+
766
+ if (upb_fielddef_type(f) == UPB_TYPE_FLOAT) {
767
+ if (val.double_val != INFINITY && val.double_val != -INFINITY &&
768
+ (val.double_val > FLT_MAX || val.double_val < -FLT_MAX)) {
769
+ jsondec_err(d, "Float out of range");
770
+ }
771
+ val.float_val = val.double_val;
772
+ }
773
+
774
+ return val;
775
+ }
776
+
777
+ /* Parse STRING or BYTES value. */
778
+ static upb_msgval jsondec_strfield(jsondec *d, const upb_fielddef *f) {
779
+ upb_msgval val;
780
+ val.str_val = jsondec_string(d);
781
+ if (upb_fielddef_type(f) == UPB_TYPE_BYTES) {
782
+ val.str_val.size = jsondec_base64(d, val.str_val);
783
+ }
784
+ return val;
785
+ }
786
+
787
+ static upb_msgval jsondec_enum(jsondec *d, const upb_fielddef *f) {
788
+ switch (jsondec_peek(d)) {
789
+ case JD_STRING: {
790
+ const upb_enumdef *e = upb_fielddef_enumsubdef(f);
791
+ upb_strview str = jsondec_string(d);
792
+ upb_msgval val;
793
+ if (!upb_enumdef_ntoi(e, str.data, str.size, &val.int32_val)) {
794
+ if (d->options & UPB_JSONDEC_IGNOREUNKNOWN) {
795
+ val.int32_val = 0;
796
+ } else {
797
+ jsondec_errf(d, "Unknown enumerator: '" UPB_STRVIEW_FORMAT "'",
798
+ UPB_STRVIEW_ARGS(str));
799
+ }
800
+ }
801
+ return val;
802
+ }
803
+ case JD_NULL: {
804
+ if (jsondec_isnullvalue(f)) {
805
+ upb_msgval val;
806
+ jsondec_null(d);
807
+ val.int32_val = 0;
808
+ return val;
809
+ }
810
+ }
811
+ /* Fallthrough. */
812
+ default:
813
+ return jsondec_int(d, f);
814
+ }
815
+ }
816
+
817
+ static upb_msgval jsondec_bool(jsondec *d, const upb_fielddef *f) {
818
+ bool is_map_key = upb_fielddef_number(f) == 1 &&
819
+ upb_msgdef_mapentry(upb_fielddef_containingtype(f));
820
+ upb_msgval val;
821
+
822
+ if (is_map_key) {
823
+ upb_strview str = jsondec_string(d);
824
+ if (jsondec_streql(str, "true")) {
825
+ val.bool_val = true;
826
+ } else if (jsondec_streql(str, "false")) {
827
+ val.bool_val = false;
828
+ } else {
829
+ jsondec_err(d, "Invalid boolean map key");
830
+ }
831
+ } else {
832
+ switch (jsondec_peek(d)) {
833
+ case JD_TRUE:
834
+ val.bool_val = true;
835
+ jsondec_true(d);
836
+ break;
837
+ case JD_FALSE:
838
+ val.bool_val = false;
839
+ jsondec_false(d);
840
+ break;
841
+ default:
842
+ jsondec_err(d, "Expected true or false");
843
+ }
844
+ }
845
+
846
+ return val;
847
+ }
848
+
849
+ /* Composite types (array/message/map) ****************************************/
850
+
851
+ static void jsondec_array(jsondec *d, upb_msg *msg, const upb_fielddef *f) {
852
+ upb_array *arr = upb_msg_mutable(msg, f, d->arena).array;
853
+
854
+ jsondec_arrstart(d);
855
+ while (jsondec_arrnext(d)) {
856
+ upb_msgval elem = jsondec_value(d, f);
857
+ upb_array_append(arr, elem, d->arena);
858
+ }
859
+ jsondec_arrend(d);
860
+ }
861
+
862
+ static void jsondec_map(jsondec *d, upb_msg *msg, const upb_fielddef *f) {
863
+ upb_map *map = upb_msg_mutable(msg, f, d->arena).map;
864
+ const upb_msgdef *entry = upb_fielddef_msgsubdef(f);
865
+ const upb_fielddef *key_f = upb_msgdef_itof(entry, 1);
866
+ const upb_fielddef *val_f = upb_msgdef_itof(entry, 2);
867
+
868
+ jsondec_objstart(d);
869
+ while (jsondec_objnext(d)) {
870
+ upb_msgval key, val;
871
+ key = jsondec_value(d, key_f);
872
+ jsondec_entrysep(d);
873
+ val = jsondec_value(d, val_f);
874
+ upb_map_set(map, key, val, d->arena);
875
+ }
876
+ jsondec_objend(d);
877
+ }
878
+
879
+ static void jsondec_tomsg(jsondec *d, upb_msg *msg, const upb_msgdef *m) {
880
+ if (upb_msgdef_wellknowntype(m) == UPB_WELLKNOWN_UNSPECIFIED) {
881
+ jsondec_object(d, msg, m);
882
+ } else {
883
+ jsondec_wellknown(d, msg, m);
884
+ }
885
+ }
886
+
887
+ static upb_msgval jsondec_msg(jsondec *d, const upb_fielddef *f) {
888
+ const upb_msgdef *m = upb_fielddef_msgsubdef(f);
889
+ upb_msg *msg = upb_msg_new(m, d->arena);
890
+ upb_msgval val;
891
+
892
+ jsondec_tomsg(d, msg, m);
893
+ val.msg_val = msg;
894
+ return val;
895
+ }
896
+
897
+ static void jsondec_field(jsondec *d, upb_msg *msg, const upb_msgdef *m) {
898
+ upb_strview name;
899
+ const upb_fielddef *f;
900
+ const upb_fielddef *preserved;
901
+
902
+ name = jsondec_string(d);
903
+ jsondec_entrysep(d);
904
+ f = upb_msgdef_lookupjsonname(m, name.data, name.size);
905
+
906
+ if (!f) {
907
+ if ((d->options & UPB_JSONDEC_IGNOREUNKNOWN) == 0) {
908
+ jsondec_errf(d, "Unknown field: '" UPB_STRVIEW_FORMAT "'",
909
+ UPB_STRVIEW_ARGS(name));
910
+ }
911
+ jsondec_skipval(d);
912
+ return;
913
+ }
914
+
915
+ if (upb_fielddef_realcontainingoneof(f) &&
916
+ upb_msg_whichoneof(msg, upb_fielddef_containingoneof(f))) {
917
+ jsondec_err(d, "More than one field for this oneof.");
918
+ }
919
+
920
+ if (jsondec_peek(d) == JD_NULL && !jsondec_isvalue(f)) {
921
+ /* JSON "null" indicates a default value, so no need to set anything. */
922
+ jsondec_null(d);
923
+ return;
924
+ }
925
+
926
+ preserved = d->debug_field;
927
+ d->debug_field = f;
928
+
929
+ if (upb_fielddef_ismap(f)) {
930
+ jsondec_map(d, msg, f);
931
+ } else if (upb_fielddef_isseq(f)) {
932
+ jsondec_array(d, msg, f);
933
+ } else if (upb_fielddef_issubmsg(f)) {
934
+ upb_msg *submsg = upb_msg_mutable(msg, f, d->arena).msg;
935
+ const upb_msgdef *subm = upb_fielddef_msgsubdef(f);
936
+ jsondec_tomsg(d, submsg, subm);
937
+ } else {
938
+ upb_msgval val = jsondec_value(d, f);
939
+ upb_msg_set(msg, f, val, d->arena);
940
+ }
941
+
942
+ d->debug_field = preserved;
943
+ }
944
+
945
+ static void jsondec_object(jsondec *d, upb_msg *msg, const upb_msgdef *m) {
946
+ jsondec_objstart(d);
947
+ while (jsondec_objnext(d)) {
948
+ jsondec_field(d, msg, m);
949
+ }
950
+ jsondec_objend(d);
951
+ }
952
+
953
+ static upb_msgval jsondec_value(jsondec *d, const upb_fielddef *f) {
954
+ switch (upb_fielddef_type(f)) {
955
+ case UPB_TYPE_BOOL:
956
+ return jsondec_bool(d, f);
957
+ case UPB_TYPE_FLOAT:
958
+ case UPB_TYPE_DOUBLE:
959
+ return jsondec_double(d, f);
960
+ case UPB_TYPE_UINT32:
961
+ case UPB_TYPE_UINT64:
962
+ return jsondec_uint(d, f);
963
+ case UPB_TYPE_INT32:
964
+ case UPB_TYPE_INT64:
965
+ return jsondec_int(d, f);
966
+ case UPB_TYPE_STRING:
967
+ case UPB_TYPE_BYTES:
968
+ return jsondec_strfield(d, f);
969
+ case UPB_TYPE_ENUM:
970
+ return jsondec_enum(d, f);
971
+ case UPB_TYPE_MESSAGE:
972
+ return jsondec_msg(d, f);
973
+ default:
974
+ UPB_UNREACHABLE();
975
+ }
976
+ }
977
+
978
+ /* Well-known types ***********************************************************/
979
+
980
+ static int jsondec_tsdigits(jsondec *d, const char **ptr, size_t digits,
981
+ const char *after) {
982
+ uint64_t val;
983
+ const char *p = *ptr;
984
+ const char *end = p + digits;
985
+ size_t after_len = after ? strlen(after) : 0;
986
+
987
+ UPB_ASSERT(digits <= 9); /* int can't overflow. */
988
+
989
+ if (jsondec_buftouint64(d, p, end, &val) != end ||
990
+ (after_len && memcmp(end, after, after_len) != 0)) {
991
+ jsondec_err(d, "Malformed timestamp");
992
+ }
993
+
994
+ UPB_ASSERT(val < INT_MAX);
995
+
996
+ *ptr = end + after_len;
997
+ return (int)val;
998
+ }
999
+
1000
+ static int jsondec_nanos(jsondec *d, const char **ptr, const char *end) {
1001
+ uint64_t nanos = 0;
1002
+ const char *p = *ptr;
1003
+
1004
+ if (p != end && *p == '.') {
1005
+ const char *nano_end = jsondec_buftouint64(d, p + 1, end, &nanos);
1006
+ int digits = (int)(nano_end - p - 1);
1007
+ int exp_lg10 = 9 - digits;
1008
+ if (digits > 9) {
1009
+ jsondec_err(d, "Too many digits for partial seconds");
1010
+ }
1011
+ while (exp_lg10--) nanos *= 10;
1012
+ *ptr = nano_end;
1013
+ }
1014
+
1015
+ UPB_ASSERT(nanos < INT_MAX);
1016
+
1017
+ return (int)nanos;
1018
+ }
1019
+
1020
+ /* jsondec_epochdays(1970, 1, 1) == 1970-01-01 == 0. */
1021
+ int jsondec_epochdays(int y, int m, int d) {
1022
+ const uint32_t year_base = 4800; /* Before min year, multiple of 400. */
1023
+ const uint32_t m_adj = m - 3; /* March-based month. */
1024
+ const uint32_t carry = m_adj > (uint32_t)m ? 1 : 0;
1025
+ const uint32_t adjust = carry ? 12 : 0;
1026
+ const uint32_t y_adj = y + year_base - carry;
1027
+ const uint32_t month_days = ((m_adj + adjust) * 62719 + 769) / 2048;
1028
+ const uint32_t leap_days = y_adj / 4 - y_adj / 100 + y_adj / 400;
1029
+ return y_adj * 365 + leap_days + month_days + (d - 1) - 2472632;
1030
+ }
1031
+
1032
+ static int64_t jsondec_unixtime(int y, int m, int d, int h, int min, int s) {
1033
+ return (int64_t)jsondec_epochdays(y, m, d) * 86400 + h * 3600 + min * 60 + s;
1034
+ }
1035
+
1036
+ static void jsondec_timestamp(jsondec *d, upb_msg *msg, const upb_msgdef *m) {
1037
+ upb_msgval seconds;
1038
+ upb_msgval nanos;
1039
+ upb_strview str = jsondec_string(d);
1040
+ const char *ptr = str.data;
1041
+ const char *end = ptr + str.size;
1042
+
1043
+ if (str.size < 20) goto malformed;
1044
+
1045
+ {
1046
+ /* 1972-01-01T01:00:00 */
1047
+ int year = jsondec_tsdigits(d, &ptr, 4, "-");
1048
+ int mon = jsondec_tsdigits(d, &ptr, 2, "-");
1049
+ int day = jsondec_tsdigits(d, &ptr, 2, "T");
1050
+ int hour = jsondec_tsdigits(d, &ptr, 2, ":");
1051
+ int min = jsondec_tsdigits(d, &ptr, 2, ":");
1052
+ int sec = jsondec_tsdigits(d, &ptr, 2, NULL);
1053
+
1054
+ seconds.int64_val = jsondec_unixtime(year, mon, day, hour, min, sec);
1055
+ }
1056
+
1057
+ nanos.int32_val = jsondec_nanos(d, &ptr, end);
1058
+
1059
+ {
1060
+ /* [+-]08:00 or Z */
1061
+ int ofs = 0;
1062
+ bool neg = false;
1063
+
1064
+ if (ptr == end) goto malformed;
1065
+
1066
+ switch (*ptr++) {
1067
+ case '-':
1068
+ neg = true;
1069
+ /* fallthrough */
1070
+ case '+':
1071
+ if ((end - ptr) != 5) goto malformed;
1072
+ ofs = jsondec_tsdigits(d, &ptr, 2, ":00");
1073
+ ofs *= 60 * 60;
1074
+ seconds.int64_val += (neg ? ofs : -ofs);
1075
+ break;
1076
+ case 'Z':
1077
+ if (ptr != end) goto malformed;
1078
+ break;
1079
+ default:
1080
+ goto malformed;
1081
+ }
1082
+ }
1083
+
1084
+ if (seconds.int64_val < -62135596800) {
1085
+ jsondec_err(d, "Timestamp out of range");
1086
+ }
1087
+
1088
+ upb_msg_set(msg, upb_msgdef_itof(m, 1), seconds, d->arena);
1089
+ upb_msg_set(msg, upb_msgdef_itof(m, 2), nanos, d->arena);
1090
+ return;
1091
+
1092
+ malformed:
1093
+ jsondec_err(d, "Malformed timestamp");
1094
+ }
1095
+
1096
+ static void jsondec_duration(jsondec *d, upb_msg *msg, const upb_msgdef *m) {
1097
+ upb_msgval seconds;
1098
+ upb_msgval nanos;
1099
+ upb_strview str = jsondec_string(d);
1100
+ const char *ptr = str.data;
1101
+ const char *end = ptr + str.size;
1102
+ const int64_t max = (uint64_t)3652500 * 86400;
1103
+
1104
+ /* "3.000000001s", "3s", etc. */
1105
+ ptr = jsondec_buftoint64(d, ptr, end, &seconds.int64_val);
1106
+ nanos.int32_val = jsondec_nanos(d, &ptr, end);
1107
+
1108
+ if (end - ptr != 1 || *ptr != 's') {
1109
+ jsondec_err(d, "Malformed duration");
1110
+ }
1111
+
1112
+ if (seconds.int64_val < -max || seconds.int64_val > max) {
1113
+ jsondec_err(d, "Duration out of range");
1114
+ }
1115
+
1116
+ if (seconds.int64_val < 0) {
1117
+ nanos.int32_val = - nanos.int32_val;
1118
+ }
1119
+
1120
+ upb_msg_set(msg, upb_msgdef_itof(m, 1), seconds, d->arena);
1121
+ upb_msg_set(msg, upb_msgdef_itof(m, 2), nanos, d->arena);
1122
+ }
1123
+
1124
+ static void jsondec_listvalue(jsondec *d, upb_msg *msg, const upb_msgdef *m) {
1125
+ const upb_fielddef *values_f = upb_msgdef_itof(m, 1);
1126
+ const upb_msgdef *value_m = upb_fielddef_msgsubdef(values_f);
1127
+ upb_array *values = upb_msg_mutable(msg, values_f, d->arena).array;
1128
+
1129
+ jsondec_arrstart(d);
1130
+ while (jsondec_arrnext(d)) {
1131
+ upb_msg *value_msg = upb_msg_new(value_m, d->arena);
1132
+ upb_msgval value;
1133
+ value.msg_val = value_msg;
1134
+ upb_array_append(values, value, d->arena);
1135
+ jsondec_wellknownvalue(d, value_msg, value_m);
1136
+ }
1137
+ jsondec_arrend(d);
1138
+ }
1139
+
1140
+ static void jsondec_struct(jsondec *d, upb_msg *msg, const upb_msgdef *m) {
1141
+ const upb_fielddef *fields_f = upb_msgdef_itof(m, 1);
1142
+ const upb_msgdef *entry_m = upb_fielddef_msgsubdef(fields_f);
1143
+ const upb_fielddef *value_f = upb_msgdef_itof(entry_m, 2);
1144
+ const upb_msgdef *value_m = upb_fielddef_msgsubdef(value_f);
1145
+ upb_map *fields = upb_msg_mutable(msg, fields_f, d->arena).map;
1146
+
1147
+ jsondec_objstart(d);
1148
+ while (jsondec_objnext(d)) {
1149
+ upb_msgval key, value;
1150
+ upb_msg *value_msg = upb_msg_new(value_m, d->arena);
1151
+ key.str_val = jsondec_string(d);
1152
+ value.msg_val = value_msg;
1153
+ upb_map_set(fields, key, value, d->arena);
1154
+ jsondec_entrysep(d);
1155
+ jsondec_wellknownvalue(d, value_msg, value_m);
1156
+ }
1157
+ jsondec_objend(d);
1158
+ }
1159
+
1160
+ static void jsondec_wellknownvalue(jsondec *d, upb_msg *msg,
1161
+ const upb_msgdef *m) {
1162
+ upb_msgval val;
1163
+ const upb_fielddef *f;
1164
+ upb_msg *submsg;
1165
+
1166
+ switch (jsondec_peek(d)) {
1167
+ case JD_NUMBER:
1168
+ /* double number_value = 2; */
1169
+ f = upb_msgdef_itof(m, 2);
1170
+ val.double_val = jsondec_number(d);
1171
+ break;
1172
+ case JD_STRING:
1173
+ /* string string_value = 3; */
1174
+ f = upb_msgdef_itof(m, 3);
1175
+ val.str_val = jsondec_string(d);
1176
+ break;
1177
+ case JD_FALSE:
1178
+ /* bool bool_value = 4; */
1179
+ f = upb_msgdef_itof(m, 4);
1180
+ val.bool_val = false;
1181
+ jsondec_false(d);
1182
+ break;
1183
+ case JD_TRUE:
1184
+ /* bool bool_value = 4; */
1185
+ f = upb_msgdef_itof(m, 4);
1186
+ val.bool_val = true;
1187
+ jsondec_true(d);
1188
+ break;
1189
+ case JD_NULL:
1190
+ /* NullValue null_value = 1; */
1191
+ f = upb_msgdef_itof(m, 1);
1192
+ val.int32_val = 0;
1193
+ jsondec_null(d);
1194
+ break;
1195
+ /* Note: these cases return, because upb_msg_mutable() is enough. */
1196
+ case JD_OBJECT:
1197
+ /* Struct struct_value = 5; */
1198
+ f = upb_msgdef_itof(m, 5);
1199
+ submsg = upb_msg_mutable(msg, f, d->arena).msg;
1200
+ jsondec_struct(d, submsg, upb_fielddef_msgsubdef(f));
1201
+ return;
1202
+ case JD_ARRAY:
1203
+ /* ListValue list_value = 6; */
1204
+ f = upb_msgdef_itof(m, 6);
1205
+ submsg = upb_msg_mutable(msg, f, d->arena).msg;
1206
+ jsondec_listvalue(d, submsg, upb_fielddef_msgsubdef(f));
1207
+ return;
1208
+ default:
1209
+ UPB_UNREACHABLE();
1210
+ }
1211
+
1212
+ upb_msg_set(msg, f, val, d->arena);
1213
+ }
1214
+
1215
+ static upb_strview jsondec_mask(jsondec *d, const char *buf, const char *end) {
1216
+ /* FieldMask fields grow due to inserted '_' characters, so we can't do the
1217
+ * transform in place. */
1218
+ const char *ptr = buf;
1219
+ upb_strview ret;
1220
+ char *out;
1221
+
1222
+ ret.size = end - ptr;
1223
+ while (ptr < end) {
1224
+ ret.size += (*ptr >= 'A' && *ptr <= 'Z');
1225
+ ptr++;
1226
+ }
1227
+
1228
+ out = upb_arena_malloc(d->arena, ret.size);
1229
+ ptr = buf;
1230
+ ret.data = out;
1231
+
1232
+ while (ptr < end) {
1233
+ char ch = *ptr++;
1234
+ if (ch >= 'A' && ch <= 'Z') {
1235
+ *out++ = '_';
1236
+ *out++ = ch + 32;
1237
+ } else if (ch == '_') {
1238
+ jsondec_err(d, "field mask may not contain '_'");
1239
+ } else {
1240
+ *out++ = ch;
1241
+ }
1242
+ }
1243
+
1244
+ return ret;
1245
+ }
1246
+
1247
+ static void jsondec_fieldmask(jsondec *d, upb_msg *msg, const upb_msgdef *m) {
1248
+ /* repeated string paths = 1; */
1249
+ const upb_fielddef *paths_f = upb_msgdef_itof(m, 1);
1250
+ upb_array *arr = upb_msg_mutable(msg, paths_f, d->arena).array;
1251
+ upb_strview str = jsondec_string(d);
1252
+ const char *ptr = str.data;
1253
+ const char *end = ptr + str.size;
1254
+ upb_msgval val;
1255
+
1256
+ while (ptr < end) {
1257
+ const char *elem_end = memchr(ptr, ',', end - ptr);
1258
+ if (elem_end) {
1259
+ val.str_val = jsondec_mask(d, ptr, elem_end);
1260
+ ptr = elem_end + 1;
1261
+ } else {
1262
+ val.str_val = jsondec_mask(d, ptr, end);
1263
+ ptr = end;
1264
+ }
1265
+ upb_array_append(arr, val, d->arena);
1266
+ }
1267
+ }
1268
+
1269
+ static void jsondec_anyfield(jsondec *d, upb_msg *msg, const upb_msgdef *m) {
1270
+ if (upb_msgdef_wellknowntype(m) == UPB_WELLKNOWN_UNSPECIFIED) {
1271
+ /* For regular types: {"@type": "[user type]", "f1": <V1>, "f2": <V2>}
1272
+ * where f1, f2, etc. are the normal fields of this type. */
1273
+ jsondec_field(d, msg, m);
1274
+ } else {
1275
+ /* For well-known types: {"@type": "[well-known type]", "value": <X>}
1276
+ * where <X> is whatever encoding the WKT normally uses. */
1277
+ upb_strview str = jsondec_string(d);
1278
+ jsondec_entrysep(d);
1279
+ if (!jsondec_streql(str, "value")) {
1280
+ jsondec_err(d, "Key for well-known type must be 'value'");
1281
+ }
1282
+ jsondec_wellknown(d, msg, m);
1283
+ }
1284
+ }
1285
+
1286
+ static const upb_msgdef *jsondec_typeurl(jsondec *d, upb_msg *msg,
1287
+ const upb_msgdef *m) {
1288
+ const upb_fielddef *type_url_f = upb_msgdef_itof(m, 1);
1289
+ const upb_msgdef *type_m;
1290
+ upb_strview type_url = jsondec_string(d);
1291
+ const char *end = type_url.data + type_url.size;
1292
+ const char *ptr = end;
1293
+ upb_msgval val;
1294
+
1295
+ val.str_val = type_url;
1296
+ upb_msg_set(msg, type_url_f, val, d->arena);
1297
+
1298
+ /* Find message name after the last '/' */
1299
+ while (ptr > type_url.data && *--ptr != '/') {}
1300
+
1301
+ if (ptr == type_url.data || ptr == end) {
1302
+ jsondec_err(d, "Type url must have at least one '/' and non-empty host");
1303
+ }
1304
+
1305
+ ptr++;
1306
+ type_m = upb_symtab_lookupmsg2(d->any_pool, ptr, end - ptr);
1307
+
1308
+ if (!type_m) {
1309
+ jsondec_err(d, "Type was not found");
1310
+ }
1311
+
1312
+ return type_m;
1313
+ }
1314
+
1315
+ static void jsondec_any(jsondec *d, upb_msg *msg, const upb_msgdef *m) {
1316
+ /* string type_url = 1;
1317
+ * bytes value = 2; */
1318
+ const upb_fielddef *value_f = upb_msgdef_itof(m, 2);
1319
+ upb_msg *any_msg;
1320
+ const upb_msgdef *any_m = NULL;
1321
+ const char *pre_type_data = NULL;
1322
+ const char *pre_type_end = NULL;
1323
+ upb_msgval encoded;
1324
+
1325
+ jsondec_objstart(d);
1326
+
1327
+ /* Scan looking for "@type", which is not necessarily first. */
1328
+ while (!any_m && jsondec_objnext(d)) {
1329
+ const char *start = d->ptr;
1330
+ upb_strview name = jsondec_string(d);
1331
+ jsondec_entrysep(d);
1332
+ if (jsondec_streql(name, "@type")) {
1333
+ any_m = jsondec_typeurl(d, msg, m);
1334
+ if (pre_type_data) {
1335
+ pre_type_end = start;
1336
+ while (*pre_type_end != ',') pre_type_end--;
1337
+ }
1338
+ } else {
1339
+ if (!pre_type_data) pre_type_data = start;
1340
+ jsondec_skipval(d);
1341
+ }
1342
+ }
1343
+
1344
+ if (!any_m) {
1345
+ jsondec_err(d, "Any object didn't contain a '@type' field");
1346
+ }
1347
+
1348
+ any_msg = upb_msg_new(any_m, d->arena);
1349
+
1350
+ if (pre_type_data) {
1351
+ size_t len = pre_type_end - pre_type_data + 1;
1352
+ char *tmp = upb_arena_malloc(d->arena, len);
1353
+ const char *saved_ptr = d->ptr;
1354
+ const char *saved_end = d->end;
1355
+ memcpy(tmp, pre_type_data, len - 1);
1356
+ tmp[len - 1] = '}';
1357
+ d->ptr = tmp;
1358
+ d->end = tmp + len;
1359
+ d->is_first = true;
1360
+ while (jsondec_objnext(d)) {
1361
+ jsondec_anyfield(d, any_msg, any_m);
1362
+ }
1363
+ d->ptr = saved_ptr;
1364
+ d->end = saved_end;
1365
+ }
1366
+
1367
+ while (jsondec_objnext(d)) {
1368
+ jsondec_anyfield(d, any_msg, any_m);
1369
+ }
1370
+
1371
+ jsondec_objend(d);
1372
+
1373
+ encoded.str_val.data = upb_encode(any_msg, upb_msgdef_layout(any_m), d->arena,
1374
+ &encoded.str_val.size);
1375
+ upb_msg_set(msg, value_f, encoded, d->arena);
1376
+ }
1377
+
1378
+ static void jsondec_wrapper(jsondec *d, upb_msg *msg, const upb_msgdef *m) {
1379
+ const upb_fielddef *value_f = upb_msgdef_itof(m, 1);
1380
+ upb_msgval val = jsondec_value(d, value_f);
1381
+ upb_msg_set(msg, value_f, val, d->arena);
1382
+ }
1383
+
1384
+ static void jsondec_wellknown(jsondec *d, upb_msg *msg, const upb_msgdef *m) {
1385
+ switch (upb_msgdef_wellknowntype(m)) {
1386
+ case UPB_WELLKNOWN_ANY:
1387
+ jsondec_any(d, msg, m);
1388
+ break;
1389
+ case UPB_WELLKNOWN_FIELDMASK:
1390
+ jsondec_fieldmask(d, msg, m);
1391
+ break;
1392
+ case UPB_WELLKNOWN_DURATION:
1393
+ jsondec_duration(d, msg, m);
1394
+ break;
1395
+ case UPB_WELLKNOWN_TIMESTAMP:
1396
+ jsondec_timestamp(d, msg, m);
1397
+ break;
1398
+ case UPB_WELLKNOWN_VALUE:
1399
+ jsondec_wellknownvalue(d, msg, m);
1400
+ break;
1401
+ case UPB_WELLKNOWN_LISTVALUE:
1402
+ jsondec_listvalue(d, msg, m);
1403
+ break;
1404
+ case UPB_WELLKNOWN_STRUCT:
1405
+ jsondec_struct(d, msg, m);
1406
+ break;
1407
+ case UPB_WELLKNOWN_DOUBLEVALUE:
1408
+ case UPB_WELLKNOWN_FLOATVALUE:
1409
+ case UPB_WELLKNOWN_INT64VALUE:
1410
+ case UPB_WELLKNOWN_UINT64VALUE:
1411
+ case UPB_WELLKNOWN_INT32VALUE:
1412
+ case UPB_WELLKNOWN_UINT32VALUE:
1413
+ case UPB_WELLKNOWN_STRINGVALUE:
1414
+ case UPB_WELLKNOWN_BYTESVALUE:
1415
+ case UPB_WELLKNOWN_BOOLVALUE:
1416
+ jsondec_wrapper(d, msg, m);
1417
+ break;
1418
+ default:
1419
+ UPB_UNREACHABLE();
1420
+ }
1421
+ }
1422
+
1423
+ bool upb_json_decode(const char *buf, size_t size, upb_msg *msg,
1424
+ const upb_msgdef *m, const upb_symtab *any_pool,
1425
+ int options, upb_arena *arena, upb_status *status) {
1426
+ jsondec d;
1427
+ d.ptr = buf;
1428
+ d.end = buf + size;
1429
+ d.arena = arena;
1430
+ d.any_pool = any_pool;
1431
+ d.status = status;
1432
+ d.options = options;
1433
+ d.depth = 64;
1434
+ d.line = 1;
1435
+ d.line_begin = d.ptr;
1436
+ d.debug_field = NULL;
1437
+ d.is_first = false;
1438
+
1439
+ if (UPB_SETJMP(d.err)) return false;
1440
+
1441
+ jsondec_tomsg(&d, msg, m);
1442
+ return true;
1443
+ }