]> Sergey Matveev's repositories - godlighty.git/blob - meta4/parse.go
0c598d31befcfe08b08bfd3d13c0d4ccc6194a71
[godlighty.git] / meta4 / parse.go
1 /*
2 godlighty -- highly-customizable HTTP, HTTP/2, HTTPS server
3 Copyright (C) 2021-2023 Sergey Matveev <stargrave@stargrave.org>
4
5 This program is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation, version 3 of the License.
8
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 GNU General Public License for more details.
13
14 You should have received a copy of the GNU General Public License
15 along with this program.  If not, see <http://www.gnu.org/licenses/>.
16 */
17
18 package meta4
19
20 import (
21         "encoding/hex"
22         "encoding/xml"
23 )
24
25 var KnownHashes = map[string]string{
26         "blake3-256":   "BLAKE3-256",
27         "sha-256":      "SHA-256",
28         "sha-512":      "SHA-512",
29         "shake128":     "SHAKE128",
30         "shake256":     "SHAKE256",
31         "skein-256":    "Skein-256",
32         "skein-512":    "Skein-512",
33         "streebog-256": "Streebog-256",
34         "streebog-512": "Streebog-512",
35 }
36
37 type ForHTTP struct {
38         Hashes   map[string][]byte
39         URLs     []string
40         Torrents []string
41 }
42
43 func Parse(fn string, data []byte) (*ForHTTP, error) {
44         var meta Metalink
45         err := xml.Unmarshal(data, &meta)
46         if err != nil {
47                 return nil, err
48         }
49         for _, f := range meta.Files {
50                 if f.Name != fn {
51                         continue
52                 }
53                 forHTTP := ForHTTP{Hashes: make(map[string][]byte)}
54                 for _, h := range f.Hashes {
55                         name := KnownHashes[h.Type]
56                         if name == "" {
57                                 continue
58                         }
59                         digest, err := hex.DecodeString(h.Hash)
60                         if err != nil {
61                                 return nil, err
62                         }
63                         forHTTP.Hashes[name] = digest
64                 }
65                 for _, u := range f.URLs {
66                         forHTTP.URLs = append(forHTTP.URLs, u.URL)
67                 }
68                 for _, m := range f.MetaURLs {
69                         if m.MediaType == "torrent" {
70                                 forHTTP.Torrents = append(forHTTP.Torrents, m.URL)
71                         }
72                 }
73                 return &forHTTP, nil
74         }
75         return nil, nil
76 }