|  | package jose | 
|  |  | 
|  | import "encoding/json" | 
|  |  | 
|  | // Header implements a JOSE Header with the addition of some helper | 
|  | // methods, similar to net/url.Values. | 
|  | type Header map[string]interface{} | 
|  |  | 
|  | // Get retrieves the value corresponding with key from the Header. | 
|  | func (h Header) Get(key string) interface{} { | 
|  | if h == nil { | 
|  | return nil | 
|  | } | 
|  | return h[key] | 
|  | } | 
|  |  | 
|  | // Set sets Claims[key] = val. It'll overwrite without warning. | 
|  | func (h Header) Set(key string, val interface{}) { | 
|  | h[key] = val | 
|  | } | 
|  |  | 
|  | // Del removes the value that corresponds with key from the Header. | 
|  | func (h Header) Del(key string) { | 
|  | delete(h, key) | 
|  | } | 
|  |  | 
|  | // Has returns true if a value for the given key exists inside the Header. | 
|  | func (h Header) Has(key string) bool { | 
|  | _, ok := h[key] | 
|  | return ok | 
|  | } | 
|  |  | 
|  | // MarshalJSON implements json.Marshaler for Header. | 
|  | func (h Header) MarshalJSON() ([]byte, error) { | 
|  | if len(h) == 0 { | 
|  | return nil, nil | 
|  | } | 
|  | b, err := json.Marshal(map[string]interface{}(h)) | 
|  | if err != nil { | 
|  | return nil, err | 
|  | } | 
|  | return EncodeEscape(b), nil | 
|  | } | 
|  |  | 
|  | // Base64 implements the Encoder interface. | 
|  | func (h Header) Base64() ([]byte, error) { | 
|  | return h.MarshalJSON() | 
|  | } | 
|  |  | 
|  | // UnmarshalJSON implements json.Unmarshaler for Header. | 
|  | func (h *Header) UnmarshalJSON(b []byte) error { | 
|  | if b == nil { | 
|  | return nil | 
|  | } | 
|  | b, err := DecodeEscaped(b) | 
|  | if err != nil { | 
|  | return err | 
|  | } | 
|  | return json.Unmarshal(b, (*map[string]interface{})(h)) | 
|  | } | 
|  |  | 
|  | // Protected Headers are base64-encoded after they're marshaled into | 
|  | // JSON. | 
|  | type Protected Header | 
|  |  | 
|  | // Get retrieves the value corresponding with key from the Protected Header. | 
|  | func (p Protected) Get(key string) interface{} { | 
|  | if p == nil { | 
|  | return nil | 
|  | } | 
|  | return p[key] | 
|  | } | 
|  |  | 
|  | // Set sets Protected[key] = val. It'll overwrite without warning. | 
|  | func (p Protected) Set(key string, val interface{}) { | 
|  | p[key] = val | 
|  | } | 
|  |  | 
|  | // Del removes the value that corresponds with key from the Protected Header. | 
|  | func (p Protected) Del(key string) { | 
|  | delete(p, key) | 
|  | } | 
|  |  | 
|  | // Has returns true if a value for the given key exists inside the Protected | 
|  | // Header. | 
|  | func (p Protected) Has(key string) bool { | 
|  | _, ok := p[key] | 
|  | return ok | 
|  | } | 
|  |  | 
|  | // MarshalJSON implements json.Marshaler for Protected. | 
|  | func (p Protected) MarshalJSON() ([]byte, error) { | 
|  | b, err := json.Marshal(map[string]interface{}(p)) | 
|  | if err != nil { | 
|  | return nil, err | 
|  | } | 
|  | return EncodeEscape(b), nil | 
|  | } | 
|  |  | 
|  | // Base64 implements the Encoder interface. | 
|  | func (p Protected) Base64() ([]byte, error) { | 
|  | b, err := json.Marshal(map[string]interface{}(p)) | 
|  | if err != nil { | 
|  | return nil, err | 
|  | } | 
|  | return Base64Encode(b), nil | 
|  | } | 
|  |  | 
|  | // UnmarshalJSON implements json.Unmarshaler for Protected. | 
|  | func (p *Protected) UnmarshalJSON(b []byte) error { | 
|  | var h Header | 
|  | if err := h.UnmarshalJSON(b); err != nil { | 
|  | return err | 
|  | } | 
|  | *p = Protected(h) | 
|  | return nil | 
|  | } | 
|  |  | 
|  | var ( | 
|  | _ json.Marshaler   = (Protected)(nil) | 
|  | _ json.Unmarshaler = (*Protected)(nil) | 
|  | _ json.Marshaler   = (Header)(nil) | 
|  | _ json.Unmarshaler = (*Header)(nil) | 
|  | ) |