api: support the expires_in param on all GET requests.
`expires_in` is an alternative to `expiry` that supports durations other than days: * https://danbooru.donmai.us/posts.json?expires_in=30s * https://danbooru.donmai.us/posts.json?expires_in=5min * https://danbooru.donmai.us/posts.json?expires_in=1hour * https://danbooru.donmai.us/posts.json?expires_in=1week * https://danbooru.donmai.us/posts.json?expires_in=1month
This commit is contained in:
@@ -3,9 +3,14 @@
|
|||||||
class ApplicationResponder < ActionController::Responder
|
class ApplicationResponder < ActionController::Responder
|
||||||
# this is called by respond_with for non-html, non-js responses.
|
# this is called by respond_with for non-html, non-js responses.
|
||||||
def to_format
|
def to_format
|
||||||
|
params = request.params
|
||||||
|
|
||||||
if get?
|
if get?
|
||||||
expiry = request.params["expiry"]
|
if params["expires_in"]
|
||||||
controller.expires_in expiry.to_i.days if expiry.present?
|
controller.expires_in(DurationParser.parse(params["expires_in"]))
|
||||||
|
elsif request.params["expiry"]
|
||||||
|
controller.expires_in(params["expiry"].to_i.days)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if format == :xml
|
if format == :xml
|
||||||
|
|||||||
27
app/logical/duration_parser.rb
Normal file
27
app/logical/duration_parser.rb
Normal 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
|
||||||
@@ -313,29 +313,7 @@ class Tag < ApplicationRecord
|
|||||||
end
|
end
|
||||||
|
|
||||||
when :age
|
when :age
|
||||||
object =~ /(\d+)(s(econds?)?|mi(nutes?)?|h(ours?)?|d(ays?)?|w(eeks?)?|mo(nths?)?|y(ears?)?)?/i
|
DurationParser.parse(object).ago
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
when :ratio
|
when :ratio
|
||||||
object =~ /\A(\d+(?:\.\d+)?):(\d+(?:\.\d+)?)\Z/i
|
object =~ /\A(\d+(?:\.\d+)?):(\d+(?:\.\d+)?)\Z/i
|
||||||
|
|||||||
@@ -199,6 +199,13 @@ class ApplicationControllerTest < ActionDispatch::IntegrationTest
|
|||||||
assert_equal("max-age=#{1.day}, private", response.headers["Cache-Control"])
|
assert_equal("max-age=#{1.day}, private", response.headers["Cache-Control"])
|
||||||
end
|
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
|
should "return the correct root element name for empty xml responses" do
|
||||||
get tags_path, as: :xml
|
get tags_path, as: :xml
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user