mirror of https://github.com/golang/go.git
[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:
parent
484535e67b
commit
25b4f40625
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
|
|
|
|||
Loading…
Reference in New Issue