wrest 2.1.9 → 4.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/CHANGELOG +6 -0
- data/LICENCE +1 -1
- data/README.md +47 -40
- data/bin/wrest +2 -1
- data/bin/wrest_shell.rb +10 -8
- data/lib/wrest/async_request/event_machine_backend.rb +3 -1
- data/lib/wrest/async_request/thread_backend.rb +5 -2
- data/lib/wrest/async_request/thread_pool.rb +4 -2
- data/lib/wrest/async_request.rb +7 -6
- data/lib/wrest/cache_proxy.rb +39 -28
- data/lib/wrest/caching/memcached.rb +21 -18
- data/lib/wrest/caching/redis.rb +22 -22
- data/lib/wrest/caching.rb +16 -14
- data/lib/wrest/callback.rb +19 -16
- data/lib/wrest/components/container/alias_accessors.rb +51 -47
- data/lib/wrest/components/container/typecaster.rb +146 -95
- data/lib/wrest/components/container.rb +171 -152
- data/lib/wrest/components/mutators/base.rb +43 -34
- data/lib/wrest/components/mutators/camel_to_snake_case.rb +7 -3
- data/lib/wrest/components/mutators/{xml_mini_type_caster.rb → xml_type_caster.rb} +29 -16
- data/lib/wrest/components/mutators.rb +21 -19
- data/lib/wrest/components/translators/content_types.rb +20 -16
- data/lib/wrest/components/translators/json.rb +19 -16
- data/lib/wrest/components/translators/txt.rb +19 -15
- data/lib/wrest/components/translators/xml/conversions.rb +56 -0
- data/lib/wrest/components/translators/xml.rb +60 -18
- data/lib/wrest/components/translators.rb +7 -6
- data/lib/wrest/components.rb +11 -8
- data/lib/wrest/core_ext/hash/conversions.rb +10 -10
- data/lib/wrest/core_ext/hash.rb +4 -2
- data/lib/wrest/core_ext/string/conversions.rb +14 -13
- data/lib/wrest/core_ext/string.rb +5 -3
- data/lib/wrest/exceptions.rb +4 -2
- data/lib/wrest/hash_with_case_insensitive_access.rb +8 -8
- data/lib/wrest/hash_with_indifferent_access.rb +442 -0
- data/lib/wrest/http_codes.rb +20 -19
- data/lib/wrest/http_shared/headers.rb +2 -0
- data/lib/wrest/http_shared/standard_headers.rb +2 -2
- data/lib/wrest/http_shared/standard_tokens.rb +8 -6
- data/lib/wrest/http_shared.rb +5 -3
- data/lib/wrest/multipart.rb +20 -11
- data/lib/wrest/native/connection_factory.rb +15 -11
- data/lib/wrest/native/delete.rb +15 -11
- data/lib/wrest/native/get.rb +60 -55
- data/lib/wrest/native/options.rb +15 -11
- data/lib/wrest/native/patch.rb +27 -0
- data/lib/wrest/native/post.rb +15 -11
- data/lib/wrest/native/post_multipart.rb +22 -18
- data/lib/wrest/native/put.rb +16 -12
- data/lib/wrest/native/put_multipart.rb +22 -18
- data/lib/wrest/native/redirection.rb +13 -12
- data/lib/wrest/native/request.rb +144 -106
- data/lib/wrest/native/response.rb +87 -78
- data/lib/wrest/native/session.rb +49 -40
- data/lib/wrest/native.rb +14 -11
- data/lib/wrest/test/request_patches.rb +10 -3
- data/lib/wrest/test.rb +3 -1
- data/lib/wrest/uri/builders.rb +14 -12
- data/lib/wrest/uri.rb +92 -50
- data/lib/wrest/uri_template.rb +11 -7
- data/lib/wrest/utils.rb +129 -0
- data/lib/wrest/version.rb +3 -1
- data/lib/wrest.rb +31 -33
- data/lib/wrest_no_ext.rb +2 -0
- metadata +91 -56
- data/lib/wrest/components/mutators/xml_simple_type_caster.rb +0 -37
- data/lib/wrest/xml_mini/jdom/xpath_filter.rb +0 -17
- data/lib/wrest/xml_mini/jdom.rb +0 -6
- data/lib/wrest/xml_mini/libxml/xpath_filter.rb +0 -12
- data/lib/wrest/xml_mini/libxml.rb +0 -8
- data/lib/wrest/xml_mini/nokogiri/xpath_filter.rb +0 -15
- data/lib/wrest/xml_mini/nokogiri.rb +0 -7
- data/lib/wrest/xml_mini/rexml/xpath_filter.rb +0 -15
- data/lib/wrest/xml_mini/rexml.rb +0 -8
- data/lib/wrest/xml_mini.rb +0 -8
data/lib/wrest/native/session.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# Copyright 2009 Sidu Ponnappa
|
2
4
|
|
3
5
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -7,51 +9,58 @@
|
|
7
9
|
# is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
8
10
|
# See the License for the specific language governing permissions and limitations under the License.
|
9
11
|
|
10
|
-
module Wrest
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
@uri = Wrest::Uri.new(uri)
|
24
|
-
@default_headers = { Wrest::Native::StandardHeaders::Connection => Wrest::Native::StandardTokens::KeepAlive }
|
25
|
-
|
26
|
-
yield(self) if block_given?
|
27
|
-
end
|
12
|
+
module Wrest
|
13
|
+
module Native
|
14
|
+
# This class is a wrapper for a keep-alive HTTP connection. It simply passes the
|
15
|
+
# same connection instance as an option to all Wrest::Native::Request instances created using it.
|
16
|
+
#
|
17
|
+
# If at any point the server closes an existing connection during a Session by returning a
|
18
|
+
# Connection: Close header the current connection is destroyed and a fresh one created for the next
|
19
|
+
# request.
|
20
|
+
#
|
21
|
+
# The Session constructor can accept either a String URI or a Wrest::Uri as a parameter. If you
|
22
|
+
# need HTTP authentication, you should use a Wrest::Uri.
|
23
|
+
class Session
|
24
|
+
attr_reader :uri
|
28
25
|
|
29
|
-
|
30
|
-
|
31
|
-
|
26
|
+
def initialize(uri)
|
27
|
+
@uri = Wrest::Uri.new(uri)
|
28
|
+
@default_headers = { Wrest::Native::StandardHeaders::Connection => Wrest::Native::StandardTokens::KeepAlive }
|
32
29
|
|
33
|
-
|
34
|
-
|
35
|
-
end
|
30
|
+
yield(self) if block_given?
|
31
|
+
end
|
36
32
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
def put(path = '', body = '', headers = {}, params = {})
|
42
|
-
maybe_destroy_connection @uri[path, {:connection => self.connection}].put(body, headers.merge(@default_headers), params)
|
43
|
-
end
|
33
|
+
def connection
|
34
|
+
@connection ||= @uri.create_connection
|
35
|
+
end
|
44
36
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
37
|
+
def get(path = '', parameters = {}, headers = {})
|
38
|
+
maybe_destroy_connection @uri[path, { connection: connection }].get(parameters,
|
39
|
+
headers.merge(@default_headers))
|
40
|
+
end
|
41
|
+
|
42
|
+
def post(path = '', body = '', headers = {}, params = {})
|
43
|
+
maybe_destroy_connection @uri[path, { connection: connection }].post(body, headers.merge(@default_headers),
|
44
|
+
params)
|
45
|
+
end
|
46
|
+
|
47
|
+
def put(path = '', body = '', headers = {}, params = {})
|
48
|
+
maybe_destroy_connection @uri[path, { connection: connection }].put(body, headers.merge(@default_headers),
|
49
|
+
params)
|
50
|
+
end
|
51
|
+
|
52
|
+
def delete(path = '', parameters = {}, headers = {})
|
53
|
+
maybe_destroy_connection @uri[path, { connection: connection }].delete(parameters,
|
54
|
+
headers.merge(@default_headers))
|
55
|
+
end
|
56
|
+
|
57
|
+
def maybe_destroy_connection(response)
|
58
|
+
if response.connection_closed?
|
59
|
+
Wrest.logger.warn "Connection #{@connection.hash} has been closed by the server"
|
60
|
+
@connection = nil
|
61
|
+
end
|
62
|
+
response
|
53
63
|
end
|
54
|
-
response
|
55
64
|
end
|
56
65
|
end
|
57
66
|
end
|
data/lib/wrest/native.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# Copyright 2009 Sidu Ponnappa
|
2
4
|
|
3
5
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -18,16 +20,17 @@ module Wrest
|
|
18
20
|
end
|
19
21
|
end
|
20
22
|
|
21
|
-
require
|
22
|
-
require
|
23
|
-
require
|
24
|
-
require
|
25
|
-
require
|
26
|
-
require
|
27
|
-
require
|
28
|
-
require
|
29
|
-
require
|
30
|
-
require
|
23
|
+
require 'wrest/native/connection_factory'
|
24
|
+
require 'wrest/native/response'
|
25
|
+
require 'wrest/native/redirection'
|
26
|
+
require 'wrest/native/request'
|
27
|
+
require 'wrest/native/get'
|
28
|
+
require 'wrest/native/put'
|
29
|
+
require 'wrest/native/patch'
|
30
|
+
require 'wrest/native/post'
|
31
|
+
require 'wrest/native/delete'
|
32
|
+
require 'wrest/native/options'
|
33
|
+
require 'wrest/native/session'
|
31
34
|
|
32
35
|
# default to using Native libs
|
33
|
-
Wrest::Http = Wrest::Native
|
36
|
+
Wrest::Http = Wrest::Native
|
@@ -1,5 +1,12 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Wrest
|
4
|
+
module Native
|
5
|
+
class Request
|
6
|
+
def invoke
|
7
|
+
raise Wrest::Exceptions::RealRequestMadeInTestEnvironmet,
|
8
|
+
'A real HTTP request was made while running tests. Please avoid using live HTTP connections while testing and replace them with mocks.'
|
9
|
+
end
|
10
|
+
end
|
4
11
|
end
|
5
12
|
end
|
data/lib/wrest/test.rb
CHANGED
data/lib/wrest/uri/builders.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Wrest
|
2
4
|
class Uri
|
3
5
|
# Contains methods that depend on Uri#clone to build
|
@@ -5,42 +7,42 @@ module Wrest
|
|
5
7
|
module Builders
|
6
8
|
# Returns a Uri object that uses threads to perform asynchronous requests.
|
7
9
|
def using_threads
|
8
|
-
clone(:
|
10
|
+
clone(asynchronous_backend: Wrest::AsyncRequest::ThreadBackend.new)
|
9
11
|
end
|
10
12
|
|
11
13
|
# Returns a Uri object that uses eventmachine to perform asynchronous requests.
|
12
|
-
# Remember to do Wrest::AsyncRequest.enable_em first so that
|
14
|
+
# Remember to do Wrest::AsyncRequest.enable_em first so that
|
13
15
|
# EventMachine is available for use.
|
14
16
|
def using_em
|
15
|
-
clone(:
|
17
|
+
clone(asynchronous_backend: Wrest::AsyncRequest::EventMachineBackend.new)
|
16
18
|
end
|
17
19
|
|
18
20
|
# Returns a Uri object that uses hash for caching responses.
|
19
21
|
def using_hash
|
20
|
-
clone(:
|
22
|
+
clone(cache_store: {})
|
21
23
|
end
|
22
24
|
|
23
25
|
# Returns a Uri object that uses memcached for caching responses.
|
24
|
-
# Remember to do Wrest::AsyncRequest.enable_memcached first so that
|
26
|
+
# Remember to do Wrest::AsyncRequest.enable_memcached first so that
|
25
27
|
# memcached is available for use.
|
26
28
|
def using_memcached
|
27
|
-
clone(:
|
29
|
+
clone(cache_store: Wrest::Caching::Memcached.new)
|
28
30
|
end
|
29
31
|
|
30
32
|
def using_redis
|
31
|
-
clone(:
|
33
|
+
clone(cache_store: Wrest::Caching::Redis.new)
|
32
34
|
end
|
33
35
|
|
34
|
-
# Disables using the globally configured cache for GET requests
|
36
|
+
# Disables using the globally configured cache for GET requests
|
35
37
|
# made using the Uri returned by this method.
|
36
38
|
def disable_cache
|
37
|
-
clone(:
|
39
|
+
clone(disable_cache: true)
|
38
40
|
end
|
39
|
-
|
41
|
+
|
40
42
|
# Sets the specified string as the cookie for the Uri
|
41
43
|
def using_cookie(cookie_string)
|
42
|
-
clone(:
|
44
|
+
clone(default_headers: { Wrest::H::Cookie => cookie_string })
|
43
45
|
end
|
44
46
|
end
|
45
47
|
end
|
46
|
-
end
|
48
|
+
end
|
data/lib/wrest/uri.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# Copyright 2009 Sidu Ponnappa
|
2
4
|
|
3
5
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -7,7 +9,7 @@
|
|
7
9
|
# is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
8
10
|
# See the License for the specific language governing permissions and limitations under the License.
|
9
11
|
|
10
|
-
module Wrest
|
12
|
+
module Wrest # :nodoc:
|
11
13
|
# Wrest::Uri provides a simple api for
|
12
14
|
# REST calls. String#to_uri is a convenience
|
13
15
|
# method to build a Wrest::Uri from a string url.
|
@@ -17,13 +19,13 @@ module Wrest #:nodoc:
|
|
17
19
|
# Example:
|
18
20
|
# "http://kaiwren:fupuppies@coathangers.com/portal/1".to_uri
|
19
21
|
# "http://coathangers.com/portal/1".to_uri(:username => 'kaiwren', :password => 'fupuppies')
|
20
|
-
#
|
22
|
+
#
|
21
23
|
# The second form is preferred as it can handle passwords with special characters like ^ and @
|
22
24
|
#
|
23
25
|
# You can find examples that use real APIs (like delicious) under the wrest/examples directory.
|
24
26
|
class Uri
|
25
27
|
attr_reader :uri, :username, :password, :uri_string, :uri_path, :query, :default_headers
|
26
|
-
|
28
|
+
|
27
29
|
# Valid tuples for the options are:
|
28
30
|
# :asynchronous_backend => Can currently be set to either Wrest::AsyncRequest::EventMachineBackend.new
|
29
31
|
# or Wrest::AsyncRequest::ThreadBackend.new. Easier to do using Uri#using_em and
|
@@ -36,29 +38,21 @@ module Wrest #:nodoc:
|
|
36
38
|
# defaults if there are any clashes. Use this to set cookies or use OAuth2 Authorize
|
37
39
|
# headers. When extending or cloning a Uri, passing in a new set of default_headers
|
38
40
|
# will result in the old set being overridden.
|
41
|
+
# :username, :password => HTTP authentication. Passing nil for either username or password will skip it.
|
39
42
|
# See Wrest::Native::Request for other available options and their default values.
|
40
43
|
def initialize(uri_string, options = {})
|
41
44
|
@options = options.clone
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
@query = uri_scheme[-2] || ''
|
48
|
-
@username = (@options[:username] ||= @uri.user)
|
49
|
-
@password = (@options[:password] ||= @uri.password)
|
50
|
-
@asynchronous_backend = @options[:asynchronous_backend] || Wrest::AsyncRequest.default_backend
|
51
|
-
@options[:callback] = Callback.new(@options[:callback]) if @options[:callback]
|
52
|
-
@default_headers = @options[:default_headers] || {}
|
53
|
-
end
|
54
|
-
|
55
|
-
# Builds a Wrest::UriTemplate by extending the current URI
|
45
|
+
setup_uri_state!(uri_string)
|
46
|
+
setup_request_config!
|
47
|
+
end
|
48
|
+
|
49
|
+
# Builds a Wrest::UriTemplate by extending the current URI
|
56
50
|
# with the pattern passed to it.
|
57
51
|
def to_template(pattern)
|
58
|
-
template_pattern = URI.join(uri_string,pattern).to_s
|
52
|
+
template_pattern = URI.join(uri_string, pattern).to_s
|
59
53
|
UriTemplate.new(template_pattern, @options)
|
60
54
|
end
|
61
|
-
|
55
|
+
|
62
56
|
# Build a new Wrest::Uri by appending _path_ to
|
63
57
|
# the current uri. If the original Wrest::Uri
|
64
58
|
# has a username and password, that will be
|
@@ -77,11 +71,11 @@ module Wrest #:nodoc:
|
|
77
71
|
def [](path, options = nil)
|
78
72
|
Uri.new(uri + File.join(uri_path, path), options || @options)
|
79
73
|
end
|
80
|
-
|
74
|
+
|
81
75
|
# Clones a Uri, building a new instance with exactly the same uri string.
|
82
76
|
# You can however change the Uri options or add new ones.
|
83
77
|
def clone(opts = {})
|
84
|
-
merged_options =
|
78
|
+
merged_options = @options.merge(opts)
|
85
79
|
merged_options[:default_headers] = opts[:default_headers] ? @default_headers.merge(opts[:default_headers]) : {}
|
86
80
|
Uri.new(@uri_string, merged_options)
|
87
81
|
end
|
@@ -89,50 +83,61 @@ module Wrest #:nodoc:
|
|
89
83
|
def eql?(other)
|
90
84
|
self == other
|
91
85
|
end
|
92
|
-
|
86
|
+
|
93
87
|
def ==(other)
|
94
88
|
return false if other.class != self.class
|
95
|
-
|
89
|
+
|
90
|
+
other.uri == uri && username == other.username && password == other.password
|
96
91
|
end
|
97
|
-
|
92
|
+
|
98
93
|
def hash
|
99
|
-
@uri
|
94
|
+
[@uri, @username, @password].hash
|
100
95
|
end
|
101
|
-
|
96
|
+
|
102
97
|
# This produces exactly the same string as the Wrest::Uri was constructed with.
|
103
98
|
# If the orignial URI contained a HTTP username and password, that too will
|
104
99
|
# show up, so be careful if using this for logging.
|
105
100
|
def to_s
|
106
101
|
uri_string
|
107
102
|
end
|
108
|
-
|
109
|
-
|
103
|
+
|
104
|
+
# :nodoc:
|
110
105
|
def build_get(parameters = {}, headers = {}, &block)
|
111
|
-
Http::Get.new(self, parameters, default_headers.merge(headers),
|
106
|
+
Http::Get.new(self, parameters, default_headers.merge(headers),
|
107
|
+
block ? @options.merge(callback_block: block) : @options)
|
112
108
|
end
|
113
|
-
|
114
|
-
|
109
|
+
|
110
|
+
# :nodoc:
|
115
111
|
def build_put(body = '', headers = {}, parameters = {}, &block)
|
116
|
-
Http::Put.new(self, body.to_s, default_headers.merge(headers), parameters,
|
112
|
+
Http::Put.new(self, body.to_s, default_headers.merge(headers), parameters,
|
113
|
+
block ? @options.merge(callback_block: block) : @options)
|
114
|
+
end
|
115
|
+
|
116
|
+
# :nodoc:
|
117
|
+
def build_patch(body = '', headers = {}, parameters = {}, &block)
|
118
|
+
Http::Patch.new(self, body.to_s, default_headers.merge(headers), parameters,
|
119
|
+
block ? @options.merge(callback_block: block) : @options)
|
117
120
|
end
|
118
|
-
|
119
|
-
|
121
|
+
|
122
|
+
# :nodoc:
|
120
123
|
def build_post(body = '', headers = {}, parameters = {}, &block)
|
121
|
-
Http::Post.new(self, body.to_s, default_headers.merge(headers), parameters,
|
124
|
+
Http::Post.new(self, body.to_s, default_headers.merge(headers), parameters,
|
125
|
+
block ? @options.merge(callback_block: block) : @options)
|
122
126
|
end
|
123
127
|
|
124
|
-
|
125
|
-
def build_post_form(parameters ={}, headers = {}, &block)
|
128
|
+
# :nodoc:
|
129
|
+
def build_post_form(parameters = {}, headers = {}, &block)
|
126
130
|
headers = default_headers.merge(headers).merge(Wrest::H::ContentType => Wrest::T::FormEncoded)
|
127
|
-
body = parameters
|
128
|
-
Http::Post.new(self, body, headers, {}, block ? @options.merge(:
|
131
|
+
body = Utils.hash_to_param(parameters)
|
132
|
+
Http::Post.new(self, body, headers, {}, block ? @options.merge(callback_block: block) : @options)
|
129
133
|
end
|
130
134
|
|
131
|
-
|
135
|
+
# :nodoc:
|
132
136
|
def build_delete(parameters = {}, headers = {}, &block)
|
133
|
-
Http::Delete.new(self, parameters, default_headers.merge(headers),
|
137
|
+
Http::Delete.new(self, parameters, default_headers.merge(headers),
|
138
|
+
block ? @options.merge(callback_block: block) : @options)
|
134
139
|
end
|
135
|
-
|
140
|
+
|
136
141
|
# Make a GET request to this URI. This is a convenience API
|
137
142
|
# that creates a Wrest::Native::Get, executes it and returns a Wrest::Native::Response.
|
138
143
|
#
|
@@ -143,7 +148,7 @@ module Wrest #:nodoc:
|
|
143
148
|
|
144
149
|
# Make a GET request to this URI. This is a convenience API
|
145
150
|
# that creates a Wrest::Native::Get.
|
146
|
-
#
|
151
|
+
#
|
147
152
|
# Remember to escape all parameter strings if necessary, using URI.escape
|
148
153
|
#
|
149
154
|
# Note: get_async does not return a response and the response should be accessed through callbacks.
|
@@ -171,6 +176,24 @@ module Wrest #:nodoc:
|
|
171
176
|
@asynchronous_backend.execute(build_put(body, headers, parameters, &block))
|
172
177
|
end
|
173
178
|
|
179
|
+
# Make a PATCH request to this URI. This is a convenience API
|
180
|
+
# that creates a Wrest::Native::Patch, executes it and returns a Wrest::Native::Response.
|
181
|
+
#
|
182
|
+
# Remember to escape all parameter strings if necessary, using URI.escape
|
183
|
+
def patch(body = '', headers = {}, parameters = {}, &block)
|
184
|
+
build_patch(body, headers, parameters, &block).invoke
|
185
|
+
end
|
186
|
+
|
187
|
+
# Make a PATCH request to this URI. This is a convenience API
|
188
|
+
# that creates a Wrest::Native::Patch.
|
189
|
+
#
|
190
|
+
# Remember to escape all parameter strings if necessary, using URI.escape
|
191
|
+
#
|
192
|
+
# Note: patch_async does not return a response and the response should be accessed through callbacks.
|
193
|
+
def patch_async(body = '', headers = {}, parameters = {}, &block)
|
194
|
+
@asynchronous_backend.execute(build_patch(body, headers, parameters, &block))
|
195
|
+
end
|
196
|
+
|
174
197
|
# Makes a POST request to this URI. This is a convenience API
|
175
198
|
# that creates a Wrest::Native::Post, executes it and returns a Wrest::Native::Response.
|
176
199
|
#
|
@@ -188,9 +211,9 @@ module Wrest #:nodoc:
|
|
188
211
|
def post_async(body = '', headers = {}, parameters = {}, &block)
|
189
212
|
@asynchronous_backend.execute(build_post(body, headers, parameters, &block))
|
190
213
|
end
|
191
|
-
|
214
|
+
|
192
215
|
# Makes a POST request to this URI. This is a convenience API
|
193
|
-
# that mimics a form being posted; some allegly RESTful APIs like FCBK require
|
216
|
+
# that mimics a form being posted; some allegly RESTful APIs like FCBK require
|
194
217
|
# this.
|
195
218
|
#
|
196
219
|
# Form encoding involves munging the parameters into a string and placing them
|
@@ -201,7 +224,7 @@ module Wrest #:nodoc:
|
|
201
224
|
end
|
202
225
|
|
203
226
|
# Makes a POST request to this URI. This is a convenience API
|
204
|
-
# that mimics a form being posted; some allegly RESTful APIs like FCBK require
|
227
|
+
# that mimics a form being posted; some allegly RESTful APIs like FCBK require
|
205
228
|
# this.
|
206
229
|
#
|
207
230
|
# Form encoding involves munging the parameters into a string and placing them
|
@@ -239,7 +262,7 @@ module Wrest #:nodoc:
|
|
239
262
|
Http::Options.new(self, @options).invoke
|
240
263
|
end
|
241
264
|
|
242
|
-
def https?
|
265
|
+
def https?
|
243
266
|
@uri.is_a?(URI::HTTPS)
|
244
267
|
end
|
245
268
|
|
@@ -255,16 +278,35 @@ module Wrest #:nodoc:
|
|
255
278
|
def protocol
|
256
279
|
uri.scheme
|
257
280
|
end
|
258
|
-
|
281
|
+
|
259
282
|
def host
|
260
283
|
uri.host
|
261
284
|
end
|
262
|
-
|
285
|
+
|
263
286
|
def port
|
264
287
|
uri.port
|
265
288
|
end
|
266
|
-
|
289
|
+
|
267
290
|
include Http::ConnectionFactory
|
268
291
|
include Uri::Builders
|
292
|
+
|
293
|
+
private
|
294
|
+
|
295
|
+
def setup_request_config!
|
296
|
+
@username = (@options[:username] ||= @uri.user)
|
297
|
+
@password = (@options[:password] ||= @uri.password)
|
298
|
+
@asynchronous_backend = @options[:asynchronous_backend] || Wrest::AsyncRequest.default_backend
|
299
|
+
@options[:callback] = Callback.new(@options[:callback]) if @options[:callback]
|
300
|
+
@default_headers = @options[:default_headers] || {}
|
301
|
+
end
|
302
|
+
|
303
|
+
def setup_uri_state!(uri_string)
|
304
|
+
@uri_string = uri_string.to_s
|
305
|
+
@uri = URI.parse(@uri_string)
|
306
|
+
uri_scheme = URI.split(@uri_string)
|
307
|
+
@uri_path = uri_scheme[-4].split('?').first || ''
|
308
|
+
@uri_path = (@uri_path.empty? ? '/' : @uri_path)
|
309
|
+
@query = uri_scheme[-2] || ''
|
310
|
+
end
|
269
311
|
end
|
270
312
|
end
|
data/lib/wrest/uri_template.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# Copyright 2009 Sidu Ponnappa
|
2
4
|
|
3
5
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -10,12 +12,13 @@
|
|
10
12
|
module Wrest
|
11
13
|
class UriTemplate
|
12
14
|
attr_reader :uri_pattern
|
15
|
+
|
13
16
|
def initialize(uri_pattern, options = {})
|
14
17
|
@uri_pattern = uri_pattern.clone
|
15
18
|
@options = options.clone
|
16
19
|
end
|
17
|
-
|
18
|
-
# Builds a new Wrest::Uri from this uri template
|
20
|
+
|
21
|
+
# Builds a new Wrest::Uri from this uri template
|
19
22
|
# by replacing the keys in the options that match with
|
20
23
|
# the corressponding values.
|
21
24
|
#
|
@@ -40,11 +43,11 @@ module Wrest
|
|
40
43
|
# )
|
41
44
|
# => #<Wrest::Uri:0x18e0bec @uri=#<URI::HTTP:0x18e09a8 URL:http://kaiwren:fupuppies@coathangers.com/portal/1>>
|
42
45
|
def to_uri(options = {})
|
43
|
-
|
44
|
-
Wrest::Uri.new(merged_options.inject(uri_pattern.clone) do |uri_string, tuple|
|
46
|
+
merged_options = @options.merge(options)
|
47
|
+
Wrest::Uri.new(merged_options.inject(uri_pattern.clone) do |uri_string, tuple|
|
45
48
|
key, value = tuple
|
46
|
-
uri_string.gsub(":#{key
|
47
|
-
end
|
49
|
+
uri_string.gsub(":#{key}", value.to_s)
|
50
|
+
end, @options)
|
48
51
|
end
|
49
52
|
|
50
53
|
def [](path)
|
@@ -53,7 +56,8 @@ module Wrest
|
|
53
56
|
|
54
57
|
def ==(other)
|
55
58
|
return false if other.class != self.class
|
56
|
-
|
59
|
+
|
60
|
+
other.uri_pattern == uri_pattern
|
57
61
|
end
|
58
62
|
end
|
59
63
|
end
|
data/lib/wrest/utils.rb
ADDED
@@ -0,0 +1,129 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Wrest
|
4
|
+
module Utils
|
5
|
+
module_function
|
6
|
+
|
7
|
+
# https://github.com/rails/rails/commit/2a371368c91789a4d689d6a84eb20b238c37678a
|
8
|
+
# A string is blank if it's empty or contains whitespaces only:
|
9
|
+
#
|
10
|
+
# "".blank? # => true
|
11
|
+
# " ".blank? # => true
|
12
|
+
# " ".blank? # => true
|
13
|
+
# " something here ".blank? # => false
|
14
|
+
#
|
15
|
+
def string_blank?(string)
|
16
|
+
string !~ /[^[:space:]]/
|
17
|
+
end
|
18
|
+
|
19
|
+
# https://github.com/rails/rails/commit/69b550fc88f0e155ab997476e576142a2dbec324
|
20
|
+
# Tries to find a constant with the name specified in the argument string.
|
21
|
+
#
|
22
|
+
# constantize('Module') # => Module
|
23
|
+
# constantize('Foo::Bar') # => Foo::Bar
|
24
|
+
#
|
25
|
+
# The name is assumed to be the one of a top-level constant, no matter
|
26
|
+
# whether it starts with "::" or not. No lexical context is taken into
|
27
|
+
# account:
|
28
|
+
#
|
29
|
+
# C = 'outside'
|
30
|
+
# module M
|
31
|
+
# C = 'inside'
|
32
|
+
# C # => 'inside'
|
33
|
+
# constantize('C') # => 'outside', same as ::C
|
34
|
+
# end
|
35
|
+
#
|
36
|
+
# NameError is raised when the name is not in CamelCase or the constant is
|
37
|
+
# unknown.
|
38
|
+
def string_constantize(camel_cased_word)
|
39
|
+
Object.const_get(camel_cased_word)
|
40
|
+
end
|
41
|
+
|
42
|
+
# https://github.com/rails/rails/commit/69b550fc88f0e155ab997476e576142a2dbec324
|
43
|
+
# Removes the module part from the expression in the string.
|
44
|
+
#
|
45
|
+
# demodulize('ActiveSupport::Inflector::Inflections') # => "Inflections"
|
46
|
+
# demodulize('Inflections') # => "Inflections"
|
47
|
+
# demodulize('::Inflections') # => "Inflections"
|
48
|
+
# demodulize('') # => ""
|
49
|
+
#
|
50
|
+
def string_demodulize(path)
|
51
|
+
path = path.to_s
|
52
|
+
if (i = path.rindex('::'))
|
53
|
+
path[(i + 2)..]
|
54
|
+
else
|
55
|
+
path
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
# https://github.com/rails/rails/commit/69b550fc88f0e155ab997476e576142a2dbec324
|
60
|
+
# Makes an underscored, lowercase form from the expression in the string.
|
61
|
+
#
|
62
|
+
# Changes '::' to '/' to convert namespaces to paths.
|
63
|
+
#
|
64
|
+
# underscore('ActiveModel') # => "active_model"
|
65
|
+
# underscore('ActiveModel::Errors') # => "active_model/errors"
|
66
|
+
#
|
67
|
+
# As a rule of thumb you can think of +underscore+ as the inverse of
|
68
|
+
# #camelize, though there are cases where that does not hold:
|
69
|
+
#
|
70
|
+
# camelize(underscore('SSLError')) # => "SslError"
|
71
|
+
def string_underscore(camel_cased_word)
|
72
|
+
return camel_cased_word.to_s unless /[A-Z-]|::/.match?(camel_cased_word)
|
73
|
+
|
74
|
+
word = camel_cased_word.to_s.gsub('::', '/')
|
75
|
+
word.gsub!(/([A-Z]+)(?=[A-Z][a-z])|([a-z\d])(?=[A-Z])/) { (Regexp.last_match(1) || Regexp.last_match(2)) << '_' }
|
76
|
+
word.tr!('-', '_')
|
77
|
+
word.downcase!
|
78
|
+
word
|
79
|
+
end
|
80
|
+
|
81
|
+
# https://github.com/rails/rails/commit/a0d7247d1509762283c61182ad82c2eed8d54757
|
82
|
+
# Returns a string representation of the receiver suitable for use as a URL
|
83
|
+
# query string:
|
84
|
+
#
|
85
|
+
# {:name => 'David', :nationality => 'Danish'}.to_param
|
86
|
+
# # => "name=David&nationality=Danish"
|
87
|
+
#
|
88
|
+
# The string pairs "key=value" that conform the query string
|
89
|
+
# are sorted lexicographically in ascending order.
|
90
|
+
#
|
91
|
+
def hash_to_param(hash)
|
92
|
+
hash.collect do |key, value|
|
93
|
+
object_to_query(key, value)
|
94
|
+
end.sort * '&'
|
95
|
+
end
|
96
|
+
|
97
|
+
# https://github.com/rails/rails/commit/52b71c01fd3c8a87152f55129a8cb3234190734a
|
98
|
+
#
|
99
|
+
# Converts an object into a string suitable for use as a URL query string, using the given <tt>key</tt> as the
|
100
|
+
# param name.
|
101
|
+
def object_to_query(key, object)
|
102
|
+
"#{CGI.escape(key.to_s)}=#{CGI.escape(object.to_s)}"
|
103
|
+
end
|
104
|
+
|
105
|
+
# https://github.com/rails/rails/commit/18707ab17fa492eb25ad2e8f9818a320dc20b823
|
106
|
+
# An object is blank if it's false, empty, or a whitespace string.
|
107
|
+
# For example, +nil+, '', ' ', [], {}, and +false+ are all blank.
|
108
|
+
#
|
109
|
+
# This simplifies
|
110
|
+
#
|
111
|
+
# !address || address.empty?
|
112
|
+
#
|
113
|
+
# to
|
114
|
+
#
|
115
|
+
# address.blank?
|
116
|
+
#
|
117
|
+
# @return [true, false]
|
118
|
+
def object_blank?(object)
|
119
|
+
object.respond_to?(:empty?) ? !!object.empty? : !object
|
120
|
+
end
|
121
|
+
|
122
|
+
# https://github.com/rails/rails/commit/6372d23616b13c62c7a12efa89f958b334dd66ae
|
123
|
+
# Converts self to an integer number of seconds since the Unix epoch.
|
124
|
+
def datetime_to_i(datetime)
|
125
|
+
seconds_per_day = 86_400
|
126
|
+
((datetime - ::DateTime.civil(1970)) * seconds_per_day).to_i
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|