12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- package mime
- import (
- "errors"
- "regexp"
- )
- type MediaType struct {
- Essence string
- Supertype string
- Subtype string
- }
- var re = regexp.MustCompile(`(?s)^(([!#$%&'*+\-.^_\x60|~a-zA-Z0-9]+)/([!#$%&'*+\-.^_\x60|~a-zA-Z0-9]+)).*$`)
- func Default() *MediaType {
- return &MediaType{
- Essence: "text/html",
- Supertype: "text",
- Subtype: "html",
- }
- }
- func Unknown() *MediaType {
- return &MediaType{
- Essence: "*/*",
- Supertype: "*",
- Subtype: "*",
- }
- }
- func UnknownSubtype(supertype string) *MediaType {
- return &MediaType{
- Essence: supertype + "/*",
- Supertype: supertype,
- Subtype: "*",
- }
- }
- func Parse(input string) (*MediaType, error) {
- matches := re.FindStringSubmatch(input)
- if len(matches) != 4 {
- return nil, errors.New(`"` + input + `" is not a valid media type`)
- }
- return &MediaType{
- Essence: matches[1],
- Supertype: matches[2],
- Subtype: matches[3],
- }, nil
- }
- func (m *MediaType) Update(input string) error {
- parsed, err := Parse(input)
- if err != nil {
- return err
- }
- *m = *parsed
- return nil
- }
- func (m *MediaType) Matches(mediaTypes []string) bool {
- for _, mediaType := range mediaTypes {
- if m.Essence == mediaType {
- return true
- }
- }
- return false
- }
|