67 lines
1.6 KiB
Ruby
67 lines
1.6 KiB
Ruby
module Danbooru
|
|
class Http
|
|
attr_writer :cache, :http
|
|
|
|
class << self
|
|
delegate :get, :post, :delete, :cache, :auth, :basic_auth, :headers, to: :new
|
|
end
|
|
|
|
def get(url, **options)
|
|
request(:get, url, **options)
|
|
end
|
|
|
|
def post(url, **options)
|
|
request(:post, url, **options)
|
|
end
|
|
|
|
def delete(url, **options)
|
|
request(:delete, url, **options)
|
|
end
|
|
|
|
def cache(expiry)
|
|
dup.tap { |o| o.cache = expiry.to_i }
|
|
end
|
|
|
|
def auth(*args)
|
|
dup.tap { |o| o.http = o.http.auth(*args) }
|
|
end
|
|
|
|
def basic_auth(*args)
|
|
dup.tap { |o| o.http = o.http.basic_auth(*args) }
|
|
end
|
|
|
|
def headers(*args)
|
|
dup.tap { |o| o.http = o.http.headers(*args) }
|
|
end
|
|
|
|
protected
|
|
|
|
def request(method, url, **options)
|
|
if @cache.present?
|
|
cached_request(method, url, **options)
|
|
else
|
|
raw_request(method, url, **options)
|
|
end
|
|
end
|
|
|
|
def cached_request(method, url, **options)
|
|
key = Cache.hash({ method: method, url: url, headers: http.default_options.headers.to_h, **options }.to_json)
|
|
|
|
cached_response = Cache.get(key, @cache) do
|
|
response = raw_request(method, url, **options)
|
|
{ status: response.status, body: response.to_s, headers: response.headers.to_h, version: "1.1" }
|
|
end
|
|
|
|
::HTTP::Response.new(**cached_response)
|
|
end
|
|
|
|
def raw_request(method, url, **options)
|
|
http.send(method, url, **options)
|
|
end
|
|
|
|
def http
|
|
@http ||= ::HTTP.use(:auto_inflate).headers(Danbooru.config.http_headers).headers("Accept-Encoding" => "gzip")
|
|
end
|
|
end
|
|
end
|