api_valve 1.1.0 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
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