Sha256: bab5471b61a74474ee781b0ee19cd5dc0c2d15157ba33113a2f349d1b79e2d3e

Contents?: true

Size: 1.27 KB

Versions: 3

Compression:

Stored size: 1.27 KB

Contents

module FlipFab
  class CookiePersistence < FlipFab::Persistence

      COOKIE_PATH            = '/'
      COOKIE_DURATION_MONTHS = 12
      # See: https://github.com/rails/rails/blob/b1124a2ac88778c0feb0157ac09367cbd204bf01/actionpack/lib/action_dispatch/middleware/cookies.rb#L214
      DOMAIN_REGEXP          = /[^.]*\.([^.]*|..\...|...\...)$/

    def initialize feature_name, context
      super
    end

    def read
      value.to_sym unless value.nil?
    end

    def write state
      cookie_domain = ".#{top_level_domain}" unless top_level_domain.nil?
      context.response.set_cookie key, {
        value:   state,
        expires: cookie_expiration,
        domain:  cookie_domain,
        path:    COOKIE_PATH,
      }
    end

    private

    def key
      "flip_fab.#{feature_name}"
    end

    def value
      @value ||= context.request.cookies[key]
    end

    # See: https://github.com/rails/rails/blob/b1124a2ac88778c0feb0157ac09367cbd204bf01/actionpack/lib/action_dispatch/middleware/cookies.rb#L286-L294
    def top_level_domain
      if (host !~ /^[\d.]+$/) && (host =~ DOMAIN_REGEXP)
        $&
      end
    end

    def cookie_expiration
      (Time.now.utc.to_datetime >> COOKIE_DURATION_MONTHS).to_time
    end

    def host
      context.request.host
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
flip_fab-1.0.1 lib/flip_fab/cookie_persistence.rb
flip_fab-1.0.0 lib/flip_fab/cookie_persistence.rb
flip_fab-0.0.1 lib/flip_fab/cookie_persistence.rb