mirror of
https://codeberg.org/Codeberg/pages-server.git
synced 2025-01-19 17:07:54 +00:00
Merge branch 'move-more-logic-into-client' into std-http
This commit is contained in:
commit
cfecdb6acc
7 changed files with 40 additions and 42 deletions
12
server/gitea/cache.go
Normal file
12
server/gitea/cache.go
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
package gitea
|
||||||
|
|
||||||
|
type FileResponse struct {
|
||||||
|
Exists bool
|
||||||
|
ETag []byte
|
||||||
|
MimeType string
|
||||||
|
Body []byte
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f FileResponse) IsEmpty() bool {
|
||||||
|
return len(f.Body) != 0
|
||||||
|
}
|
|
@ -2,34 +2,6 @@ package gitea
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"strings"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const giteaAPIRepos = "/api/v1/repos/"
|
|
||||||
|
|
||||||
var ErrorNotFound = errors.New("not found")
|
var ErrorNotFound = errors.New("not found")
|
||||||
|
|
||||||
type FileResponse struct {
|
|
||||||
Exists bool
|
|
||||||
ETag []byte
|
|
||||||
MimeType string
|
|
||||||
Body []byte
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: once golang v1.19 is min requirement, we can switch to 'JoinPath()' of 'net/url' package
|
|
||||||
func joinURL(baseURL string, paths ...string) string {
|
|
||||||
p := make([]string, 0, len(paths))
|
|
||||||
for i := range paths {
|
|
||||||
path := strings.TrimSpace(paths[i])
|
|
||||||
path = strings.Trim(path, "/")
|
|
||||||
if len(path) != 0 {
|
|
||||||
p = append(p, path)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return baseURL + "/" + strings.Join(p, "/")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (f FileResponse) IsEmpty() bool {
|
|
||||||
return len(f.Body) != 0
|
|
||||||
}
|
|
||||||
|
|
|
@ -10,8 +10,12 @@ import (
|
||||||
|
|
||||||
"github.com/valyala/fasthttp"
|
"github.com/valyala/fasthttp"
|
||||||
"github.com/valyala/fastjson"
|
"github.com/valyala/fastjson"
|
||||||
|
|
||||||
|
"codeberg.org/codeberg/pages/server/cache"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const giteaAPIRepos = "/api/v1/repos/"
|
||||||
|
|
||||||
type Client struct {
|
type Client struct {
|
||||||
giteaRoot string
|
giteaRoot string
|
||||||
giteaAPIToken string
|
giteaAPIToken string
|
||||||
|
@ -36,24 +40,15 @@ func NewClient(giteaRoot, giteaAPIToken string, fileResponseCache cache.SetGetKe
|
||||||
}
|
}
|
||||||
|
|
||||||
func (client *Client) GiteaRawContent(targetOwner, targetRepo, ref, resource string) ([]byte, error) {
|
func (client *Client) GiteaRawContent(targetOwner, targetRepo, ref, resource string) ([]byte, error) {
|
||||||
url := joinURL(client.giteaRoot, giteaAPIRepos, targetOwner, targetRepo, "raw", resource+"?ref="+url.QueryEscape(ref))
|
resp, err := client.ServeRawContent(targetOwner, targetRepo, ref, resource)
|
||||||
res, err := client.do(client.contentTimeout, url)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
return resp.Body(), nil
|
||||||
switch res.StatusCode() {
|
|
||||||
case fasthttp.StatusOK:
|
|
||||||
return res.Body(), nil
|
|
||||||
case fasthttp.StatusNotFound:
|
|
||||||
return nil, ErrorNotFound
|
|
||||||
default:
|
|
||||||
return nil, fmt.Errorf("unexpected status code '%d'", res.StatusCode())
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (client *Client) ServeRawContent(uri string) (*fasthttp.Response, error) {
|
func (client *Client) ServeRawContent(targetOwner, targetRepo, ref, resource string) (*fasthttp.Response, error) {
|
||||||
url := joinURL(client.giteaRoot, giteaAPIRepos, uri)
|
url := joinURL(client.giteaRoot, giteaAPIRepos, targetOwner, targetRepo, "raw", resource+"?ref="+url.QueryEscape(ref))
|
||||||
res, err := client.do(client.contentTimeout, url)
|
res, err := client.do(client.contentTimeout, url)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -104,3 +99,17 @@ func (client *Client) do(timeout time.Duration, url string) (*fasthttp.Response,
|
||||||
|
|
||||||
return res, err
|
return res, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: once golang v1.19 is min requirement, we can switch to 'JoinPath()' of 'net/url' package
|
||||||
|
func joinURL(baseURL string, paths ...string) string {
|
||||||
|
p := make([]string, 0, len(paths))
|
||||||
|
for i := range paths {
|
||||||
|
path := strings.TrimSpace(paths[i])
|
||||||
|
path = strings.Trim(path, "/")
|
||||||
|
if len(path) != 0 {
|
||||||
|
p = append(p, path)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return baseURL + "/" + strings.Join(p, "/")
|
||||||
|
}
|
||||||
|
|
|
@ -12,6 +12,7 @@ import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"code.gitea.io/sdk/gitea"
|
"code.gitea.io/sdk/gitea"
|
||||||
|
|
||||||
"codeberg.org/codeberg/pages/server/cache"
|
"codeberg.org/codeberg/pages/server/cache"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -67,6 +67,10 @@ func (o *Options) generateUri() string {
|
||||||
return path.Join(o.TargetOwner, o.TargetRepo, "raw", o.TargetBranch, o.TargetPath)
|
return path.Join(o.TargetOwner, o.TargetRepo, "raw", o.TargetBranch, o.TargetPath)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (o *Options) generateUriClientArgs() (targetOwner, targetRepo, ref, resource string) {
|
||||||
|
return o.TargetOwner, o.TargetRepo, o.TargetBranch, o.TargetPath
|
||||||
|
}
|
||||||
|
|
||||||
func (o *Options) timestamp() string {
|
func (o *Options) timestamp() string {
|
||||||
return strconv.FormatInt(o.BranchTimestamp.Unix(), 10)
|
return strconv.FormatInt(o.BranchTimestamp.Unix(), 10)
|
||||||
}
|
}
|
||||||
|
|
|
@ -80,7 +80,7 @@ func (o *Options) Upstream(ctx *fasthttp.RequestCtx, giteaClient *gitea.Client,
|
||||||
if cachedValue, ok := fileResponseCache.Get(uri + "?timestamp=" + o.timestamp()); ok && !cachedValue.(gitea.FileResponse).IsEmpty() {
|
if cachedValue, ok := fileResponseCache.Get(uri + "?timestamp=" + o.timestamp()); ok && !cachedValue.(gitea.FileResponse).IsEmpty() {
|
||||||
cachedResponse = cachedValue.(gitea.FileResponse)
|
cachedResponse = cachedValue.(gitea.FileResponse)
|
||||||
} else {
|
} else {
|
||||||
res, err = giteaClient.ServeRawContent(uri)
|
res, err = giteaClient.ServeRawContent(o.generateUriClientArgs())
|
||||||
}
|
}
|
||||||
log.Debug().Msg("acquisition")
|
log.Debug().Msg("acquisition")
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue