return originalErr
}
+// errInvalidUnsafePath is returned by Dir.Open when the call to
+// filepath.Localize fails. filepath.Localize returns an error if the path
+// cannot be represented by the operating system.
+var errInvalidUnsafePath = errors.New("http: invalid or unsafe file path")
+
// Open implements [FileSystem] using [os.Open], opening files for reading rooted
// and relative to the directory d.
func (d Dir) Open(name string) (File, error) {
}
path, err := filepath.Localize(path)
if err != nil {
- return nil, errors.New("http: invalid or unsafe file path")
+ return nil, errInvalidUnsafePath
}
dir := string(d)
if dir == "" {
if errors.Is(err, fs.ErrPermission) {
return "403 Forbidden", StatusForbidden
}
+ if errors.Is(err, errInvalidUnsafePath) {
+ return "404 page not found", StatusNotFound
+ }
// Default:
return "500 Internal Server Error", StatusInternalServerError
}
}
}
+func TestFileServerNullByte(t *testing.T) { run(t, testFileServerNullByte) }
+func testFileServerNullByte(t *testing.T, mode testMode) {
+ ts := newClientServerTest(t, mode, FileServer(Dir("testdata"))).ts
+
+ for _, path := range []string{
+ "/file%00",
+ "/%00",
+ "/file/qwe/%00",
+ } {
+ res, err := ts.Client().Get(ts.URL + path)
+ if err != nil {
+ t.Fatal(err)
+ }
+ res.Body.Close()
+ if res.StatusCode != 404 {
+ t.Errorf("Get(%q): got status %v, want 404", path, res.StatusCode)
+ }
+
+ }
+}
+
func TestFileServerNamesEscape(t *testing.T) { run(t, testFileServerNamesEscape) }
func testFileServerNamesEscape(t *testing.T, mode testMode) {
ts := newClientServerTest(t, mode, FileServer(Dir("testdata"))).ts