twirp 1.4.1 → 1.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/twirp/error.rb +4 -3
- data/lib/twirp/service.rb +9 -9
- data/lib/twirp/version.rb +1 -1
- data/test/error_test.rb +2 -2
- data/test/service_test.rb +4 -4
- data/twirp.gemspec +1 -1
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '07397331bd18c688d70740c3ad5cec2401103a325bab3331dda34d3072223c89'
|
4
|
+
data.tar.gz: 684074c539bb00ddb32e814601378b6d3e0f967b48e8c758832a56a74ceba0a2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '079722ee218b74194884e10383fc9ebb53febf02e215d7fa001c14c864e3c2eff9fddee8079c29e06396a766901efab7e696c14d9f9e0afd6df1034a10e5aa56'
|
7
|
+
data.tar.gz: d91d578d6cbd5245b38d5b1838892db43bc53730cdfb00391a1cad266d3193522625d87c3b5e2bfb0fc807bb90e6d1cd90063c95a139c5096ea4ef425106e2f7
|
data/lib/twirp/error.rb
CHANGED
@@ -16,9 +16,10 @@ module Twirp
|
|
16
16
|
# Valid Twirp error codes and their mapping to related HTTP status.
|
17
17
|
# This can also be used to check if a code is valid (check if not nil).
|
18
18
|
ERROR_CODES_TO_HTTP_STATUS = {
|
19
|
-
canceled: 408, #
|
20
|
-
invalid_argument: 400, #
|
21
|
-
|
19
|
+
canceled: 408, # Request Timeout
|
20
|
+
invalid_argument: 400, # Bad Request
|
21
|
+
malformed: 400, # Bad Request
|
22
|
+
deadline_exceeded: 408, # Request Timeout
|
22
23
|
not_found: 404, # Not Found
|
23
24
|
bad_route: 404, # Not Found
|
24
25
|
already_exists: 409, # Conflict
|
data/lib/twirp/service.rb
CHANGED
@@ -107,29 +107,30 @@ module Twirp
|
|
107
107
|
private
|
108
108
|
|
109
109
|
# Parse request and fill env with rpc data.
|
110
|
-
# Returns a bad_route error if
|
110
|
+
# Returns a bad_route error if could not be properly routed to a Twirp method.
|
111
|
+
# Returns a malformed error if could not decode the body (either bad JSON or bad Protobuf)
|
111
112
|
def route_request(rack_env, env)
|
112
113
|
rack_request = Rack::Request.new(rack_env)
|
113
114
|
|
114
115
|
if rack_request.request_method != "POST"
|
115
|
-
return
|
116
|
+
return route_err(:bad_route, "HTTP request method must be POST", rack_request)
|
116
117
|
end
|
117
118
|
|
118
119
|
content_type = rack_request.get_header("CONTENT_TYPE")
|
119
120
|
if !Encoding.valid_content_type?(content_type)
|
120
|
-
return
|
121
|
+
return route_err(:bad_route, "Unexpected Content-Type: #{content_type.inspect}. Content-Type header must be one of #{Encoding.valid_content_types.inspect}", rack_request)
|
121
122
|
end
|
122
123
|
env[:content_type] = content_type
|
123
124
|
|
124
125
|
path_parts = rack_request.fullpath.split("/")
|
125
126
|
if path_parts.size < 3 || path_parts[-2] != self.full_name
|
126
|
-
return
|
127
|
+
return route_err(:bad_route, "Invalid route. Expected format: POST {BaseURL}/#{self.full_name}/{Method}", rack_request)
|
127
128
|
end
|
128
129
|
method_name = path_parts[-1]
|
129
130
|
|
130
131
|
base_env = self.class.rpcs[method_name]
|
131
132
|
if !base_env
|
132
|
-
return
|
133
|
+
return route_err(:bad_route, "Invalid rpc method #{method_name.inspect}", rack_request)
|
133
134
|
end
|
134
135
|
env.merge!(base_env) # :rpc_method, :input_class, :output_class
|
135
136
|
|
@@ -141,7 +142,7 @@ module Twirp
|
|
141
142
|
if e.is_a?(Google::Protobuf::ParseError)
|
142
143
|
error_msg += ": #{e.message.strip}"
|
143
144
|
end
|
144
|
-
return
|
145
|
+
return route_err(:malformed, error_msg, rack_request)
|
145
146
|
end
|
146
147
|
|
147
148
|
env[:input] = input
|
@@ -149,12 +150,11 @@ module Twirp
|
|
149
150
|
return
|
150
151
|
end
|
151
152
|
|
152
|
-
def
|
153
|
-
Twirp::Error.
|
153
|
+
def route_err(code, msg, req)
|
154
|
+
Twirp::Error.new code, msg, twirp_invalid_route: "#{req.request_method} #{req.fullpath}"
|
154
155
|
end
|
155
156
|
|
156
157
|
|
157
|
-
|
158
158
|
# Call handler method and return a Protobuf Message or a Twirp::Error.
|
159
159
|
def call_handler(env)
|
160
160
|
m = env[:ruby_method]
|
data/lib/twirp/version.rb
CHANGED
data/test/error_test.rb
CHANGED
@@ -5,7 +5,7 @@ require_relative '../lib/twirp/error'
|
|
5
5
|
class TestErrorCodes < Minitest::Test
|
6
6
|
|
7
7
|
def test_error_codes
|
8
|
-
assert_equal
|
8
|
+
assert_equal 18, Twirp::ERROR_CODES.size
|
9
9
|
|
10
10
|
# all codes should be symbols
|
11
11
|
Twirp::ERROR_CODES.each do |code|
|
@@ -19,7 +19,7 @@ class TestErrorCodes < Minitest::Test
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def test_codes_to_http_status
|
22
|
-
assert_equal
|
22
|
+
assert_equal 18, Twirp::ERROR_CODES_TO_HTTP_STATUS.size
|
23
23
|
|
24
24
|
assert_equal 404, Twirp::ERROR_CODES_TO_HTTP_STATUS[:not_found]
|
25
25
|
assert_equal 500, Twirp::ERROR_CODES_TO_HTTP_STATUS[:internal]
|
data/test/service_test.rb
CHANGED
@@ -145,10 +145,10 @@ class ServiceTest < Minitest::Test
|
|
145
145
|
method: "POST", input: 'bad json', "CONTENT_TYPE" => "application/json"
|
146
146
|
status, headers, body = haberdasher_service.call(rack_env)
|
147
147
|
|
148
|
-
assert_equal
|
148
|
+
assert_equal 400, status
|
149
149
|
assert_equal 'application/json', headers['Content-Type']
|
150
150
|
assert_equal({
|
151
|
-
"code" => '
|
151
|
+
"code" => 'malformed',
|
152
152
|
"msg" => 'Invalid request body for rpc method "MakeHat" with Content-Type=application/json: ' +
|
153
153
|
"Error occurred during parsing: Parse error at 'bad json'",
|
154
154
|
"meta" => {"twirp_invalid_route" => "POST /example.Haberdasher/MakeHat"},
|
@@ -160,10 +160,10 @@ class ServiceTest < Minitest::Test
|
|
160
160
|
method: "POST", input: 'bad protobuf', "CONTENT_TYPE" => "application/protobuf"
|
161
161
|
status, headers, body = haberdasher_service.call(rack_env)
|
162
162
|
|
163
|
-
assert_equal
|
163
|
+
assert_equal 400, status
|
164
164
|
assert_equal 'application/json', headers['Content-Type']
|
165
165
|
assert_equal({
|
166
|
-
"code" => '
|
166
|
+
"code" => 'malformed',
|
167
167
|
"msg" => 'Invalid request body for rpc method "MakeHat" with Content-Type=application/protobuf: ' +
|
168
168
|
'Error occurred during parsing: Unexpected EOF inside skipped data',
|
169
169
|
"meta" => {"twirp_invalid_route" => "POST /example.Haberdasher/MakeHat"},
|
data/twirp.gemspec
CHANGED
@@ -20,7 +20,7 @@ Gem::Specification.new do |spec|
|
|
20
20
|
|
21
21
|
spec.required_ruby_version = '>= 1.9'
|
22
22
|
spec.add_runtime_dependency 'google-protobuf', '~> 3.0', '>= 3.0.0'
|
23
|
-
spec.add_runtime_dependency 'faraday', '
|
23
|
+
spec.add_runtime_dependency 'faraday', '< 2' # for clients
|
24
24
|
|
25
25
|
spec.add_development_dependency 'bundler', '~> 1'
|
26
26
|
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.
|
4
|
+
version: 1.5.0
|
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:
|
12
|
+
date: 2020-04-14 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: google-protobuf
|
@@ -35,16 +35,16 @@ dependencies:
|
|
35
35
|
name: faraday
|
36
36
|
requirement: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - "<"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '2'
|
41
41
|
type: :runtime
|
42
42
|
prerelease: false
|
43
43
|
version_requirements: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
45
|
+
- - "<"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '2'
|
48
48
|
- !ruby/object:Gem::Dependency
|
49
49
|
name: bundler
|
50
50
|
requirement: !ruby/object:Gem::Requirement
|