grpc 1.34.0 → 1.35.0.pre1

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 (458) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +808 -2787
  3. data/etc/roots.pem +257 -573
  4. data/include/grpc/compression.h +1 -1
  5. data/include/grpc/grpc.h +14 -0
  6. data/include/grpc/grpc_security.h +61 -3
  7. data/include/grpc/impl/codegen/atm_windows.h +4 -0
  8. data/include/grpc/impl/codegen/byte_buffer.h +1 -1
  9. data/include/grpc/impl/codegen/grpc_types.h +1 -1
  10. data/include/grpc/impl/codegen/log.h +0 -2
  11. data/include/grpc/impl/codegen/sync_windows.h +4 -0
  12. data/include/grpc/slice_buffer.h +3 -3
  13. data/include/grpc/support/sync.h +3 -3
  14. data/include/grpc/support/time.h +7 -7
  15. data/src/core/ext/filters/client_channel/backend_metric.cc +2 -4
  16. data/src/core/ext/filters/client_channel/client_channel.cc +2734 -1498
  17. data/src/core/ext/filters/client_channel/client_channel.h +0 -4
  18. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +1 -1
  19. data/src/core/ext/filters/client_channel/config_selector.h +4 -0
  20. data/src/core/ext/filters/client_channel/dynamic_filters.cc +186 -0
  21. data/src/core/ext/filters/client_channel/dynamic_filters.h +99 -0
  22. data/src/core/ext/filters/client_channel/health/health_check_client.cc +6 -6
  23. data/src/core/ext/filters/client_channel/health/health_check_client.h +2 -2
  24. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +4 -5
  25. data/src/core/ext/filters/client_channel/http_proxy.cc +21 -20
  26. data/src/core/ext/filters/client_channel/lb_policy.cc +1 -1
  27. data/src/core/ext/filters/client_channel/lb_policy.h +2 -3
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +32 -30
  29. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +3 -3
  30. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +1 -1
  31. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +162 -20
  32. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +0 -8
  33. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_args.h +24 -0
  34. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +5 -2
  35. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +1 -1
  36. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +1262 -0
  37. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +7 -14
  38. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +1 -32
  39. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +2 -2
  40. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +454 -16
  41. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +5 -0
  42. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +6 -9
  43. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +2 -2
  44. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +18 -31
  45. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +3 -5
  46. data/src/core/ext/filters/client_channel/resolver_factory.h +6 -6
  47. data/src/core/ext/filters/client_channel/resolver_registry.cc +40 -39
  48. data/src/core/ext/filters/client_channel/resolver_registry.h +2 -2
  49. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +11 -13
  50. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +8 -8
  51. data/src/core/ext/filters/client_channel/retry_throttle.cc +5 -3
  52. data/src/core/ext/filters/client_channel/retry_throttle.h +3 -1
  53. data/src/core/ext/filters/client_channel/service_config_call_data.h +19 -1
  54. data/src/core/ext/filters/client_channel/subchannel.cc +34 -50
  55. data/src/core/ext/filters/client_channel/subchannel.h +12 -18
  56. data/src/core/ext/filters/deadline/deadline_filter.cc +4 -2
  57. data/src/core/ext/filters/http/client_authority_filter.cc +6 -6
  58. data/src/core/ext/filters/http/http_filters_plugin.cc +6 -3
  59. data/src/core/ext/filters/message_size/message_size_filter.cc +1 -1
  60. data/src/core/ext/filters/workarounds/workaround_utils.cc +1 -1
  61. data/src/core/ext/transport/chttp2/client/authority.cc +3 -3
  62. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +20 -8
  63. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +21 -10
  64. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +26 -14
  65. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +178 -86
  66. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +12 -5
  67. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +7 -8
  68. data/src/core/ext/transport/chttp2/transport/flow_control.h +1 -1
  69. data/src/core/ext/transport/chttp2/transport/frame_settings.h +2 -1
  70. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +6 -6
  71. data/src/core/ext/transport/chttp2/transport/writing.cc +1 -1
  72. data/src/core/ext/transport/inproc/inproc_transport.cc +42 -8
  73. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h +1 -0
  74. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.c +1 -1
  75. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +7 -0
  76. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +27 -27
  77. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +139 -40
  78. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.c +13 -13
  79. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.h +44 -17
  80. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +111 -111
  81. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +424 -241
  82. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.c +3 -3
  83. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.h +13 -5
  84. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.c +22 -22
  85. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +47 -21
  86. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c +21 -21
  87. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h +88 -39
  88. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.c +4 -4
  89. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.h +15 -6
  90. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +44 -44
  91. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +200 -78
  92. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +17 -17
  93. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +72 -35
  94. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.c +1 -1
  95. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.h +7 -0
  96. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.c +7 -7
  97. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.h +27 -11
  98. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +30 -30
  99. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +136 -49
  100. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +39 -39
  101. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +157 -89
  102. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.c +4 -4
  103. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h +17 -9
  104. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +47 -47
  105. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +163 -78
  106. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +1 -1
  107. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +7 -0
  108. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.c +2 -2
  109. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h +9 -2
  110. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c +1 -1
  111. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h +7 -0
  112. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +13 -13
  113. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h +59 -36
  114. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +16 -16
  115. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h +61 -29
  116. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c +26 -26
  117. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h +101 -66
  118. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.c +2 -2
  119. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h +11 -3
  120. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +28 -28
  121. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +122 -77
  122. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +23 -23
  123. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +106 -54
  124. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +2 -2
  125. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +13 -0
  126. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +16 -16
  127. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +81 -35
  128. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +7 -7
  129. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +38 -22
  130. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +203 -203
  131. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +845 -495
  132. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c +5 -5
  133. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h +26 -6
  134. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +3 -3
  135. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h +17 -3
  136. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +87 -87
  137. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +343 -204
  138. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.h +1 -0
  139. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +20 -20
  140. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +85 -46
  141. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +7 -7
  142. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +33 -11
  143. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +32 -32
  144. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +118 -67
  145. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.c +1 -1
  146. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.h +7 -0
  147. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.c +1 -1
  148. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.h +7 -0
  149. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +29 -29
  150. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +120 -82
  151. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.c +1 -1
  152. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.h +7 -0
  153. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.c +1 -1
  154. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.h +7 -0
  155. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +7 -7
  156. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.h +31 -16
  157. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.c +1 -1
  158. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.h +7 -0
  159. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.c +1 -1
  160. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.h +7 -0
  161. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c +5 -5
  162. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h +25 -11
  163. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c +1 -1
  164. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h +7 -0
  165. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.c +1 -1
  166. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.h +7 -0
  167. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +6 -6
  168. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.h +29 -8
  169. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +2 -2
  170. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.h +16 -3
  171. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.c +3 -3
  172. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.h +19 -0
  173. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.c +7 -7
  174. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.h +46 -3
  175. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.c +8 -8
  176. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.h +41 -8
  177. data/src/core/ext/upb-generated/envoy/type/v3/http.upb.h +1 -0
  178. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.c +3 -3
  179. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.h +15 -2
  180. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.c +3 -3
  181. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.h +19 -0
  182. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.c +1 -1
  183. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.h +7 -0
  184. data/src/core/ext/upb-generated/google/api/annotations.upb.h +1 -0
  185. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.c +34 -34
  186. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.h +149 -72
  187. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +34 -34
  188. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +142 -59
  189. data/src/core/ext/upb-generated/google/api/http.upb.c +3 -3
  190. data/src/core/ext/upb-generated/google/api/http.upb.h +25 -6
  191. data/src/core/ext/upb-generated/google/protobuf/any.upb.c +1 -1
  192. data/src/core/ext/upb-generated/google/protobuf/any.upb.h +7 -0
  193. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +90 -90
  194. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +455 -292
  195. data/src/core/ext/upb-generated/google/protobuf/duration.upb.c +1 -1
  196. data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +7 -0
  197. data/src/core/ext/upb-generated/google/protobuf/empty.upb.c +1 -1
  198. data/src/core/ext/upb-generated/google/protobuf/empty.upb.h +7 -0
  199. data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +4 -4
  200. data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +22 -3
  201. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.c +1 -1
  202. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +7 -0
  203. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.c +9 -9
  204. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +55 -0
  205. data/src/core/ext/upb-generated/google/rpc/status.upb.c +1 -1
  206. data/src/core/ext/upb-generated/google/rpc/status.upb.h +10 -3
  207. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c +4 -4
  208. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +11 -3
  209. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +41 -41
  210. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +149 -76
  211. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c +5 -5
  212. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +21 -6
  213. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c +2 -2
  214. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +13 -0
  215. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c +17 -17
  216. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +82 -25
  217. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.c +3 -3
  218. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +19 -0
  219. data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +1 -1
  220. data/src/core/ext/upb-generated/udpa/annotations/security.upb.h +7 -0
  221. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h +1 -0
  222. data/src/core/ext/upb-generated/udpa/annotations/status.upb.c +2 -2
  223. data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +9 -2
  224. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.c +1 -1
  225. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.h +7 -0
  226. data/src/core/ext/upb-generated/udpa/core/v1/authority.upb.c +1 -1
  227. data/src/core/ext/upb-generated/udpa/core/v1/authority.upb.h +7 -0
  228. data/src/core/ext/upb-generated/udpa/core/v1/collection_entry.upb.c +5 -5
  229. data/src/core/ext/upb-generated/udpa/core/v1/collection_entry.upb.h +21 -7
  230. data/src/core/ext/upb-generated/udpa/core/v1/context_params.upb.c +2 -2
  231. data/src/core/ext/upb-generated/udpa/core/v1/context_params.upb.h +7 -0
  232. data/src/core/ext/upb-generated/udpa/core/v1/resource.upb.c +4 -4
  233. data/src/core/ext/upb-generated/udpa/core/v1/resource.upb.h +17 -8
  234. data/src/core/ext/upb-generated/udpa/core/v1/resource_locator.upb.c +7 -7
  235. data/src/core/ext/upb-generated/udpa/core/v1/resource_locator.upb.h +31 -18
  236. data/src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.c +5 -5
  237. data/src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.h +19 -11
  238. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c +3 -3
  239. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h +7 -0
  240. data/src/core/ext/upb-generated/validate/validate.upb.c +64 -64
  241. data/src/core/ext/upb-generated/validate/validate.upb.h +296 -157
  242. data/src/core/ext/xds/certificate_provider_store.cc +10 -7
  243. data/src/core/ext/xds/certificate_provider_store.h +12 -7
  244. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +25 -0
  245. data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +1 -4
  246. data/src/core/ext/xds/xds_api.cc +220 -31
  247. data/src/core/ext/xds/xds_api.h +41 -10
  248. data/src/core/ext/xds/xds_bootstrap.h +0 -1
  249. data/src/core/ext/xds/xds_certificate_provider.cc +61 -2
  250. data/src/core/ext/xds/xds_certificate_provider.h +40 -2
  251. data/src/core/ext/xds/xds_client.cc +31 -29
  252. data/src/core/ext/xds/xds_client.h +6 -1
  253. data/src/core/ext/xds/xds_client_stats.cc +2 -2
  254. data/src/core/ext/xds/xds_server_config_fetcher.cc +131 -0
  255. data/src/core/lib/channel/channel_args.cc +8 -8
  256. data/src/core/lib/channel/channel_trace.h +1 -1
  257. data/src/core/lib/channel/channelz.cc +13 -14
  258. data/src/core/lib/channel/channelz.h +0 -1
  259. data/src/core/lib/channel/channelz_registry.h +0 -1
  260. data/src/core/lib/channel/handshaker.cc +2 -2
  261. data/src/core/lib/compression/compression_args.cc +3 -2
  262. data/src/core/lib/debug/stats.h +2 -2
  263. data/src/core/lib/debug/stats_data.h +13 -13
  264. data/src/core/lib/gpr/alloc.cc +3 -2
  265. data/src/core/lib/gpr/log.cc +53 -16
  266. data/src/core/lib/gpr/log_linux.cc +3 -1
  267. data/src/core/lib/gpr/log_posix.cc +3 -1
  268. data/src/core/lib/gpr/log_windows.cc +3 -1
  269. data/src/core/lib/gpr/spinlock.h +10 -2
  270. data/src/core/lib/gpr/string.cc +22 -21
  271. data/src/core/lib/gpr/string.h +5 -6
  272. data/src/core/lib/gpr/sync.cc +4 -4
  273. data/src/core/lib/gpr/time.cc +12 -12
  274. data/src/core/lib/gprpp/arena.h +3 -2
  275. data/src/core/lib/gprpp/ref_counted.h +2 -2
  276. data/src/core/lib/gprpp/ref_counted_ptr.h +9 -1
  277. data/src/core/lib/gprpp/thd_posix.cc +6 -1
  278. data/src/core/lib/gprpp/thd_windows.cc +3 -1
  279. data/src/core/lib/http/httpcli.cc +1 -1
  280. data/src/core/lib/http/httpcli.h +2 -3
  281. data/src/core/lib/http/httpcli_security_connector.cc +1 -1
  282. data/src/core/lib/http/parser.cc +1 -2
  283. data/src/core/lib/iomgr/call_combiner.cc +8 -5
  284. data/src/core/lib/iomgr/combiner.cc +2 -1
  285. data/src/core/lib/iomgr/endpoint.h +1 -1
  286. data/src/core/lib/iomgr/error.cc +15 -11
  287. data/src/core/lib/iomgr/error_internal.h +1 -1
  288. data/src/core/lib/iomgr/ev_epoll1_linux.cc +20 -13
  289. data/src/core/lib/iomgr/ev_epollex_linux.cc +17 -13
  290. data/src/core/lib/iomgr/ev_poll_posix.cc +9 -7
  291. data/src/core/lib/iomgr/exec_ctx.h +6 -4
  292. data/src/core/lib/iomgr/executor.cc +2 -1
  293. data/src/core/lib/iomgr/executor.h +1 -1
  294. data/src/core/lib/iomgr/executor/threadpool.h +1 -1
  295. data/src/core/lib/iomgr/iomgr.cc +1 -1
  296. data/src/core/lib/iomgr/load_file.h +1 -1
  297. data/src/core/lib/iomgr/lockfree_event.cc +19 -14
  298. data/src/core/lib/iomgr/lockfree_event.h +2 -2
  299. data/src/core/lib/iomgr/parse_address.cc +52 -46
  300. data/src/core/lib/iomgr/parse_address.h +13 -9
  301. data/src/core/lib/iomgr/poller/eventmanager_libuv.h +1 -1
  302. data/src/core/lib/iomgr/pollset_set_custom.cc +1 -1
  303. data/src/core/lib/iomgr/python_util.h +1 -1
  304. data/src/core/lib/iomgr/resolve_address.cc +4 -4
  305. data/src/core/lib/iomgr/resource_quota.cc +4 -4
  306. data/src/core/lib/iomgr/sockaddr_utils.cc +10 -10
  307. data/src/core/lib/iomgr/sockaddr_utils.h +1 -1
  308. data/src/core/lib/iomgr/socket_factory_posix.cc +3 -2
  309. data/src/core/lib/iomgr/socket_mutator.cc +3 -2
  310. data/src/core/lib/iomgr/tcp_client.cc +3 -3
  311. data/src/core/lib/iomgr/tcp_client_custom.cc +7 -6
  312. data/src/core/lib/iomgr/tcp_custom.cc +22 -17
  313. data/src/core/lib/iomgr/tcp_posix.cc +9 -6
  314. data/src/core/lib/iomgr/tcp_server_custom.cc +28 -22
  315. data/src/core/lib/iomgr/timer_custom.cc +3 -3
  316. data/src/core/lib/iomgr/timer_generic.cc +3 -3
  317. data/src/core/lib/iomgr/timer_manager.cc +2 -2
  318. data/src/core/lib/iomgr/udp_server.cc +1 -2
  319. data/src/core/lib/iomgr/udp_server.h +1 -2
  320. data/src/core/lib/iomgr/unix_sockets_posix.cc +17 -18
  321. data/src/core/lib/json/json.h +10 -0
  322. data/src/core/lib/security/authorization/evaluate_args.cc +5 -10
  323. data/src/core/lib/security/authorization/evaluate_args.h +1 -1
  324. data/src/core/lib/security/context/security_context.cc +4 -3
  325. data/src/core/lib/security/credentials/alts/check_gcp_environment.cc +1 -1
  326. data/src/core/lib/security/credentials/credentials.cc +6 -6
  327. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +413 -0
  328. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +80 -0
  329. data/src/core/lib/security/credentials/external/aws_request_signer.cc +15 -10
  330. data/src/core/lib/security/credentials/external/aws_request_signer.h +1 -2
  331. data/src/core/lib/security/credentials/external/external_account_credentials.cc +217 -31
  332. data/src/core/lib/security/credentials/external/external_account_credentials.h +7 -5
  333. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +5 -6
  334. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +3 -4
  335. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +20 -18
  336. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +5 -6
  337. data/src/core/lib/security/credentials/fake/fake_credentials.cc +2 -1
  338. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +18 -12
  339. data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +18 -5
  340. data/src/core/lib/security/credentials/jwt/json_token.cc +1 -1
  341. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +3 -3
  342. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +37 -44
  343. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +5 -4
  344. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +1 -1
  345. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +5 -5
  346. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +1 -1
  347. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +1 -6
  348. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +1 -6
  349. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +326 -5
  350. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +64 -0
  351. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +1 -1
  352. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +0 -1
  353. data/src/core/lib/security/credentials/tls/tls_credentials.cc +1 -1
  354. data/src/core/lib/security/credentials/tls/tls_utils.cc +91 -0
  355. data/src/core/lib/security/credentials/tls/tls_utils.h +38 -0
  356. data/src/core/lib/security/credentials/xds/xds_credentials.cc +140 -10
  357. data/src/core/lib/security/credentials/xds/xds_credentials.h +27 -9
  358. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +1 -1
  359. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +1 -1
  360. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +46 -13
  361. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +23 -6
  362. data/src/core/lib/security/security_connector/local/local_security_connector.cc +1 -1
  363. data/src/core/lib/security/security_connector/security_connector.cc +3 -2
  364. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +4 -4
  365. data/src/core/lib/security/security_connector/ssl_utils.cc +2 -2
  366. data/src/core/lib/security/security_connector/ssl_utils.h +12 -19
  367. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +57 -12
  368. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +2 -3
  369. data/src/core/lib/security/transport/secure_endpoint.cc +2 -2
  370. data/src/core/lib/security/transport/security_handshaker.cc +2 -2
  371. data/src/core/lib/slice/slice_intern.cc +4 -5
  372. data/src/core/lib/slice/slice_internal.h +2 -2
  373. data/src/core/lib/surface/call.cc +32 -24
  374. data/src/core/lib/surface/call_details.cc +8 -8
  375. data/src/core/lib/surface/channel.cc +16 -10
  376. data/src/core/lib/surface/channel.h +3 -2
  377. data/src/core/lib/surface/channel_init.cc +1 -1
  378. data/src/core/lib/surface/completion_queue.cc +23 -18
  379. data/src/core/lib/surface/completion_queue.h +16 -16
  380. data/src/core/lib/surface/init.cc +6 -5
  381. data/src/core/lib/surface/lame_client.cc +20 -46
  382. data/src/core/lib/surface/lame_client.h +4 -0
  383. data/src/core/lib/surface/server.cc +59 -15
  384. data/src/core/lib/surface/server.h +37 -5
  385. data/src/core/lib/surface/version.cc +1 -1
  386. data/src/core/lib/transport/authority_override.cc +6 -4
  387. data/src/core/lib/transport/authority_override.h +5 -2
  388. data/src/core/lib/transport/connectivity_state.h +6 -4
  389. data/src/core/lib/transport/error_utils.h +1 -1
  390. data/src/core/lib/transport/metadata_batch.h +4 -4
  391. data/src/core/lib/transport/static_metadata.cc +1 -1
  392. data/src/core/lib/transport/status_metadata.cc +4 -3
  393. data/src/core/lib/transport/transport.h +7 -7
  394. data/src/core/lib/uri/uri_parser.cc +131 -249
  395. data/src/core/lib/uri/uri_parser.h +57 -21
  396. data/src/core/plugin_registry/grpc_plugin_registry.cc +10 -4
  397. data/src/core/tsi/alts/crypt/gsec.cc +5 -4
  398. data/src/core/tsi/alts/frame_protector/frame_handler.cc +8 -6
  399. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -1
  400. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +23 -23
  401. data/src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.cc +8 -6
  402. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +4 -4
  403. data/src/core/tsi/fake_transport_security.cc +5 -3
  404. data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +1 -1
  405. data/src/core/tsi/ssl_transport_security.cc +62 -49
  406. data/src/core/tsi/ssl_transport_security.h +6 -6
  407. data/src/core/tsi/transport_security.cc +6 -6
  408. data/src/core/tsi/transport_security_interface.h +1 -1
  409. data/src/ruby/ext/grpc/rb_event_thread.c +2 -0
  410. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +12 -0
  411. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +31 -13
  412. data/src/ruby/lib/grpc/version.rb +1 -1
  413. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +28 -0
  414. data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +18 -0
  415. data/src/ruby/spec/pb/codegen/package_option_spec.rb +2 -6
  416. data/third_party/abseil-cpp/absl/container/flat_hash_map.h +606 -0
  417. data/third_party/abseil-cpp/absl/container/internal/raw_hash_map.h +197 -0
  418. data/third_party/abseil-cpp/absl/status/internal/statusor_internal.h +399 -0
  419. data/third_party/abseil-cpp/absl/status/statusor.cc +71 -0
  420. data/third_party/abseil-cpp/absl/status/statusor.h +760 -0
  421. data/third_party/upb/third_party/wyhash/wyhash.h +145 -0
  422. data/third_party/upb/upb/decode.c +248 -167
  423. data/third_party/upb/upb/decode.h +20 -1
  424. data/third_party/upb/upb/decode.int.h +163 -0
  425. data/third_party/upb/upb/decode_fast.c +1040 -0
  426. data/third_party/upb/upb/decode_fast.h +126 -0
  427. data/third_party/upb/upb/def.c +525 -516
  428. data/third_party/upb/upb/def.h +16 -31
  429. data/third_party/upb/upb/def.hpp +37 -123
  430. data/third_party/upb/upb/encode.c +227 -169
  431. data/third_party/upb/upb/encode.h +27 -2
  432. data/third_party/upb/upb/json_decode.c +1443 -0
  433. data/third_party/upb/upb/json_decode.h +23 -0
  434. data/third_party/upb/upb/json_encode.c +713 -0
  435. data/third_party/upb/upb/json_encode.h +36 -0
  436. data/third_party/upb/upb/msg.c +167 -88
  437. data/third_party/upb/upb/msg.h +174 -34
  438. data/third_party/upb/upb/port_def.inc +74 -61
  439. data/third_party/upb/upb/port_undef.inc +3 -7
  440. data/third_party/upb/upb/reflection.c +36 -19
  441. data/third_party/upb/upb/table.c +34 -197
  442. data/third_party/upb/upb/table.int.h +14 -5
  443. data/third_party/upb/upb/text_encode.c +45 -22
  444. data/third_party/upb/upb/text_encode.h +4 -1
  445. data/third_party/upb/upb/upb.c +18 -41
  446. data/third_party/upb/upb/upb.h +36 -7
  447. data/third_party/upb/upb/upb.hpp +4 -4
  448. data/third_party/upb/upb/upb.int.h +29 -0
  449. metadata +60 -46
  450. data/src/core/ext/filters/client_channel/lb_policy/xds/eds.cc +0 -909
  451. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +0 -485
  452. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +0 -68
  453. data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +0 -355
  454. data/src/core/ext/filters/client_channel/resolving_lb_policy.h +0 -138
  455. data/src/core/ext/xds/google_mesh_ca_certificate_provider_factory.cc +0 -265
  456. data/src/core/ext/xds/google_mesh_ca_certificate_provider_factory.h +0 -104
  457. data/src/core/lib/gprpp/map.h +0 -53
  458. data/third_party/upb/upb/port.c +0 -26
@@ -1207,7 +1207,7 @@ static uint32_t elems_phash(uint32_t i) {
1207
1207
  uint32_t y = i / 108;
1208
1208
  uint32_t h = x;
1209
1209
  if (y < GPR_ARRAY_SIZE(elems_r)) {
1210
- uint32_t delta = (uint32_t)elems_r[y];
1210
+ uint32_t delta = static_cast<uint32_t>(elems_r[y]);
1211
1211
  h += delta;
1212
1212
  }
1213
1213
  return h;
@@ -42,14 +42,15 @@ grpc_status_code grpc_get_status_code_from_metadata(grpc_mdelem md) {
42
42
  }
43
43
  void* user_data = grpc_mdelem_get_user_data(md, destroy_status);
44
44
  if (user_data != nullptr) {
45
- return static_cast<grpc_status_code>((intptr_t)user_data - STATUS_OFFSET);
45
+ return static_cast<grpc_status_code>(reinterpret_cast<intptr_t>(user_data) -
46
+ STATUS_OFFSET);
46
47
  }
47
48
  uint32_t status;
48
49
  if (!grpc_parse_slice_to_uint32(GRPC_MDVALUE(md), &status)) {
49
50
  status = GRPC_STATUS_UNKNOWN; /* could not parse status code */
50
51
  }
51
- grpc_mdelem_set_user_data(
52
- md, destroy_status, (void*)static_cast<intptr_t>(status + STATUS_OFFSET));
52
+ grpc_mdelem_set_user_data(md, destroy_status,
53
+ reinterpret_cast<void*>(status + STATUS_OFFSET));
53
54
  return static_cast<grpc_status_code>(status);
54
55
  }
55
56
 
@@ -411,7 +411,7 @@ void grpc_transport_destroy_stream(grpc_transport* transport,
411
411
  grpc_closure* then_schedule_closure);
412
412
 
413
413
  void grpc_transport_stream_op_batch_finish_with_failure(
414
- grpc_transport_stream_op_batch* op, grpc_error* error,
414
+ grpc_transport_stream_op_batch* batch, grpc_error* error,
415
415
  grpc_core::CallCombiner* call_combiner);
416
416
 
417
417
  std::string grpc_transport_stream_op_batch_string(
@@ -450,14 +450,14 @@ void grpc_transport_destroy(grpc_transport* transport);
450
450
  /* Get the endpoint used by \a transport */
451
451
  grpc_endpoint* grpc_transport_get_endpoint(grpc_transport* transport);
452
452
 
453
- /* Allocate a grpc_transport_op, and preconfigure the on_consumed closure to
454
- \a on_consumed and then delete the returned transport op */
455
- grpc_transport_op* grpc_make_transport_op(grpc_closure* on_consumed);
456
- /* Allocate a grpc_transport_stream_op_batch, and preconfigure the on_consumed
453
+ /* Allocate a grpc_transport_op, and preconfigure the on_complete closure to
454
+ \a on_complete and then delete the returned transport op */
455
+ grpc_transport_op* grpc_make_transport_op(grpc_closure* on_complete);
456
+ /* Allocate a grpc_transport_stream_op_batch, and preconfigure the on_complete
457
457
  closure
458
- to \a on_consumed and then delete the returned transport op */
458
+ to \a on_complete and then delete the returned transport op */
459
459
  grpc_transport_stream_op_batch* grpc_make_transport_stream_op(
460
- grpc_closure* on_consumed);
460
+ grpc_closure* on_complete);
461
461
 
462
462
  namespace grpc_core {
463
463
  // This is the key to be used for loading/storing keepalive_throttling in the
@@ -22,288 +22,170 @@
22
22
 
23
23
  #include <string.h>
24
24
 
25
+ #include <map>
25
26
  #include <string>
26
27
 
28
+ #include "absl/strings/escaping.h"
27
29
  #include "absl/strings/str_format.h"
30
+ #include "absl/strings/str_split.h"
28
31
 
29
- #include <grpc/slice_buffer.h>
30
- #include <grpc/support/alloc.h>
31
32
  #include <grpc/support/log.h>
32
33
 
33
34
  #include "src/core/lib/gpr/string.h"
34
- #include "src/core/lib/slice/percent_encoding.h"
35
- #include "src/core/lib/slice/slice_internal.h"
36
- #include "src/core/lib/slice/slice_string_helpers.h"
37
35
 
38
- /** a size_t default value... maps to all 1's */
39
- #define NOT_SET (~(size_t)0)
36
+ namespace grpc_core {
37
+ namespace {
40
38
 
41
- static grpc_uri* bad_uri(absl::string_view uri_text, size_t pos,
42
- const char* section, bool suppress_errors) {
43
- if (!suppress_errors) {
44
- std::string line_prefix = absl::StrFormat("bad uri.%s: '", section);
45
- gpr_log(GPR_ERROR, "%s%s'", line_prefix.c_str(),
46
- std::string(uri_text).c_str());
47
- size_t pfx_len = line_prefix.size() + pos;
48
- gpr_log(GPR_ERROR, "%s^ here", std::string(pfx_len, ' ').c_str());
39
+ // Similar to `grpc_permissive_percent_decode_slice`, this %-decodes all valid
40
+ // triplets, and passes through the rest verbatim.
41
+ std::string PercentDecode(absl::string_view str) {
42
+ if (str.empty() || !absl::StrContains(str, "%")) {
43
+ return std::string(str);
44
+ }
45
+ std::string out;
46
+ std::string unescaped;
47
+ out.reserve(str.size());
48
+ for (size_t i = 0; i < str.length(); i++) {
49
+ unescaped = "";
50
+ if (str[i] != '%') {
51
+ out += str[i];
52
+ continue;
53
+ }
54
+ if (i + 3 >= str.length() ||
55
+ !absl::CUnescape(absl::StrCat("\\x", str.substr(i + 1, 2)),
56
+ &unescaped) ||
57
+ unescaped.length() > 1) {
58
+ out += str[i];
59
+ } else {
60
+ out += unescaped[0];
61
+ i += 2;
62
+ }
49
63
  }
50
- return nullptr;
51
- }
52
-
53
- /** Returns a copy of percent decoded \a src[begin, end) */
54
- static char* decode_and_copy_component(absl::string_view src, size_t begin,
55
- size_t end) {
56
- grpc_slice component =
57
- (begin == NOT_SET || end == NOT_SET)
58
- ? grpc_empty_slice()
59
- : grpc_slice_from_copied_buffer(src.data() + begin, end - begin);
60
- grpc_slice decoded_component =
61
- grpc_permissive_percent_decode_slice(component);
62
- char* out = grpc_dump_slice(decoded_component, GPR_DUMP_ASCII);
63
- grpc_slice_unref_internal(component);
64
- grpc_slice_unref_internal(decoded_component);
65
64
  return out;
66
65
  }
67
66
 
68
- static bool valid_hex(char c) {
69
- return ((c >= 'a') && (c <= 'f')) || ((c >= 'A') && (c <= 'F')) ||
70
- ((c >= '0') && (c <= '9'));
67
+ // Checks if this string is made up of pchars, '/', '?', and '%' exclusively.
68
+ // See https://tools.ietf.org/html/rfc3986#section-3.4
69
+ bool IsPCharString(absl::string_view str) {
70
+ return (str.find_first_not_of("ABCDEFGHIJKLMNOPQRSTUVWXYZ"
71
+ "abcdefghijklmnopqrstuvwxyz"
72
+ "0123456789"
73
+ "?/:@\\-._~!$&'()*+,;=%") ==
74
+ absl::string_view::npos);
71
75
  }
72
76
 
73
- /** Returns how many chars to advance if \a uri_text[i] begins a valid \a pchar
74
- * production. If \a uri_text[i] introduces an invalid \a pchar (such as percent
75
- * sign not followed by two hex digits), NOT_SET is returned. */
76
- static size_t parse_pchar(absl::string_view uri_text, size_t i) {
77
- /* pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
78
- * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
79
- * pct-encoded = "%" HEXDIG HEXDIG
80
- * sub-delims = "!" / "$" / "&" / "'" / "(" / ")"
81
- / "*" / "+" / "," / ";" / "=" */
82
- char c = uri_text[i];
83
- switch (c) {
84
- default:
85
- if (((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z')) ||
86
- ((c >= '0') && (c <= '9'))) {
87
- return 1;
88
- }
89
- break;
90
- case ':':
91
- case '@':
92
- case '-':
93
- case '.':
94
- case '_':
95
- case '~':
96
- case '!':
97
- case '$':
98
- case '&':
99
- case '\'':
100
- case '(':
101
- case ')':
102
- case '*':
103
- case '+':
104
- case ',':
105
- case ';':
106
- case '=':
107
- return 1;
108
- case '%': /* pct-encoded */
109
- if (uri_text.size() > i + 2 && valid_hex(uri_text[i + 1]) &&
110
- valid_hex(uri_text[i + 2])) {
111
- return 2;
112
- }
113
- return NOT_SET;
114
- }
115
- return 0;
77
+ absl::Status MakeInvalidURIStatus(absl::string_view part_name,
78
+ absl::string_view uri,
79
+ absl::string_view extra) {
80
+ return absl::InvalidArgumentError(absl::StrFormat(
81
+ "Could not parse '%s' from uri '%s'. %s", part_name, uri, extra));
116
82
  }
117
-
118
- /* *( pchar / "?" / "/" ) */
119
- static int parse_fragment_or_query(absl::string_view uri_text, size_t* i) {
120
- while (uri_text.size() > *i) {
121
- const size_t advance = parse_pchar(uri_text, *i); /* pchar */
122
- switch (advance) {
123
- case 0: /* uri_text[i] isn't in pchar */
124
- /* maybe it's ? or / */
125
- if (uri_text[*i] == '?' || uri_text[*i] == '/') {
126
- (*i)++;
127
- break;
128
- } else {
129
- return 1;
130
- }
131
- GPR_UNREACHABLE_CODE(return 0);
132
- default:
133
- (*i) += advance;
134
- break;
135
- case NOT_SET: /* uri_text[i] introduces an invalid URI */
136
- return 0;
137
- }
83
+ } // namespace
84
+
85
+ absl::StatusOr<URI> URI::Parse(absl::string_view uri_text) {
86
+ absl::StatusOr<std::string> decoded;
87
+ absl::string_view remaining = uri_text;
88
+ // parse scheme
89
+ size_t idx = remaining.find(':');
90
+ if (idx == remaining.npos || idx == 0) {
91
+ return MakeInvalidURIStatus("scheme", uri_text, "Scheme not found.");
138
92
  }
139
- /* *i is the first uri_text position past the \a query production, maybe \0 */
140
- return 1;
141
- }
142
-
143
- static void parse_query_parts(grpc_uri* uri) {
144
- static const char* QUERY_PARTS_SEPARATOR = "&";
145
- static const char* QUERY_PARTS_VALUE_SEPARATOR = "=";
146
- GPR_ASSERT(uri->query != nullptr);
147
- if (uri->query[0] == '\0') {
148
- uri->query_parts = nullptr;
149
- uri->query_parts_values = nullptr;
150
- uri->num_query_parts = 0;
151
- return;
93
+ std::string scheme(remaining.substr(0, idx));
94
+ if (scheme.find_first_not_of("ABCDEFGHIJKLMNOPQRSTUVWXYZ"
95
+ "abcdefghijklmnopqrstuvwxyz"
96
+ "0123456789+-.") != std::string::npos) {
97
+ return MakeInvalidURIStatus("scheme", uri_text,
98
+ "Scheme contains invalid characters.");
152
99
  }
153
-
154
- gpr_string_split(uri->query, QUERY_PARTS_SEPARATOR, &uri->query_parts,
155
- &uri->num_query_parts);
156
- uri->query_parts_values =
157
- static_cast<char**>(gpr_malloc(uri->num_query_parts * sizeof(char**)));
158
- for (size_t i = 0; i < uri->num_query_parts; i++) {
159
- char** query_param_parts;
160
- size_t num_query_param_parts;
161
- char* full = uri->query_parts[i];
162
- gpr_string_split(full, QUERY_PARTS_VALUE_SEPARATOR, &query_param_parts,
163
- &num_query_param_parts);
164
- GPR_ASSERT(num_query_param_parts > 0);
165
- uri->query_parts[i] = query_param_parts[0];
166
- if (num_query_param_parts > 1) {
167
- /* TODO(dgq): only the first value after the separator is considered.
168
- * Perhaps all chars after the first separator for the query part should
169
- * be included, even if they include the separator. */
170
- uri->query_parts_values[i] = query_param_parts[1];
171
- } else {
172
- uri->query_parts_values[i] = nullptr;
173
- }
174
- for (size_t j = 2; j < num_query_param_parts; j++) {
175
- gpr_free(query_param_parts[j]);
176
- }
177
- gpr_free(query_param_parts);
178
- gpr_free(full);
100
+ if (!isalpha(scheme[0])) {
101
+ return MakeInvalidURIStatus(
102
+ "scheme", uri_text,
103
+ "Scheme must begin with an alpha character [A-Za-z].");
179
104
  }
180
- }
181
-
182
- grpc_uri* grpc_uri_parse(absl::string_view uri_text, bool suppress_errors) {
183
- grpc_uri* uri;
184
- size_t scheme_begin = 0;
185
- size_t scheme_end = NOT_SET;
186
- size_t authority_begin = NOT_SET;
187
- size_t authority_end = NOT_SET;
188
- size_t path_begin = NOT_SET;
189
- size_t path_end = NOT_SET;
190
- size_t query_begin = NOT_SET;
191
- size_t query_end = NOT_SET;
192
- size_t fragment_begin = NOT_SET;
193
- size_t fragment_end = NOT_SET;
194
- size_t i;
195
-
196
- for (i = scheme_begin; i < uri_text.size(); ++i) {
197
- if (uri_text[i] == ':') {
198
- scheme_end = i;
199
- break;
200
- }
201
- if (uri_text[i] >= 'a' && uri_text[i] <= 'z') continue;
202
- if (uri_text[i] >= 'A' && uri_text[i] <= 'Z') continue;
203
- if (i != scheme_begin) {
204
- if (uri_text[i] >= '0' && uri_text[i] <= '9') continue;
205
- if (uri_text[i] == '+') continue;
206
- if (uri_text[i] == '-') continue;
207
- if (uri_text[i] == '.') continue;
208
- }
209
- break;
105
+ remaining.remove_prefix(scheme.length() + 1);
106
+ // parse authority
107
+ std::string authority;
108
+ if (absl::StartsWith(remaining, "//")) {
109
+ remaining.remove_prefix(2);
110
+ authority =
111
+ PercentDecode(remaining.substr(0, remaining.find_first_of("/?#")));
112
+ remaining.remove_prefix(authority.length());
210
113
  }
211
- if (scheme_end == NOT_SET) {
212
- return bad_uri(uri_text, i, "scheme", suppress_errors);
114
+ // parse path
115
+ std::string path;
116
+ if (!remaining.empty()) {
117
+ path = PercentDecode(remaining.substr(0, remaining.find_first_of("?#")));
118
+ remaining.remove_prefix(path.length());
213
119
  }
214
-
215
- if (uri_text.size() > scheme_end + 2 && uri_text[scheme_end + 1] == '/' &&
216
- uri_text[scheme_end + 2] == '/') {
217
- authority_begin = scheme_end + 3;
218
- for (i = authority_begin; uri_text.size() > i && authority_end == NOT_SET;
219
- i++) {
220
- if (uri_text[i] == '/' || uri_text[i] == '?' || uri_text[i] == '#') {
221
- authority_end = i;
222
- }
120
+ // parse query
121
+ std::vector<QueryParam> query_param_pairs;
122
+ if (!remaining.empty() && remaining[0] == '?') {
123
+ remaining.remove_prefix(1);
124
+ absl::string_view tmp_query = remaining.substr(0, remaining.find('#'));
125
+ if (tmp_query.empty()) {
126
+ return MakeInvalidURIStatus("query", uri_text, "Invalid query string.");
223
127
  }
224
- if (authority_end == NOT_SET && uri_text.size() == i) {
225
- authority_end = i;
128
+ if (!IsPCharString(tmp_query)) {
129
+ return MakeInvalidURIStatus("query string", uri_text,
130
+ "Query string contains invalid characters.");
226
131
  }
227
- if (authority_end == NOT_SET) {
228
- return bad_uri(uri_text, i, "authority", suppress_errors);
132
+ for (absl::string_view query_param : absl::StrSplit(tmp_query, '&')) {
133
+ const std::pair<absl::string_view, absl::string_view> possible_kv =
134
+ absl::StrSplit(query_param, absl::MaxSplits('=', 1));
135
+ if (possible_kv.first.empty()) continue;
136
+ query_param_pairs.push_back({PercentDecode(possible_kv.first),
137
+ PercentDecode(possible_kv.second)});
229
138
  }
230
- /* TODO(ctiller): parse the authority correctly */
231
- path_begin = authority_end;
232
- } else {
233
- path_begin = scheme_end + 1;
139
+ remaining.remove_prefix(tmp_query.length());
234
140
  }
235
-
236
- for (i = path_begin; i < uri_text.size(); ++i) {
237
- if (uri_text[i] == '?' || uri_text[i] == '#') {
238
- path_end = i;
239
- break;
141
+ std::string fragment;
142
+ if (!remaining.empty() && remaining[0] == '#') {
143
+ remaining.remove_prefix(1);
144
+ if (!IsPCharString(remaining)) {
145
+ return MakeInvalidURIStatus("fragment", uri_text,
146
+ "Fragment contains invalid characters.");
240
147
  }
148
+ fragment = PercentDecode(remaining);
241
149
  }
242
- if (path_end == NOT_SET && uri_text.size() == i) {
243
- path_end = i;
244
- }
245
- if (path_end == NOT_SET) {
246
- return bad_uri(uri_text, i, "path", suppress_errors);
247
- }
150
+ return URI(std::move(scheme), std::move(authority), std::move(path),
151
+ std::move(query_param_pairs), std::move(fragment));
152
+ }
248
153
 
249
- if (uri_text.size() > i && uri_text[i] == '?') {
250
- query_begin = ++i;
251
- if (!parse_fragment_or_query(uri_text, &i)) {
252
- return bad_uri(uri_text, i, "query", suppress_errors);
253
- } else if (uri_text.size() > i && uri_text[i] != '#') {
254
- /* We must be at the end or at the beginning of a fragment */
255
- return bad_uri(uri_text, i, "query", suppress_errors);
256
- }
257
- query_end = i;
258
- }
259
- if (uri_text.size() > i && uri_text[i] == '#') {
260
- fragment_begin = ++i;
261
- if (!parse_fragment_or_query(uri_text, &i)) {
262
- return bad_uri(uri_text, i - fragment_end, "fragment", suppress_errors);
263
- } else if (uri_text.size() > i) {
264
- /* We must be at the end */
265
- return bad_uri(uri_text, i, "fragment", suppress_errors);
266
- }
267
- fragment_end = i;
154
+ URI::URI(std::string scheme, std::string authority, std::string path,
155
+ std::vector<QueryParam> query_parameter_pairs, std::string fragment)
156
+ : scheme_(std::move(scheme)),
157
+ authority_(std::move(authority)),
158
+ path_(std::move(path)),
159
+ query_parameter_pairs_(std::move(query_parameter_pairs)),
160
+ fragment_(std::move(fragment)) {
161
+ for (const auto& kv : query_parameter_pairs_) {
162
+ query_parameter_map_[kv.key] = kv.value;
268
163
  }
269
-
270
- uri = static_cast<grpc_uri*>(gpr_zalloc(sizeof(*uri)));
271
- uri->scheme = decode_and_copy_component(uri_text, scheme_begin, scheme_end);
272
- uri->authority =
273
- decode_and_copy_component(uri_text, authority_begin, authority_end);
274
- uri->path = decode_and_copy_component(uri_text, path_begin, path_end);
275
- uri->query = decode_and_copy_component(uri_text, query_begin, query_end);
276
- uri->fragment =
277
- decode_and_copy_component(uri_text, fragment_begin, fragment_end);
278
- parse_query_parts(uri);
279
-
280
- return uri;
281
164
  }
282
165
 
283
- const char* grpc_uri_get_query_arg(const grpc_uri* uri, const char* key) {
284
- GPR_ASSERT(key != nullptr);
285
- if (key[0] == '\0') return nullptr;
286
-
287
- for (size_t i = 0; i < uri->num_query_parts; ++i) {
288
- if (0 == strcmp(key, uri->query_parts[i])) {
289
- return uri->query_parts_values[i];
290
- }
166
+ URI::URI(const URI& other)
167
+ : scheme_(other.scheme_),
168
+ authority_(other.authority_),
169
+ path_(other.path_),
170
+ query_parameter_pairs_(other.query_parameter_pairs_),
171
+ fragment_(other.fragment_) {
172
+ for (const auto& kv : query_parameter_pairs_) {
173
+ query_parameter_map_[kv.key] = kv.value;
291
174
  }
292
- return nullptr;
293
175
  }
294
176
 
295
- void grpc_uri_destroy(grpc_uri* uri) {
296
- if (!uri) return;
297
- gpr_free(uri->scheme);
298
- gpr_free(uri->authority);
299
- gpr_free(uri->path);
300
- gpr_free(uri->query);
301
- for (size_t i = 0; i < uri->num_query_parts; ++i) {
302
- gpr_free(uri->query_parts[i]);
303
- gpr_free(uri->query_parts_values[i]);
177
+ URI& URI::operator=(const URI& other) {
178
+ if (this == &other) {
179
+ return *this;
180
+ }
181
+ scheme_ = other.scheme_;
182
+ authority_ = other.authority_;
183
+ path_ = other.path_;
184
+ query_parameter_pairs_ = other.query_parameter_pairs_;
185
+ fragment_ = other.fragment_;
186
+ for (const auto& kv : query_parameter_pairs_) {
187
+ query_parameter_map_[kv.key] = kv.value;
304
188
  }
305
- gpr_free(uri->query_parts);
306
- gpr_free(uri->query_parts_values);
307
- gpr_free(uri->fragment);
308
- gpr_free(uri);
189
+ return *this;
309
190
  }
191
+ } // namespace grpc_core