grpc 1.23.1 → 1.24.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 (245) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +757 -477
  3. data/include/grpc/grpc.h +3 -1
  4. data/include/grpc/grpc_security.h +20 -4
  5. data/include/grpc/impl/codegen/grpc_types.h +6 -5
  6. data/include/grpc/impl/codegen/port_platform.h +25 -0
  7. data/src/core/ext/filters/client_channel/backend_metric.cc +78 -0
  8. data/src/core/ext/filters/client_channel/backend_metric.h +36 -0
  9. data/src/core/ext/filters/client_channel/channel_connectivity.cc +16 -2
  10. data/src/core/ext/filters/client_channel/client_channel.cc +325 -267
  11. data/src/core/ext/filters/client_channel/client_channel_factory.h +0 -4
  12. data/src/core/ext/filters/client_channel/health/health_check_client.cc +23 -32
  13. data/src/core/ext/filters/client_channel/http_proxy.cc +7 -3
  14. data/src/core/ext/filters/client_channel/lb_policy.cc +1 -1
  15. data/src/core/ext/filters/client_channel/lb_policy.h +58 -34
  16. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +46 -50
  17. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +9 -2
  18. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +35 -17
  19. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +130 -215
  20. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +34 -21
  21. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +1120 -802
  22. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel.h +8 -2
  23. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_secure.cc +33 -12
  24. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_client_stats.cc +151 -40
  25. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_client_stats.h +184 -26
  26. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_load_balancer_api.cc +389 -245
  27. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_load_balancer_api.h +98 -60
  28. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +6 -1
  29. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +89 -0
  30. data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +3 -8
  31. data/src/core/ext/filters/client_channel/server_address.cc +1 -3
  32. data/src/core/ext/filters/client_channel/server_address.h +1 -1
  33. data/src/core/ext/filters/client_channel/subchannel.h +2 -1
  34. data/src/core/ext/filters/client_idle/client_idle_filter.cc +207 -29
  35. data/src/core/ext/filters/http/client/http_client_filter.cc +10 -8
  36. data/src/core/ext/filters/http/client_authority_filter.cc +1 -1
  37. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +10 -7
  38. data/src/core/ext/filters/http/server/http_server_filter.cc +52 -26
  39. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +23 -20
  40. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +24 -21
  41. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +1 -1
  42. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +37 -24
  43. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +1 -0
  44. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +237 -191
  45. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +29 -27
  46. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +1 -1
  47. data/src/core/ext/transport/chttp2/transport/hpack_table.cc +19 -4
  48. data/src/core/ext/transport/chttp2/transport/hpack_table.h +13 -4
  49. data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +2 -1
  50. data/src/core/ext/transport/chttp2/transport/internal.h +0 -2
  51. data/src/core/ext/transport/chttp2/transport/parsing.cc +99 -71
  52. data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c +222 -0
  53. data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h +818 -0
  54. data/src/core/ext/upb-generated/envoy/api/v2/cds.upb.c +314 -0
  55. data/src/core/ext/upb-generated/envoy/api/v2/cds.upb.h +1142 -0
  56. data/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c +53 -0
  57. data/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.h +158 -0
  58. data/src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c +34 -0
  59. data/src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.h +69 -0
  60. data/src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c +49 -0
  61. data/src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.h +240 -0
  62. data/src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c +110 -0
  63. data/src/core/ext/upb-generated/envoy/api/v2/core/address.upb.h +324 -0
  64. data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c +235 -0
  65. data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h +661 -0
  66. data/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c +84 -0
  67. data/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h +274 -0
  68. data/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c +175 -0
  69. data/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h +572 -0
  70. data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c +150 -0
  71. data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h +596 -0
  72. data/src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c +35 -0
  73. data/src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.h +80 -0
  74. data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c +95 -0
  75. data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h +308 -0
  76. data/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c +128 -0
  77. data/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.h +392 -0
  78. data/src/core/ext/upb-generated/envoy/api/v2/eds.upb.c +91 -0
  79. data/src/core/ext/upb-generated/envoy/api/v2/eds.upb.h +236 -0
  80. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.c +88 -0
  81. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.h +258 -0
  82. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.c +111 -0
  83. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.h +324 -0
  84. data/src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.c +23 -0
  85. data/src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.h +50 -0
  86. data/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c +52 -0
  87. data/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.h +130 -0
  88. data/src/core/ext/upb-generated/envoy/type/percent.upb.c +39 -0
  89. data/src/core/ext/upb-generated/envoy/type/percent.upb.h +87 -0
  90. data/src/core/ext/upb-generated/envoy/type/range.upb.c +39 -0
  91. data/src/core/ext/upb-generated/envoy/type/range.upb.h +85 -0
  92. data/src/core/ext/upb-generated/gogoproto/gogo.upb.c +17 -0
  93. data/src/core/ext/upb-generated/gogoproto/gogo.upb.h +30 -0
  94. data/src/core/ext/upb-generated/google/api/annotations.upb.c +18 -0
  95. data/src/core/ext/upb-generated/google/api/annotations.upb.h +30 -0
  96. data/src/core/ext/upb-generated/google/api/http.upb.c +66 -0
  97. data/src/core/ext/upb-generated/google/api/http.upb.h +190 -0
  98. data/src/core/ext/upb-generated/google/protobuf/any.upb.c +27 -0
  99. data/src/core/ext/upb-generated/google/protobuf/any.upb.h +58 -0
  100. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +485 -0
  101. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +1690 -0
  102. data/src/core/ext/upb-generated/google/protobuf/duration.upb.c +27 -0
  103. data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +58 -0
  104. data/src/core/ext/upb-generated/google/protobuf/empty.upb.c +22 -0
  105. data/src/core/ext/upb-generated/google/protobuf/empty.upb.h +50 -0
  106. data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +79 -0
  107. data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +215 -0
  108. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.c +27 -0
  109. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +58 -0
  110. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.c +106 -0
  111. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +238 -0
  112. data/src/core/ext/upb-generated/google/rpc/status.upb.c +33 -0
  113. data/src/core/ext/upb-generated/google/rpc/status.upb.h +74 -0
  114. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c +49 -0
  115. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +126 -0
  116. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +209 -0
  117. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +681 -0
  118. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c +42 -0
  119. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +109 -0
  120. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c +36 -0
  121. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +84 -0
  122. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c +133 -0
  123. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +359 -0
  124. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c +58 -0
  125. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h +144 -0
  126. data/src/core/ext/upb-generated/validate/validate.upb.c +443 -0
  127. data/src/core/ext/upb-generated/validate/validate.upb.h +2037 -0
  128. data/src/core/lib/channel/channel_args.cc +21 -0
  129. data/src/core/lib/channel/channel_args.h +16 -2
  130. data/src/core/lib/channel/channel_stack.h +2 -1
  131. data/src/core/lib/channel/channelz.cc +54 -56
  132. data/src/core/lib/channel/channelz.h +29 -12
  133. data/src/core/lib/compression/compression.cc +2 -1
  134. data/src/core/lib/compression/compression_internal.h +8 -0
  135. data/src/core/lib/gpr/log_linux.cc +2 -2
  136. data/src/core/lib/gpr/log_posix.cc +2 -2
  137. data/src/core/lib/gpr/time_precise.cc +123 -36
  138. data/src/core/lib/gpr/time_precise.h +37 -0
  139. data/src/core/lib/gprpp/abstract.h +10 -0
  140. data/src/core/lib/gprpp/atomic.h +4 -0
  141. data/src/core/lib/gprpp/inlined_vector.h +20 -4
  142. data/src/core/lib/gprpp/map.h +109 -6
  143. data/src/core/lib/gprpp/memory.h +6 -0
  144. data/src/core/lib/gprpp/ref_counted_ptr.h +2 -0
  145. data/src/core/lib/iomgr/ev_epollex_linux.cc +29 -54
  146. data/src/core/lib/iomgr/exec_ctx.cc +27 -17
  147. data/src/core/lib/iomgr/exec_ctx.h +3 -0
  148. data/src/core/lib/iomgr/sockaddr_utils.cc +1 -3
  149. data/src/core/lib/iomgr/tcp_posix.cc +16 -25
  150. data/src/core/lib/iomgr/tcp_server_custom.cc +1 -1
  151. data/src/core/lib/iomgr/timer_manager.cc +8 -1
  152. data/src/core/lib/iomgr/timer_manager.h +2 -0
  153. data/src/core/lib/security/credentials/credentials.h +8 -2
  154. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +23 -0
  155. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +3 -0
  156. data/src/core/lib/security/credentials/tls/spiffe_credentials.cc +3 -3
  157. data/src/core/lib/security/security_connector/ssl_utils.cc +1 -12
  158. data/src/core/lib/security/security_connector/ssl_utils.h +10 -6
  159. data/src/core/lib/security/security_connector/ssl_utils_config.cc +32 -0
  160. data/src/core/lib/security/security_connector/ssl_utils_config.h +30 -0
  161. data/src/core/lib/security/security_connector/tls/spiffe_security_connector.cc +161 -49
  162. data/src/core/lib/security/security_connector/tls/spiffe_security_connector.h +34 -1
  163. data/src/core/lib/slice/slice_intern.cc +17 -9
  164. data/src/core/lib/slice/slice_internal.h +34 -7
  165. data/src/core/lib/slice/slice_utils.h +7 -3
  166. data/src/core/lib/surface/call.cc +97 -57
  167. data/src/core/lib/surface/channel.cc +2 -2
  168. data/src/core/lib/surface/completion_queue.cc +10 -16
  169. data/src/core/lib/surface/init.cc +3 -0
  170. data/src/core/lib/surface/server.cc +11 -14
  171. data/src/core/lib/surface/validate_metadata.cc +4 -0
  172. data/src/core/lib/surface/version.cc +2 -2
  173. data/src/core/lib/transport/metadata.cc +4 -4
  174. data/src/core/lib/transport/metadata_batch.cc +72 -16
  175. data/src/core/lib/transport/metadata_batch.h +38 -0
  176. data/src/core/lib/transport/static_metadata.cc +814 -1023
  177. data/src/core/lib/transport/static_metadata.h +271 -213
  178. data/src/core/lib/transport/transport.h +12 -0
  179. data/src/core/plugin_registry/grpc_plugin_registry.cc +4 -0
  180. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +104 -76
  181. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +34 -16
  182. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +2 -2
  183. data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +10 -6
  184. data/src/core/tsi/alts/handshaker/alts_tsi_utils.h +4 -3
  185. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +74 -48
  186. data/src/core/tsi/alts/handshaker/transport_security_common_api.h +34 -26
  187. data/src/core/tsi/ssl_transport_security.cc +14 -6
  188. data/src/core/tsi/ssl_transport_security.h +4 -0
  189. data/src/ruby/ext/grpc/ext-export.clang +1 -0
  190. data/src/ruby/ext/grpc/ext-export.gcc +6 -0
  191. data/src/ruby/ext/grpc/extconf.rb +5 -0
  192. data/src/ruby/ext/grpc/rb_enable_cpp.cc +22 -0
  193. data/src/ruby/ext/grpc/rb_grpc.c +1 -42
  194. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -0
  195. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +6 -0
  196. data/src/ruby/lib/grpc.rb +2 -0
  197. data/src/ruby/lib/grpc/core/status_codes.rb +135 -0
  198. data/src/ruby/lib/grpc/errors.rb +4 -7
  199. data/src/ruby/lib/grpc/google_rpc_status_utils.rb +9 -4
  200. data/src/ruby/lib/grpc/structs.rb +15 -0
  201. data/src/ruby/lib/grpc/version.rb +1 -1
  202. data/src/ruby/spec/errors_spec.rb +1 -0
  203. data/src/ruby/spec/pb/codegen/grpc/testing/package_options_import.proto +22 -0
  204. data/src/ruby/spec/pb/codegen/grpc/testing/package_options_ruby_style.proto +34 -0
  205. data/src/ruby/spec/pb/codegen/package_option_spec.rb +53 -29
  206. data/third_party/upb/upb/decode.c +604 -0
  207. data/third_party/upb/upb/decode.h +21 -0
  208. data/third_party/upb/upb/encode.c +378 -0
  209. data/third_party/upb/upb/encode.h +21 -0
  210. data/third_party/upb/upb/generated_util.h +105 -0
  211. data/third_party/upb/upb/msg.c +111 -0
  212. data/third_party/upb/upb/msg.h +69 -0
  213. data/third_party/upb/upb/port.c +27 -0
  214. data/third_party/upb/upb/port_def.inc +152 -0
  215. data/third_party/upb/upb/port_undef.inc +21 -0
  216. data/third_party/upb/upb/table.c +911 -0
  217. data/third_party/upb/upb/table.int.h +507 -0
  218. data/third_party/upb/upb/upb.c +261 -0
  219. data/third_party/upb/upb/upb.h +364 -0
  220. metadata +134 -55
  221. data/src/core/ext/filters/client_channel/health/health.pb.c +0 -23
  222. data/src/core/ext/filters/client_channel/health/health.pb.h +0 -73
  223. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/google/protobuf/duration.pb.c +0 -19
  224. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/google/protobuf/duration.pb.h +0 -54
  225. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/google/protobuf/timestamp.pb.c +0 -19
  226. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/google/protobuf/timestamp.pb.h +0 -54
  227. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c +0 -89
  228. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h +0 -164
  229. data/src/core/tsi/alts/handshaker/alts_handshaker_service_api.cc +0 -520
  230. data/src/core/tsi/alts/handshaker/alts_handshaker_service_api.h +0 -323
  231. data/src/core/tsi/alts/handshaker/alts_handshaker_service_api_util.cc +0 -145
  232. data/src/core/tsi/alts/handshaker/alts_handshaker_service_api_util.h +0 -149
  233. data/src/core/tsi/alts/handshaker/altscontext.pb.c +0 -47
  234. data/src/core/tsi/alts/handshaker/altscontext.pb.h +0 -63
  235. data/src/core/tsi/alts/handshaker/handshaker.pb.c +0 -122
  236. data/src/core/tsi/alts/handshaker/handshaker.pb.h +0 -254
  237. data/src/core/tsi/alts/handshaker/transport_security_common.pb.c +0 -49
  238. data/src/core/tsi/alts/handshaker/transport_security_common.pb.h +0 -78
  239. data/third_party/nanopb/pb.h +0 -579
  240. data/third_party/nanopb/pb_common.c +0 -97
  241. data/third_party/nanopb/pb_common.h +0 -42
  242. data/third_party/nanopb/pb_decode.c +0 -1347
  243. data/third_party/nanopb/pb_decode.h +0 -149
  244. data/third_party/nanopb/pb_encode.c +0 -696
  245. data/third_party/nanopb/pb_encode.h +0 -154
@@ -15,10 +15,12 @@
15
15
  ssl_roots_path = File.expand_path('../../../../etc/roots.pem', __FILE__)
16
16
 
17
17
  require_relative 'grpc/errors'
18
+ require_relative 'grpc/structs'
18
19
  require_relative 'grpc/grpc'
19
20
  require_relative 'grpc/logconfig'
20
21
  require_relative 'grpc/notifier'
21
22
  require_relative 'grpc/version'
23
+ require_relative 'grpc/core/status_codes'
22
24
  require_relative 'grpc/core/time_consts'
23
25
  require_relative 'grpc/generic/active_call'
24
26
  require_relative 'grpc/generic/client_stub'
@@ -0,0 +1,135 @@
1
+ # Copyright 2015 gRPC authors.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ # GRPC contains the General RPC module.
16
+ module GRPC
17
+ module Core
18
+ # StatusCodes defines the canonical error codes used by gRPC for the RPC
19
+ # API.
20
+ module StatusCodes
21
+ # OK is returned on success.
22
+ OK = 0
23
+
24
+ # Canceled indicates the operation was canceled (typically by the caller).
25
+ CANCELLED = 1
26
+
27
+ # Unknown error. An example of where this error may be returned is if a
28
+ # Status value received from another address space belongs to an
29
+ # error-space that is not known in this address space. Also errors raised
30
+ # by APIs that do not return enough error information may be converted to
31
+ # this error.
32
+ UNKNOWN = 2
33
+
34
+ # InvalidArgument indicates client specified an invalid argument. Note
35
+ # that this differs from FailedPrecondition. It indicates arguments that
36
+ # are problematic regardless of the state of the system (e.g., a malformed
37
+ # file name).
38
+ INVALID_ARGUMENT = 3
39
+
40
+ # DeadlineExceeded means operation expired before completion. For
41
+ # operations that change the state of the system, this error may be
42
+ # returned even if the operation has completed successfully. For example,
43
+ # a successful response from a server could have been delayed long enough
44
+ # for the deadline to expire.
45
+ DEADLINE_EXCEEDED = 4
46
+
47
+ # NotFound means some requested entity (e.g., file or directory) was not
48
+ # found.
49
+ NOT_FOUND = 5
50
+
51
+ # AlreadyExists means an attempt to create an entity failed because one
52
+ # already exists.
53
+ ALREADY_EXISTS = 6
54
+
55
+ # PermissionDenied indicates the caller does not have permission to
56
+ # execute the specified operation. It must not be used for rejections
57
+ # caused by exhausting some resource (use ResourceExhausted instead for
58
+ # those errors). It must not be used if the caller cannot be identified
59
+ # (use Unauthenticated instead for those errors).
60
+ PERMISSION_DENIED = 7
61
+
62
+ # ResourceExhausted indicates some resource has been exhausted, perhaps a
63
+ # per-user quota, or perhaps the entire file system is out of space.
64
+ RESOURCE_EXHAUSTED = 8
65
+
66
+ # FailedPrecondition indicates operation was rejected because the system
67
+ # is not in a state required for the operation's execution. For example,
68
+ # directory to be deleted may be non-empty, an rmdir operation is applied
69
+ # to a non-directory, etc.
70
+ #
71
+ # A litmus test that may help a service implementor in deciding between
72
+ # FailedPrecondition, Aborted, and Unavailable:
73
+ # (a) Use Unavailable if the client can retry just the failing call.
74
+ # (b) Use Aborted if the client should retry at a higher-level (e.g.,
75
+ # restarting a read-modify-write sequence).
76
+ # (c) Use FailedPrecondition if the client should not retry until the
77
+ # system state has been explicitly fixed. E.g., if an "rmdir" fails
78
+ # because the directory is non-empty, FailedPrecondition should be
79
+ # returned since the client should not retry unless they have first
80
+ # fixed up the directory by deleting files from it.
81
+ # (d) Use FailedPrecondition if the client performs conditional REST
82
+ # Get/Update/Delete on a resource and the resource on the server does
83
+ # not match the condition. E.g., conflicting read-modify-write on the
84
+ # same resource.
85
+ FAILED_PRECONDITION = 9
86
+
87
+ # Aborted indicates the operation was aborted, typically due to a
88
+ # concurrency issue like sequencer check failures, transaction aborts,
89
+ # etc.
90
+ #
91
+ # See litmus test above for deciding between FailedPrecondition, Aborted,
92
+ # and Unavailable.
93
+ ABORTED = 10
94
+
95
+ # OutOfRange means operation was attempted past the valid range. E.g.,
96
+ # seeking or reading past end of file.
97
+ #
98
+ # Unlike InvalidArgument, this error indicates a problem that may be fixed
99
+ # if the system state changes. For example, a 32-bit file system will
100
+ # generate InvalidArgument if asked to read at an offset that is not in
101
+ # the range [0,2^32-1], but it will generate OutOfRange if asked to read
102
+ # from an offset past the current file size.
103
+ #
104
+ # There is a fair bit of overlap between FailedPrecondition and
105
+ # OutOfRange. We recommend using OutOfRange (the more specific error) when
106
+ # it applies so that callers who are iterating through a space can easily
107
+ # look for an OutOfRange error to detect when they are done.
108
+ OUT_OF_RANGE = 11
109
+
110
+ # Unimplemented indicates operation is not implemented or not
111
+ # supported/enabled in this service.
112
+ UNIMPLEMENTED = 12
113
+
114
+ # Internal errors. Means some invariants expected by underlying system has
115
+ # been broken. If you see one of these errors, something is very broken.
116
+ INTERNAL = 13
117
+
118
+ # Unavailable indicates the service is currently unavailable. This is a
119
+ # most likely a transient condition and may be corrected by retrying with
120
+ # a backoff. Note that it is not always safe to retry non-idempotent
121
+ # operations.
122
+ #
123
+ # See litmus test above for deciding between FailedPrecondition, Aborted,
124
+ # and Unavailable.
125
+ UNAVAILABLE = 14
126
+
127
+ # DataLoss indicates unrecoverable data loss or corruption.
128
+ DATA_LOSS = 15
129
+
130
+ # Unauthenticated indicates the request does not have valid authentication
131
+ # credentials for the operation.
132
+ UNAUTHENTICATED = 16
133
+ end
134
+ end
135
+ end
@@ -12,7 +12,9 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- require_relative './grpc'
15
+ require_relative './structs'
16
+ require_relative './core/status_codes'
17
+ require_relative './google_rpc_status_utils'
16
18
 
17
19
  # GRPC contains the General RPC module.
18
20
  module GRPC
@@ -57,12 +59,7 @@ module GRPC
57
59
  #
58
60
  # @return [Google::Rpc::Status, nil]
59
61
  def to_rpc_status
60
- # Lazily require google_rpc_status_utils to scope
61
- # loading protobuf_c.so to the users of this method.
62
- require_relative './google_rpc_status_utils'
63
- status = to_status
64
- return if status.nil?
65
- GoogleRpcStatusUtils.extract_google_rpc_status(status)
62
+ GoogleRpcStatusUtils.extract_google_rpc_status(to_status)
66
63
  rescue Google::Protobuf::ParseError => parse_error
67
64
  GRPC.logger.warn('parse error: to_rpc_status failed')
68
65
  GRPC.logger.warn(parse_error)
@@ -12,8 +12,7 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- require_relative './grpc'
16
- require 'google/rpc/status_pb'
15
+ require_relative './structs'
17
16
 
18
17
  # GRPC contains the General RPC module.
19
18
  module GRPC
@@ -28,8 +27,14 @@ module GRPC
28
27
  def self.extract_google_rpc_status(status)
29
28
  fail ArgumentError, 'bad type' unless status.is_a? Struct::Status
30
29
  grpc_status_details_bin_trailer = 'grpc-status-details-bin'
31
- return nil if status.metadata[grpc_status_details_bin_trailer].nil?
32
- Google::Rpc::Status.decode(status.metadata[grpc_status_details_bin_trailer])
30
+ binstatus = status.metadata[grpc_status_details_bin_trailer]
31
+ return nil if binstatus.nil?
32
+
33
+ # Lazily load grpc_c and protobuf_c.so for users of this method.
34
+ require_relative './grpc'
35
+ require 'google/rpc/status_pb'
36
+
37
+ Google::Rpc::Status.decode(binstatus)
33
38
  end
34
39
  end
35
40
  end
@@ -0,0 +1,15 @@
1
+ # Copyright 2015 gRPC authors.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ Struct.new('Status', :code, :details, :metadata)
@@ -14,5 +14,5 @@
14
14
 
15
15
  # GRPC contains the General RPC module.
16
16
  module GRPC
17
- VERSION = '1.23.1'
17
+ VERSION = '1.24.0.pre1'
18
18
  end
@@ -14,6 +14,7 @@
14
14
 
15
15
  require 'spec_helper'
16
16
  require 'google/protobuf/well_known_types'
17
+ require 'google/rpc/status_pb'
17
18
  require_relative '../pb/src/proto/grpc/testing/messages_pb'
18
19
 
19
20
  describe GRPC::BadStatus do
@@ -0,0 +1,22 @@
1
+ // Copyright 2019 gRPC authors.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ syntax = "proto3";
16
+
17
+ package grpc.testing;
18
+
19
+ // For sanity checking package definitions
20
+ option ruby_package = "A::Other";
21
+
22
+ message Thing { }
@@ -0,0 +1,34 @@
1
+ // Copyright 2019 gRPC authors.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ syntax = "proto3";
16
+
17
+ package grpc.testing;
18
+
19
+ import "grpc/testing/package_options_import.proto";
20
+
21
+ // For sanity checking package definitions
22
+ option ruby_package = "RPC::Test::New::Package::Options";
23
+
24
+ message AnotherTestRequest { }
25
+
26
+ message AnotherTestResponse { }
27
+
28
+ message Foo { }
29
+
30
+ service AnotherTestService {
31
+ rpc GetTest(AnotherTestRequest) returns (AnotherTestResponse) { }
32
+ rpc OtherTest(Thing) returns (Thing) { }
33
+ rpc FooTest(Foo) returns (Foo) { }
34
+ }
@@ -18,35 +18,59 @@ require 'tmpdir'
18
18
 
19
19
  describe 'Code Generation Options' do
20
20
  it 'should generate and respect package options' do
21
- fail 'CONFIG env variable unexpectedly unset' unless ENV['CONFIG']
22
- bins_sub_dir = ENV['CONFIG']
23
-
24
- pb_dir = File.dirname(__FILE__)
25
- bins_dir = File.join('..', '..', '..', '..', '..', 'bins', bins_sub_dir)
26
-
27
- plugin = File.join(bins_dir, 'grpc_ruby_plugin')
28
- protoc = File.join(bins_dir, 'protobuf', 'protoc')
29
-
30
- # Generate the service from the proto
31
- Dir.mktmpdir(nil, File.dirname(__FILE__)) do |tmp_dir|
32
- gen_file = system(protoc,
33
- '-I.',
34
- 'grpc/testing/package_options.proto',
35
- "--grpc_out=#{tmp_dir}", # generate the service
36
- "--ruby_out=#{tmp_dir}", # generate the definitions
37
- "--plugin=protoc-gen-grpc=#{plugin}",
38
- chdir: pb_dir,
39
- out: File::NULL)
40
-
41
- expect(gen_file).to be_truthy
42
- begin
43
- $LOAD_PATH.push(tmp_dir)
44
- expect { Grpc::Testing::Package::Options::TestService::Service }.to raise_error(NameError)
45
- expect(require('grpc/testing/package_options_services_pb')).to be_truthy
46
- expect { Grpc::Testing::Package::Options::TestService::Service }.to_not raise_error
47
- ensure
48
- $LOAD_PATH.delete(tmp_dir)
49
- end
21
+ with_protos(%w[grpc/testing/package_options.proto]) do
22
+ expect { Grpc::Testing::Package::Options::TestService::Service }.to raise_error(NameError)
23
+ expect(require('grpc/testing/package_options_services_pb')).to be_truthy
24
+ expect { Grpc::Testing::Package::Options::TestService::Service }.to_not raise_error
25
+ expect { Grpc::Testing::TestService::Service }.to raise_error(NameError)
26
+ end
27
+ end
28
+
29
+ it 'should generate and respect Ruby style package options' do
30
+ with_protos(%w[grpc/testing/package_options_ruby_style.proto grpc/testing/package_options_import.proto]) do
31
+ expect { RPC::Test::New::Package::Options::AnotherTestService::Service }.to raise_error(NameError)
32
+ expect(require('grpc/testing/package_options_ruby_style_services_pb')).to be_truthy
33
+ expect { RPC::Test::New::Package::Options::AnotherTestService::Service }.to_not raise_error
34
+ expect { Grpc::Testing::AnotherTestService::Service }.to raise_error(NameError)
35
+
36
+ services = RPC::Test::New::Package::Options::AnotherTestService::Service.rpc_descs
37
+ expect(services[:GetTest].input).to eq(RPC::Test::New::Package::Options::AnotherTestRequest)
38
+ expect(services[:GetTest].output).to eq(RPC::Test::New::Package::Options::AnotherTestResponse)
39
+ expect(services[:OtherTest].input).to eq(A::Other::Thing)
40
+ expect(services[:OtherTest].output).to eq(A::Other::Thing)
41
+ expect(services[:FooTest].input).to eq(RPC::Test::New::Package::Options::Foo)
42
+ expect(services[:FooTest].output).to eq(RPC::Test::New::Package::Options::Foo)
43
+ end
44
+ end
45
+ end
46
+
47
+ def with_protos(file_paths)
48
+ fail 'CONFIG env variable unexpectedly unset' unless ENV['CONFIG']
49
+ bins_sub_dir = ENV['CONFIG']
50
+
51
+ pb_dir = File.dirname(__FILE__)
52
+ bins_dir = File.join('..', '..', '..', '..', '..', 'bins', bins_sub_dir)
53
+
54
+ plugin = File.join(bins_dir, 'grpc_ruby_plugin')
55
+ protoc = File.join(bins_dir, 'protobuf', 'protoc')
56
+
57
+ # Generate the service from the proto
58
+ Dir.mktmpdir(nil, File.dirname(__FILE__)) do |tmp_dir|
59
+ gen_file = system(protoc,
60
+ '-I.',
61
+ *file_paths,
62
+ "--grpc_out=#{tmp_dir}", # generate the service
63
+ "--ruby_out=#{tmp_dir}", # generate the definitions
64
+ "--plugin=protoc-gen-grpc=#{plugin}",
65
+ chdir: pb_dir,
66
+ out: File::NULL)
67
+
68
+ expect(gen_file).to be_truthy
69
+ begin
70
+ $LOAD_PATH.push(tmp_dir)
71
+ yield
72
+ ensure
73
+ $LOAD_PATH.delete(tmp_dir)
50
74
  end
51
75
  end
52
76
  end
@@ -0,0 +1,604 @@
1
+
2
+ #include <string.h>
3
+ #include "upb/upb.h"
4
+ #include "upb/decode.h"
5
+
6
+ #include "upb/port_def.inc"
7
+
8
+ /* Maps descriptor type -> upb field type. */
9
+ const uint8_t upb_desctype_to_fieldtype[] = {
10
+ UPB_WIRE_TYPE_END_GROUP, /* ENDGROUP */
11
+ UPB_TYPE_DOUBLE, /* DOUBLE */
12
+ UPB_TYPE_FLOAT, /* FLOAT */
13
+ UPB_TYPE_INT64, /* INT64 */
14
+ UPB_TYPE_UINT64, /* UINT64 */
15
+ UPB_TYPE_INT32, /* INT32 */
16
+ UPB_TYPE_UINT64, /* FIXED64 */
17
+ UPB_TYPE_UINT32, /* FIXED32 */
18
+ UPB_TYPE_BOOL, /* BOOL */
19
+ UPB_TYPE_STRING, /* STRING */
20
+ UPB_TYPE_MESSAGE, /* GROUP */
21
+ UPB_TYPE_MESSAGE, /* MESSAGE */
22
+ UPB_TYPE_BYTES, /* BYTES */
23
+ UPB_TYPE_UINT32, /* UINT32 */
24
+ UPB_TYPE_ENUM, /* ENUM */
25
+ UPB_TYPE_INT32, /* SFIXED32 */
26
+ UPB_TYPE_INT64, /* SFIXED64 */
27
+ UPB_TYPE_INT32, /* SINT32 */
28
+ UPB_TYPE_INT64, /* SINT64 */
29
+ };
30
+
31
+ /* Data pertaining to the parse. */
32
+ typedef struct {
33
+ const char *ptr; /* Current parsing position. */
34
+ const char *field_start; /* Start of this field. */
35
+ const char *limit; /* End of delimited region or end of buffer. */
36
+ upb_arena *arena;
37
+ int depth;
38
+ uint32_t end_group; /* Set to field number of END_GROUP tag, if any. */
39
+ } upb_decstate;
40
+
41
+ /* Data passed by value to each parsing function. */
42
+ typedef struct {
43
+ char *msg;
44
+ const upb_msglayout *layout;
45
+ upb_decstate *state;
46
+ } upb_decframe;
47
+
48
+ #define CHK(x) if (!(x)) { return 0; }
49
+
50
+ static bool upb_skip_unknowngroup(upb_decstate *d, int field_number);
51
+ static bool upb_decode_message(upb_decstate *d, char *msg,
52
+ const upb_msglayout *l);
53
+
54
+ static bool upb_decode_varint(const char **ptr, const char *limit,
55
+ uint64_t *val) {
56
+ uint8_t byte;
57
+ int bitpos = 0;
58
+ const char *p = *ptr;
59
+ *val = 0;
60
+
61
+ do {
62
+ CHK(bitpos < 70 && p < limit);
63
+ byte = *p;
64
+ *val |= (uint64_t)(byte & 0x7F) << bitpos;
65
+ p++;
66
+ bitpos += 7;
67
+ } while (byte & 0x80);
68
+
69
+ *ptr = p;
70
+ return true;
71
+ }
72
+
73
+ static bool upb_decode_varint32(const char **ptr, const char *limit,
74
+ uint32_t *val) {
75
+ uint64_t u64;
76
+ CHK(upb_decode_varint(ptr, limit, &u64) && u64 <= UINT32_MAX);
77
+ *val = (uint32_t)u64;
78
+ return true;
79
+ }
80
+
81
+ static bool upb_decode_64bit(const char **ptr, const char *limit,
82
+ uint64_t *val) {
83
+ CHK(limit - *ptr >= 8);
84
+ memcpy(val, *ptr, 8);
85
+ *ptr += 8;
86
+ return true;
87
+ }
88
+
89
+ static bool upb_decode_32bit(const char **ptr, const char *limit,
90
+ uint32_t *val) {
91
+ CHK(limit - *ptr >= 4);
92
+ memcpy(val, *ptr, 4);
93
+ *ptr += 4;
94
+ return true;
95
+ }
96
+
97
+ static int32_t upb_zzdecode_32(uint32_t n) {
98
+ return (n >> 1) ^ -(int32_t)(n & 1);
99
+ }
100
+
101
+ static int64_t upb_zzdecode_64(uint64_t n) {
102
+ return (n >> 1) ^ -(int64_t)(n & 1);
103
+ }
104
+
105
+ static bool upb_decode_string(const char **ptr, const char *limit,
106
+ int *outlen) {
107
+ uint32_t len;
108
+
109
+ CHK(upb_decode_varint32(ptr, limit, &len) &&
110
+ len < INT32_MAX &&
111
+ limit - *ptr >= (int32_t)len);
112
+
113
+ *outlen = len;
114
+ return true;
115
+ }
116
+
117
+ static void upb_set32(void *msg, size_t ofs, uint32_t val) {
118
+ memcpy((char*)msg + ofs, &val, sizeof(val));
119
+ }
120
+
121
+ static bool upb_append_unknown(upb_decstate *d, upb_decframe *frame) {
122
+ upb_msg_addunknown(frame->msg, d->field_start, d->ptr - d->field_start,
123
+ d->arena);
124
+ return true;
125
+ }
126
+
127
+
128
+ static bool upb_skip_unknownfielddata(upb_decstate *d, uint32_t tag,
129
+ uint32_t group_fieldnum) {
130
+ switch (tag & 7) {
131
+ case UPB_WIRE_TYPE_VARINT: {
132
+ uint64_t val;
133
+ return upb_decode_varint(&d->ptr, d->limit, &val);
134
+ }
135
+ case UPB_WIRE_TYPE_32BIT: {
136
+ uint32_t val;
137
+ return upb_decode_32bit(&d->ptr, d->limit, &val);
138
+ }
139
+ case UPB_WIRE_TYPE_64BIT: {
140
+ uint64_t val;
141
+ return upb_decode_64bit(&d->ptr, d->limit, &val);
142
+ }
143
+ case UPB_WIRE_TYPE_DELIMITED: {
144
+ int len;
145
+ CHK(upb_decode_string(&d->ptr, d->limit, &len));
146
+ d->ptr += len;
147
+ return true;
148
+ }
149
+ case UPB_WIRE_TYPE_START_GROUP:
150
+ return upb_skip_unknowngroup(d, tag >> 3);
151
+ case UPB_WIRE_TYPE_END_GROUP:
152
+ return (tag >> 3) == group_fieldnum;
153
+ }
154
+ return false;
155
+ }
156
+
157
+ static bool upb_skip_unknowngroup(upb_decstate *d, int field_number) {
158
+ while (d->ptr < d->limit && d->end_group == 0) {
159
+ uint32_t tag = 0;
160
+ CHK(upb_decode_varint32(&d->ptr, d->limit, &tag));
161
+ CHK(upb_skip_unknownfielddata(d, tag, field_number));
162
+ }
163
+
164
+ CHK(d->end_group == field_number);
165
+ d->end_group = 0;
166
+ return true;
167
+ }
168
+
169
+ static bool upb_array_grow(upb_array *arr, size_t elements, size_t elem_size,
170
+ upb_arena *arena) {
171
+ size_t needed = arr->len + elements;
172
+ size_t new_size = UPB_MAX(arr->size, 8);
173
+ size_t new_bytes;
174
+ size_t old_bytes;
175
+ void *new_data;
176
+ upb_alloc *alloc = upb_arena_alloc(arena);
177
+
178
+ while (new_size < needed) {
179
+ new_size *= 2;
180
+ }
181
+
182
+ old_bytes = arr->len * elem_size;
183
+ new_bytes = new_size * elem_size;
184
+ new_data = upb_realloc(alloc, arr->data, old_bytes, new_bytes);
185
+ CHK(new_data);
186
+
187
+ arr->data = new_data;
188
+ arr->size = new_size;
189
+ return true;
190
+ }
191
+
192
+ static void *upb_array_reserve(upb_array *arr, size_t elements,
193
+ size_t elem_size, upb_arena *arena) {
194
+ if (arr->size - arr->len < elements) {
195
+ CHK(upb_array_grow(arr, elements, elem_size, arena));
196
+ }
197
+ return (char*)arr->data + (arr->len * elem_size);
198
+ }
199
+
200
+ bool upb_array_add(upb_array *arr, size_t elements, size_t elem_size,
201
+ const void *data, upb_arena *arena) {
202
+ void *dest = upb_array_reserve(arr, elements, elem_size, arena);
203
+
204
+ CHK(dest);
205
+ arr->len += elements;
206
+ memcpy(dest, data, elements * elem_size);
207
+
208
+ return true;
209
+ }
210
+
211
+ static upb_array *upb_getarr(upb_decframe *frame,
212
+ const upb_msglayout_field *field) {
213
+ UPB_ASSERT(field->label == UPB_LABEL_REPEATED);
214
+ return *(upb_array**)&frame->msg[field->offset];
215
+ }
216
+
217
+ static upb_array *upb_getorcreatearr(upb_decframe *frame,
218
+ const upb_msglayout_field *field) {
219
+ upb_array *arr = upb_getarr(frame, field);
220
+
221
+ if (!arr) {
222
+ arr = upb_array_new(frame->state->arena);
223
+ CHK(arr);
224
+ *(upb_array**)&frame->msg[field->offset] = arr;
225
+ }
226
+
227
+ return arr;
228
+ }
229
+
230
+ static upb_msg *upb_getorcreatemsg(upb_decframe *frame,
231
+ const upb_msglayout_field *field,
232
+ const upb_msglayout **subm) {
233
+ upb_msg **submsg = (void*)(frame->msg + field->offset);
234
+ *subm = frame->layout->submsgs[field->submsg_index];
235
+
236
+ UPB_ASSERT(field->label != UPB_LABEL_REPEATED);
237
+
238
+ if (!*submsg) {
239
+ *submsg = upb_msg_new(*subm, frame->state->arena);
240
+ CHK(*submsg);
241
+ }
242
+
243
+ return *submsg;
244
+ }
245
+
246
+ static upb_msg *upb_addmsg(upb_decframe *frame,
247
+ const upb_msglayout_field *field,
248
+ const upb_msglayout **subm) {
249
+ upb_msg *submsg;
250
+ upb_array *arr = upb_getorcreatearr(frame, field);
251
+
252
+ *subm = frame->layout->submsgs[field->submsg_index];
253
+ submsg = upb_msg_new(*subm, frame->state->arena);
254
+ CHK(submsg);
255
+ upb_array_add(arr, 1, sizeof(submsg), &submsg, frame->state->arena);
256
+
257
+ return submsg;
258
+ }
259
+
260
+ static void upb_sethasbit(upb_decframe *frame,
261
+ const upb_msglayout_field *field) {
262
+ int32_t hasbit = field->presence;
263
+ UPB_ASSERT(field->presence > 0);
264
+ frame->msg[hasbit / 8] |= (1 << (hasbit % 8));
265
+ }
266
+
267
+ static void upb_setoneofcase(upb_decframe *frame,
268
+ const upb_msglayout_field *field) {
269
+ UPB_ASSERT(field->presence < 0);
270
+ upb_set32(frame->msg, ~field->presence, field->number);
271
+ }
272
+
273
+ static bool upb_decode_addval(upb_decframe *frame,
274
+ const upb_msglayout_field *field, void *val,
275
+ size_t size) {
276
+ char *field_mem = frame->msg + field->offset;
277
+ upb_array *arr;
278
+
279
+ if (field->label == UPB_LABEL_REPEATED) {
280
+ arr = upb_getorcreatearr(frame, field);
281
+ CHK(arr);
282
+ field_mem = upb_array_reserve(arr, 1, size, frame->state->arena);
283
+ CHK(field_mem);
284
+ }
285
+
286
+ memcpy(field_mem, val, size);
287
+ return true;
288
+ }
289
+
290
+ static void upb_decode_setpresent(upb_decframe *frame,
291
+ const upb_msglayout_field *field) {
292
+ if (field->label == UPB_LABEL_REPEATED) {
293
+ upb_array *arr = upb_getarr(frame, field);
294
+ UPB_ASSERT(arr->len < arr->size);
295
+ arr->len++;
296
+ } else if (field->presence < 0) {
297
+ upb_setoneofcase(frame, field);
298
+ } else if (field->presence > 0) {
299
+ upb_sethasbit(frame, field);
300
+ }
301
+ }
302
+
303
+ static bool upb_decode_msgfield(upb_decstate *d, upb_msg *msg,
304
+ const upb_msglayout *layout, int limit) {
305
+ const char* saved_limit = d->limit;
306
+ d->limit = d->ptr + limit;
307
+ CHK(--d->depth >= 0);
308
+ upb_decode_message(d, msg, layout);
309
+ d->depth++;
310
+ d->limit = saved_limit;
311
+ CHK(d->end_group == 0);
312
+ return true;
313
+ }
314
+
315
+ static bool upb_decode_groupfield(upb_decstate *d, upb_msg *msg,
316
+ const upb_msglayout *layout,
317
+ int field_number) {
318
+ CHK(--d->depth >= 0);
319
+ upb_decode_message(d, msg, layout);
320
+ d->depth++;
321
+ CHK(d->end_group == field_number);
322
+ d->end_group = 0;
323
+ return true;
324
+ }
325
+
326
+ static bool upb_decode_varintfield(upb_decstate *d, upb_decframe *frame,
327
+ const upb_msglayout_field *field) {
328
+ uint64_t val;
329
+ CHK(upb_decode_varint(&d->ptr, d->limit, &val));
330
+
331
+ switch (field->descriptortype) {
332
+ case UPB_DESCRIPTOR_TYPE_INT64:
333
+ case UPB_DESCRIPTOR_TYPE_UINT64:
334
+ CHK(upb_decode_addval(frame, field, &val, sizeof(val)));
335
+ break;
336
+ case UPB_DESCRIPTOR_TYPE_INT32:
337
+ case UPB_DESCRIPTOR_TYPE_UINT32:
338
+ case UPB_DESCRIPTOR_TYPE_ENUM: {
339
+ uint32_t val32 = (uint32_t)val;
340
+ CHK(upb_decode_addval(frame, field, &val32, sizeof(val32)));
341
+ break;
342
+ }
343
+ case UPB_DESCRIPTOR_TYPE_BOOL: {
344
+ bool valbool = val != 0;
345
+ CHK(upb_decode_addval(frame, field, &valbool, sizeof(valbool)));
346
+ break;
347
+ }
348
+ case UPB_DESCRIPTOR_TYPE_SINT32: {
349
+ int32_t decoded = upb_zzdecode_32((uint32_t)val);
350
+ CHK(upb_decode_addval(frame, field, &decoded, sizeof(decoded)));
351
+ break;
352
+ }
353
+ case UPB_DESCRIPTOR_TYPE_SINT64: {
354
+ int64_t decoded = upb_zzdecode_64(val);
355
+ CHK(upb_decode_addval(frame, field, &decoded, sizeof(decoded)));
356
+ break;
357
+ }
358
+ default:
359
+ return upb_append_unknown(d, frame);
360
+ }
361
+
362
+ upb_decode_setpresent(frame, field);
363
+ return true;
364
+ }
365
+
366
+ static bool upb_decode_64bitfield(upb_decstate *d, upb_decframe *frame,
367
+ const upb_msglayout_field *field) {
368
+ uint64_t val;
369
+ CHK(upb_decode_64bit(&d->ptr, d->limit, &val));
370
+
371
+ switch (field->descriptortype) {
372
+ case UPB_DESCRIPTOR_TYPE_DOUBLE:
373
+ case UPB_DESCRIPTOR_TYPE_FIXED64:
374
+ case UPB_DESCRIPTOR_TYPE_SFIXED64:
375
+ CHK(upb_decode_addval(frame, field, &val, sizeof(val)));
376
+ break;
377
+ default:
378
+ return upb_append_unknown(d, frame);
379
+ }
380
+
381
+ upb_decode_setpresent(frame, field);
382
+ return true;
383
+ }
384
+
385
+ static bool upb_decode_32bitfield(upb_decstate *d, upb_decframe *frame,
386
+ const upb_msglayout_field *field) {
387
+ uint32_t val;
388
+ CHK(upb_decode_32bit(&d->ptr, d->limit, &val));
389
+
390
+ switch (field->descriptortype) {
391
+ case UPB_DESCRIPTOR_TYPE_FLOAT:
392
+ case UPB_DESCRIPTOR_TYPE_FIXED32:
393
+ case UPB_DESCRIPTOR_TYPE_SFIXED32:
394
+ CHK(upb_decode_addval(frame, field, &val, sizeof(val)));
395
+ break;
396
+ default:
397
+ return upb_append_unknown(d, frame);
398
+ }
399
+
400
+ upb_decode_setpresent(frame, field);
401
+ return true;
402
+ }
403
+
404
+ static bool upb_decode_fixedpacked(upb_decstate *d, upb_array *arr,
405
+ uint32_t len, int elem_size) {
406
+ size_t elements = len / elem_size;
407
+
408
+ CHK((size_t)(elements * elem_size) == len);
409
+ CHK(upb_array_add(arr, elements, elem_size, d->ptr, d->arena));
410
+ d->ptr += len;
411
+
412
+ return true;
413
+ }
414
+
415
+ static upb_strview upb_decode_strfield(upb_decstate *d, uint32_t len) {
416
+ upb_strview ret;
417
+ ret.data = d->ptr;
418
+ ret.size = len;
419
+ d->ptr += len;
420
+ return ret;
421
+ }
422
+
423
+ static bool upb_decode_toarray(upb_decstate *d, upb_decframe *frame,
424
+ const upb_msglayout_field *field, int len) {
425
+ upb_array *arr = upb_getorcreatearr(frame, field);
426
+ CHK(arr);
427
+
428
+ #define VARINT_CASE(ctype, decode) \
429
+ VARINT_CASE_EX(ctype, decode, decode)
430
+
431
+ #define VARINT_CASE_EX(ctype, decode, dtype) \
432
+ { \
433
+ const char *ptr = d->ptr; \
434
+ const char *limit = ptr + len; \
435
+ while (ptr < limit) { \
436
+ uint64_t val; \
437
+ ctype decoded; \
438
+ CHK(upb_decode_varint(&ptr, limit, &val)); \
439
+ decoded = (decode)((dtype)val); \
440
+ CHK(upb_array_add(arr, 1, sizeof(decoded), &decoded, d->arena)); \
441
+ } \
442
+ d->ptr = ptr; \
443
+ return true; \
444
+ }
445
+
446
+ switch (field->descriptortype) {
447
+ case UPB_DESCRIPTOR_TYPE_STRING:
448
+ case UPB_DESCRIPTOR_TYPE_BYTES: {
449
+ upb_strview str = upb_decode_strfield(d, len);
450
+ return upb_array_add(arr, 1, sizeof(str), &str, d->arena);
451
+ }
452
+ case UPB_DESCRIPTOR_TYPE_FLOAT:
453
+ case UPB_DESCRIPTOR_TYPE_FIXED32:
454
+ case UPB_DESCRIPTOR_TYPE_SFIXED32:
455
+ return upb_decode_fixedpacked(d, arr, len, sizeof(int32_t));
456
+ case UPB_DESCRIPTOR_TYPE_DOUBLE:
457
+ case UPB_DESCRIPTOR_TYPE_FIXED64:
458
+ case UPB_DESCRIPTOR_TYPE_SFIXED64:
459
+ return upb_decode_fixedpacked(d, arr, len, sizeof(int64_t));
460
+ case UPB_DESCRIPTOR_TYPE_INT32:
461
+ case UPB_DESCRIPTOR_TYPE_UINT32:
462
+ case UPB_DESCRIPTOR_TYPE_ENUM:
463
+ VARINT_CASE(uint32_t, uint32_t);
464
+ case UPB_DESCRIPTOR_TYPE_INT64:
465
+ case UPB_DESCRIPTOR_TYPE_UINT64:
466
+ VARINT_CASE(uint64_t, uint64_t);
467
+ case UPB_DESCRIPTOR_TYPE_BOOL:
468
+ VARINT_CASE(bool, bool);
469
+ case UPB_DESCRIPTOR_TYPE_SINT32:
470
+ VARINT_CASE_EX(int32_t, upb_zzdecode_32, uint32_t);
471
+ case UPB_DESCRIPTOR_TYPE_SINT64:
472
+ VARINT_CASE_EX(int64_t, upb_zzdecode_64, uint64_t);
473
+ case UPB_DESCRIPTOR_TYPE_MESSAGE: {
474
+ const upb_msglayout *subm;
475
+ upb_msg *submsg = upb_addmsg(frame, field, &subm);
476
+ CHK(submsg);
477
+ return upb_decode_msgfield(d, submsg, subm, len);
478
+ }
479
+ case UPB_DESCRIPTOR_TYPE_GROUP:
480
+ return upb_append_unknown(d, frame);
481
+ }
482
+ #undef VARINT_CASE
483
+ UPB_UNREACHABLE();
484
+ }
485
+
486
+ static bool upb_decode_delimitedfield(upb_decstate *d, upb_decframe *frame,
487
+ const upb_msglayout_field *field) {
488
+ int len;
489
+
490
+ CHK(upb_decode_string(&d->ptr, d->limit, &len));
491
+
492
+ if (field->label == UPB_LABEL_REPEATED) {
493
+ return upb_decode_toarray(d, frame, field, len);
494
+ } else {
495
+ switch (field->descriptortype) {
496
+ case UPB_DESCRIPTOR_TYPE_STRING:
497
+ case UPB_DESCRIPTOR_TYPE_BYTES: {
498
+ upb_strview str = upb_decode_strfield(d, len);
499
+ CHK(upb_decode_addval(frame, field, &str, sizeof(str)));
500
+ break;
501
+ }
502
+ case UPB_DESCRIPTOR_TYPE_MESSAGE: {
503
+ const upb_msglayout *subm;
504
+ upb_msg *submsg = upb_getorcreatemsg(frame, field, &subm);
505
+ CHK(submsg);
506
+ CHK(upb_decode_msgfield(d, submsg, subm, len));
507
+ break;
508
+ }
509
+ default:
510
+ /* TODO(haberman): should we accept the last element of a packed? */
511
+ d->ptr += len;
512
+ return upb_append_unknown(d, frame);
513
+ }
514
+ upb_decode_setpresent(frame, field);
515
+ return true;
516
+ }
517
+ }
518
+
519
+ static const upb_msglayout_field *upb_find_field(const upb_msglayout *l,
520
+ uint32_t field_number) {
521
+ /* Lots of optimization opportunities here. */
522
+ int i;
523
+ for (i = 0; i < l->field_count; i++) {
524
+ if (l->fields[i].number == field_number) {
525
+ return &l->fields[i];
526
+ }
527
+ }
528
+
529
+ return NULL; /* Unknown field. */
530
+ }
531
+
532
+ static bool upb_decode_field(upb_decstate *d, upb_decframe *frame) {
533
+ uint32_t tag;
534
+ const upb_msglayout_field *field;
535
+ int field_number;
536
+
537
+ d->field_start = d->ptr;
538
+ CHK(upb_decode_varint32(&d->ptr, d->limit, &tag));
539
+ field_number = tag >> 3;
540
+ field = upb_find_field(frame->layout, field_number);
541
+
542
+ if (field) {
543
+ switch (tag & 7) {
544
+ case UPB_WIRE_TYPE_VARINT:
545
+ return upb_decode_varintfield(d, frame, field);
546
+ case UPB_WIRE_TYPE_32BIT:
547
+ return upb_decode_32bitfield(d, frame, field);
548
+ case UPB_WIRE_TYPE_64BIT:
549
+ return upb_decode_64bitfield(d, frame, field);
550
+ case UPB_WIRE_TYPE_DELIMITED:
551
+ return upb_decode_delimitedfield(d, frame, field);
552
+ case UPB_WIRE_TYPE_START_GROUP: {
553
+ const upb_msglayout *layout;
554
+ upb_msg *group;
555
+
556
+ if (field->label == UPB_LABEL_REPEATED) {
557
+ group = upb_addmsg(frame, field, &layout);
558
+ } else {
559
+ group = upb_getorcreatemsg(frame, field, &layout);
560
+ }
561
+
562
+ return upb_decode_groupfield(d, group, layout, field_number);
563
+ }
564
+ case UPB_WIRE_TYPE_END_GROUP:
565
+ d->end_group = field_number;
566
+ return true;
567
+ default:
568
+ CHK(false);
569
+ }
570
+ } else {
571
+ CHK(field_number != 0);
572
+ CHK(upb_skip_unknownfielddata(d, tag, -1));
573
+ CHK(upb_append_unknown(d, frame));
574
+ return true;
575
+ }
576
+ }
577
+
578
+ static bool upb_decode_message(upb_decstate *d, char *msg, const upb_msglayout *l) {
579
+ upb_decframe frame;
580
+ frame.msg = msg;
581
+ frame.layout = l;
582
+ frame.state = d;
583
+
584
+ while (d->ptr < d->limit) {
585
+ CHK(upb_decode_field(d, &frame));
586
+ }
587
+
588
+ return true;
589
+ }
590
+
591
+ bool upb_decode(const char *buf, size_t size, void *msg, const upb_msglayout *l,
592
+ upb_arena *arena) {
593
+ upb_decstate state;
594
+ state.ptr = buf;
595
+ state.limit = buf + size;
596
+ state.arena = arena;
597
+ state.depth = 64;
598
+ state.end_group = 0;
599
+
600
+ CHK(upb_decode_message(&state, msg, l));
601
+ return state.end_group == 0;
602
+ }
603
+
604
+ #undef CHK