danbooru::http: support tracking cookies between requests.
Allow cookies to be saved and sent back when making several requests in
a row. Usage:
http = Danbooru::Http.use(:session)
# saves the foo=42 cookie sent by the response.
http.get("https://httpbin.org/cookies/set/foo/42")
# sends back the foo=42 cookie from the previous request.
http.get("https://httpbin.org/cookies")
This commit is contained in:
37
app/logical/danbooru/http/session.rb
Normal file
37
app/logical/danbooru/http/session.rb
Normal file
@@ -0,0 +1,37 @@
|
||||
module Danbooru
|
||||
class Http
|
||||
class Session < HTTP::Feature
|
||||
HTTP::Options.register_feature :session, self
|
||||
|
||||
attr_reader :cookie_jar
|
||||
|
||||
def initialize(cookie_jar: HTTP::CookieJar.new)
|
||||
@cookie_jar = cookie_jar
|
||||
end
|
||||
|
||||
def perform(request)
|
||||
add_cookies(request)
|
||||
response = yield request
|
||||
save_cookies(response)
|
||||
response
|
||||
end
|
||||
|
||||
def add_cookies(request)
|
||||
cookies = cookies_for_request(request)
|
||||
request.headers["Cookie"] = cookies if cookies.present?
|
||||
end
|
||||
|
||||
def cookies_for_request(request)
|
||||
saved_cookies = cookie_jar.each(request.uri).map { |c| [c.name, c.value] }.to_h
|
||||
request_cookies = HTTP::Cookie.cookie_value_to_hash(request.headers["Cookie"].to_s)
|
||||
saved_cookies.merge(request_cookies).map { |name, value| "#{name}=#{value}" }.join("; ")
|
||||
end
|
||||
|
||||
def save_cookies(response)
|
||||
response.cookies.each do |cookie|
|
||||
cookie_jar.add(cookie)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user