api-transformer 0.1.0 → 0.1.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 +4 -4
- data/lib/api_transformer/backend_request.rb +9 -2
- data/lib/api_transformer/backend_request_sender.rb +4 -0
- data/lib/api_transformer/backend_response.rb +23 -3
- data/lib/api_transformer/endpoint.rb +5 -1
- data/lib/api_transformer/frontend_response.rb +13 -5
- data/lib/api_transformer/frontend_response_builder.rb +4 -0
- data/lib/api_transformer/version.rb +1 -1
- data/spec/server_spec.rb +84 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6c0849ff779ae501cfe99583f2d4d09165e607a8
|
4
|
+
data.tar.gz: ef8495fb1b89371bf6332311ac80402551b0760a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 932f425f46f6a4d9a3bb310f8a32817cb30531c41b824801e07d7fc73f6e42d8042deb551142cc2053a0d17f6553cdaeca1f76db7c2a3b82b5e0380fa45e4d0c
|
7
|
+
data.tar.gz: e7a3fbed08c8bfd79fab20e7a43ff45c9559347db841f6cf96a103cd754504ba1847b8d052d75094f59a0d00ea66ccda4a5970fad9e523b997f9a79a14fc1f03
|
@@ -5,7 +5,7 @@ module ApiTransformer
|
|
5
5
|
class BackendRequest
|
6
6
|
attr_reader :name
|
7
7
|
attr_accessor :path, :method, :query_params, :form_params, :json_params,
|
8
|
-
:cookie_params
|
8
|
+
:cookie_params, :header_params
|
9
9
|
|
10
10
|
def initialize(name, base_url, frontend_headers)
|
11
11
|
@name = name
|
@@ -16,6 +16,7 @@ module ApiTransformer
|
|
16
16
|
@form_params = {}
|
17
17
|
@json_params = {}
|
18
18
|
@cookie_params = {}
|
19
|
+
@header_params = {}
|
19
20
|
end
|
20
21
|
|
21
22
|
def send
|
@@ -45,7 +46,13 @@ module ApiTransformer
|
|
45
46
|
end
|
46
47
|
|
47
48
|
def headers
|
48
|
-
ret = [
|
49
|
+
ret = [
|
50
|
+
stripped_frontend_headers,
|
51
|
+
@header_params,
|
52
|
+
content_type,
|
53
|
+
cookies
|
54
|
+
].reduce(&:merge)
|
55
|
+
|
49
56
|
ret.delete("Host")
|
50
57
|
ret
|
51
58
|
end
|
@@ -27,13 +27,25 @@ module ApiTransformer
|
|
27
27
|
end
|
28
28
|
|
29
29
|
def json
|
30
|
-
@data ||=
|
31
|
-
|
30
|
+
@data ||= begin
|
31
|
+
json = JSON.parse(@body)
|
32
|
+
|
33
|
+
if json.respond_to?(:keys)
|
34
|
+
Data.try_convert(json)
|
35
|
+
else
|
36
|
+
json
|
37
|
+
end
|
38
|
+
end
|
39
|
+
rescue JSON::ParserError, Encoding::InvalidByteSequenceError
|
32
40
|
{}
|
33
41
|
end
|
34
42
|
|
35
43
|
def [](key)
|
36
|
-
json
|
44
|
+
if json.respond_to?(:keys)
|
45
|
+
json[key]
|
46
|
+
else
|
47
|
+
nil
|
48
|
+
end
|
37
49
|
end
|
38
50
|
|
39
51
|
def cookies
|
@@ -46,6 +58,14 @@ module ApiTransformer
|
|
46
58
|
Data.try_convert(data)
|
47
59
|
end
|
48
60
|
|
61
|
+
def content_type
|
62
|
+
@http.response_header["CONTENT_TYPE"]
|
63
|
+
end
|
64
|
+
|
65
|
+
def headers
|
66
|
+
@http.response_header
|
67
|
+
end
|
68
|
+
|
49
69
|
def stream(&block)
|
50
70
|
if block
|
51
71
|
block.call(@body)
|
@@ -57,7 +57,11 @@ module ApiTransformer
|
|
57
57
|
iterator = EM::Synchrony::Iterator.new(@backend_request_senders)
|
58
58
|
|
59
59
|
iterator.each do |sender, iter|
|
60
|
-
|
60
|
+
if @backend_responses.values.all?(&:success?)
|
61
|
+
send_request(sender, iter)
|
62
|
+
else
|
63
|
+
iter.next
|
64
|
+
end
|
61
65
|
end
|
62
66
|
end
|
63
67
|
|
@@ -6,28 +6,36 @@ module ApiTransformer
|
|
6
6
|
attr_accessor :status
|
7
7
|
attr_writer :body, :content_type
|
8
8
|
|
9
|
+
def initialize
|
10
|
+
@hash = {}
|
11
|
+
@cookies = {}
|
12
|
+
@headers = {}
|
13
|
+
end
|
14
|
+
|
9
15
|
def set(key, value)
|
10
|
-
@hash ||= {}
|
11
16
|
@hash[key] = value
|
12
17
|
end
|
13
18
|
|
14
19
|
def set_cookie(key, value)
|
15
|
-
@cookies ||= {}
|
16
20
|
@cookies[key] = value
|
17
21
|
end
|
18
22
|
|
23
|
+
def set_header(key, value)
|
24
|
+
@headers[key] = value
|
25
|
+
end
|
26
|
+
|
19
27
|
def body
|
20
|
-
@hash && @hash.to_json || @body
|
28
|
+
@hash.any? && @hash.to_json || @body
|
21
29
|
end
|
22
30
|
|
23
31
|
def headers
|
24
|
-
cookie_header.merge
|
32
|
+
[@headers, cookie_header, content_type_header].reduce(&:merge)
|
25
33
|
end
|
26
34
|
|
27
35
|
private
|
28
36
|
|
29
37
|
def cookie_header
|
30
|
-
if @cookies
|
38
|
+
if @cookies.any?
|
31
39
|
pairs = @cookies.map { |key, value| "#{key}=#{value}" }
|
32
40
|
{ "Set-Cookie" => pairs.join("; ") }
|
33
41
|
else
|
data/spec/server_spec.rb
CHANGED
@@ -209,6 +209,35 @@ describe ApiTransformer::Server do
|
|
209
209
|
end
|
210
210
|
end
|
211
211
|
|
212
|
+
it "sends header params in backend requests" do
|
213
|
+
server = extend_server echo_greeting_server do
|
214
|
+
get "/endpoint" do
|
215
|
+
request :echo do
|
216
|
+
path "/echo_header"
|
217
|
+
method :get
|
218
|
+
|
219
|
+
header_param "Range", "bytes=0-"
|
220
|
+
end
|
221
|
+
|
222
|
+
response do |data|
|
223
|
+
attribute :greeting, data[:echo].headers["Range"]
|
224
|
+
end
|
225
|
+
end
|
226
|
+
|
227
|
+
get "/echo_header" do |_, headers|
|
228
|
+
response do
|
229
|
+
success { header :Range, headers["Range"] }
|
230
|
+
end
|
231
|
+
end
|
232
|
+
end
|
233
|
+
|
234
|
+
with_api(server) do
|
235
|
+
get_request(path: "/endpoint") do |c|
|
236
|
+
c.response.must_equal '{"greeting":"bytes=0-"}'
|
237
|
+
end
|
238
|
+
end
|
239
|
+
end
|
240
|
+
|
212
241
|
describe "json params" do
|
213
242
|
it "sends json params in backend requests" do
|
214
243
|
proxy_json = extend_server echo_greeting_server do
|
@@ -469,6 +498,22 @@ describe ApiTransformer::Server do
|
|
469
498
|
end
|
470
499
|
end
|
471
500
|
|
501
|
+
it "can respond with arbitrary headers" do
|
502
|
+
server = create_server do
|
503
|
+
get "/endpoint" do
|
504
|
+
response do
|
505
|
+
success { header "Range", "bytes=0-" }
|
506
|
+
end
|
507
|
+
end
|
508
|
+
end
|
509
|
+
|
510
|
+
with_api(server) do
|
511
|
+
get_request(path: "/endpoint") do |c|
|
512
|
+
c.response_header["Range"].must_equal "bytes=0-"
|
513
|
+
end
|
514
|
+
end
|
515
|
+
end
|
516
|
+
|
472
517
|
it "makes the results of requests available to subsequent requests" do
|
473
518
|
multiple_requests = create_server do
|
474
519
|
get "/multi" do
|
@@ -488,6 +533,7 @@ describe ApiTransformer::Server do
|
|
488
533
|
success do
|
489
534
|
attribute :name, data[:two][:result]
|
490
535
|
cookie "type", data[:two].cookies[:type]
|
536
|
+
content_type data[:one].content_type
|
491
537
|
end
|
492
538
|
end
|
493
539
|
end
|
@@ -512,6 +558,7 @@ describe ApiTransformer::Server do
|
|
512
558
|
get_request(path: "/multi") do |c|
|
513
559
|
c.response.must_equal '{"name":"Bob"}'
|
514
560
|
c.response_header["Set-Cookie"].must_equal "type=delicious"
|
561
|
+
c.response_header["Content-Type"].must_equal "application/json"
|
515
562
|
end
|
516
563
|
end
|
517
564
|
end
|
@@ -685,6 +732,43 @@ describe ApiTransformer::Server do
|
|
685
732
|
end
|
686
733
|
end
|
687
734
|
|
735
|
+
it "does not send requests after a failed request" do
|
736
|
+
server = create_server do
|
737
|
+
get "/endpoint" do
|
738
|
+
request :fail do
|
739
|
+
path "/fail"
|
740
|
+
method :get
|
741
|
+
end
|
742
|
+
|
743
|
+
request :never_runs do
|
744
|
+
fail "should not get here"
|
745
|
+
end
|
746
|
+
|
747
|
+
response do |data|
|
748
|
+
failure true do
|
749
|
+
status 400
|
750
|
+
attribute :oh, data[:fail][:oh]
|
751
|
+
end
|
752
|
+
end
|
753
|
+
end
|
754
|
+
|
755
|
+
get "/fail" do
|
756
|
+
response do
|
757
|
+
success do
|
758
|
+
status 400
|
759
|
+
attribute :oh, "no"
|
760
|
+
end
|
761
|
+
end
|
762
|
+
end
|
763
|
+
end
|
764
|
+
|
765
|
+
with_api(server) do
|
766
|
+
get_request(path: "/endpoint") do |c|
|
767
|
+
c.response.must_equal '{"oh":"no"}'
|
768
|
+
end
|
769
|
+
end
|
770
|
+
end
|
771
|
+
|
688
772
|
it "does not crash when there are no routes for an HTTP verb" do
|
689
773
|
server = create_server do
|
690
774
|
get "/ping" do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: api-transformer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bruz Marzolf
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-10-
|
11
|
+
date: 2014-10-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rack
|