evazion
2019-09-08 15:32:31 -05:00
parent 22fd90eee9
commit 24202d51f0
4 changed files with 42 additions and 25 deletions

View File

@@ -3,9 +3,14 @@
class ApplicationResponder < ActionController::Responder
# this is called by respond_with for non-html, non-js responses.
def to_format
params = request.params
if get?
expiry = request.params["expiry"]
controller.expires_in expiry.to_i.days if expiry.present?
if params["expires_in"]
controller.expires_in(DurationParser.parse(params["expires_in"]))
elsif request.params["expiry"]
controller.expires_in(params["expiry"].to_i.days)
end
end
if format == :xml

View File

@@ -0,0 +1,27 @@
module DurationParser
def self.parse(string)
string =~ /(\d+)(s(econds?)?|mi(nutes?)?|h(ours?)?|d(ays?)?|w(eeks?)?|mo(nths?)?|y(ears?)?)?/i
size = $1.to_i
unit = $2
case unit
when /^s/i
size.seconds
when /^mi/i
size.minutes
when /^h/i
size.hours
when /^d/i
size.days
when /^w/i
size.weeks
when /^mo/i
size.months
when /^y/i
size.years
else
size.seconds
end
end
end

View File

@@ -313,29 +313,7 @@ class Tag < ApplicationRecord
end
when :age
object =~ /(\d+)(s(econds?)?|mi(nutes?)?|h(ours?)?|d(ays?)?|w(eeks?)?|mo(nths?)?|y(ears?)?)?/i
size = $1.to_i
unit = $2
case unit
when /^s/i
size.seconds.ago
when /^mi/i
size.minutes.ago
when /^h/i
size.hours.ago
when /^d/i
size.days.ago
when /^w/i
size.weeks.ago
when /^mo/i
size.months.ago
when /^y/i
size.years.ago
else
size.seconds.ago
end
DurationParser.parse(object).ago
when :ratio
object =~ /\A(\d+(?:\.\d+)?):(\d+(?:\.\d+)?)\Z/i

View File

@@ -199,6 +199,13 @@ class ApplicationControllerTest < ActionDispatch::IntegrationTest
assert_equal("max-age=#{1.day}, private", response.headers["Cache-Control"])
end
should "support the expires_in parameter" do
get posts_path, as: :json, params: { expires_in: "5min" }
assert_response :success
assert_equal("max-age=#{5.minutes}, private", response.headers["Cache-Control"])
end
should "return the correct root element name for empty xml responses" do
get tags_path, as: :xml