hal-client 3.3.2 → 3.4.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/hal_client/version.rb +1 -1
- data/lib/hal_client.rb +46 -27
- data/spec/hal_client_spec.rb +16 -0
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 74de1dba1a4d7fcb4b836da48535915b9694219b
|
4
|
+
data.tar.gz: 5e3ebfbb756110e9adaefff3e339e34532fdd982
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c30ea673a86d148156f8783afbdb05e663e5445910a30aedbcf67edd2775e66d9bb7fa46d4770e165f13607cdeb29b3db6c517d8cb27679aa97a3a4bd92d0f7f
|
7
|
+
data.tar.gz: 223ce6546a7d0adcc61ed5d1e0306fb5087b99ad15c1d9a8c6ceca5dfca5e91600f02027db42198f76240b238de9b06812311441b71c82731da1c2fa9deec526
|
data/lib/hal_client/version.rb
CHANGED
data/lib/hal_client.rb
CHANGED
@@ -24,10 +24,15 @@ class HalClient
|
|
24
24
|
# prepended to the `Accept` header field of each request.
|
25
25
|
# :content_type - a single content type that should be
|
26
26
|
# prepended to the `Content-Type` header field of each request.
|
27
|
+
# :authorization - a `#call`able which takes the url being
|
28
|
+
# requested and returns the authorization header value to use
|
29
|
+
# for the request or a string which will always be the value of
|
30
|
+
# the authorization header
|
27
31
|
# :headers - a hash of other headers to send on each request.
|
28
32
|
def initialize(options={})
|
29
33
|
@default_message_request_headers = HTTP::Headers.new
|
30
34
|
@default_entity_request_headers = HTTP::Headers.new
|
35
|
+
@auth_helper = as_callable(options.fetch(:authorization, NullAuthHelper))
|
31
36
|
|
32
37
|
default_message_request_headers.set('Accept', options[:accept]) if
|
33
38
|
options[:accept]
|
@@ -63,57 +68,71 @@ class HalClient
|
|
63
68
|
# url - The URL of the resource of interest.
|
64
69
|
# headers - custom header fields to use for this request
|
65
70
|
def get(url, headers={})
|
71
|
+
headers = auth_headers(url).merge(headers)
|
66
72
|
interpret_response client_for_get(override_headers: headers).get(url)
|
67
73
|
end
|
68
74
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
75
|
+
class << self
|
76
|
+
protected
|
77
|
+
|
78
|
+
def def_unsafe_request(method)
|
79
|
+
define_method(method) do |url, data, headers={}|
|
80
|
+
headers = auth_headers(url).merge(headers)
|
81
|
+
|
82
|
+
req_body = if data.respond_to? :to_hal
|
76
83
|
data.to_hal
|
77
84
|
else
|
78
85
|
data
|
79
86
|
end
|
80
87
|
|
81
|
-
|
88
|
+
interpret_response client_for_post(override_headers: headers)
|
89
|
+
.request(method, url, body: req_body)
|
90
|
+
end
|
91
|
+
end
|
82
92
|
end
|
83
93
|
|
84
|
-
#
|
94
|
+
# Post a `Representation` or `String` to the resource identified at `url`.
|
85
95
|
#
|
86
96
|
# url - The URL of the resource of interest.
|
87
97
|
# data - a `String` or an object that responds to `#to_hal`
|
88
98
|
# headers - custom header fields to use for this request
|
89
|
-
|
90
|
-
req_body = if data.respond_to? :to_hal
|
91
|
-
data.to_hal
|
92
|
-
else
|
93
|
-
data
|
94
|
-
end
|
99
|
+
def_unsafe_request :post
|
95
100
|
|
96
|
-
|
97
|
-
|
101
|
+
# Put a `Representation` or `String` to the resource identified at `url`.
|
102
|
+
#
|
103
|
+
# url - The URL of the resource of interest.
|
104
|
+
# data - a `String` or an object that responds to `#to_hal`
|
105
|
+
# headers - custom header fields to use for this request
|
106
|
+
def_unsafe_request :put
|
98
107
|
|
99
108
|
# Patch a `Representation` or `String` to the resource identified at `url`.
|
100
109
|
#
|
101
110
|
# url - The URL of the resource of interest.
|
102
111
|
# data - a `String` or an object that responds to `#to_hal`
|
103
112
|
# headers - custom header fields to use for this request
|
104
|
-
|
105
|
-
req_body = if data.respond_to? :to_hal
|
106
|
-
data.to_hal
|
107
|
-
else
|
108
|
-
data
|
109
|
-
end
|
110
|
-
|
111
|
-
interpret_response client_for_post(override_headers: headers).patch(url, body: req_body)
|
112
|
-
end
|
113
|
+
def_unsafe_request :patch
|
113
114
|
|
114
115
|
protected
|
115
116
|
|
116
|
-
attr_reader :headers
|
117
|
+
attr_reader :headers, :auth_helper
|
118
|
+
|
119
|
+
NullAuthHelper = ->(_url) { nil }
|
120
|
+
|
121
|
+
def as_callable(thing)
|
122
|
+
if thing.respond_to?(:call)
|
123
|
+
thing
|
124
|
+
else
|
125
|
+
->(*_args) { thing }
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
def auth_headers(url)
|
130
|
+
if h_val = auth_helper.call(url)
|
131
|
+
{"Authorization" => h_val}
|
132
|
+
else
|
133
|
+
{}
|
134
|
+
end
|
135
|
+
end
|
117
136
|
|
118
137
|
def interpret_response(resp)
|
119
138
|
case resp.status
|
data/spec/hal_client_spec.rb
CHANGED
@@ -47,6 +47,22 @@ describe HalClient do
|
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
50
|
+
context "explicit authorization helper" do
|
51
|
+
subject(:client) { HalClient.new authorization: ->(_url) { "Bearer hello" } }
|
52
|
+
it "sends specified accept header" do
|
53
|
+
expect(request.with(headers: {'Authorization' => "Bearer hello"})).
|
54
|
+
to have_been_made
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
context "explicit authorization string" do
|
59
|
+
subject(:client) { HalClient.new authorization: "Bearer hello" }
|
60
|
+
it "sends specified accept header" do
|
61
|
+
expect(request.with(headers: {'Authorization' => "Bearer hello"})).
|
62
|
+
to have_been_made
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
50
66
|
context "other headers" do
|
51
67
|
let(:headers) { {"Authorization" => "Bearer f73c04b0970f1deb6005fab53edd1708"} }
|
52
68
|
subject(:client) { HalClient.new headers: headers }
|