diff --git a/integration/get_test.go b/integration/get_test.go index 617c886..332096f 100644 --- a/integration/get_test.go +++ b/integration/get_test.go @@ -103,6 +103,19 @@ func TestFollowSymlink(t *testing.T) { assert.EqualValues(t, "abc\n", string(body)) } +func TestLFSSupport(t *testing.T) { + log.Printf("=== TestLFSSupport ===\n") + + resp, err := getTestHTTPSClient().Get("https://6543.localhost.mock.directory:4430/tests_for_pages-server/@main/lfs.txt") + assert.NoError(t, err) + if !assert.EqualValues(t, http.StatusOK, resp.StatusCode) { + t.FailNow() + } + body := strings.TrimSpace(string(getBytes(resp.Body))) + assert.EqualValues(t, 12, len(body)) + assert.EqualValues(t, "actual value", body) +} + func getTestHTTPSClient() *http.Client { cookieJar, _ := cookiejar.New(nil) return &http.Client{ diff --git a/server/gitea/client.go b/server/gitea/client.go index 9c45e66..747bd6a 100644 --- a/server/gitea/client.go +++ b/server/gitea/client.go @@ -27,6 +27,7 @@ type Client struct { contentTimeout time.Duration followSymlinks bool + supportLFS bool } // TODO: once golang v1.19 is min requirement, we can switch to 'JoinPath()' of 'net/url' package @@ -55,6 +56,7 @@ func NewClient(giteaRoot, giteaAPIToken string) (*Client, error) { fastClient: getFastHTTPClient(), followSymlinks: true, + supportLFS: true, }, err } @@ -67,8 +69,13 @@ 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)) - resp, err := client.do(client.contentTimeout, url) + var apiURL string + if client.supportLFS { + apiURL = joinURL(client.giteaRoot, giteaAPIRepos, targetOwner, targetRepo, "media", resource+"?ref="+url.QueryEscape(ref)) + } else { + apiURL = joinURL(client.giteaRoot, giteaAPIRepos, targetOwner, targetRepo, "raw", resource+"?ref="+url.QueryEscape(ref)) + } + resp, err := client.do(client.contentTimeout, apiURL) if err != nil { return nil, err }