api_valve 1.1.0 → 1.2.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: efc4ab150d52d51871f9f354981bc593ee5498ceb18a8360903dc852e7236ac1
4
- data.tar.gz: 6e7a6baf1e21e480d37b9051d7af404bb597665571aa0904d5fad58e09c5852c
3
+ metadata.gz: 06a97139becbc8072fd7a530580b48ca5b5ba0ea13321524833d470fd868d175
4
+ data.tar.gz: 0abefffd5835c0c2eabd3c8095b75dc9d529815992f1bc0449bea9d96ad6d2dd
5
5
  SHA512:
6
- metadata.gz: 141e76749cc7dc127434882786ab90f7574a9e5fe0c826b7932e3ac9b4949821c05d79080fc91a2643af5d0893e39c8694769f2516fd3fc16765c46e38db443b
7
- data.tar.gz: 706c645a89c86349fdd91b7bd7ee74530636dd71df43fafe999e4a479575aee37f6217dc47a41b1c9c591806826886ecf82c1b16b6771f1c493a6c05f13765ec
6
+ metadata.gz: 6fb2949969a28eb1c05fec05d936b91af13124a0e6a0d7e7c4cfaae40f8cf7e2abb3737e23f5d5e036ceab2f89dae1d273fcdaef04513c6d4890d8dacae4d0cc
7
+ data.tar.gz: 633b4057742e3271366a241103a6afa80278ec1f384b68da01a57974c7d116c0310f852dc1d1413b800dc9ffecb46d25d321b211cfd63cc98197c9260b920e08
@@ -5,10 +5,10 @@ module ApiValve
5
5
  end
6
6
 
7
7
  def call
8
- [
8
+ Rack::Response[
9
9
  status,
10
10
  {'Content-Type' => 'application/vnd.api+json'},
11
- [MultiJson.dump({errors: [json_error]}, mode: :compat)]
11
+ JSON.generate({errors: [json_error]}, mode: :compat)
12
12
  ]
13
13
  end
14
14
 
@@ -0,0 +1,38 @@
1
+ module ApiValve
2
+ class Forwarder::LocationConverter
3
+ def initialize(location, options)
4
+ @location = location
5
+ @options = options
6
+ end
7
+
8
+ def call
9
+ if other_host? || same_prefix?
10
+ @location.to_s
11
+ else
12
+ convert_location
13
+ end
14
+ end
15
+
16
+ private
17
+
18
+ def local_prefix
19
+ @options[:local_prefix].presence
20
+ end
21
+
22
+ def other_host?
23
+ @location.host && @options[:response_uri].host != @location.host
24
+ end
25
+
26
+ def same_prefix?
27
+ local_prefix == target_prefix
28
+ end
29
+
30
+ def target_prefix
31
+ @options[:target_prefix].presence
32
+ end
33
+
34
+ def convert_location
35
+ @location.to_s.gsub(/^#{@options[:target_prefix]}/, @options[:local_prefix])
36
+ end
37
+ end
38
+ end
@@ -26,7 +26,7 @@ module ApiValve
26
26
 
27
27
  # Must return a rack compatible response array of status code, headers and body
28
28
  def rack_response
29
- [status, headers, [body]]
29
+ Rack::Response.new(body, status, headers)
30
30
  end
31
31
 
32
32
  protected
@@ -56,9 +56,15 @@ module ApiValve
56
56
  end
57
57
 
58
58
  def adjust_location(location)
59
- return location if @options[:target_prefix] == @options[:local_prefix]
59
+ return unless location
60
60
 
61
- location&.gsub(/^#{@options[:target_prefix]}/, @options[:local_prefix])
61
+ Forwarder::LocationConverter.new(
62
+ URI(location),
63
+ @options.slice(:local_prefix, :target_prefix).merge(
64
+ request_uri: URI(@original_request.url),
65
+ response_uri: @original_response.env.url # already a URI
66
+ )
67
+ ).call
62
68
  end
63
69
 
64
70
  def body
@@ -4,8 +4,9 @@ module ApiValve
4
4
  # options, and called from the router.
5
5
 
6
6
  class Forwarder
7
- autoload :Request, 'api_valve/forwarder/request'
8
- autoload :Response, 'api_valve/forwarder/response'
7
+ autoload :LocationConverter, 'api_valve/forwarder/location_converter'
8
+ autoload :Request, 'api_valve/forwarder/request'
9
+ autoload :Response, 'api_valve/forwarder/response'
9
10
 
10
11
  include Benchmarking
11
12
 
@@ -8,7 +8,7 @@ class ApiValve::Middleware
8
8
  @app.call(env)
9
9
  rescue Exception => e # rubocop:disable Lint/RescueException
10
10
  log_error e
11
- self.class.const_get(ApiValve.error_responder).new(e).call
11
+ render_error(e).to_a
12
12
  end
13
13
 
14
14
  private
@@ -17,5 +17,9 @@ class ApiValve::Middleware
17
17
  ApiValve.logger.error { "#{error.class}: #{error.message}" }
18
18
  ApiValve.logger.error { error.backtrace.join("\n") }
19
19
  end
20
+
21
+ def render_error(error)
22
+ self.class.const_get(ApiValve.error_responder).new(error).call
23
+ end
20
24
  end
21
25
  end
@@ -24,9 +24,9 @@ module ApiValve
24
24
  end
25
25
 
26
26
  def call(env)
27
- to_app.call(env)
27
+ to_app.call(env).to_a
28
28
  rescue ApiValve::Error::Client, ApiValve::Error::Server => e
29
- render_error e
29
+ render_error(e).to_a
30
30
  end
31
31
 
32
32
  delegate :add_route, to: :route_set
data/lib/api_valve.rb CHANGED
@@ -10,8 +10,9 @@ require 'active_support/notifications'
10
10
  require 'active_support/rescuable'
11
11
  require 'benchmark'
12
12
  require 'faraday'
13
- require 'multi_json'
13
+ require 'json'
14
14
  require 'logger'
15
+ require 'rack'
15
16
 
16
17
  module ApiValve
17
18
  autoload :Benchmarking, 'api_valve/benchmarking'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: api_valve
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - mkon
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-05-26 00:00:00.000000000 Z
11
+ date: 2022-11-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -37,9 +37,9 @@ dependencies:
37
37
  - - ">="
38
38
  - !ruby/object:Gem::Version
39
39
  version: '0.14'
40
- - - "<="
40
+ - - "<"
41
41
  - !ruby/object:Gem::Version
42
- version: 2.3.0
42
+ version: '2.7'
43
43
  type: :runtime
44
44
  prerelease: false
45
45
  version_requirements: !ruby/object:Gem::Requirement
@@ -47,37 +47,43 @@ dependencies:
47
47
  - - ">="
48
48
  - !ruby/object:Gem::Version
49
49
  version: '0.14'
50
- - - "<="
50
+ - - "<"
51
51
  - !ruby/object:Gem::Version
52
- version: 2.3.0
52
+ version: '2.7'
53
53
  - !ruby/object:Gem::Dependency
54
- name: multi_json
54
+ name: json
55
55
  requirement: !ruby/object:Gem::Requirement
56
56
  requirements:
57
- - - "~>"
57
+ - - ">="
58
58
  - !ruby/object:Gem::Version
59
- version: '1.13'
59
+ version: '2.0'
60
60
  type: :runtime
61
61
  prerelease: false
62
62
  version_requirements: !ruby/object:Gem::Requirement
63
63
  requirements:
64
- - - "~>"
64
+ - - ">="
65
65
  - !ruby/object:Gem::Version
66
- version: '1.13'
66
+ version: '2.0'
67
67
  - !ruby/object:Gem::Dependency
68
68
  name: rack
69
69
  requirement: !ruby/object:Gem::Requirement
70
70
  requirements:
71
- - - "~>"
71
+ - - ">="
72
72
  - !ruby/object:Gem::Version
73
73
  version: '2'
74
+ - - "<"
75
+ - !ruby/object:Gem::Version
76
+ version: '4'
74
77
  type: :runtime
75
78
  prerelease: false
76
79
  version_requirements: !ruby/object:Gem::Requirement
77
80
  requirements:
78
- - - "~>"
81
+ - - ">="
79
82
  - !ruby/object:Gem::Version
80
83
  version: '2'
84
+ - - "<"
85
+ - !ruby/object:Gem::Version
86
+ version: '4'
81
87
  - !ruby/object:Gem::Dependency
82
88
  name: json_spec
83
89
  requirement: !ruby/object:Gem::Requirement
@@ -98,14 +104,28 @@ dependencies:
98
104
  requirements:
99
105
  - - "~>"
100
106
  - !ruby/object:Gem::Version
101
- version: '1.1'
107
+ version: '2.0'
102
108
  type: :development
103
109
  prerelease: false
104
110
  version_requirements: !ruby/object:Gem::Requirement
105
111
  requirements:
106
112
  - - "~>"
107
113
  - !ruby/object:Gem::Version
108
- version: '1.1'
114
+ version: '2.0'
115
+ - !ruby/object:Gem::Dependency
116
+ name: rackup
117
+ requirement: !ruby/object:Gem::Requirement
118
+ requirements:
119
+ - - ">="
120
+ - !ruby/object:Gem::Version
121
+ version: '0'
122
+ type: :development
123
+ prerelease: false
124
+ version_requirements: !ruby/object:Gem::Requirement
125
+ requirements:
126
+ - - ">="
127
+ - !ruby/object:Gem::Version
128
+ version: '0'
109
129
  - !ruby/object:Gem::Dependency
110
130
  name: rspec
111
131
  requirement: !ruby/object:Gem::Requirement
@@ -126,28 +146,28 @@ dependencies:
126
146
  requirements:
127
147
  - - '='
128
148
  - !ruby/object:Gem::Version
129
- version: 1.29.1
149
+ version: 1.37.1
130
150
  type: :development
131
151
  prerelease: false
132
152
  version_requirements: !ruby/object:Gem::Requirement
133
153
  requirements:
134
154
  - - '='
135
155
  - !ruby/object:Gem::Version
136
- version: 1.29.1
156
+ version: 1.37.1
137
157
  - !ruby/object:Gem::Dependency
138
158
  name: rubocop-rspec
139
159
  requirement: !ruby/object:Gem::Requirement
140
160
  requirements:
141
161
  - - '='
142
162
  - !ruby/object:Gem::Version
143
- version: 2.11.1
163
+ version: 2.13.2
144
164
  type: :development
145
165
  prerelease: false
146
166
  version_requirements: !ruby/object:Gem::Requirement
147
167
  requirements:
148
168
  - - '='
149
169
  - !ruby/object:Gem::Version
150
- version: 2.11.1
170
+ version: 2.13.2
151
171
  - !ruby/object:Gem::Dependency
152
172
  name: simplecov
153
173
  requirement: !ruby/object:Gem::Requirement
@@ -204,6 +224,7 @@ files:
204
224
  - lib/api_valve/error.rb
205
225
  - lib/api_valve/error_responder.rb
206
226
  - lib/api_valve/forwarder.rb
227
+ - lib/api_valve/forwarder/location_converter.rb
207
228
  - lib/api_valve/forwarder/request.rb
208
229
  - lib/api_valve/forwarder/response.rb
209
230
  - lib/api_valve/logger.rb