diff --git a/server/gitea/client.go b/server/gitea/client.go index 8a34d5b..6a31fb1 100644 --- a/server/gitea/client.go +++ b/server/gitea/client.go @@ -4,7 +4,7 @@ import ( "errors" "fmt" "net/url" - "path" + "strings" "time" "github.com/valyala/fasthttp" @@ -16,7 +16,7 @@ const giteaAPIRepos = "/api/v1/repos/" var ErrorNotFound = errors.New("not found") type Client struct { - giteaRoot *url.URL + giteaRoot string giteaAPIToken string fastClient *fasthttp.Client infoTimeout time.Duration @@ -29,18 +29,27 @@ type FileResponse struct { Body []byte } -func joinURL(baseURL *url.URL, paths ...string) string { - b := *baseURL - b.Path = path.Join(append([]string{b.Path}, paths...)...) - return b.String() +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 } func NewClient(giteaRoot, giteaAPIToken string) (*Client, error) { rootURL, err := url.Parse(giteaRoot) + giteaRoot = strings.Trim(rootURL.String(), "/") + return &Client{ - giteaRoot: rootURL, + giteaRoot: giteaRoot, giteaAPIToken: giteaAPIToken, infoTimeout: 5 * time.Second, contentTimeout: 10 * time.Second, diff --git a/server/gitea/client_test.go b/server/gitea/client_test.go index 83be60c..7dbad68 100644 --- a/server/gitea/client_test.go +++ b/server/gitea/client_test.go @@ -8,16 +8,16 @@ import ( ) func TestJoinURL(t *testing.T) { - baseURL, _ := url.Parse("") - assert.EqualValues(t, "", joinURL(baseURL)) - assert.EqualValues(t, "", joinURL(baseURL, "", "")) + baseURL := "" + assert.EqualValues(t, "/", joinURL(baseURL)) + assert.EqualValues(t, "/", joinURL(baseURL, "", "")) - baseURL, _ = url.Parse("http://wwow.url.com") + baseURL = "http://wwow.url.com" assert.EqualValues(t, "http://wwow.url.com/a/b/c/d", joinURL(baseURL, "a", "b/c/", "d")) - baseURL, _ = url.Parse("http://wow.url.com/subpath/2/") + baseURL = "http://wow.url.com/subpath/2" assert.EqualValues(t, "http://wow.url.com/subpath/2/content.pdf", joinURL(baseURL, "/content.pdf")) assert.EqualValues(t, "http://wow.url.com/subpath/2/wonderful.jpg", joinURL(baseURL, "wonderful.jpg")) - assert.EqualValues(t, "http://wow.url.com/subpath/2/wonderful.jpg?ref=main", joinURL(baseURL, "raw", "wonderful.jpg"+"?ref="+url.QueryEscape("main"))) - assert.EqualValues(t, "http://wow.url.com/subpath/2/wonderful.jpg%3Fref=main", joinURL(baseURL, "raw", "wonderful.jpg%3Fref=main")) + assert.EqualValues(t, "http://wow.url.com/subpath/2/raw/wonderful.jpg?ref=main", joinURL(baseURL, "raw", "wonderful.jpg"+"?ref="+url.QueryEscape("main"))) + assert.EqualValues(t, "http://wow.url.com/subpath/2/raw/wonderful.jpg%3Fref=main", joinURL(baseURL, "raw", "wonderful.jpg%3Fref=main")) }