twirp 1.12.0 → 1.13.1

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: 84ca98464f629eded22f43e5f6be8d5f720287e32056db5535ec71d529745504
4
- data.tar.gz: 7f52befd48f263ec529820cdc0a376becee5bff8d83b206d443df288125cf65d
3
+ metadata.gz: f1fce513f08d6551c5d099f27704a8d25d6177db7d900dbbcd83fd7b03fda9df
4
+ data.tar.gz: ddf4a06f70734f8a8df227c7e75ca26ac4dfaacb5315f8302d76037e40e2b999
5
5
  SHA512:
6
- metadata.gz: 1199fe21d97365b929b03e1f2ae347544c13ba69473638c69c7a5f6097bc4de230c41422f1f019700f3b0a8e7a6475cbc24801cee45c755710031a635b4cc359
7
- data.tar.gz: fdf6e077944198c4ae9158080f4120c7039a5b2e5bcfd83535a1e2da103638ccf3f2feab429ad22a3fb33c0ed69c504c8b74979a998bd8491d786273f8542733
6
+ metadata.gz: 3ae5f6c40e1a3050c3629b2f0885c599c4d88c949e7017d1fa22133b1a31c4d5b7b2e5e315f2e3075a0d17152c4160794880f61f9ccd2594b3a392fc197bf088
7
+ data.tar.gz: 55960cf34895498a55f61e9d9ae350d13f42410097b18c397ebae1b6822c385e35ea97cc22c96909a6375aac22f5a23f1576df5ddf941986568b499816a3c67b
data/lib/twirp/client.rb CHANGED
@@ -106,7 +106,7 @@ module Twirp
106
106
  end
107
107
 
108
108
  def is_http_redirect?(status)
109
- status >= 300 && status <= 399
109
+ status && status >= 300 && status <= 399
110
110
  end
111
111
 
112
112
  def make_http_request(conn, service_full_name, rpc_method, content_type, req_opts, body)
data/lib/twirp/service.rb CHANGED
@@ -32,7 +32,7 @@ module Twirp
32
32
  # Rack response with a Twirp::Error
33
33
  def error_response(twerr)
34
34
  status = Twirp::ERROR_CODES_TO_HTTP_STATUS[twerr.code]
35
- headers = {'Content-Type' => Encoding::JSON} # Twirp errors are always JSON, even if the request was protobuf
35
+ headers = {Rack::CONTENT_TYPE => Encoding::JSON} # Twirp errors are always JSON, even if the request was protobuf
36
36
  resp_body = Encoding.encode_json(twerr.to_h)
37
37
  [status, headers, [resp_body]]
38
38
  end
@@ -100,7 +100,7 @@ module Twirp
100
100
  input = env[:input_class].new(input) if input.is_a? Hash
101
101
  env[:input] = input
102
102
  env[:content_type] ||= Encoding::PROTO
103
- env[:http_response_headers] = {}
103
+ env[:http_response_headers] = defined?(Rack::Headers) ? Rack::Headers.new : {}
104
104
  call_handler(env)
105
105
  end
106
106
 
@@ -138,7 +138,7 @@ module Twirp
138
138
  input = nil
139
139
  begin
140
140
  body_str = rack_request.body.read
141
- rack_request.body.rewind # allow other middleware to read again (https://github.com/arthurnn/twirp-ruby/issues/50)
141
+ rack_request.body.rewind if rack_request.body.respond_to?(:rewind) # allow other middleware to read again (https://github.com/arthurnn/twirp-ruby/issues/50)
142
142
  input = Encoding.decode(body_str, env[:input_class], content_type)
143
143
  rescue => e
144
144
  error_msg = "Invalid request body for rpc method #{method_name.inspect} with Content-Type=#{content_type}"
@@ -149,7 +149,7 @@ module Twirp
149
149
  end
150
150
 
151
151
  env[:input] = input
152
- env[:http_response_headers] = {}
152
+ env[:http_response_headers] = defined?(Rack::Headers) ? Rack::Headers.new : {}
153
153
  return
154
154
  end
155
155
 
@@ -181,7 +181,7 @@ module Twirp
181
181
  env[:output] = output
182
182
  @on_success.each{|hook| hook.call(env) }
183
183
 
184
- headers = env[:http_response_headers].merge('Content-Type' => env[:content_type])
184
+ headers = env[:http_response_headers].merge(Rack::CONTENT_TYPE => env[:content_type])
185
185
  resp_body = Encoding.encode(output, env[:output_class], env[:content_type])
186
186
  [200, headers, [resp_body]]
187
187
 
data/lib/twirp/version.rb CHANGED
@@ -12,5 +12,5 @@
12
12
  # permissions and limitations under the License.
13
13
 
14
14
  module Twirp
15
- VERSION = '1.12.0'
15
+ VERSION = '1.13.1'
16
16
  end
data/test/client_test.rb CHANGED
@@ -58,6 +58,17 @@ class ClientTest < Minitest::Test
58
58
  assert_equal num_mthds + 1, EmptyClient.instance_methods.size # new method added
59
59
  end
60
60
 
61
+ def test_is_http_redirect
62
+ assert Twirp::Client.is_http_redirect? 300
63
+ assert Twirp::Client.is_http_redirect? 301
64
+ assert Twirp::Client.is_http_redirect? 302
65
+ assert Twirp::Client.is_http_redirect? 399
66
+
67
+ refute Twirp::Client.is_http_redirect? 200
68
+ refute Twirp::Client.is_http_redirect? 400
69
+ refute Twirp::Client.is_http_redirect? nil
70
+ end
71
+
61
72
 
62
73
  # Call .rpc on Protobuf client
63
74
  # ----------------------------
data/test/service_test.rb CHANGED
@@ -17,7 +17,7 @@ class ServiceTest < Minitest::Test
17
17
  twerr = Twirp::Error.invalid_argument('foo')
18
18
  resp = Twirp::Service.error_response(twerr)
19
19
  assert_equal 400, resp[0]
20
- assert_equal 'application/json', resp[1]['Content-Type']
20
+ assert_equal 'application/json', resp[1][Rack::CONTENT_TYPE]
21
21
  assert_equal '{"code":"invalid_argument","msg":"foo"}', resp[2][0]
22
22
  end
23
23
 
@@ -60,7 +60,7 @@ class ServiceTest < Minitest::Test
60
60
  status, headers, body = haberdasher_service.call(rack_env)
61
61
 
62
62
  assert_equal 200, status
63
- assert_equal 'application/json', headers['Content-Type']
63
+ assert_equal 'application/json', headers[Rack::CONTENT_TYPE]
64
64
  assert_equal({"inches" => 10, "color" => "white"}, JSON.parse(body[0]))
65
65
  end
66
66
 
@@ -69,7 +69,7 @@ class ServiceTest < Minitest::Test
69
69
  status, headers, body = haberdasher_service.call(rack_env)
70
70
 
71
71
  assert_equal 200, status
72
- assert_equal 'application/json; strict=true', headers['Content-Type']
72
+ assert_equal 'application/json; strict=true', headers[Rack::CONTENT_TYPE]
73
73
  assert_equal({"inches" => 0, "color" => "white"}, JSON.parse(body[0]))
74
74
  end
75
75
 
@@ -78,7 +78,7 @@ class ServiceTest < Minitest::Test
78
78
  status, headers, body = haberdasher_service.call(rack_env)
79
79
 
80
80
  assert_equal 200, status
81
- assert_equal 'application/json', headers['Content-Type']
81
+ assert_equal 'application/json', headers[Rack::CONTENT_TYPE]
82
82
  assert_equal({"inches" => 0, "color" => "white"}, JSON.parse(body[0]))
83
83
  end
84
84
 
@@ -87,7 +87,7 @@ class ServiceTest < Minitest::Test
87
87
  status, headers, body = haberdasher_service.call(rack_env)
88
88
 
89
89
  assert_equal 200, status
90
- assert_equal 'application/protobuf', headers['Content-Type']
90
+ assert_equal 'application/protobuf', headers[Rack::CONTENT_TYPE]
91
91
  assert_equal Example::Hat.new(inches: 10, color: "white"), Example::Hat.decode(body[0])
92
92
  end
93
93
 
@@ -96,7 +96,7 @@ class ServiceTest < Minitest::Test
96
96
  status, headers, body = haberdasher_service.call(rack_env)
97
97
 
98
98
  assert_equal 404, status
99
- assert_equal 'application/json', headers['Content-Type']
99
+ assert_equal 'application/json', headers[Rack::CONTENT_TYPE]
100
100
  assert_equal({
101
101
  "code" => 'bad_route',
102
102
  "msg" => 'Invalid rpc method "MakeUnicorns"',
@@ -110,7 +110,7 @@ class ServiceTest < Minitest::Test
110
110
  status, headers, body = haberdasher_service.call(rack_env)
111
111
 
112
112
  assert_equal 404, status
113
- assert_equal 'application/json', headers['Content-Type']
113
+ assert_equal 'application/json', headers[Rack::CONTENT_TYPE]
114
114
  assert_equal({
115
115
  "code" => 'bad_route',
116
116
  "msg" => 'HTTP request method must be POST',
@@ -124,7 +124,7 @@ class ServiceTest < Minitest::Test
124
124
  status, headers, body = haberdasher_service.call(rack_env)
125
125
 
126
126
  assert_equal 404, status
127
- assert_equal 'application/json', headers['Content-Type']
127
+ assert_equal 'application/json', headers[Rack::CONTENT_TYPE]
128
128
  assert_equal({
129
129
  "code" => 'bad_route',
130
130
  "msg" => 'Unexpected Content-Type: "text/plain". Content-Type header must be one of ["application/json", "application/protobuf"]',
@@ -137,7 +137,7 @@ class ServiceTest < Minitest::Test
137
137
  status, headers, body = haberdasher_service.call(rack_env)
138
138
 
139
139
  assert_equal 404, status
140
- assert_equal 'application/json', headers['Content-Type']
140
+ assert_equal 'application/json', headers[Rack::CONTENT_TYPE]
141
141
  assert_equal({
142
142
  "code" => 'bad_route',
143
143
  "msg" => 'Invalid route. Expected format: POST {BaseURL}/example.Haberdasher/{Method}',
@@ -150,7 +150,7 @@ class ServiceTest < Minitest::Test
150
150
  status, headers, body = haberdasher_service.call(rack_env)
151
151
 
152
152
  assert_equal 404, status
153
- assert_equal 'application/json', headers['Content-Type'] # error responses are always JSON, even for Protobuf requests
153
+ assert_equal 'application/json', headers[Rack::CONTENT_TYPE] # error responses are always JSON, even for Protobuf requests
154
154
  assert_equal({
155
155
  "code" => 'bad_route',
156
156
  "msg" => 'Invalid route. Expected format: POST {BaseURL}/example.Haberdasher/{Method}',
@@ -164,7 +164,7 @@ class ServiceTest < Minitest::Test
164
164
  status, headers, body = haberdasher_service.call(rack_env)
165
165
 
166
166
  assert_equal 400, status
167
- assert_equal 'application/json', headers['Content-Type']
167
+ assert_equal 'application/json', headers[Rack::CONTENT_TYPE]
168
168
  assert_equal({
169
169
  "code" => 'malformed',
170
170
  "msg" => 'Invalid request body for rpc method "MakeHat" with Content-Type=application/json: ' +
@@ -179,7 +179,7 @@ class ServiceTest < Minitest::Test
179
179
  status, headers, body = haberdasher_service.call(rack_env)
180
180
 
181
181
  assert_equal 400, status
182
- assert_equal 'application/json', headers['Content-Type']
182
+ assert_equal 'application/json', headers[Rack::CONTENT_TYPE]
183
183
  assert_equal({
184
184
  "code" => 'malformed',
185
185
  "msg" => 'Invalid request body for rpc method "MakeHat" with Content-Type=application/protobuf: ' +
@@ -193,7 +193,7 @@ class ServiceTest < Minitest::Test
193
193
  status, headers, body = haberdasher_service.call(rack_env)
194
194
 
195
195
  assert_equal 200, status
196
- assert_equal 'application/json', headers['Content-Type']
196
+ assert_equal 'application/json', headers[Rack::CONTENT_TYPE]
197
197
  assert_equal({"inches" => 10, "color" => "white"}, JSON.parse(body[0]))
198
198
  end
199
199
 
@@ -202,7 +202,7 @@ class ServiceTest < Minitest::Test
202
202
  status, headers, body = haberdasher_service.call(rack_env)
203
203
 
204
204
  assert_equal 200, status
205
- assert_equal 'application/json', headers['Content-Type']
205
+ assert_equal 'application/json', headers[Rack::CONTENT_TYPE]
206
206
  assert_equal({"inches" => 10, "color" => "white"}, JSON.parse(body[0]))
207
207
  end
208
208
 
@@ -211,7 +211,7 @@ class ServiceTest < Minitest::Test
211
211
  status, headers, body = haberdasher_service.call(rack_env)
212
212
 
213
213
  assert_equal 400, status
214
- assert_equal 'application/json', headers['Content-Type']
214
+ assert_equal 'application/json', headers[Rack::CONTENT_TYPE]
215
215
  assert_equal({
216
216
  "code" => 'malformed',
217
217
  "msg" => 'Invalid request body for rpc method "MakeHat" with Content-Type=application/json; strict=true: ' +
@@ -289,7 +289,7 @@ class ServiceTest < Minitest::Test
289
289
  rack_env = proto_req "/example.Haberdasher/MakeHat", Example::Size.new(inches: 666)
290
290
  status, headers, body = svc.call(rack_env)
291
291
  assert_equal 400, status
292
- assert_equal 'application/json', headers['Content-Type'] # error responses are always JSON, even for Protobuf requests
292
+ assert_equal 'application/json', headers[Rack::CONTENT_TYPE] # error responses are always JSON, even for Protobuf requests
293
293
  assert_equal({
294
294
  "code" => 'invalid_argument',
295
295
  "msg" => "I don't like that size",
@@ -298,7 +298,7 @@ class ServiceTest < Minitest::Test
298
298
 
299
299
  def test_handler_method_can_set_response_headers_through_the_env
300
300
  svc = Example::Haberdasher.new(HaberdasherHandler.new do |size, env|
301
- env[:http_response_headers]["Cache-Control"] = "public, max-age=60"
301
+ env[:http_response_headers][Rack::CACHE_CONTROL] = "public, max-age=60"
302
302
  {}
303
303
  end)
304
304
 
@@ -306,8 +306,8 @@ class ServiceTest < Minitest::Test
306
306
  status, headers, body = svc.call(rack_env)
307
307
 
308
308
  assert_equal 200, status
309
- assert_equal "public, max-age=60", headers["Cache-Control"] # set by the handler
310
- assert_equal "application/protobuf", headers["Content-Type"] # set by Twirp::Service
309
+ assert_equal "public, max-age=60", headers[Rack::CACHE_CONTROL] # set by the handler
310
+ assert_equal "application/protobuf", headers[Rack::CONTENT_TYPE] # set by Twirp::Service
311
311
  end
312
312
 
313
313
  def test_handler_returns_invalid_type_nil
@@ -533,7 +533,7 @@ class ServiceTest < Minitest::Test
533
533
  status, headers, body = svc.call(rack_env)
534
534
 
535
535
  assert_equal 500, status
536
- assert_equal 'application/json', headers['Content-Type']
536
+ assert_equal 'application/json', headers[Rack::CONTENT_TYPE]
537
537
  assert_equal({
538
538
  "code" => 'intenal',
539
539
  "msg" => 'hook1 failed',
data/twirp.gemspec CHANGED
@@ -21,7 +21,7 @@ Gem::Specification.new do |spec|
21
21
  spec.required_ruby_version = '>= 1.9'
22
22
  spec.add_runtime_dependency 'google-protobuf', '>= 3.25', '< 5.a'
23
23
  spec.add_runtime_dependency 'faraday', '< 3' # for clients
24
- spec.add_dependency 'rack', '>= 2.2.3', '< 3' # see https://github.com/arthurnn/twirp-ruby/issues/111
24
+ spec.add_dependency 'rack', '>= 2.2.3'
25
25
 
26
26
  spec.add_development_dependency 'bundler', '~> 2'
27
27
  spec.add_development_dependency 'minitest', '>= 5'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: twirp
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.12.0
4
+ version: 1.13.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cyrus A. Forbes
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2024-08-26 00:00:00.000000000 Z
12
+ date: 2025-04-30 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: google-protobuf
@@ -52,9 +52,6 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: 2.2.3
55
- - - "<"
56
- - !ruby/object:Gem::Version
57
- version: '3'
58
55
  type: :runtime
59
56
  prerelease: false
60
57
  version_requirements: !ruby/object:Gem::Requirement
@@ -62,9 +59,6 @@ dependencies:
62
59
  - - ">="
63
60
  - !ruby/object:Gem::Version
64
61
  version: 2.2.3
65
- - - "<"
66
- - !ruby/object:Gem::Version
67
- version: '3'
68
62
  - !ruby/object:Gem::Dependency
69
63
  name: bundler
70
64
  requirement: !ruby/object:Gem::Requirement