twirp 1.4.1 → 1.5.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 +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
|