Switches relative URLs to RelativeReference lib method

This commit is contained in:
Sloom Sloum Sluom IV 2020-05-26 21:46:17 -07:00
parent cba3682c27
commit c175b45cb9
1 changed files with 12 additions and 44 deletions

View File

@ -6,6 +6,7 @@ import (
"crypto/tls" "crypto/tls"
"fmt" "fmt"
"io/ioutil" "io/ioutil"
"net/url"
"strconv" "strconv"
"strings" "strings"
"time" "time"
@ -343,8 +344,7 @@ func Visit(host, port, resource string, td *TofuDigest) (Capsule, error) {
resource = "/" resource = "/"
} }
currentUrl := fmt.Sprintf("gemini://%s:%s%s", host, port, resource) currentUrl := fmt.Sprintf("gemini://%s:%s%s", host, port, resource)
rootUrl := fmt.Sprintf("gemini://%s:%s", host, port) capsule.Content, capsule.Links = parseGemini(body, currentUrl)
capsule.Content, capsule.Links = parseGemini(body, rootUrl, currentUrl)
} else { } else {
capsule.Content = body capsule.Content = body
} }
@ -365,7 +365,7 @@ func Visit(host, port, resource string, td *TofuDigest) (Capsule, error) {
} }
} }
func parseGemini(b, rootUrl, currentUrl string) (string, []string) { func parseGemini(b, currentUrl string) (string, []string) {
splitContent := strings.Split(b, "\n") splitContent := strings.Split(b, "\n")
links := make([]string, 0, 10) links := make([]string, 0, 10)
@ -399,7 +399,7 @@ func parseGemini(b, rootUrl, currentUrl string) (string, []string) {
} }
if strings.Index(link, "://") < 0 { if strings.Index(link, "://") < 0 {
link = handleRelativeUrl(link, rootUrl, currentUrl) link, _ = handleRelativeUrl(link, currentUrl)
} }
links = append(links, link) links = append(links, link)
@ -418,48 +418,16 @@ func parseGemini(b, rootUrl, currentUrl string) (string, []string) {
} }
// handleRelativeUrl provides link completion // handleRelativeUrl provides link completion
// takes: func handleRelativeUrl(relLink, current string) (string, error) {
// - u : the relative link as written on the page base, err := url.Parse(current)
// - root : the root url for the site if err != nil {
// - current : the current url a user is on return relLink, err
func handleRelativeUrl(u, root, current string) string {
if len(u) < 1 {
return u
} }
currentIsDir := strings.HasSuffix(current, "/") rel, err := url.Parse(relLink)
if err != nil {
if u[0] == '/' { return relLink, err
// Handle relative off of root
return fmt.Sprintf("%s%s", root, u)
} else if strings.HasPrefix(u, "../") {
// Handle up one dir
currentDir := strings.LastIndex(current, "/")
upOne := strings.LastIndex(current[:currentDir], "/")
dirRoot := current[:upOne]
if upOne < len(root) {
return fmt.Sprintf("%s%s", root, u[2:])
}
return dirRoot + u[2:]
} }
return base.ResolveReference(rel).String(), nil
if strings.HasPrefix(u, "./") {
// Handle explicit same dir
if len(u) == 2 {
return current
}
u = u[2:]
}
if currentIsDir {
// Handle non-prefixed relative link when current URL is a directory
ind := strings.LastIndex(current, "/")
current = current[:ind+1]
return current + u
}
// Handle non-prefixed relative link when current URL is a file
indPrevDir := strings.LastIndex(current, "/")
return current[:indPrevDir+1] + u
} }
func hashCert(cert []byte) string { func hashCert(cert []byte) string {