rack-client 0.3.0 → 0.3.1.pre.a

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (153) hide show
  1. data/Rakefile +12 -14
  2. data/lib/rack/client/adapter/base.rb +23 -14
  3. data/lib/rack/client/adapter/base.rbc +1802 -0
  4. data/lib/rack/client/adapter/simple.rb +53 -21
  5. data/lib/rack/client/adapter/simple.rbc +2063 -0
  6. data/lib/rack/client/adapter.rbc +225 -0
  7. data/lib/rack/client/{dual_band.rb → core/dual_band.rb} +0 -0
  8. data/lib/rack/client/core/dual_band.rbc +380 -0
  9. data/lib/rack/client/{headers.rb → core/headers.rb} +1 -1
  10. data/lib/rack/client/core/headers.rbc +1811 -0
  11. data/lib/rack/client/core/response.rb +50 -0
  12. data/lib/rack/client/core/response.rbc +1105 -0
  13. data/lib/rack/client/core.rb +3 -0
  14. data/lib/rack/client/core.rbc +85 -0
  15. data/lib/rack/client/handler/em-http.rb +3 -7
  16. data/lib/rack/client/handler/em-http.rbc +1648 -0
  17. data/lib/rack/client/handler/excon.rb +6 -14
  18. data/lib/rack/client/handler/excon.rbc +1270 -0
  19. data/lib/rack/client/handler/net_http.rb +7 -4
  20. data/lib/rack/client/handler/net_http.rbc +2400 -0
  21. data/lib/rack/client/handler/typhoeus.rb +12 -5
  22. data/lib/rack/client/handler/typhoeus.rbc +1885 -0
  23. data/lib/rack/client/handler.rbc +340 -0
  24. data/lib/rack/client/{auth → middleware/auth}/abstract/challenge.rb +0 -0
  25. data/lib/rack/client/middleware/auth/abstract/challenge.rbc +1453 -0
  26. data/lib/rack/client/{auth → middleware/auth}/basic.rb +0 -0
  27. data/lib/rack/client/middleware/auth/basic.rbc +1566 -0
  28. data/lib/rack/client/{auth → middleware/auth}/digest/challenge.rb +0 -0
  29. data/lib/rack/client/middleware/auth/digest/challenge.rbc +1124 -0
  30. data/lib/rack/client/{auth → middleware/auth}/digest/md5.rb +0 -0
  31. data/lib/rack/client/middleware/auth/digest/md5.rbc +2241 -0
  32. data/lib/rack/client/{auth → middleware/auth}/digest/params.rb +0 -0
  33. data/lib/rack/client/middleware/auth/digest/params.rbc +365 -0
  34. data/lib/rack/client/middleware/auth.rb +5 -0
  35. data/lib/rack/client/middleware/auth.rbc +117 -0
  36. data/lib/rack/client/{cache → middleware/cache}/cachecontrol.rb +0 -0
  37. data/lib/rack/client/middleware/cache/cachecontrol.rbc +1610 -0
  38. data/lib/rack/client/{cache → middleware/cache}/context.rb +12 -3
  39. data/lib/rack/client/middleware/cache/context.rbc +2074 -0
  40. data/lib/rack/client/{cache → middleware/cache}/entitystore.rb +0 -0
  41. data/lib/rack/client/middleware/cache/entitystore.rbc +1619 -0
  42. data/lib/rack/client/{cache → middleware/cache}/key.rb +0 -0
  43. data/lib/rack/client/middleware/cache/key.rbc +1217 -0
  44. data/lib/rack/client/{cache → middleware/cache}/metastore.rb +0 -0
  45. data/lib/rack/client/middleware/cache/metastore.rbc +2754 -0
  46. data/lib/rack/client/{cache → middleware/cache}/options.rb +0 -0
  47. data/lib/rack/client/middleware/cache/options.rbc +1844 -0
  48. data/lib/rack/client/{cache → middleware/cache}/request.rb +0 -0
  49. data/lib/rack/client/middleware/cache/request.rbc +1020 -0
  50. data/lib/rack/client/{cache → middleware/cache}/response.rb +19 -0
  51. data/lib/rack/client/middleware/cache/response.rbc +1540 -0
  52. data/lib/rack/client/{cache → middleware/cache}/storage.rb +0 -0
  53. data/lib/rack/client/middleware/cache/storage.rbc +1106 -0
  54. data/lib/rack/client/middleware/cache.rb +19 -0
  55. data/lib/rack/client/middleware/cache.rbc +528 -0
  56. data/lib/rack/client/{cookie_jar → middleware/cookie_jar}/context.rb +0 -0
  57. data/lib/rack/client/middleware/cookie_jar/context.rbc +1576 -0
  58. data/lib/rack/client/{cookie_jar → middleware/cookie_jar}/cookie.rb +0 -0
  59. data/lib/rack/client/middleware/cookie_jar/cookie.rbc +2393 -0
  60. data/lib/rack/client/{cookie_jar → middleware/cookie_jar}/cookiestore.rb +0 -0
  61. data/lib/rack/client/middleware/cookie_jar/cookiestore.rbc +1209 -0
  62. data/lib/rack/client/{cookie_jar → middleware/cookie_jar}/options.rb +0 -0
  63. data/lib/rack/client/middleware/cookie_jar/options.rbc +1305 -0
  64. data/lib/rack/client/{cookie_jar → middleware/cookie_jar}/request.rb +0 -0
  65. data/lib/rack/client/middleware/cookie_jar/request.rbc +568 -0
  66. data/lib/rack/client/{cookie_jar → middleware/cookie_jar}/response.rb +0 -0
  67. data/lib/rack/client/middleware/cookie_jar/response.rbc +616 -0
  68. data/lib/rack/client/{cookie_jar → middleware/cookie_jar}/storage.rb +0 -0
  69. data/lib/rack/client/middleware/cookie_jar/storage.rbc +894 -0
  70. data/lib/rack/client/middleware/cookie_jar.rb +17 -0
  71. data/lib/rack/client/middleware/cookie_jar.rbc +471 -0
  72. data/lib/rack/client/{follow_redirects.rb → middleware/follow_redirects.rb} +0 -0
  73. data/lib/rack/client/middleware/follow_redirects.rbc +1344 -0
  74. data/lib/rack/client/middleware.rb +4 -0
  75. data/lib/rack/client/middleware.rbc +101 -0
  76. data/lib/rack/client/parser/base.rbc +898 -0
  77. data/lib/rack/client/parser/body_collection.rbc +1220 -0
  78. data/lib/rack/client/parser/context.rbc +540 -0
  79. data/lib/rack/client/parser/request.rbc +631 -0
  80. data/lib/rack/client/parser/response.rbc +663 -0
  81. data/lib/rack/client/parser.rbc +484 -0
  82. data/lib/rack/client/version.rb +1 -1
  83. data/lib/rack/client/version.rbc +203 -0
  84. data/lib/rack/client.rb +3 -13
  85. data/lib/rack/client.rbc +701 -0
  86. data/spec/core/headers_spec.rb +47 -0
  87. data/spec/core/headers_spec.rbc +1674 -0
  88. data/spec/core/response_spec.rb +78 -0
  89. data/spec/core/response_spec.rbc +2244 -0
  90. data/spec/handler/em_http_spec.rb +4 -19
  91. data/spec/handler/em_http_spec.rbc +224 -0
  92. data/spec/handler/excon_spec.rb +4 -4
  93. data/spec/handler/excon_spec.rbc +224 -0
  94. data/spec/handler/net_http_spec.rb +7 -4
  95. data/spec/handler/net_http_spec.rbc +307 -0
  96. data/spec/handler/typhoeus_spec.rb +6 -17
  97. data/spec/handler/typhoeus_spec.rbc +307 -0
  98. data/spec/helpers/async_helper.rb +31 -0
  99. data/spec/helpers/async_helper.rbc +843 -0
  100. data/spec/helpers/em_http_helper.rb +24 -0
  101. data/spec/helpers/em_http_helper.rbc +663 -0
  102. data/spec/helpers/excon_helper.rb +13 -0
  103. data/spec/helpers/excon_helper.rbc +461 -0
  104. data/spec/helpers/handler_helper.rb +68 -0
  105. data/spec/helpers/handler_helper.rbc +1769 -0
  106. data/spec/helpers/net_http_helper.rb +26 -0
  107. data/spec/helpers/net_http_helper.rbc +806 -0
  108. data/spec/helpers/sync_helper.rb +9 -0
  109. data/spec/helpers/sync_helper.rbc +311 -0
  110. data/spec/helpers/typhoeus_helper.rb +32 -0
  111. data/spec/helpers/typhoeus_helper.rbc +936 -0
  112. data/spec/middleware/cache_spec.rb +25 -0
  113. data/spec/middleware/cache_spec.rbc +712 -0
  114. data/spec/middleware/cookie_jar_spec.rb +19 -0
  115. data/spec/middleware/cookie_jar_spec.rbc +614 -0
  116. data/spec/middleware/etag_spec.rb +10 -0
  117. data/spec/middleware/etag_spec.rbc +438 -0
  118. data/spec/middleware/follow_redirects_spec.rb +12 -0
  119. data/spec/middleware/follow_redirects_spec.rbc +402 -0
  120. data/spec/middleware/lint_spec.rb +10 -0
  121. data/spec/middleware/lint_spec.rbc +392 -0
  122. data/spec/shared/handler_api.rb +33 -0
  123. data/spec/shared/handler_api.rbc +1340 -0
  124. data/spec/shared/streamed_response_api.rb +14 -0
  125. data/spec/shared/streamed_response_api.rbc +508 -0
  126. data/spec/spec_apps/cache.ru +14 -0
  127. data/spec/spec_apps/cookie.ru +12 -0
  128. data/spec/spec_apps/delete.ru +10 -0
  129. data/spec/spec_apps/get.ru +13 -0
  130. data/spec/spec_apps/head.ru +10 -0
  131. data/spec/spec_apps/hello_world.ru +1 -0
  132. data/spec/spec_apps/redirect.ru +13 -0
  133. data/spec/spec_apps/stream.ru +9 -0
  134. data/spec/spec_config.ru +10 -0
  135. data/spec/spec_helper.rb +14 -12
  136. metadata +190 -64
  137. data/lib/rack/client/cache.rb +0 -19
  138. data/lib/rack/client/cookie_jar.rb +0 -17
  139. data/lib/rack/client/response.rb +0 -9
  140. data/spec/apps/example.org.ru +0 -128
  141. data/spec/auth/basic_spec.rb +0 -69
  142. data/spec/auth/digest/md5_spec.rb +0 -69
  143. data/spec/cache_spec.rb +0 -40
  144. data/spec/cookie_jar_spec.rb +0 -37
  145. data/spec/endpoint_spec.rb +0 -30
  146. data/spec/follow_redirect_spec.rb +0 -27
  147. data/spec/handler/async_api_spec.rb +0 -69
  148. data/spec/handler/sync_api_spec.rb +0 -55
  149. data/spec/middleware_helper.rb +0 -37
  150. data/spec/middleware_spec.rb +0 -53
  151. data/spec/parser/json_spec.rb +0 -22
  152. data/spec/parser/yaml_spec.rb +0 -22
  153. data/spec/server_helper.rb +0 -72
@@ -1,37 +0,0 @@
1
- require File.dirname(__FILE__) + '/spec_helper'
2
-
3
- describe Rack::Client::CookieJar do
4
- let(:client) do
5
- Rack::Client.new("http://localhost:#{server.port}") do
6
- use Rack::Client::CookieJar
7
- run Rack::Client::Handler::NetHTTP
8
- end
9
- end
10
-
11
- context 'Synchronous API' do
12
- it 'serves the cookie in future responses' do
13
- response = client.get("http://localhost:#{server.port}/cookied")
14
- response['Set-Cookie'].should_not be_nil
15
- response['rack-client-cookiejar.cookies'].should_not be_nil
16
-
17
- response = client.get("http://localhost:#{server.port}/cookied")
18
- response['Set-Cookie'].should be_nil
19
- response['rack-client-cookiejar.cookies'].should_not be_nil
20
- end
21
- end
22
-
23
- context 'Asynchronous API' do
24
- it 'serves the cookie in future responses' do
25
- client.get("http://localhost:#{server.port}/cookied") do |response|
26
- response['Set-Cookie'].should_not be_nil
27
- response['rack-client-cookiejar.cookies'].should_not be_nil
28
-
29
- client.get("http://localhost:#{server.port}/cookied") do |response|
30
- response['Set-Cookie'].should be_nil
31
- response['rack-client-cookiejar.cookies'].should_not be_nil
32
- end
33
- end
34
- end
35
- end
36
- end
37
-
@@ -1,30 +0,0 @@
1
- require File.dirname(__FILE__) + '/spec_helper'
2
-
3
- require 'sinatra/base'
4
-
5
- class MyApp < Sinatra::Base
6
- get "/awesome" do
7
- "test"
8
- end
9
- end
10
-
11
- describe Rack::Client, "with an Rack app endpoint" do
12
- let(:client) do
13
- Rack::Client.new("http://localhost:#{server.port}") do
14
- run Rack::URLMap.new("http://example.org/" => MyApp)
15
- end
16
- end
17
-
18
- describe "with a custom domain" do
19
- it "returns the body" do
20
- response = client.get("http://example.org/awesome")
21
- response.status.should == 200
22
- response.body.to_s.should == "test"
23
- end
24
-
25
- it "only functions for that domain" do
26
- response = client.get("http://example.org/")
27
- response.status.should == 404
28
- end
29
- end
30
- end
@@ -1,27 +0,0 @@
1
- require File.dirname(__FILE__) + '/spec_helper'
2
-
3
- describe Rack::Client::FollowRedirects do
4
- let(:client) do
5
- Rack::Client.new("http://localhost:#{server.port}") do
6
- use Rack::Client::FollowRedirects
7
- run Rack::Client::Handler::NetHTTP
8
- end
9
- end
10
-
11
- context 'Synchronous API' do
12
- it "follows redirects" do
13
- response = client.get("http://localhost:#{server.port}/redirect")
14
- response.status.should == 200
15
- response.body.to_s.should == "after redirect"
16
- end
17
- end
18
-
19
- context 'Asynchronous API' do
20
- it "follows redirects" do
21
- client.get("http://localhost:#{server.port}/redirect") do |response|
22
- response.status.should == 200
23
- response.body.to_s.should == "after redirect"
24
- end
25
- end
26
- end
27
- end
@@ -1,69 +0,0 @@
1
- require File.dirname(__FILE__) + '/../spec_helper'
2
-
3
- share_examples_for "Asynchronous Request API" do
4
- context 'DELETE request' do
5
- it 'can handle a No Content response' do
6
- client.delete("/shelf/ctm") do |response|
7
- response.status.should == 204
8
- finish
9
- end
10
- end
11
- end
12
-
13
- context 'GET request' do
14
- it 'has the proper response for a basic request' do
15
- client.get("/ping") do |response|
16
- response.status.should == 200
17
- response.body.to_s.should == 'pong'
18
- response["Content-Type"].should == 'text/html'
19
- response["Content-Length"].to_i.should == 4
20
- finish
21
- end
22
- end
23
-
24
- it 'can handle a temporary redirect response' do
25
- client.get("/redirect") do |response|
26
- response.status.should == 302
27
- response["Location"].should == "/after-redirect"
28
- finish
29
- end
30
- end
31
-
32
- it 'can return an empty body' do
33
- client.get("/empty") do |response|
34
- response.body.should be_empty
35
- finish
36
- end
37
- end
38
- end
39
-
40
- context 'HEAD request' do
41
- it 'can handle ETag headers' do
42
- client.head("/shelf") do |response|
43
- response.status.should == 200
44
- response["ETag"].should == "828ef3fdfa96f00ad9f27c383fc9ac7f"
45
- finish
46
- end
47
- end
48
- end
49
-
50
- context 'POST request' do
51
- it 'can send a request body' do
52
- client.post("/posted", {}, "some data") do |response|
53
- response.status.should == 201
54
- response["Created"].should == "awesome"
55
- finish
56
- end
57
- end
58
- end
59
-
60
- context 'PUT request' do
61
- it 'can send a request body' do
62
- client.put("/shelf/ctm", {}, "some data") do |response|
63
- response.status.should == 200
64
- response["Location"].should == "/shelf/ctm"
65
- finish
66
- end
67
- end
68
- end
69
- end
@@ -1,55 +0,0 @@
1
- require File.dirname(__FILE__) + '/../spec_helper'
2
-
3
- share_examples_for "Synchronous Request API" do
4
- context 'DELETE request' do
5
- it 'can handle a No Content response' do
6
- response = client.delete("/shelf/ctm")
7
- response.status.should == 204
8
- end
9
- end
10
-
11
- context 'GET request' do
12
- it 'has the proper response for a basic request' do
13
- response = client.get("/ping")
14
- response.status.should == 200
15
- response.body.to_s.should == 'pong'
16
- response["Content-Type"].should == 'text/html'
17
- response["Content-Length"].to_i.should == 4
18
- end
19
-
20
- it 'can handle a temporary redirect response' do
21
- response = client.get("/redirect")
22
- response.status.should == 302
23
- response["Location"].should == "/after-redirect"
24
- end
25
-
26
- it 'can return an empty body' do
27
- response = client.get("/empty")
28
- response.body.should be_empty
29
- end
30
- end
31
-
32
- context 'HEAD request' do
33
- it 'can handle ETag headers' do
34
- response = client.head("/shelf")
35
- response.status.should == 200
36
- response["ETag"].should == "828ef3fdfa96f00ad9f27c383fc9ac7f"
37
- end
38
- end
39
-
40
- context 'POST request' do
41
- it 'can send a request body' do
42
- response = client.post("/posted", {}, "some data")
43
- response.status.should == 201
44
- response["Created"].should == "awesome"
45
- end
46
- end
47
-
48
- context 'PUT request' do
49
- it 'can send a request body' do
50
- response = client.put("/shelf/ctm", {}, "some data")
51
- response.status.should == 200
52
- response["Location"].should == "/shelf/ctm"
53
- end
54
- end
55
- end
@@ -1,37 +0,0 @@
1
- class LoggerCheck
2
- def initialize(app, &block)
3
- @app, @block = app, block
4
- end
5
-
6
- def call(env)
7
- logger = env['rack.logger']
8
-
9
- @app.call(env)
10
- ensure
11
- @block.call(logger)
12
- end
13
- end
14
-
15
- class ETagFixed < Rack::ETag
16
- def call(env)
17
- status, headers, body = @app.call(env)
18
-
19
- if !headers.has_key?('ETag')
20
- digest, body = digest_body(body)
21
- headers['ETag'] = %("#{digest}")
22
- end
23
-
24
- [status, headers, body]
25
- end
26
-
27
- private
28
- def digest_body(body)
29
- digest = Digest::MD5.new
30
- parts = []
31
- body.each do |part|
32
- digest << part
33
- parts << part
34
- end
35
- [digest.hexdigest, parts]
36
- end
37
- end
@@ -1,53 +0,0 @@
1
- require File.dirname(__FILE__) + '/spec_helper'
2
-
3
- describe Rack::Client, "with a standard piece of Rack middleware" do
4
- context "Rack::ETag" do
5
- let(:client) do
6
- Rack::Client.new("http://localhost:#{server.port}") do
7
- use Rack::ETag
8
- run Rack::Client::Handler::NetHTTP
9
- end
10
- end
11
-
12
- it "successfully uses that middleware" do
13
- pending "Rack::ETag fixes streaming bodies (http://github.com/rack/rack/commit/f10713cce876d370ee5f1018928521d4b43e0dce)"
14
-
15
- response = client.get("http://localhost:#{server.port}/no-etag")
16
- response.status.should == 200
17
- response.headers["ETag"].should_not be_empty
18
- end
19
- end
20
-
21
- context "Rack::ETag (fixed for streaming)" do
22
- let(:client) do
23
- Rack::Client.new("http://localhost:#{server.port}") do
24
- use ETagFixed
25
- run Rack::Client::Handler::NetHTTP
26
- end
27
- end
28
-
29
- it "successfully uses that middleware" do
30
- response = client.get("http://localhost:#{server.port}/no-etag")
31
- response.status.should == 200
32
- response.headers["ETag"].should_not be_empty
33
- end
34
- end
35
-
36
- context "Rack::Logger" do
37
- let(:client) do
38
- Rack::Client.new("http://localhost:#{server.port}") do
39
- use Rack::Logger
40
- use LoggerCheck do |logger|
41
- logger.class.should == Logger
42
- end
43
- run Rack::Client::Handler::NetHTTP
44
- end
45
- end
46
-
47
- it "successfully uses that middleware" do
48
- response = client.get("http://localhost:#{server.port}/no-etag")
49
- response.status.should == 200
50
- end
51
- end
52
- end
53
-
@@ -1,22 +0,0 @@
1
- require File.dirname(__FILE__) + '/../spec_helper'
2
-
3
- describe Rack::Client::Parser::JSON do
4
- let(:client) do
5
- Rack::Client.new("http://localhost:#{server.port}") do
6
- use Rack::Client::Parser
7
- run Rack::Client::Handler::NetHTTP
8
- end
9
- end
10
-
11
- context 'Synchronous API' do
12
- it "injects the parsed body into the response" do
13
- response = client.get("http://localhost:#{server.port}/hash.json")
14
- response.headers['rack-client.body_collection'].should == [{'foo' => 'bar'}]
15
- end
16
-
17
- it "injects the dumped body into the request" do
18
- response = client.post("http://localhost:#{server.port}/echo", {'rack-client.body_collection' => [{'foo' => 'bar'}], 'Content-Type' => 'application/json'}, {})
19
- response.headers['rack-client.body_collection'].should == [{'foo' => 'bar'}]
20
- end
21
- end
22
- end
@@ -1,22 +0,0 @@
1
- require File.dirname(__FILE__) + '/../spec_helper'
2
-
3
- describe Rack::Client::Parser::YAML do
4
- let(:client) do
5
- Rack::Client.new("http://localhost:#{server.port}") do
6
- use Rack::Client::Parser
7
- run Rack::Client::Handler::NetHTTP
8
- end
9
- end
10
-
11
- context 'Synchronous API' do
12
- it "injects the parsed body into the response" do
13
- response = client.get("http://localhost:#{server.port}/hash.yml")
14
- response.headers['rack-client.body_collection'].should == [{:foo => :bar}]
15
- end
16
-
17
- it "injects the dumped body into the request" do
18
- response = client.post("http://localhost:#{server.port}/echo", {'rack-client.body_collection' => [{:foo => :bar}], 'Content-Type' => 'application/x-yaml'}, {})
19
- response.headers['rack-client.body_collection'].should == [{:foo => :bar}]
20
- end
21
- end
22
- end
@@ -1,72 +0,0 @@
1
- class InThreadServer
2
- def self.rackup(*a)
3
- server = new(*a)
4
- server.start
5
- server
6
- end
7
-
8
- attr_accessor :port, :port_range, :pre_spawn_callback, :config_ru, :running
9
-
10
- def initialize(config_ru, pre_spawn_callback = nil, port_range = 8000..10000)
11
- @config_ru, @pre_spawn_callback, @port_range = config_ru, pre_spawn_callback, port_range
12
- end
13
-
14
- def start
15
- return if running
16
- find_port
17
- pre_spawn
18
- spawn_server_thread
19
- wait_for_server
20
- @running = true
21
- end
22
-
23
- def stop
24
- @thread.kill
25
- @running= false
26
- end
27
-
28
- def find_port
29
- return if @port
30
-
31
- @port = @port_range.min
32
-
33
- while(system("lsof -i tcp:#{self.port} > /dev/null")) do
34
- @port += 1
35
- end
36
- end
37
-
38
- def pre_spawn
39
- pre_spawn_callback.call(self) if pre_spawn_callback
40
- end
41
-
42
- def spawn_server_thread
43
- @thread ||= Thread.new {
44
- begin
45
- Rack::Server.new(:Port => @port, :config => @config_ru, :server => 'mongrel').start
46
- rescue
47
- $stderr.puts "Failed to start server"
48
- $stderr.puts $!.inspect
49
- $stderr.puts $!.backtrace
50
- abort
51
- end
52
- }
53
- end
54
-
55
- def wait_for_server
56
- loop do
57
- begin
58
- Rack::Client.get("http://127.0.0.1:#{@port}/")
59
- break
60
- rescue Errno::ECONNREFUSED
61
- sleep 1
62
- end
63
- end
64
- end
65
- end
66
-
67
- class DigestServer < Rack::Auth::Digest::MD5
68
- def initialize(*)
69
- super
70
- self.opaque = '12345'
71
- end
72
- end