Sha256: 9a8e3629008ba14de18f5396985fb51f02eabf8d6cd62394495e75d2f70199d7

Contents?: true

Size: 1.98 KB

Versions: 3

Compression:

Stored size: 1.98 KB

Contents

require 'http/cookie_jar'

# CookiestxtSaver saves and loads cookies in the cookies.txt format.
class HTTP::CookieJar::CookiestxtSaver < HTTP::CookieJar::AbstractSaver
  True  = "TRUE"
  False = "FALSE"

  def save(io, jar)
    io.puts @header if @header
    jar.each { |cookie|
      next if !@session && cookie.session?
      io.print cookie_to_record(cookie)
    }
  end

  def load(io, jar)
    io.each_line { |line|
      cookie = parse_record(line) and jar.add(cookie)
    }
  end

  private

  def default_options
    {
      :header => "# HTTP Cookie File",
      :linefeed => "\n",
    }
  end

  HTTPONLY_PREFIX = '#HttpOnly_'
  RE_HTTPONLY_PREFIX = /\A#{HTTPONLY_PREFIX}/

  # Serializes the cookie into a cookies.txt line.
  def cookie_to_record(cookie)
    cookie.instance_eval {
      [
        @httponly ? HTTPONLY_PREFIX + dot_domain : dot_domain,
        @for_domain ? True : False,
        @path,
        @secure ? True : False,
        expires.to_i,
        @name,
        @value
      ]
    }.join("\t") << @linefeed
  end

  # Parses a line from cookies.txt and returns a cookie object if the
  # line represents a cookie record or returns nil otherwise.
  def parse_record(line)
    case line
    when RE_HTTPONLY_PREFIX
      httponly = true
      line = $'
    when /\A#/
      return nil
    else
      httponly = false
    end

    domain,
    s_for_domain,	# Whether this cookie is for domain
    path,		# Path for which the cookie is relevant
    s_secure,		# Requires a secure connection
    s_expires,		# Time the cookie expires (Unix epoch time)
    name, value = line.split("\t", 7)
    return nil if value.nil?

    value.chomp!

    if (expires_seconds = s_expires.to_i).nonzero?
      expires = Time.at(expires_seconds)
      return nil if expires < Time.now
    end

    HTTP::Cookie.new(name, value,
      :domain => domain,
      :for_domain => s_for_domain == True,
      :path => path,
      :secure => s_secure == True,
      :httponly => httponly,
      :expires => expires)
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
http-cookie-1.0.0.pre12 lib/http/cookie_jar/cookiestxt_saver.rb
http-cookie-1.0.0.pre11 lib/http/cookie_jar/cookiestxt_saver.rb
http-cookie-1.0.0.pre10 lib/http/cookie_jar/cookiestxt_saver.rb