web 0.0.4 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/lib/web.rb CHANGED
@@ -1,4 +1,5 @@
1
- require File.dirname(__FILE__) + '/web/ext/net_http'
1
+ require File.dirname(__FILE__) + '/web/ext/net_http' if defined?(Net::HTTP)
2
+ require File.dirname(__FILE__) + '/web/ext/typhoeus' if defined?(Typhoeus)
2
3
  require File.dirname(__FILE__) + '/web/faker'
3
4
 
4
5
  module Web
@@ -19,6 +20,10 @@ module Web
19
20
  registered << options
20
21
  end
21
22
 
23
+ def unregister_all
24
+ @registered = []
25
+ end
26
+
22
27
  # an array of registrations
23
28
  def registered
24
29
  @registered ||= []
@@ -26,7 +31,7 @@ module Web
26
31
 
27
32
  # Get the cache we're using
28
33
  def cache
29
- @cache ||= RedisCache.new
34
+ @cache ||= MemoryCache.new
30
35
  end
31
36
 
32
37
  end
@@ -104,8 +104,28 @@ module Net
104
104
  protocol = use_ssl? ? 'https' : 'http'
105
105
  path = request.path
106
106
  path = URI.parse(request.path).request_uri if request.path =~ /^http/
107
+ path = path.chop if path.end_with?('/') # remove trailing slashes in caching layer
107
108
  # TODO handle basic auth
108
- "#{protocol}://#{address}:#{port}#{path}"
109
+ if (use_ssl? && port == 443) || (!use_ssl? && port == 80)
110
+ "#{protocol}://#{address}#{path}"
111
+ else
112
+ "#{protocol}://#{address}:#{port}#{path}"
113
+ end
114
+ end
115
+
116
+ end
117
+
118
+ end
119
+
120
+ module Web
121
+
122
+ module ReadableHTTPResponse
123
+
124
+ include HTTPResponse
125
+
126
+ def read_body(dest = nil, &block)
127
+ yield @body if block_given?
128
+ @body
109
129
  end
110
130
 
111
131
  end
@@ -0,0 +1,64 @@
1
+ require 'typhoeus'
2
+
3
+ require File.dirname(__FILE__) + '/../http_response'
4
+
5
+ module Typhoeus
6
+
7
+ class Response
8
+
9
+ def cached?
10
+ !!@cached
11
+ end
12
+
13
+ end
14
+
15
+ class Request
16
+
17
+ # A dummy cache timeout so that our cache always
18
+ # gets called
19
+ def cache_timeout
20
+ 1
21
+ end
22
+
23
+ end
24
+
25
+ class Hydra
26
+
27
+ # Thank you to the creators of Typhoeus for making this so easy
28
+ # to do.
29
+
30
+ def initialize_with_web(options = {})
31
+ initialize_without_web(options)
32
+ # On cache set, record this if we should
33
+ cache_setter do |req|
34
+ web = Web::Faker.new req.method, req.url, req.body, req.headers
35
+ if web.desired?
36
+ res = req.response
37
+ web.record res.code, res.body, res.headers_hash
38
+ end
39
+ end
40
+ # On cache get, reconstruct the response and send it back
41
+ cache_getter do |req|
42
+ web = Web::Faker.new req.method, req.url, req.body, req.headers
43
+ if web.desired? && web_response = web.response_for
44
+ # put the headers back together, since we cache them as a dict
45
+ h_str = web_response.headers ?
46
+ web_response.headers.map { |k, v| "#{k}: #{v}" }.join("\n") : ''
47
+ # and then reconstruct the response
48
+ response = Typhoeus::Response.new({
49
+ :code => web_response.code,
50
+ :headers => h_str,
51
+ :body => web_response.body
52
+ })
53
+ response.instance_variable_set :@cached, true
54
+ response
55
+ end
56
+ end
57
+ end
58
+
59
+ alias_method :initialize_without_web, :initialize
60
+ alias_method :initialize, :initialize_with_web
61
+
62
+ end
63
+
64
+ end
@@ -7,6 +7,10 @@ module Web
7
7
 
8
8
  attr_reader :cache, :key
9
9
 
10
+ # method is expected to be a symbol, downcase
11
+ # url is expected to be a full url, trailing slash chopped off
12
+ # body is expected to be nil or a string
13
+ # headers is expected to be a hash
10
14
  def initialize(method, url, body, headers)
11
15
  @key = "#{method}:#{url}"
12
16
  @cache = Web.cache
@@ -24,6 +28,9 @@ module Web
24
28
  end
25
29
 
26
30
  # Given a response, marshall down and record in redis
31
+ # code is expected to be Fixnum
32
+ # body is expected to be a string or nil
33
+ # headers is expected to be a hash
27
34
  def record(code, body, headers)
28
35
  # save and return the response
29
36
  res = Web::Response.new code, body, headers
@@ -8,15 +8,4 @@ module Web
8
8
 
9
9
  end
10
10
 
11
- module ReadableHTTPResponse
12
-
13
- include HTTPResponse
14
-
15
- def read_body(dest = nil, &block)
16
- yield @body if block_given?
17
- @body
18
- end
19
-
20
- end
21
-
22
11
  end
@@ -1,5 +1,5 @@
1
1
  module Web
2
2
 
3
- VERSION = '0.0.4'
3
+ VERSION = '0.1.0'
4
4
 
5
5
  end
@@ -1,3 +1,8 @@
1
+ require 'uri'
2
+
3
+ require 'net/http'
4
+ require 'typhoeus'
1
5
  require File.dirname(__FILE__) + '/../lib/web'
2
6
 
3
- REQUEST_URL = URI.parse 'http://google.com'
7
+ REQUEST_URL_STRING = 'http://google.com'
8
+ REQUEST_URL = URI.parse REQUEST_URL_STRING
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: web
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,12 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-08-22 00:00:00.000000000 -04:00
13
- default_executable:
12
+ date: 2011-08-31 00:00:00.000000000Z
14
13
  dependencies:
15
14
  - !ruby/object:Gem::Dependency
16
15
  name: rspec
17
- requirement: &2154099420 !ruby/object:Gem::Requirement
16
+ requirement: &17525600 !ruby/object:Gem::Requirement
18
17
  none: false
19
18
  requirements:
20
19
  - - ! '>='
@@ -22,25 +21,36 @@ dependencies:
22
21
  version: '0'
23
22
  type: :development
24
23
  prerelease: false
25
- version_requirements: *2154099420
24
+ version_requirements: *17525600
25
+ - !ruby/object:Gem::Dependency
26
+ name: typhoeus
27
+ requirement: &17525180 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: *17525180
26
36
  description: web is a library for caching HTTP responses
27
37
  email: john.crepezzi@gmail.com
28
38
  executables: []
29
39
  extensions: []
30
40
  extra_rdoc_files: []
31
41
  files:
32
- - lib/web/cache/memcached_cache.rb
33
- - lib/web/cache/memory_cache.rb
34
- - lib/web/cache/redis_cache.rb
42
+ - lib/web.rb
43
+ - lib/web/response.rb
44
+ - lib/web/ext/typhoeus.rb
35
45
  - lib/web/ext/net_http.rb
46
+ - lib/web/version.rb
47
+ - lib/web/status_codes.rb
36
48
  - lib/web/faker.rb
37
49
  - lib/web/http_response.rb
38
- - lib/web/response.rb
39
- - lib/web/status_codes.rb
40
- - lib/web/version.rb
41
- - lib/web.rb
50
+ - lib/web/cache/memory_cache.rb
51
+ - lib/web/cache/memcached_cache.rb
52
+ - lib/web/cache/redis_cache.rb
42
53
  - spec/spec_helper.rb
43
- has_rdoc: true
44
54
  homepage: http://github.com/seejohnrun/web
45
55
  licenses: []
46
56
  post_install_message:
@@ -61,7 +71,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
61
71
  version: '0'
62
72
  requirements: []
63
73
  rubyforge_project: web
64
- rubygems_version: 1.6.2
74
+ rubygems_version: 1.8.10
65
75
  signing_key:
66
76
  specification_version: 3
67
77
  summary: cache HTTP responses