################################################################################ # simple cache validation ################################################################################ class HelloController < ServerSide::Controller.mount ('/hello') def response request.validate_cache(Time.now, 3.weeks) do render_view 'hello.rhtml', :layout => 'default.rhtml' end end end ################################################################################ # cache with all parameters ################################################################################ class PostsController < ServerSide::ActionController def index @session = Sessions.by_sid(cookies[:sid]) @posts = Posts.order_by_stamp_DESC.all_by_user(@session[:user]) request.validate_cache(@posts.first[:stamp], 3.days, 'xxx-yyy', :private) do render_view 'posts' end end end ################################################################################ # custom etag validation ################################################################################ class Reality::Controller def validate_expiry_etag request.validate_etag do |etag| if etag =~ /(\d+)-(\d+)/ stamp, expires = Time.at($1), Time.at($2) expires < Time.now end end end def expiry_etag(stamp, valid_period) "%d-%d" % [stamp, valid_period] end def process before_response if respond_to?(:before_response) send(params[:flavor] || params[:f]) unless request.@rendered end end class HistoryController < Reality::Controller def before_response @node = Nodes[@path] return if validate_expiry_etag @states = @node.states.filter(:stamp => (@start..@stop)).all stamp = @states.first[:stamp] valid_period = @node.sample_rate request.validate_cache(stamp, valid_period, expiry_etag(stamp, @node.sample_)) end def xml render_xml { states {@states.to_xml(:session)} } end def json render_json { states {@states.to_json} } end