-
Notifications
You must be signed in to change notification settings - Fork 0
/
header.go
89 lines (78 loc) · 2.09 KB
/
header.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
package orderedheaders
import (
"net/mail"
"net/textproto"
"regexp"
"strings"
"time"
)
// A KV represents a single mime header
type KV struct {
Key string
Value string
}
// A Header represents a MIME-style header consisting
// of a list of key, value pairs
type Header struct {
Headers []KV
}
// ToMap converts a Header to a textproto.MIMEHeader
func (h *Header) ToMap() textproto.MIMEHeader {
m := make(textproto.MIMEHeader)
for _, h := range h.Headers {
m.Add(h.Key, h.Value)
}
return m
}
// Add adds a new key, value pair to the header
func (h *Header) Add(key, value string) {
key = textproto.CanonicalMIMEHeaderKey(key)
h.Headers = append(h.Headers, KV{Key: key, Value: value})
}
// Get gets the first value associated with the given key.
// It is case-insensitive; CanonicalMIMEHeaderKey is used
// to canonicalize the provided key.
// If there are no values associated with the key, Get returns "".
func (h *Header) Get(key string) string {
key = textproto.CanonicalMIMEHeaderKey(key)
for _, h := range h.Headers {
if key == h.Key {
return h.Value
}
}
return ""
}
// AddressList parses the named header field as a list of addresses.
func (h *Header) AddressList(key string) ([]*mail.Address, error) {
hdr := h.Get(key)
if hdr == "" {
return nil, mail.ErrHeaderNotPresent
}
return mail.ParseAddressList(hdr)
}
// Date parses the Date header field.
func (h *Header) Date() (time.Time, error) {
hdr := h.Get("Date")
if hdr == "" {
return time.Time{}, mail.ErrHeaderNotPresent
}
return mail.ParseDate(hdr)
}
var whitespaceRe = regexp.MustCompile(`[\s\p{Zs}]+`)
// Normalize replaces all whitespace in a header with a single space.
func (h *Header) Normalize() {
for i, kv := range h.Headers {
h.Headers[i].Value = strings.TrimSpace(whitespaceRe.ReplaceAllLiteralString(kv.Value, " "))
}
}
// RemoveAll removes all headers with this (canonicalized) name
func (h *Header) RemoveAll(key string) {
key = textproto.CanonicalMIMEHeaderKey(key)
filtered := h.Headers[:0]
for _, kv := range h.Headers {
if kv.Key != key {
filtered = append(filtered, kv)
}
}
h.Headers = filtered
}