Class: Dommy::Rack::HeaderStore

Inherits:
Object
  • Object
show all
Defined in:
lib/dommy/rack/header_store.rb

Overview

The persistent request headers a Session sends on every request, plus the auth conveniences that set them. Encapsulates the header state and the case-insensitive merge the way CookieJar encapsulates cookie state — a Session owns one HeaderStore and mutates it via set / delete / basic_auth / bearer.

HTTP header names are case-insensitive, so #delete and #merge match names case-insensitively: a per-request override replaces a stored default even when the two names differ only in case.

Instance Method Summary collapse

Constructor Details

#initializeHeaderStore

Returns a new instance of HeaderStore.



15
16
17
# File 'lib/dommy/rack/header_store.rb', line 15

def initialize
  @headers = {}
end

Instance Method Details

#basic_auth(user, password) ⇒ Object

HTTP Basic auth: sets a persistent Authorization header.



57
58
59
# File 'lib/dommy/rack/header_store.rb', line 57

def basic_auth(user, password)
  set("Authorization", "Basic #{["#{user}:#{password}"].pack("m0")}")
end

#bearer(token) ⇒ Object

Bearer-token auth: sets a persistent Authorization header.



62
63
64
# File 'lib/dommy/rack/header_store.rb', line 62

def bearer(token)
  set("Authorization", "Bearer #{token}")
end

#delete(name) ⇒ Object



36
37
38
39
40
# File 'lib/dommy/rack/header_store.rb', line 36

def delete(name)
  target = name.to_s.downcase
  @headers.delete_if { |key, _| key.downcase == target }
  self
end

#merge(override) ⇒ Object

The headers to send for one request: the stored defaults with the per-request override applied on top. An override wins even if its name differs only in case from a default.



45
46
47
48
49
50
51
52
53
54
# File 'lib/dommy/rack/header_store.rb', line 45

def merge(override)
  return @headers.dup if override.nil? || override.empty?

  merged = @headers.dup
  override.each do |name, value|
    merged.delete_if { |existing, _| existing.to_s.downcase == name.to_s.downcase }
    merged[name] = value
  end
  merged
end

#set(name, value) ⇒ Object



31
32
33
34
# File 'lib/dommy/rack/header_store.rb', line 31

def set(name, value)
  @headers[name.to_s] = value.to_s
  self
end

#snapshotObject

A detached HeaderStore with the same headers, safe to hand to a network worker thread: it owns its own state (no shared mutation with the page's store) and keeps the case-insensitive #merge a plain Hash would lose.



25
26
27
28
29
# File 'lib/dommy/rack/header_store.rb', line 25

def snapshot
  copy = HeaderStore.new
  @headers.each { |name, value| copy.set(name, value) }
  copy
end

#to_hObject

A copy of the stored headers. Mutate via #set / #delete.



20
# File 'lib/dommy/rack/header_store.rb', line 20

def to_h = @headers.dup