class ActionDispatch::Cookies::CookieJar
def handle_options(options)
def handle_options(options) if options[:expires].respond_to?(:from_now) options[:expires] = options[:expires].from_now end options[:path] ||= "/" unless options.key?(:same_site) options[:same_site] = request.cookies_same_site_protection end if options[:domain] == :all || options[:domain] == "all" cookie_domain = "" dot_splitted_host = request.host.split(".", -1) # Case where request.host is not an IP address or it's an invalid domain # (ip confirms to the domain structure we expect so we explicitly check for ip) if request.host.match?(/^[\d.]+$/) || dot_splitted_host.include?("") || dot_splitted_host.length == 1 options[:domain] = nil return end # If there is a provided tld length then we use it otherwise default domain. if options[:tld_length].present? # Case where the tld_length provided is valid if dot_splitted_host.length >= options[:tld_length] cookie_domain = dot_splitted_host.last(options[:tld_length]).join(".") end # Case where tld_length is not provided else # Regular TLDs if !(/\.[^.]{2,3}\.[^.]{2}\z/.match?(request.host)) cookie_domain = dot_splitted_host.last(2).join(".") # **.**, ***.** style TLDs like co.uk and com.au else cookie_domain = dot_splitted_host.last(3).join(".") end end options[:domain] = if cookie_domain.present? cookie_domain end elsif options[:domain].is_a? Array # If host matches one of the supplied domains. options[:domain] = options[:domain].find do |domain| domain = domain.delete_prefix(".") request.host == domain || request.host.end_with?(".#{domain}") end elsif options[:domain].respond_to?(:call) options[:domain] = options[:domain].call(request) end end