1 | package contenttype
|
---|
2 |
|
---|
3 | import (
|
---|
4 | "mime"
|
---|
5 | "strings"
|
---|
6 | )
|
---|
7 |
|
---|
8 | type ContentType struct {
|
---|
9 | TopLevelType string
|
---|
10 | SubType string
|
---|
11 | Suffix string
|
---|
12 | Parameters map[string]string
|
---|
13 | }
|
---|
14 |
|
---|
15 | func (contenttype *ContentType) String() string {
|
---|
16 | var mimetype string
|
---|
17 | if contenttype.Suffix == "" {
|
---|
18 | if contenttype.SubType == "" {
|
---|
19 | mimetype = contenttype.TopLevelType
|
---|
20 | } else {
|
---|
21 | mimetype = contenttype.TopLevelType + "/" + contenttype.SubType
|
---|
22 | }
|
---|
23 | } else {
|
---|
24 | mimetype = contenttype.TopLevelType + "/" + contenttype.SubType + "+" + contenttype.Suffix
|
---|
25 | }
|
---|
26 | return mime.FormatMediaType(mimetype, contenttype.Parameters)
|
---|
27 | }
|
---|
28 |
|
---|
29 | func (contenttype *ContentType) Equals(other ContentType) bool {
|
---|
30 | if contenttype.TopLevelType != other.TopLevelType ||
|
---|
31 | contenttype.SubType != other.SubType ||
|
---|
32 | contenttype.Suffix != other.Suffix ||
|
---|
33 | len(contenttype.Parameters) != len(other.Parameters) {
|
---|
34 | return false
|
---|
35 | }
|
---|
36 | for k, v := range contenttype.Parameters {
|
---|
37 | if other.Parameters[k] != v {
|
---|
38 | return false
|
---|
39 | }
|
---|
40 | }
|
---|
41 | return true
|
---|
42 | }
|
---|
43 |
|
---|
44 | func (contenttype *ContentType) FilterParameters(parameters map[string]bool) {
|
---|
45 | for k, _ := range contenttype.Parameters {
|
---|
46 | if !parameters[k] {
|
---|
47 | delete(contenttype.Parameters, k)
|
---|
48 | }
|
---|
49 | }
|
---|
50 | }
|
---|
51 |
|
---|
52 | func ParseContentType(contenttype string) (ContentType, error) {
|
---|
53 | mimetype, params, err := mime.ParseMediaType(contenttype)
|
---|
54 | if err != nil {
|
---|
55 | return ContentType{"", "", "", params}, err
|
---|
56 | }
|
---|
57 | splitted_mimetype := strings.SplitN(strings.ToLower(mimetype), "/", 2)
|
---|
58 | if len(splitted_mimetype) <= 1 {
|
---|
59 | return ContentType{splitted_mimetype[0], "", "", params}, nil
|
---|
60 | } else {
|
---|
61 | splitted_subtype := strings.SplitN(splitted_mimetype[1], "+", 2)
|
---|
62 | if len(splitted_subtype) == 1 {
|
---|
63 | return ContentType{splitted_mimetype[0], splitted_subtype[0], "", params}, nil
|
---|
64 | } else {
|
---|
65 | return ContentType{splitted_mimetype[0], splitted_subtype[0], splitted_subtype[1], params}, nil
|
---|
66 | }
|
---|
67 | }
|
---|
68 |
|
---|
69 | }
|
---|
70 |
|
---|
71 | type Filter func(contenttype ContentType) bool
|
---|
72 |
|
---|
73 | func NewFilterContains(partialMimeType string) Filter {
|
---|
74 | return func(contenttype ContentType) bool {
|
---|
75 | return strings.Contains(contenttype.TopLevelType, partialMimeType) ||
|
---|
76 | strings.Contains(contenttype.SubType, partialMimeType) ||
|
---|
77 | strings.Contains(contenttype.Suffix, partialMimeType)
|
---|
78 | }
|
---|
79 | }
|
---|
80 |
|
---|
81 | func NewFilterEquals(TopLevelType, SubType, Suffix string) Filter {
|
---|
82 | return func(contenttype ContentType) bool {
|
---|
83 | return ((TopLevelType != "*" && TopLevelType == contenttype.TopLevelType) || (TopLevelType == "*")) &&
|
---|
84 | ((SubType != "*" && SubType == contenttype.SubType) || (SubType == "*")) &&
|
---|
85 | ((Suffix != "*" && Suffix == contenttype.Suffix) || (Suffix == "*"))
|
---|
86 | }
|
---|
87 | }
|
---|
88 |
|
---|
89 | func NewFilterOr(contentTypeFilterList []Filter) Filter {
|
---|
90 | return func(contenttype ContentType) bool {
|
---|
91 | for _, contentTypeFilter := range contentTypeFilterList {
|
---|
92 | if contentTypeFilter(contenttype) {
|
---|
93 | return true
|
---|
94 | }
|
---|
95 | }
|
---|
96 | return false
|
---|
97 | }
|
---|
98 | }
|
---|