89 lines
1.7 KiB
Go
89 lines
1.7 KiB
Go
package utils
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"mime"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
type BlobInfo struct {
|
|
UID string `json:"uid"`
|
|
Size int64 `json:"size,omitempty"`
|
|
Hash string `json:"hash,omitempty"`
|
|
MimeType string `json:"mime,omitempty"`
|
|
Charset string `json:"charset,omitempty"` // content type = mime+charset
|
|
}
|
|
|
|
// Content type is mime + charset
|
|
func (b *BlobInfo) SetContentType(v string) {
|
|
var params map[string]string
|
|
var err error
|
|
|
|
b.Charset = ""
|
|
b.MimeType, params, err = mime.ParseMediaType(v)
|
|
if err != nil {
|
|
return
|
|
}
|
|
b.Charset = params["charset"]
|
|
}
|
|
|
|
// Content type is mime + charset
|
|
func (b *BlobInfo) ContentType() string {
|
|
sb := bytes.NewBufferString(b.MimeType)
|
|
if b.Charset != "" {
|
|
sb.WriteString("; charset=")
|
|
sb.WriteString(b.Charset)
|
|
}
|
|
return sb.String()
|
|
}
|
|
|
|
func (b *BlobInfo) String() string {
|
|
sb := bytes.NewBufferString(b.UID)
|
|
if b.Size > 0 {
|
|
fmt.Fprintf(sb, "; size=%d", b.Size)
|
|
}
|
|
if b.Hash != "" {
|
|
sb.WriteString("; hash=")
|
|
sb.WriteString(b.Hash)
|
|
}
|
|
if b.MimeType != "" {
|
|
sb.WriteString("; mime=")
|
|
sb.WriteString(b.MimeType)
|
|
}
|
|
if b.Charset != "" {
|
|
sb.WriteString("; charset=")
|
|
sb.WriteString(b.Charset)
|
|
}
|
|
return sb.String()
|
|
}
|
|
|
|
func ParseBlobInfo(v string) *BlobInfo {
|
|
if v == "" {
|
|
return nil
|
|
}
|
|
info := &BlobInfo{}
|
|
for i, part := range strings.Split(v, ";") {
|
|
if i == 0 {
|
|
info.UID = part
|
|
continue
|
|
}
|
|
kv := strings.Split(strings.TrimSpace(part), "=")
|
|
if len(kv) == 2 {
|
|
val := kv[1]
|
|
switch kv[0] {
|
|
case "size":
|
|
info.Size, _ = strconv.ParseInt(val, 10, 64)
|
|
case "hash":
|
|
info.Hash = val
|
|
case "mime":
|
|
info.MimeType = val
|
|
case "charset":
|
|
info.Charset = val
|
|
}
|
|
}
|
|
}
|
|
return info
|
|
}
|