Skip to content

Instantly share code, notes, and snippets.

@ixti
Last active August 29, 2015 13:56
Show Gist options
  • Save ixti/9312897 to your computer and use it in GitHub Desktop.
Save ixti/9312897 to your computer and use it in GitHub Desktop.
require 'set'
class HTTP::Headers
def initialize
@pile = []
@keys = Set.new
end
def set(name, value)
delete(name)
add(name, value)
end
alias_method :[]=, :set
def delete(name)
name = normalize_header name
@keys.delete name
@pile.delete_if { |k, _|, k == name }
end
def add(name, value)
name = normalize_header name
@keys << name
Array(value).each { |v| @pile << [name, v] }
end
def get(name)
name = normalize_header name
@pile.select { |k, _| k == name }.map { |_, v| v }
end
def [](name)
values = get(name)
1 == values.count ? values.first : values
end
def to_h
Hash[@keys.map { |k| [k, self[k]] }]
end
def keys
@keys.to_a
end
private
def normalize_header(name)
# ...
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment