pages-server/pages/parser.go
2024-09-14 11:53:32 +08:00

70 lines
1.9 KiB
Go

package pages
import (
"fmt"
"github.com/pkg/errors"
"net/http"
"strings"
)
func (p *PageClient) parseDomain(request *http.Request) (*PageDomain, string, error) {
if strings.Contains(request.Host, "]") {
//跳过 ipv6 address 直接访问, 因为仅支持域名的方式
return nil, "", ErrorNotMatches
}
host := strings.Split(request.Host, ":")[0]
filePath := request.URL.Path
pathTrim := strings.Split(strings.Trim(filePath, "/"), "/")
repo := pathTrim[0]
// 处理 scheme://domain/path 的情况
if !strings.HasPrefix(filePath, fmt.Sprintf("/%s/", repo)) {
repo = ""
}
if strings.HasSuffix(host, p.BaseDomain) {
child := strings.Split(strings.TrimSuffix(host, p.BaseDomain), ".")
result := NewPageDomain(
child[len(child)-1],
repo,
"gh-pages",
)
// 处于使用默认 Domain 下
config, err := p.OwnerCache.GetOwnerConfig(p.GiteaConfig, result.Owner)
if err != nil {
return nil, "", err
}
ownerRepoName := result.Owner + p.BaseDomain
if result.Repo == "" && config.Exists(ownerRepoName) {
// 推导为默认仓库
result.Repo = ownerRepoName
return result, filePath, nil
} else if result.Repo == "" || !config.Exists(result.Repo) {
if config.Exists(ownerRepoName) {
result.Repo = ownerRepoName
return result, filePath, nil
}
// 未指定 repo 或者 repo 不存在,跳过
return nil, "", errors.Wrap(ErrorNotFound, result.Repo+" not found")
}
// 存在子目录且仓库存在
pathTrim = pathTrim[1:]
path := ""
if strings.HasSuffix(filePath, "/") {
path = "/" + strings.Join(pathTrim, "/") + "/"
} else {
path = "/" + strings.Join(pathTrim, "/")
}
path = strings.ReplaceAll(path, "//", "/")
path = strings.ReplaceAll(path, "//", "/")
if path == "" {
path = "/"
}
return result, path, nil
} else {
get, exists := p.DomainAlias.Get(host)
if exists {
return &get, filePath, nil
} else {
return nil, "", errors.Wrap(ErrorNotFound, "")
}
}
}