81 lines
1.7 KiB
Go
81 lines
1.7 KiB
Go
package utils
|
|
|
|
import (
|
|
"fmt"
|
|
"net/url"
|
|
"os"
|
|
"path"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/rs/zerolog/log"
|
|
|
|
"git.gay/gitgay/pages/cache"
|
|
"git.gay/gitgay/pages/errors"
|
|
)
|
|
|
|
var (
|
|
resolveCache = cache.NewRedisCache[*DomainResolution]("resolve", time.Minute*15)
|
|
PAGES_DOMAIN = os.Getenv("PAGES_DOMAIN")
|
|
BASE_URL = fmt.Sprintf("https://%s/", PAGES_DOMAIN)
|
|
PAGES_DOMAIN_CANONICAL = PAGES_DOMAIN + "."
|
|
PAGES_SUBDOMAIN = fmt.Sprintf(".%s", PAGES_DOMAIN)
|
|
)
|
|
|
|
func CleanPath(uriPath string) string {
|
|
unescapedPath, _ := url.PathUnescape(uriPath)
|
|
cleanedPath := path.Join("/", unescapedPath)
|
|
|
|
return cleanedPath
|
|
}
|
|
|
|
type DomainResolution struct {
|
|
Owner string
|
|
Repository string
|
|
Branch *string
|
|
}
|
|
|
|
func (d *DomainResolution) String() string {
|
|
if d.Branch != nil {
|
|
return fmt.Sprintf("%s/%s/%s", d.Owner, d.Repository, *d.Branch)
|
|
}
|
|
return fmt.Sprintf("%s/%s", d.Owner, d.Repository)
|
|
}
|
|
|
|
func ResolveDomain(domain string) (result *DomainResolution, err error) {
|
|
result, err = resolveCache.Get(domain)
|
|
if err == nil {
|
|
return
|
|
}
|
|
target, err := getTarget(domain)
|
|
if err != nil {
|
|
return
|
|
}
|
|
target = strings.TrimSuffix(target, "."+PAGES_DOMAIN)
|
|
parts := strings.Split(target, ".")
|
|
if parts[0] == "*" {
|
|
parts = parts[1:]
|
|
}
|
|
result = &DomainResolution{}
|
|
switch len(parts) {
|
|
case 1:
|
|
result.Owner = parts[0]
|
|
result.Repository = "pages"
|
|
case 2:
|
|
result.Owner = parts[1]
|
|
result.Repository = parts[0]
|
|
case 3:
|
|
result.Owner = parts[2]
|
|
result.Repository = parts[1]
|
|
result.Branch = &parts[0]
|
|
default:
|
|
return nil, errors.NewErrorInvalidTarget()
|
|
}
|
|
log.Debug().Str("domain", domain).Str("target", target).Msg("Resolved domain")
|
|
err = resolveCache.Set(domain, result)
|
|
if err != nil {
|
|
return
|
|
}
|
|
return result, nil
|
|
}
|