import (
"bytes"
"compress/gzip"
+ "encoding/base64"
"errors"
"fmt"
"io/ioutil"
"time"
"github.com/klauspost/compress/zstd"
+ "go.stargrave.org/godlighty/meta4"
"golang.org/x/net/webdav"
)
const (
- Index = "index.html"
- Readme = "README"
- Meta4Ext = ".meta4"
+ Index = "index.html"
+ Readme = "README"
)
var (
}
defer fd.Close()
- if _, err = os.Stat(pth + Meta4Ext); err == nil {
- w.Header().Set("Link", "<"+path.Base(pth)+Meta4Ext+`>; rel=describedby; type="application/metalink4+xml"`)
+ if meta4fi, err := os.Stat(pth + meta4.Ext); err == nil {
+ if meta4fi.Size() > meta4.MaxSize {
+ goto SkipMeta4
+ }
+ meta4Raw, err := ioutil.ReadFile(pth + meta4.Ext)
+ if err != nil {
+ goto SkipMeta4
+ }
+ base := path.Base(pth)
+ forHTTP, err := meta4.Parse(base, meta4Raw)
+ if err != nil {
+ goto SkipMeta4
+ }
+ w.Header().Add("Link", "<"+base+meta4.Ext+
+ `>; rel=describedby; type="application/metalink4+xml"`,
+ )
+ for _, u := range forHTTP.URLs {
+ w.Header().Add("Link", "<"+u+">; rel=duplicate")
+ }
+ if forHTTP.SHA256 != nil {
+ w.Header().Add("Digest", "SHA-256="+
+ base64.StdEncoding.EncodeToString(forHTTP.SHA256))
+ }
+ if forHTTP.SHA512 != nil {
+ w.Header().Add("Digest", "SHA-512="+
+ base64.StdEncoding.EncodeToString(forHTTP.SHA512))
+ }
}
+SkipMeta4:
if contentType == "" {
contentType = mediaType(path.Base(pth), cfg.MIMEs)