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