| 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) |
| ) |