Re-encode URLs from CF and when exporting to MR for RFC3986 compliance

This commit is contained in:
comp500 2022-02-14 15:48:54 +00:00
parent fa5de4b4bc
commit 36b6d806c8
3 changed files with 34 additions and 3 deletions

14
core/urlutil.go Normal file
View File

@ -0,0 +1,14 @@
package core
import (
"fmt"
"net/url"
)
func ReencodeURL(u string) (string, error) {
parsed, err := url.Parse(u)
if err != nil {
return "", fmt.Errorf("failed to parse url: %s, %v", u, err)
}
return parsed.String(), nil
}

View File

@ -174,12 +174,17 @@ func createModFile(modInfo modInfo, fileInfo modFileInfo, index *core.Index) err
return err
}
u, err := core.ReencodeURL(fileInfo.DownloadURL)
if err != nil {
return err
}
modMeta := core.Mod{
Name: modInfo.Name,
FileName: fileInfo.FileName,
Side: core.UniversalSide,
Download: core.ModDownload{
URL: fileInfo.DownloadURL,
URL: u,
// TODO: murmur2 hashing may be unstable in curse api, calculate the hash manually?
// TODO: check if the hash is invalid (e.g. 0)
HashFormat: "murmur2",
@ -409,10 +414,15 @@ func (u cfUpdater) DoUpdate(mods []*core.Mod, cachedState []interface{}) error {
}
}
u, err := core.ReencodeURL(fileInfoData.DownloadURL)
if err != nil {
return err
}
v.FileName = fileInfoData.FileName
v.Name = modState.Name
v.Download = core.ModDownload{
URL: fileInfoData.DownloadURL,
URL: u,
// TODO: murmur2 hashing may be unstable in curse api, calculate the hash manually?
// TODO: check if the hash is invalid (e.g. 0)
HashFormat: "murmur2",

View File

@ -135,6 +135,13 @@ var exportCmd = &cobra.Command{
serverEnv = envInstalled
}
// Modrinth URLs must be RFC3986
u, err := core.ReencodeURL(mod.Download.URL)
if err != nil {
fmt.Printf("Error re-encoding mod URL: %s\n", err.Error())
u = mod.Download.URL
}
manifestFiles[i] = PackFile{
Path: path,
Hashes: hashes,
@ -142,7 +149,7 @@ var exportCmd = &cobra.Command{
Client string `json:"client"`
Server string `json:"server"`
}{Client: clientEnv, Server: serverEnv},
Downloads: []string{mod.Download.URL},
Downloads: []string{u},
}
}