[release-branch.go1.20] Revert "net/http: FileServer method check + minimal OPTIONS implementation"

This reverts https://go.dev/cl/413554

Reason for revert: Backwards-incompatible change in behavior.

For #53501
For #59375
Fixes #59469

Change-Id: Ic3f63b378f9c819599b32e5e6e410f6163849317
Reviewed-on: https://go-review.googlesource.com/c/go/+/482635
Reviewed-by: Tatiana Bradley <tatianabradley@google.com>
Run-TryBot: Damien Neil <dneil@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
(cherry picked from commit c02fa75086)
Reviewed-on: https://go-review.googlesource.com/c/go/+/488635
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
Auto-Submit: Dmitri Shuralyov <dmitshur@google.com>
Reviewed-by: Dmitri Shuralyov <dmitshur@golang.org>
This commit is contained in:
Damien Neil 2023-04-05 10:19:44 -07:00 committed by Gopher Robot
parent 484535e67b
commit 25b4f40625
2 changed files with 5 additions and 56 deletions

View File

@ -858,22 +858,12 @@ func FileServer(root FileSystem) Handler {
}
func (f *fileHandler) ServeHTTP(w ResponseWriter, r *Request) {
const options = MethodOptions + ", " + MethodGet + ", " + MethodHead
switch r.Method {
case MethodGet, MethodHead:
if !strings.HasPrefix(r.URL.Path, "/") {
r.URL.Path = "/" + r.URL.Path
}
serveFile(w, r, f.root, path.Clean(r.URL.Path), true)
case MethodOptions:
w.Header().Set("Allow", options)
default:
w.Header().Set("Allow", options)
Error(w, "read-only", StatusMethodNotAllowed)
upath := r.URL.Path
if !strings.HasPrefix(upath, "/") {
upath = "/" + upath
r.URL.Path = upath
}
serveFile(w, r, f.root, path.Clean(upath), true)
}
// httpRange specifies the byte range to be sent to the client.

View File

@ -24,7 +24,6 @@ import (
"reflect"
"regexp"
"runtime"
"sort"
"strings"
"testing"
"time"
@ -420,46 +419,6 @@ func testFileServerImplicitLeadingSlash(t *testing.T, mode testMode) {
}
}
func TestFileServerMethodOptions(t *testing.T) { run(t, testFileServerMethodOptions) }
func testFileServerMethodOptions(t *testing.T, mode testMode) {
const want = "GET, HEAD, OPTIONS"
ts := newClientServerTest(t, mode, FileServer(Dir("."))).ts
tests := []struct {
method string
wantStatus int
}{
{MethodOptions, StatusOK},
{MethodDelete, StatusMethodNotAllowed},
{MethodPut, StatusMethodNotAllowed},
{MethodPost, StatusMethodNotAllowed},
}
for _, test := range tests {
req, err := NewRequest(test.method, ts.URL, nil)
if err != nil {
t.Fatal(err)
}
res, err := ts.Client().Do(req)
if err != nil {
t.Fatal(err)
}
defer res.Body.Close()
if res.StatusCode != test.wantStatus {
t.Errorf("%s got status %q, want code %d", test.method, res.Status, test.wantStatus)
}
a := strings.Split(res.Header.Get("Allow"), ", ")
sort.Strings(a)
got := strings.Join(a, ", ")
if got != want {
t.Errorf("%s got Allow header %q, want %q", test.method, got, want)
}
}
}
func TestDirJoin(t *testing.T) {
if runtime.GOOS == "windows" {
t.Skip("skipping test on windows")