lib/rufus/verbs/conditional.rb in rufus-verbs-0.10 vs lib/rufus/verbs/conditional.rb in rufus-verbs-1.0.0
- old
+ new
@@ -1,139 +1,129 @@
-#
#--
-# Copyright (c) 2008, John Mettraux, jmettraux@gmail.com
+# Copyright (c) 2008-2010, John Mettraux, jmettraux@gmail.com
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
-#
+#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
-#
+#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
#
-# (MIT license)
+# Made in Japan.
#++
-#
-#
-# John Mettraux
-#
-# Made in Japan
-#
-# 2008/01/16
-#
-#require 'rubygems'
require 'rufus/lru'
module Rufus::Verbs
- #
- # An EndPoint with a cache for conditional GETs.
- #
- # ep = ConditionalEndPoint.new(
- # :host => "restful.server",
- # :port => 7080,
- # :resource => "inventory/tools")
- #
- # res = ep.get :id => 1
- # # first call will retrieve the representation completely
- #
- # res = ep.get :id => 1
- # # the server (provided that it supports conditional GET) only
- # # returned a 304 answer, the response is returned from the
- # # ConditionalEndPoint cache
- #
- # The :cache_size option allows to set the size of the conditional GET
- # cache. The default size is currently 147.
- #
- class ConditionalEndPoint < EndPoint
+ #
+ # An EndPoint with a cache for conditional GETs.
+ #
+ # ep = ConditionalEndPoint.new(
+ # :host => "restful.server",
+ # :port => 7080,
+ # :resource => "inventory/tools")
+ #
+ # res = ep.get :id => 1
+ # # first call will retrieve the representation completely
+ #
+ # res = ep.get :id => 1
+ # # the server (provided that it supports conditional GET) only
+ # # returned a 304 answer, the response is returned from the
+ # # ConditionalEndPoint cache
+ #
+ # The :cache_size option allows to set the size of the conditional GET
+ # cache. The default size is currently 147.
+ #
+ class ConditionalEndPoint < EndPoint
- def initialize (opts)
+ def initialize (opts)
- super
+ super
- cs = opts[:cache_size] || 147
+ cs = opts[:cache_size] || 147
- @cache = LruHash.new cs
- end
+ @cache = LruHash.new cs
+ end
- #
- # Returns the count of representation 'cached' here for the
- # purpose of conditional GET requests.
- #
- def cache_current_size
+ #
+ # Returns the count of representation 'cached' here for the
+ # purpose of conditional GET requests.
+ #
+ def cache_current_size
- @cache.size
- end
+ @cache.size
+ end
- #
- # Returns the max size of the conditional GET cache.
- #
- def cache_size
+ #
+ # Returns the max size of the conditional GET cache.
+ #
+ def cache_size
- @cache.maxsize
- end
+ @cache.maxsize
+ end
- private
+ private
- #
- # If the representation has already been gotten, send
- # potential If-Modified-Since and/or If-None-Match.
- #
- def add_conditional_headers (req, opts)
+ #
+ # If the representation has already been gotten, send
+ # potential If-Modified-Since and/or If-None-Match.
+ #
+ def add_conditional_headers (req, opts)
- # if path is cached send since and/or match
+ # if path is cached send since and/or match
- e = @cache[opts[:c_uri]]
+ e = @cache[opts[:c_uri]]
- return unless e # not cached
+ return unless e # not cached
- req['If-Modified-Since'] = e.lastmod if e.lastmod
- req['If-None-Match'] = e.etag if e.etag
+ req['If-Modified-Since'] = e.lastmod if e.lastmod
+ req['If-None-Match'] = e.etag if e.etag
- opts[:c_cached] = e
- end
+ opts[:c_cached] = e
+ end
- def handle_response (method, res, opts)
+ def handle_response (method, res, opts)
- # if method is get and reply is 200, cache (if et and/or lm)
- # if method is get and reply is 304, return from cache
+ # if method is get and reply is 200, cache (if et and/or lm)
+ # if method is get and reply is 304, return from cache
- super
+ super
- code = res.code.to_i
+ code = res.code.to_i
- return opts[:c_cached] if code == 304
+ return opts[:c_cached] if code == 304
- cache(res, opts) if code == 200
+ cache(res, opts) if code == 200
- res
- end
+ res
+ end
- def cache (res, opts)
+ def cache (res, opts)
- class << res
- def lastmod
- self['Last-Modified']
- end
- def etag
- self['Etag']
- end
- end
+ class << res
+ def lastmod
+ self['Last-Modified']
+ end
+ def etag
+ self['Etag']
+ end
+ end
- @cache[opts[:c_uri]] = res
- end
+ @cache[opts[:c_uri]] = res
end
+ end
end