A Hurley connection that respects HTTP cache
Ruby Shell

README.md

Hurley Http Cache

Build Status

a Hurley connection that respects HTTP cache, by checking expiration and validation of the stored responses. This gem is a direct reimplementation of the faraday-http-cache gem.

Installation

Add it to your Gemfile:

gem 'hurley-http-cache'

Usage and configuration

You can use an instance of the Hurley::HttpCache as the connection for your hurley client.

require 'hurley'
require 'hurley/http_cache'

client = Hurley::Client.new
client.connection = Hurley::HttpCache.new

The middleware accepts a store option for the cache backend responsible for recording the API responses that should be stored. Stores should respond to write and read, just like an object from the ActiveSupport::Cache API.

store = ActiveSupport::Cache.lookup_store(:mem_cache_store, ['localhost:11211'])

client = Hurley::Client.new
# Use the connection with a Memcache server.
client.connection = Hurley::HttpCache.new(store: store)

# Or use the Rails.cache instance inside your Rails app.
client.connection = Hurley::HttpCache.new(store: Rails.cache)

By default, the Hurley::HttpCache connection will use the Hurley.default_connection to perform the real HTTP requests when we can't use a cached response. If you want to use a different connection object, just pass it when creating the Hurley::HttpCache object.

require 'hurley'
require 'hurley-excon'

client = Hurley.new
client.connection = Hurley::HttpCache.new(HurleyExcon::Connection.new)

The default store provided is a simple in memory cache that lives on the client instance. This type of store might not be persisted across multiple processes or connection instances so it is probably not suitable for most production environments. Make sure that you configure a store that is suitable for you.

the stdlib JSON module is used for serialization by default. If you expect to be dealing with images, you can use [Marshal][http://ruby-doc.org//core-2.2.0/Marshal.html] instead, or if you want to use another json library like oj or yajl-ruby.

client = Hurley::Client.new
client.connection = Hurley::HttpCache.new(store: Rails.cache, serializer: Marshal)

Logging

You can provide a logger option that will be receive debug informations based connection operations:

client = Hurley::Client.new
client.connection = Hurley::HttpCache.new(logger: Rails.logger)

client.get('http://site/api/users')
# logs "HTTP Cache: [GET /users] miss, store"

See it live

You can clone this repository, install it's dependencies with Bundler (run bundle install) and execute the files under the examples directory to see a sample of the gem usage.

License

Copyright (c) 2015 Plataformatec. See LICENSE file.