]> source.dussan.org Git - gitea.git/commitdiff
Fix relative markdown links with anchors (#4058)
authorJonas Franz <info@jonasfranz.software>
Tue, 29 May 2018 03:51:42 +0000 (05:51 +0200)
committertechknowlogick <techknowlogick@users.noreply.github.com>
Tue, 29 May 2018 03:51:42 +0000 (23:51 -0400)
* Replace '%28' with '#'
Add test case

Signed-off-by: Jonas Franz <info@jonasfranz.software>
* Use ResolveReference instead of strings.Replace

Signed-off-by: Jonas Franz <info@jonasfranz.software>
modules/util/util.go
modules/util/util_test.go

index 3a0411f64b800b58718f11c2ab1f040773820a63..4bd2b843f73c404ab53da64f41edd97182274d9e 100644 (file)
@@ -7,6 +7,7 @@ package util
 import (
        "net/url"
        "path"
+       "strings"
 
        "code.gitea.io/gitea/modules/log"
 )
@@ -56,16 +57,25 @@ func Max(a, b int) int {
 
 // URLJoin joins url components, like path.Join, but preserving contents
 func URLJoin(base string, elems ...string) string {
-       u, err := url.Parse(base)
+       if !strings.HasSuffix(base, "/") {
+               base += "/"
+       }
+       baseURL, err := url.Parse(base)
        if err != nil {
                log.Error(4, "URLJoin: Invalid base URL %s", base)
                return ""
        }
-       joinArgs := make([]string, 0, len(elems)+1)
-       joinArgs = append(joinArgs, u.Path)
-       joinArgs = append(joinArgs, elems...)
-       u.Path = path.Join(joinArgs...)
-       return u.String()
+       joinedPath := path.Join(elems...)
+       argURL, err := url.Parse(joinedPath)
+       if err != nil {
+               log.Error(4, "URLJoin: Invalid arg %s", joinedPath)
+               return ""
+       }
+       joinedURL := baseURL.ResolveReference(argURL).String()
+       if !baseURL.IsAbs() {
+               return joinedURL[1:] // Removing leading '/'
+       }
+       return joinedURL
 }
 
 // Min min of two ints
index cc5875263a3f49d6de70b38c83ef1baba3a493f5..67d9efe1d2f861fd7fe7f49bbacfb1fe442deba0 100644 (file)
@@ -30,6 +30,8 @@ func TestURLJoin(t *testing.T) {
                        "a", "b/c/"),
                newTest("a/b/d",
                        "a/", "b/c/", "/../d/"),
+               newTest("https://try.gitea.io/a/b/c#d",
+                       "https://try.gitea.io", "a/b", "c#d"),
        } {
                assert.Equal(t, test.Expected, URLJoin(test.Base, test.Elements...))
        }