grpc-rest 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 628c8c0d79cbe90cfcb02c74d1f4e785ed25d7d56267bd1da54d4fe911ba0daa
4
- data.tar.gz: a14292a527e3b1ae8c3455b3146c5aa9d3760d4cb11c5a1f206bba22e7690a67
3
+ metadata.gz: 624b3de8eba78302edff97ecf421a9d660fe781c72452b7f642fa5772e3a6234
4
+ data.tar.gz: 39143f78f27e6c0905cfb2092b23c4427c70c5810d78243935baf5c38bee9443
5
5
  SHA512:
6
- metadata.gz: 64227c2f740fd93e1f9c1bcb3e4779fac6de80c47c5f85848b1ab785a5cde39347a03eee6184ab906937eac465ef40e601adcf0c625aeae97128440d9f8f6c55
7
- data.tar.gz: 7c1a0b6bdc6f7d56380646b388fc8eca4755ad750d6a4054d1151d0052e2b661a2dafa4299b72cf883a7dc15fc71b0892fa166c64513b2c28d7f806010110cf6
6
+ metadata.gz: 1d3897f28befb1aadf27163d67771605116de984a80d86d9ae3b41d131729bfa75c0bd04c84f63ef622cf77637fe1958078d62e59afb1fc8cb95a073137e8733
7
+ data.tar.gz: 415c00d2059a1cbd9923d5689333f6ae8c07ac9f2c595e0abaed8183106aa6f30e2da751fdeefb5b856969a62fac5f6ae63e0e36cd146c409768f23df7e02a34
data/CHANGELOG CHANGED
@@ -7,6 +7,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## UNRELEASED
9
9
 
10
+ # 0.4.0 - 2025-07-08
11
+
12
+ - Feature: Forward request headers to the gRPC call as metadata.
13
+ - ***BREAKING CHANGE***: Update interceptors to pass a Gruf::Controller::Request instead of the raw gRPC request object. This allows e.g. checking metadata inside the interceptor.
14
+
15
+ # 0.3.1 - 2025-07-02
16
+ - Fix: Include full error backtrace in logs
17
+
10
18
  # 0.3.0 - 2025-06-11
11
19
 
12
20
  - Feature: Add `strict_mode` configuration for rejecting invalid JSON fields.
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- grpc-rest (0.2.1)
4
+ grpc-rest (0.3.1)
5
5
  google-protobuf (>= 4.30.2)
6
6
  grpc
7
7
  rails (>= 6.0)
@@ -88,11 +88,17 @@ GEM
88
88
  google-protobuf (4.30.2-arm64-darwin)
89
89
  bigdecimal
90
90
  rake (>= 13)
91
+ google-protobuf (4.30.2-x86_64-linux)
92
+ bigdecimal
93
+ rake (>= 13)
91
94
  googleapis-common-protos-types (1.19.0)
92
95
  google-protobuf (>= 3.18, < 5.a)
93
96
  grpc (1.71.0-arm64-darwin)
94
97
  google-protobuf (>= 3.25, < 5.0)
95
98
  googleapis-common-protos-types (~> 1.0)
99
+ grpc (1.71.0-x86_64-linux)
100
+ google-protobuf (>= 3.25, < 5.0)
101
+ googleapis-common-protos-types (~> 1.0)
96
102
  grpc-tools (1.64.0)
97
103
  gruf (2.20.0)
98
104
  activesupport (> 4)
@@ -21,7 +21,7 @@ class <%= service.name.demodulize %>Controller < ActionController::Base
21
21
  except(*%w(controller action <%= service.name.underscore %>))
22
22
  grpc_request = GrpcRest.init_request(<%= method.request_type %>, parameters)
23
23
  GrpcRest.assign_params(grpc_request, METHOD_PARAM_MAP["<%= method.name.underscore %>"], "<%= method.option_body %>", request.parameters)
24
- render json: GrpcRest.send_request("<%= service.namespace %>::<%= service.name.classify %>", "<%= method.name.underscore %>", grpc_request, <%= method.rest_options.inspect %>)
24
+ render json: GrpcRest.send_request("<%= service.namespace %>::<%= service.name.classify %>", "<%= method.name.underscore %>", grpc_request, <%= method.rest_options.inspect %>, headers: request.headers)
25
25
  end
26
26
  <% end %>
27
27
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module GrpcRest
4
- VERSION = '0.3.0'
4
+ VERSION = '0.4.0'
5
5
  end
data/lib/grpc_rest.rb CHANGED
@@ -5,6 +5,9 @@ require 'grpc'
5
5
  require 'grpc/core/status_codes'
6
6
 
7
7
  module GrpcRest
8
+
9
+ GrpcRestCall = Struct.new(:metadata)
10
+
8
11
  class << self
9
12
  attr_accessor :strict_mode
10
13
 
@@ -180,7 +183,11 @@ module GrpcRest
180
183
  end
181
184
 
182
185
  def error_msg(error)
183
- Rails.logger.error("#{error.message}, backtrace: #{error.backtrace.join("\n")}")
186
+ error_info = "#{error.message}, backtrace: #{error.backtrace.join("\n")}"
187
+ if error.respond_to?(:cause) && error.cause
188
+ error_info += "\n\nCaused by: " + error.cause.backtrace.join("\n")
189
+ end
190
+ Rails.logger.error(error_info)
184
191
  if error.respond_to?(:code)
185
192
  {
186
193
  code: error.code,
@@ -204,21 +211,29 @@ module GrpcRest
204
211
  end
205
212
  end
206
213
 
207
- def send_gruf_request(klass, service_obj, method, request)
214
+ def send_gruf_request(klass, service_obj, method, request, headers: {})
208
215
  ref = service_obj.rpc_descs[method.classify.to_sym]
216
+ call = GrpcRestCall.new(headers)
209
217
  handler = klass.new(
210
218
  method_key: method.to_sym,
211
219
  service: service_obj,
212
220
  rpc_desc: ref,
213
- active_call: nil,
221
+ active_call: GrpcRestCall.new(headers),
222
+ message: request
223
+ )
224
+ controller_request = Gruf::Controllers::Request.new(
225
+ method_key: method.to_sym,
226
+ service: service_obj,
227
+ rpc_desc: ref,
228
+ active_call: call,
214
229
  message: request
215
230
  )
216
- Gruf::Interceptors::Context.new(gruf_interceptors(request)).intercept! do
231
+ Gruf::Interceptors::Context.new(gruf_interceptors(controller_request)).intercept! do
217
232
  handler.send(method.to_sym)
218
233
  end
219
234
  end
220
235
 
221
- # @param request [Google::Protobuf::AbstractMessage]
236
+ # @param request [Gruf::Controllers::Request]
222
237
  # @return [Array<Gruf::Interceptors::Base>]
223
238
  def gruf_interceptors(request)
224
239
  error = Gruf::Error.new
@@ -232,19 +247,19 @@ module GrpcRest
232
247
  klass.new.public_send(method, request)
233
248
  end
234
249
 
235
- def get_response(service, method, request)
250
+ def get_response(service, method, request, headers: {})
236
251
  if defined?(Gruf)
237
252
  service_obj = service.constantize::Service
238
253
  klass = ::Gruf::Controllers::Base.subclasses.find do |k|
239
254
  k.bound_service == service_obj
240
255
  end
241
- return send_gruf_request(klass, service_obj, method, request) if klass
256
+ return send_gruf_request(klass, service_obj, method, request, headers: headers) if klass
242
257
  end
243
258
  send_grpc_request(service, method, request)
244
259
  end
245
260
 
246
- def send_request(service, method, request, options = {})
247
- response = get_response(service, method, request)
261
+ def send_request(service, method, request, options = {}, headers: {})
262
+ response = get_response(service, method, request, headers: headers)
248
263
  if options[:emit_defaults]
249
264
  response.to_json(emit_defaults: true)
250
265
  else
@@ -29,7 +29,7 @@ class MyServiceController < ActionController::Base
29
29
  except(*%w(controller action my_service))
30
30
  grpc_request = GrpcRest.init_request(Testdata::TestRequest, parameters)
31
31
  GrpcRest.assign_params(grpc_request, METHOD_PARAM_MAP["test"], "", request.parameters)
32
- render json: GrpcRest.send_request("Testdata::MyService", "test", grpc_request, {:emit_defaults=>true})
32
+ render json: GrpcRest.send_request("Testdata::MyService", "test", grpc_request, {:emit_defaults=>true}, headers: request.headers)
33
33
  end
34
34
 
35
35
  def test2
@@ -37,7 +37,7 @@ class MyServiceController < ActionController::Base
37
37
  except(*%w(controller action my_service))
38
38
  grpc_request = GrpcRest.init_request(Testdata::TestRequest, parameters)
39
39
  GrpcRest.assign_params(grpc_request, METHOD_PARAM_MAP["test2"], "second_record", request.parameters)
40
- render json: GrpcRest.send_request("Testdata::MyService", "test2", grpc_request, {})
40
+ render json: GrpcRest.send_request("Testdata::MyService", "test2", grpc_request, {}, headers: request.headers)
41
41
  end
42
42
 
43
43
  def test3
@@ -45,7 +45,7 @@ class MyServiceController < ActionController::Base
45
45
  except(*%w(controller action my_service))
46
46
  grpc_request = GrpcRest.init_request(Testdata::TestRequest, parameters)
47
47
  GrpcRest.assign_params(grpc_request, METHOD_PARAM_MAP["test3"], "", request.parameters)
48
- render json: GrpcRest.send_request("Testdata::MyService", "test3", grpc_request, {})
48
+ render json: GrpcRest.send_request("Testdata::MyService", "test3", grpc_request, {}, headers: request.headers)
49
49
  end
50
50
 
51
51
  def test4
@@ -53,7 +53,7 @@ class MyServiceController < ActionController::Base
53
53
  except(*%w(controller action my_service))
54
54
  grpc_request = GrpcRest.init_request(Testdata::TestRequest, parameters)
55
55
  GrpcRest.assign_params(grpc_request, METHOD_PARAM_MAP["test4"], "*", request.parameters)
56
- render json: GrpcRest.send_request("Testdata::MyService", "test4", grpc_request, {})
56
+ render json: GrpcRest.send_request("Testdata::MyService", "test4", grpc_request, {}, headers: request.headers)
57
57
  end
58
58
 
59
59
  end
@@ -28,7 +28,7 @@ class MyServiceController < ActionController::Base
28
28
  except(*%w(controller action my_service))
29
29
  grpc_request = GrpcRest.init_request(Testdata::TestRequest, parameters)
30
30
  GrpcRest.assign_params(grpc_request, METHOD_PARAM_MAP["test"], "", request.parameters)
31
- render json: GrpcRest.send_request("Testdata::MyService", "test", grpc_request, {:emit_defaults=>true})
31
+ render json: GrpcRest.send_request("Testdata::MyService", "test", grpc_request, {:emit_defaults=>true}, headers: request.headers)
32
32
  end
33
33
 
34
34
  def test2
@@ -36,7 +36,7 @@ class MyServiceController < ActionController::Base
36
36
  except(*%w(controller action my_service))
37
37
  grpc_request = GrpcRest.init_request(Testdata::TestRequest, parameters)
38
38
  GrpcRest.assign_params(grpc_request, METHOD_PARAM_MAP["test2"], "second_record", request.parameters)
39
- render json: GrpcRest.send_request("Testdata::MyService", "test2", grpc_request, {})
39
+ render json: GrpcRest.send_request("Testdata::MyService", "test2", grpc_request, {}, headers: request.headers)
40
40
  end
41
41
 
42
42
  def test3
@@ -44,7 +44,7 @@ class MyServiceController < ActionController::Base
44
44
  except(*%w(controller action my_service))
45
45
  grpc_request = GrpcRest.init_request(Testdata::TestRequest, parameters)
46
46
  GrpcRest.assign_params(grpc_request, METHOD_PARAM_MAP["test3"], "", request.parameters)
47
- render json: GrpcRest.send_request("Testdata::MyService", "test3", grpc_request, {})
47
+ render json: GrpcRest.send_request("Testdata::MyService", "test3", grpc_request, {}, headers: request.headers)
48
48
  end
49
49
 
50
50
  def test4
@@ -52,7 +52,7 @@ class MyServiceController < ActionController::Base
52
52
  except(*%w(controller action my_service))
53
53
  grpc_request = GrpcRest.init_request(Testdata::TestRequest, parameters)
54
54
  GrpcRest.assign_params(grpc_request, METHOD_PARAM_MAP["test4"], "*", request.parameters)
55
- render json: GrpcRest.send_request("Testdata::MyService", "test4", grpc_request, {})
55
+ render json: GrpcRest.send_request("Testdata::MyService", "test4", grpc_request, {}, headers: request.headers)
56
56
  end
57
57
 
58
58
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: grpc-rest
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Orner
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-06-11 00:00:00.000000000 Z
11
+ date: 2025-07-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: google-protobuf