Merge branch 'move-more-logic-into-client' into std-http

This commit is contained in:
6543 2022-07-21 21:58:22 +02:00
commit cfecdb6acc
No known key found for this signature in database
GPG key ID: C99B82E40B027BAE
7 changed files with 40 additions and 42 deletions

12
server/gitea/cache.go Normal file
View 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
}

View file

@ -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
}

View file

@ -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, "/")
}

View file

@ -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"
) )

View file

@ -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)
} }

View file

@ -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")