grpc 1.36.0 → 1.38.0

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

Potentially problematic release.


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

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