resterl 0.0.6 → 0.0.7
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/lib/resterl/base_object.rb +22 -5
- data/lib/resterl/client.rb +16 -3
- data/lib/resterl/generic_request.rb +45 -0
- data/lib/resterl/get_request.rb +29 -0
- data/lib/resterl/post_request.rb +16 -0
- data/lib/resterl.rb +3 -1
- data/resterl.gemspec +5 -3
- metadata +7 -5
- data/lib/resterl/request.rb +0 -72
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.7
|
data/lib/resterl/base_object.rb
CHANGED
@@ -3,7 +3,8 @@ require 'hashie'
|
|
3
3
|
class Resterl::BaseObject #< Hashie::Mash
|
4
4
|
|
5
5
|
include ClassLevelInheritableAttributes
|
6
|
-
cattr_inheritable :resterl_client, :parser, :
|
6
|
+
cattr_inheritable :resterl_client, :parser, :composer, :complete_mime_type,
|
7
|
+
:mapper
|
7
8
|
attr_reader :response
|
8
9
|
|
9
10
|
#self.resterl_client = nil
|
@@ -30,14 +31,30 @@ class Resterl::BaseObject #< Hashie::Mash
|
|
30
31
|
doc = mapper.map(doc) if @mapper
|
31
32
|
new(doc, response)
|
32
33
|
end
|
34
|
+
|
35
|
+
def self.post_to_object url, params = {}, data = {}
|
36
|
+
headers = {
|
37
|
+
'Accept' => complete_mime_type,
|
38
|
+
'Content-Type' => complete_mime_type
|
39
|
+
}
|
40
|
+
data = composer.call(data)
|
41
|
+
response = resterl_client.post(url, params, data, headers)
|
42
|
+
end
|
33
43
|
|
34
44
|
def self.mime_type= t
|
35
|
-
self.parser, self.complete_mime_type = case t
|
45
|
+
self.parser, self.composer, self.complete_mime_type = case t
|
36
46
|
when :json
|
37
|
-
|
47
|
+
# TODO prio 2: Only works when Rails is loaded?
|
48
|
+
[ proc {|str| JSON.parse(str)},
|
49
|
+
proc(&:to_json),
|
50
|
+
'application/json'
|
51
|
+
]
|
38
52
|
when :xml
|
39
|
-
# TODO: Only works when Rails is loaded?
|
40
|
-
[proc {|str| Hash.from_xml(str)},
|
53
|
+
# TODO prio 2: Only works when Rails is loaded?
|
54
|
+
[ proc {|str| Hash.from_xml(str)},
|
55
|
+
proc(&:to_xml),
|
56
|
+
'application/xml'
|
57
|
+
]
|
41
58
|
end
|
42
59
|
end
|
43
60
|
|
data/lib/resterl/client.rb
CHANGED
@@ -32,6 +32,15 @@ class Resterl::Client
|
|
32
32
|
new_get_request url, cache_key, params, headers, old_response
|
33
33
|
end
|
34
34
|
end
|
35
|
+
|
36
|
+
def post url, params, data, headers
|
37
|
+
# Caching nicht notwendig
|
38
|
+
url = setup_url url
|
39
|
+
request = Resterl::PostRequest.new(self, url, params, data, headers)
|
40
|
+
response = request.perform.response
|
41
|
+
|
42
|
+
response
|
43
|
+
end
|
35
44
|
|
36
45
|
private
|
37
46
|
|
@@ -47,7 +56,7 @@ class Resterl::Client
|
|
47
56
|
end
|
48
57
|
|
49
58
|
# Anfrage stellen, ggf. ETag mit übergeben
|
50
|
-
request = Resterl::
|
59
|
+
request = Resterl::GetRequest.new(self, url, params, headers)
|
51
60
|
new_response = request.perform.response
|
52
61
|
|
53
62
|
response, max_age_seconds = case new_response
|
@@ -84,8 +93,12 @@ class Resterl::Client
|
|
84
93
|
end
|
85
94
|
|
86
95
|
def setup_url url
|
87
|
-
|
88
|
-
|
96
|
+
if url =~ /^http/
|
97
|
+
url
|
98
|
+
else
|
99
|
+
bu = options[:base_uri]
|
100
|
+
bu ? "#{bu}#{url}" : url
|
101
|
+
end
|
89
102
|
end
|
90
103
|
|
91
104
|
def data_to_cache_key *args
|
@@ -0,0 +1,45 @@
|
|
1
|
+
class Resterl::GenericRequest
|
2
|
+
attr_accessor :rest_client, :url, :body, :response
|
3
|
+
DEFAULT_HEADERS = {}
|
4
|
+
|
5
|
+
def initialize client, url, query_params, headers
|
6
|
+
@rest_client = client
|
7
|
+
@url = url
|
8
|
+
@query_params = query_params
|
9
|
+
@headers = DEFAULT_HEADERS.merge headers
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def get_http_object_and_query_path
|
15
|
+
uri = URI.parse(url)
|
16
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
17
|
+
apply_ssl http, uri
|
18
|
+
|
19
|
+
path_with_query = uri.path
|
20
|
+
path_with_query << "?#{query_param_string}" unless query_param_string.blank?
|
21
|
+
|
22
|
+
[http, path_with_query]
|
23
|
+
end
|
24
|
+
|
25
|
+
def query_param_string
|
26
|
+
@query_param_string ||= begin
|
27
|
+
@query_params.collect do |key, value|
|
28
|
+
"#{URI.escape(key.to_s)}=#{URI.escape(value.to_s)}"
|
29
|
+
end.join('&')
|
30
|
+
end
|
31
|
+
end
|
32
|
+
def apply_basic_auth request
|
33
|
+
ba = rest_client.options[:basic_auth]
|
34
|
+
request.basic_auth(ba[:username], ba[:password]) if ba
|
35
|
+
end
|
36
|
+
def apply_ssl http, uri
|
37
|
+
if uri.is_a? URI::HTTPS
|
38
|
+
http.use_ssl = true
|
39
|
+
http.verify_mode = rest_client.options[:ssl_verify_mode]
|
40
|
+
end
|
41
|
+
end
|
42
|
+
def redirect_url
|
43
|
+
response['location'] || response.body.match(/<a href=\"([^>]+)\">/i)[1]
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# Redirect code from:
|
2
|
+
# http://railstips.org/blog/archives/2009/03/04/following-redirects-with-nethttp/
|
3
|
+
class Resterl::GetRequest < Resterl::GenericRequest
|
4
|
+
attr_accessor :redirect_limit
|
5
|
+
|
6
|
+
def initialize client, url, query_params, headers
|
7
|
+
super client, url, query_params, headers
|
8
|
+
@redirect_limit = @rest_client.options[:max_redirect_depth]
|
9
|
+
end
|
10
|
+
|
11
|
+
def perform
|
12
|
+
raise TooManyRedirects if redirect_limit < 0
|
13
|
+
|
14
|
+
http, path = get_http_object_and_query_path
|
15
|
+
request = Net::HTTP::Get.new path, @headers
|
16
|
+
apply_basic_auth request
|
17
|
+
self.response = http.request(request)
|
18
|
+
|
19
|
+
# Follow redirects
|
20
|
+
if response.is_a?(Net::HTTPRedirection) &&
|
21
|
+
!response.is_a?(Net::HTTPNotModified)
|
22
|
+
self.url = redirect_url
|
23
|
+
self.redirect_limit -= 1
|
24
|
+
perform
|
25
|
+
end
|
26
|
+
self
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
class Resterl::PostRequest < Resterl::GenericRequest
|
2
|
+
def initialize client, url, query_params, data, headers
|
3
|
+
super client, url, query_params, headers
|
4
|
+
@data = data
|
5
|
+
end
|
6
|
+
def perform
|
7
|
+
http, path = get_http_object_and_query_path
|
8
|
+
request = Net::HTTP::Post.new path, @headers
|
9
|
+
apply_basic_auth request
|
10
|
+
request.body = @data
|
11
|
+
self.response = http.request(request)
|
12
|
+
|
13
|
+
self
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
data/lib/resterl.rb
CHANGED
@@ -15,7 +15,9 @@ require 'resterl/caches/rails_memcached_cache'
|
|
15
15
|
require 'resterl/caches/key_prefix_decorator'
|
16
16
|
|
17
17
|
require 'resterl/client'
|
18
|
-
require 'resterl/
|
18
|
+
require 'resterl/generic_request'
|
19
|
+
require 'resterl/get_request'
|
20
|
+
require 'resterl/post_request'
|
19
21
|
require 'resterl/response'
|
20
22
|
require 'resterl/base_object'
|
21
23
|
|
data/resterl.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{resterl}
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.7"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Florian D\303\274tsch"]
|
12
|
-
s.date = %q{2011-
|
12
|
+
s.date = %q{2011-02-08}
|
13
13
|
s.email = %q{florian.duetsch@nix-wie-weg.de}
|
14
14
|
s.extra_rdoc_files = [
|
15
15
|
"LICENSE",
|
@@ -31,7 +31,9 @@ Gem::Specification.new do |s|
|
|
31
31
|
"lib/resterl/caches/simple_cache.rb",
|
32
32
|
"lib/resterl/class_level_inheritable_attributes.rb",
|
33
33
|
"lib/resterl/client.rb",
|
34
|
-
"lib/resterl/
|
34
|
+
"lib/resterl/generic_request.rb",
|
35
|
+
"lib/resterl/get_request.rb",
|
36
|
+
"lib/resterl/post_request.rb",
|
35
37
|
"lib/resterl/response.rb",
|
36
38
|
"resterl.gemspec",
|
37
39
|
"test/helper.rb",
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: resterl
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 17
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 7
|
10
|
+
version: 0.0.7
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- "Florian D\xC3\xBCtsch"
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
18
|
+
date: 2011-02-08 00:00:00 +01:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -89,7 +89,9 @@ files:
|
|
89
89
|
- lib/resterl/caches/simple_cache.rb
|
90
90
|
- lib/resterl/class_level_inheritable_attributes.rb
|
91
91
|
- lib/resterl/client.rb
|
92
|
-
- lib/resterl/
|
92
|
+
- lib/resterl/generic_request.rb
|
93
|
+
- lib/resterl/get_request.rb
|
94
|
+
- lib/resterl/post_request.rb
|
93
95
|
- lib/resterl/response.rb
|
94
96
|
- resterl.gemspec
|
95
97
|
- test/helper.rb
|
data/lib/resterl/request.rb
DELETED
@@ -1,72 +0,0 @@
|
|
1
|
-
# Redirect code from:
|
2
|
-
# http://railstips.org/blog/archives/2009/03/04/following-redirects-with-nethttp/
|
3
|
-
class Resterl::Request
|
4
|
-
attr_accessor :rest_client, :url, :body, :redirect_limit, :response
|
5
|
-
DEFAULT_HEADERS = {}
|
6
|
-
|
7
|
-
def initialize client, url, query_params, headers
|
8
|
-
@rest_client = client
|
9
|
-
@url = url
|
10
|
-
@query_params = query_params
|
11
|
-
@redirect_limit = @rest_client.options[:max_redirect_depth]
|
12
|
-
@headers = DEFAULT_HEADERS.merge headers
|
13
|
-
end
|
14
|
-
def perform
|
15
|
-
raise TooManyRedirects if redirect_limit < 0
|
16
|
-
|
17
|
-
# build URL
|
18
|
-
#complete_url = url.dup
|
19
|
-
#complete_url << "?#{query_param_string}" unless query_param_string.blank?
|
20
|
-
#puts complete_url
|
21
|
-
uri = URI.parse(url)#complete_url)
|
22
|
-
#puts uri.path
|
23
|
-
|
24
|
-
|
25
|
-
http = Net::HTTP.new(uri.host, uri.port)
|
26
|
-
apply_ssl http, uri
|
27
|
-
|
28
|
-
path_with_query = uri.path
|
29
|
-
path_with_query << "?#{query_param_string}" unless query_param_string.blank?
|
30
|
-
request = Net::HTTP::Get.new path_with_query, @headers
|
31
|
-
apply_basic_auth request
|
32
|
-
self.response = http.request(request)
|
33
|
-
|
34
|
-
# Follow redirects
|
35
|
-
if response.is_a?(Net::HTTPRedirection) &&
|
36
|
-
!response.is_a?(Net::HTTPNotModified)
|
37
|
-
self.url = redirect_url
|
38
|
-
self.redirect_limit -= 1
|
39
|
-
perform
|
40
|
-
end
|
41
|
-
self
|
42
|
-
end
|
43
|
-
|
44
|
-
private
|
45
|
-
|
46
|
-
def query_param_string
|
47
|
-
@query_param_string ||= begin
|
48
|
-
@query_params.collect do |key, value|
|
49
|
-
"#{URI.escape(key.to_s)}=#{URI.escape(value.to_s)}"
|
50
|
-
end.join('&')
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
def redirect_url
|
55
|
-
if response['location'].nil?
|
56
|
-
response.body.match(/<a href=\"([^>]+)\">/i)[1]
|
57
|
-
else
|
58
|
-
response['location']
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
def apply_ssl http, uri
|
63
|
-
if uri.is_a? URI::HTTPS
|
64
|
-
http.use_ssl = true
|
65
|
-
http.verify_mode = rest_client.options[:ssl_verify_mode]
|
66
|
-
end
|
67
|
-
end
|
68
|
-
def apply_basic_auth request
|
69
|
-
ba = rest_client.options[:basic_auth]
|
70
|
-
request.basic_auth(ba[:username], ba[:password]) if ba
|
71
|
-
end
|
72
|
-
end
|