From 69c2532026bb52c374f1d4832aba21c451b98727 Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Thu, 21 Jul 2022 22:13:18 +0200 Subject: [PATCH] Add Support to Follow Symlinks --- server/gitea/client.go | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/server/gitea/client.go b/server/gitea/client.go index b918235..6653d40 100644 --- a/server/gitea/client.go +++ b/server/gitea/client.go @@ -11,7 +11,10 @@ import ( "github.com/valyala/fastjson" ) -const giteaAPIRepos = "/api/v1/repos/" +const ( + giteaAPIRepos = "/api/v1/repos/" + giteaObjectTypeHeader = "X-Gitea-Object-Type" +) var ErrorNotFound = errors.New("not found") @@ -21,6 +24,8 @@ type Client struct { fastClient *fasthttp.Client infoTimeout time.Duration contentTimeout time.Duration + + followSymlinks bool } // TODO: once golang v1.19 is min requirement, we can switch to 'JoinPath()' of 'net/url' package @@ -47,6 +52,8 @@ func NewClient(giteaRoot, giteaAPIToken string) (*Client, error) { infoTimeout: 5 * time.Second, contentTimeout: 10 * time.Second, fastClient: getFastHTTPClient(), + + followSymlinks: true, }, err } @@ -60,7 +67,7 @@ func (client *Client) GiteaRawContent(targetOwner, targetRepo, ref, resource str func (client *Client) ServeRawContent(targetOwner, targetRepo, ref, resource string) (*fasthttp.Response, error) { url := joinURL(client.giteaRoot, giteaAPIRepos, targetOwner, targetRepo, "raw", resource+"?ref="+url.QueryEscape(ref)) - res, err := client.do(client.contentTimeout, url) + resp, err := client.do(client.contentTimeout, url) if err != nil { return nil, err } @@ -69,13 +76,19 @@ func (client *Client) ServeRawContent(targetOwner, targetRepo, ref, resource str return nil, err } - switch res.StatusCode() { + switch resp.StatusCode() { case fasthttp.StatusOK: - return res, nil + if client.followSymlinks && string(resp.Header.Peek(giteaObjectTypeHeader)) == "symlink" { + return client.ServeRawContent(targetOwner, targetRepo, ref, strings.TrimSpace(string(resp.Body()))) + } + + return resp, nil + case fasthttp.StatusNotFound: return nil, ErrorNotFound + default: - return nil, fmt.Errorf("unexpected status code '%d'", res.StatusCode()) + return nil, fmt.Errorf("unexpected status code '%d'", resp.StatusCode()) } }