rest-client-components 0.2.1 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -6,16 +6,19 @@ Want to add transparent HTTP caching to the rest-client[http://github.com/archil
6
6
  require 'restclient/components'
7
7
  require 'rack/cache'
8
8
  RestClient.enable Rack::Cache
9
+ RestClient.get "http://some/cacheable/resource"
9
10
 
10
11
  Want to log the requests in the commonlog format ?
11
12
  require 'restclient/components'
12
13
  RestClient.enable Rack::CommonLogger, STDOUT
14
+ RestClient.get "http://some/resource"
13
15
 
14
16
  Want to enable both ?
15
17
  require 'restclient/components'
16
18
  require 'rack/cache'
17
19
  RestClient.enable Rack::CommonLogger, STDOUT
18
20
  RestClient.enable Rack::Cache
21
+ RestClient.get "http://some/cacheable/resource"
19
22
 
20
23
  This works with any Rack middleware, thus you can reuse the wide range of existing Rack middleware to add functionalities to RestClient with very little effort.
21
24
  The order in which you enable components will be respected.
@@ -26,6 +29,8 @@ Note that the rest-client behaviour is also respected: you'll get back a RestCli
26
29
  status, header, body = RestClient.get('http://some/url')
27
30
  In that case, you will only get exceptions for connection or timeout errors (RestClient::ServerBrokeConnection or RestClient::RequestTimeout)
28
31
 
32
+ See the examples folder for more details.
33
+
29
34
  = Installation
30
35
 
31
36
  gem install rest-client-components
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.1
1
+ 0.2.2
@@ -10,7 +10,9 @@ module Rack
10
10
 
11
11
  def call(env)
12
12
  status, header, body = @app.call env
13
- parsed_body = ::JSON.parse body.join if header['Content-Type'] =~ /^application\/.*json/i
13
+ content = ""
14
+ body.each{|line| content << line}
15
+ parsed_body = ::JSON.parse content if header['Content-Type'] =~ /^application\/.*json/i
14
16
  [status, header, parsed_body]
15
17
  end
16
18
  end
@@ -0,0 +1,21 @@
1
+ require File.dirname(__FILE__) + '/../lib/restclient/components'
2
+ require 'rack/cache'
3
+ require 'json'
4
+
5
+
6
+ RestClient.log = 'stdout'
7
+ RestClient.enable Rack::Cache, :allow_reload => true, :allow_revalidate => true
8
+
9
+ 2.times do
10
+ resp = RestClient::Resource.new("https://localhost:3443/sid/grid5000").get(:accept => "application/json")
11
+ p ["Cache-Control", resp.headers[:cache_control]]
12
+ end
13
+
14
+ __END__
15
+ RestClient.get "https://localhost:3443/sid/grid5000", headers: {"Accept-encoding"=>"gzip, deflate", "Accept"=>"application/json"}
16
+ # => 200 OK | application/vnd.fr.grid5000.api.grid+json 998 bytes
17
+ cache: [GET /sid/grid5000] miss, store
18
+ ["Cache-Control", "public, must-revalidate"]
19
+ RestClient.get "https://localhost:3443/sid/grid5000", headers: {"If-none-match"=>"\"ef6d9ea6d7d00299dd59a025fa84c19b4e69fafe\"", "Accept-encoding"=>"gzip, deflate", "Accept"=>"application/json", "If-modified-since"=>"Wed, 09 Dec 2009 13:58:54 GMT"}
20
+ cache: [GET /sid/grid5000] stale, valid, store
21
+ ["Cache-Control", "public, must-revalidate"]
@@ -14,7 +14,9 @@ module RestClient
14
14
  raise e
15
15
  else
16
16
  response = RestClient::MockNetHTTPResponse.new(body, status, header)
17
- RestClient::Response.new(response.body.join, response)
17
+ content = ""
18
+ response.body.each{|line| content << line}
19
+ RestClient::Response.new(content, response)
18
20
  end
19
21
  end
20
22
  end
@@ -136,17 +138,26 @@ module RestClient
136
138
 
137
139
  RACK_APP = Proc.new { |env|
138
140
  begin
139
- # get the original request and execute it
140
- response = env['restclient.request'].original_execute
141
- # to satisfy Rack::Lint
142
- response.headers.delete(:status)
143
- [response.code, RestClient.debeautify_headers( response.headers ), [response.to_s]]
141
+ # get the original request, replace headers with those of env, and execute it
142
+ request = env['restclient.request']
143
+ additional_headers = env.keys.select{|k| k=~/^HTTP_/}.inject({}){|accu, k|
144
+ accu[k.gsub("HTTP_", "")] = env[k]
145
+ accu
146
+ }
147
+ request.processed_headers.replace(request.make_headers(additional_headers))
148
+ response = request.original_execute
144
149
  rescue RestClient::ExceptionWithResponse => e
145
150
  env['restclient.error'] = e
146
151
  # e is a Net::HTTPResponse
147
152
  response = RestClient::Response.new(e.response.body, e.response)
148
- [response.code, RestClient.debeautify_headers( response.headers ), [response.to_s]]
149
153
  end
154
+ # to satisfy Rack::Lint
155
+ response.headers.delete(:status)
156
+ header = RestClient.debeautify_headers( response.headers )
157
+ body = response.to_s
158
+ # return the real content-length since RestClient does not do it when decoding gzip responses
159
+ header['Content-Length'] = body.length.to_s if header.has_key?('Content-Length')
160
+ [response.code, header, [body]]
150
161
  }
151
162
 
152
- end
163
+ end
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{rest-client-components}
8
- s.version = "0.2.1"
8
+ s.version = "0.2.2"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Cyril Rohr"]
@@ -37,7 +37,8 @@ Gem::Specification.new do |s|
37
37
  "spec/components_spec.rb",
38
38
  "spec/spec_helper.rb",
39
39
  "examples/caching.rb",
40
- "examples/parsing.rb"
40
+ "examples/parsing.rb",
41
+ "examples/twitter_caching.rb"
41
42
  ]
42
43
 
43
44
  if s.respond_to? :specification_version then
@@ -37,7 +37,6 @@ describe "Components for RestClient" do
37
37
 
38
38
  describe "usage" do
39
39
  before do
40
-
41
40
  @expected_args = {:url=>"http://domain.tld:8888/some/cacheable/resource?q1=a&q2=b", :method=>:get, :headers=>{:additional_header=>"whatever"}}
42
41
  @expected_request = RestClient::Request.new(@expected_args)
43
42
  end
@@ -58,6 +57,47 @@ describe "Components for RestClient" do
58
57
  body.each{|part| content << part}
59
58
  content.should == "body"
60
59
  end
60
+
61
+ it "should cif the requested resource is not in the cache" do
62
+ @expected_request.should_receive(:original_execute).and_return(
63
+ mock('rest-client response',
64
+ :headers => {:content_type => "text/plain, */*", :date => "Mon, 04 Jan 2010 13:37:18 GMT"},
65
+ :code => 200,
66
+ :to_s => 'body'))
67
+ status, header, body = Rack::Lint.new(Rack::CommonLogger.new(Rack::Cache.new(RestClient::RACK_APP))).call(@env.merge(
68
+ 'restclient.request' => @expected_request
69
+ ))
70
+ status.should == 200
71
+ header.should == {"Content-Type"=>"text/plain, */*", "X-Rack-Cache"=>"miss", "Date"=>"Mon, 04 Jan 2010 13:37:18 GMT"}
72
+ content = ""
73
+ body.each{|part| content << part}
74
+ content.should == "body"
75
+ end
76
+
77
+
78
+ it "should add HTTP headers set by Rack middleware to the list of request headers" do
79
+ module Rack
80
+ class AddRequestHeader
81
+ def initialize(app)
82
+ @app = app
83
+ end
84
+ def call(env)
85
+ env['HTTP_X_HEADER'] = "hello"
86
+ @app.call(env)
87
+ end
88
+ end
89
+ end
90
+ @expected_request.should_receive(:processed_headers).and_return(processed_headers=mock("hash processed headers"))
91
+ processed_headers.should_receive(:replace).with(hash_including("X-header" => "hello"))
92
+ @expected_request.should_receive(:original_execute).and_return(
93
+ mock('rest-client response',
94
+ :headers => {:content_type => "text/plain, */*", :date => "Mon, 04 Jan 2010 13:37:18 GMT"},
95
+ :code => 200,
96
+ :to_s => 'body'))
97
+ status, header, body = Rack::Lint.new(Rack::AddRequestHeader.new(RestClient::RACK_APP)).call(@env.merge(
98
+ 'restclient.request' => @expected_request
99
+ ))
100
+ end
61
101
 
62
102
  it "should return a 304 not modified response if the call to the backend returned a 304 not modified response" do
63
103
  @expected_request.should_receive(:original_execute).and_raise(RestClient::NotModified.new(@mock_304_net_http_response))
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rest-client-components
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cyril Rohr
@@ -85,3 +85,4 @@ test_files:
85
85
  - spec/spec_helper.rb
86
86
  - examples/caching.rb
87
87
  - examples/parsing.rb
88
+ - examples/twitter_caching.rb