From: Sergey Matveev Date: Thu, 4 May 2023 08:25:46 +0000 (+0300) Subject: Simpler Metalink4 hashes substitution X-Git-Url: http://www.git.stargrave.org/?p=godlighty.git;a=commitdiff_plain;h=6720be1b80880c7b58a782ebef48956d050dbbfd Simpler Metalink4 hashes substitution --- diff --git a/godlighty.go b/godlighty.go index 213cd3a..8b141c6 100644 --- a/godlighty.go +++ b/godlighty.go @@ -1,6 +1,6 @@ // Highly-customizable HTTP, HTTP/2, HTTPS server package godlighty -const Version = "godlighty/0.4.0" +const Version = "godlighty/0.6.0" var BindAddr string diff --git a/handler.go b/handler.go index 30b1c1e..44c8a1f 100644 --- a/handler.go +++ b/handler.go @@ -270,29 +270,8 @@ IndexLookuped: 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)) - } - if forHTTP.Streebog256 != nil { - w.Header().Add("Digest", "Streebog-256="+ - base64.StdEncoding.EncodeToString(forHTTP.Streebog256)) - } - if forHTTP.Streebog512 != nil { - w.Header().Add("Digest", "Streebog-512="+ - base64.StdEncoding.EncodeToString(forHTTP.Streebog512)) - } - if forHTTP.SHAKE128 != nil { - w.Header().Add("Digest", "SHAKE128="+ - base64.StdEncoding.EncodeToString(forHTTP.SHAKE128)) - } - if forHTTP.SHAKE256 != nil { - w.Header().Add("Digest", "SHAKE256="+ - base64.StdEncoding.EncodeToString(forHTTP.SHAKE256)) + for name, digest := range forHTTP.Hashes { + w.Header().Add("Digest", name+"="+base64.StdEncoding.EncodeToString(digest)) } } SkipMeta4: diff --git a/meta4/parse.go b/meta4/parse.go index b5f67ba..7659bc8 100644 --- a/meta4/parse.go +++ b/meta4/parse.go @@ -22,14 +22,21 @@ import ( "encoding/xml" ) +var KnownHashes = map[string]string{ + "blake3-256": "BLAKE3-256", + "sha-256": "SHA-256", + "sha-512": "SHA-512", + "shake128": "SHAKE128", + "shake256": "SHAKE256", + "skein-256": "Skein-256", + "skein-512": "Skein-512", + "streebog-256": "Streebog-256", + "streebog-512": "Streebog-512", +} + type ForHTTP struct { - SHA256 []byte - SHA512 []byte - Streebog256 []byte - Streebog512 []byte - SHAKE128 []byte - SHAKE256 []byte - URLs []string + Hashes map[string][]byte + URLs []string } func Parse(fn string, data []byte) (*ForHTTP, error) { @@ -42,26 +49,17 @@ func Parse(fn string, data []byte) (*ForHTTP, error) { if f.Name != fn { continue } - forHTTP := ForHTTP{} + forHTTP := ForHTTP{Hashes: make(map[string][]byte)} for _, h := range f.Hashes { + name := KnownHashes[h.Type] + if name == "" { + continue + } digest, err := hex.DecodeString(h.Hash) if err != nil { return nil, err } - switch h.Type { - case HashSHA256: - forHTTP.SHA256 = digest - case HashSHA512: - forHTTP.SHA512 = digest - case HashStreebog256: - forHTTP.Streebog256 = digest - case HashStreebog512: - forHTTP.Streebog512 = digest - case HashSHAKE128: - forHTTP.SHAKE128 = digest - case HashSHAKE256: - forHTTP.SHAKE256 = digest - } + forHTTP.Hashes[name] = digest } for _, u := range f.URLs { forHTTP.URLs = append(forHTTP.URLs, u.URL) diff --git a/meta4/scheme.go b/meta4/scheme.go index 82796a4..cccaa26 100644 --- a/meta4/scheme.go +++ b/meta4/scheme.go @@ -23,14 +23,8 @@ import ( ) const ( - HashSHA256 = "sha-256" - HashSHA512 = "sha-512" - HashStreebog256 = "streebog-256" - HashStreebog512 = "streebog-512" - HashSHAKE128 = "shake128" - HashSHAKE256 = "shake256" - Ext = ".meta4" - MaxSize = 1 << 16 + Ext = ".meta4" + MaxSize = 1 << 16 ) type Metalink struct {