net/http: prepend ./ to directory list hrefs in FileServer
Certain browsers (Chrome 53, Safari 9.1.2, Firefox 46) won't correctly
follow a directory listing's links if the file name begins with a run
of characters then a colon, e.g. "foo:bar". Probably mistaking it for
a URI. However, they are happy to follow "./foo:bar", so this change
prepends "./" to all link hrefs in the directory listing of
FileServer.
Change-Id: I60ee8e1ebac73cbd3a3ac0f23e80fdf52e3dc352
Reviewed-on: https://go-review.googlesource.com/27440
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
diff --git a/src/net/http/fs.go b/src/net/http/fs.go
index c7a58a6..9ebc558 100644
--- a/src/net/http/fs.go
+++ b/src/net/http/fs.go
@@ -90,7 +90,7 @@
// part of the URL path, and not indicate the start of a query
// string or fragment.
url := url.URL{Path: name}
- fmt.Fprintf(w, "<a href=\"%s\">%s</a>\n", url.String(), htmlReplacer.Replace(name))
+ fmt.Fprintf(w, "<a href=\"./%s\">%s</a>\n", url.String(), htmlReplacer.Replace(name))
}
fmt.Fprintf(w, "</pre>\n")
}
diff --git a/src/net/http/fs_test.go b/src/net/http/fs_test.go
index c811891..aa3323d 100644
--- a/src/net/http/fs_test.go
+++ b/src/net/http/fs_test.go
@@ -270,10 +270,10 @@
tests := []struct {
name, escaped string
}{
- {`simple_name`, `<a href="simple_name">simple_name</a>`},
- {`"'<>&`, `<a href="%22%27%3C%3E&">"'<>&</a>`},
- {`?foo=bar#baz`, `<a href="%3Ffoo=bar%23baz">?foo=bar#baz</a>`},
- {`<combo>?foo`, `<a href="%3Ccombo%3E%3Ffoo"><combo>?foo</a>`},
+ {`simple_name`, `<a href="./simple_name">simple_name</a>`},
+ {`"'<>&`, `<a href="./%22%27%3C%3E&">"'<>&</a>`},
+ {`?foo=bar#baz`, `<a href="./%3Ffoo=bar%23baz">?foo=bar#baz</a>`},
+ {`<combo>?foo`, `<a href="./%3Ccombo%3E%3Ffoo"><combo>?foo</a>`},
}
// We put each test file in its own directory in the fakeFS so we can look at it in isolation.
@@ -349,7 +349,7 @@
t.Fatalf("read Body: %v", err)
}
s := string(b)
- if !strings.Contains(s, "<a href=\"a\">a</a>\n<a href=\"b\">b</a>") {
+ if !strings.Contains(s, "<a href=\"./a\">a</a>\n<a href=\"./b\">b</a>") {
t.Errorf("output appears to be unsorted:\n%s", s)
}
}