Johan Svensson
Johan Svensson

Reputation: 315

Caching a redirect to a static image in Sinatra

I have a Sinatra route for displaying a status image. While this simple solution works, I run into caching issues:

get '/stream/:service/:stream_id.png' do
  # Building image_url omitted

  redirect image_url
end

What is a proper way to handle the caching here, to set a max TTL? These images will be embedded on other sites, otherwise I could simply link straight to the images I redirect to.

The problem is that it generates an URL like site.com/image.png which in turn redirects elsewhere -- but it's site.com/image.png that is considered cached by the browser, so it won't check if it's updated.

I've experimented a bit with Cache-Control headers, but I have yet to find a solution.

I'm open for other solutions if this method is completely boneheaded.

Upvotes: 3

Views: 748

Answers (2)

calvinf
calvinf

Reputation: 3924

You can also make use of Sinatra's expires method:

# Set the Expires header and Cache-Control/max-age directive. Amount
# can be an integer number of seconds in the future or a Time object
# indicating when the response should be considered "stale". The remaining
# "values" arguments are passed to the #cache_control helper:
#
#   expires 500, :public, :must_revalidate
#   => Cache-Control: public, must-revalidate, max-age=60
#   => Expires: Mon, 08 Jun 2009 08:50:17 GMT

Or the cache_control method:

# Specify response freshness policy for HTTP caches (Cache-Control header).
# Any number of non-value directives (:public, :private, :no_cache,
# :no_store, :must_revalidate, :proxy_revalidate) may be passed along with
# a Hash of value directives (:max_age, :min_stale, :s_max_age).
#
#   cache_control :public, :must_revalidate, :max_age => 60
#   => Cache-Control: public, must-revalidate, max-age=60
#
# See RFC 2616 / 14.9 for more on standard cache control directives:
# http://tools.ietf.org/html/rfc2616#section-14.9.1

Sinatra Documentation (as of 1.4.6 release)

Upvotes: 0

kreek
kreek

Reputation: 8834

You set the Cache-Control on a per route basis:

get '/stream/:service/:stream_id.png' do
  # Building image_url omitted
  response['Cache-Control'] = "public, max-age=0, must-revalidate"
  redirect image_url
end

Upvotes: 2

Related Questions