test: enable the missing Host header ListBuckets test
Since fasthttp v1.70.0 an HTTP/1.1 request without a Host header is rejected and the gateway answers it with 400 BadRequest. Add a server test that sends such requests over a raw connection and stop skipping the REST missing host test against the gateway. Fixes #1530
This commit is contained in:
1 parent
cf6c64c93a
commit
deab0fc412
2 files changed
+90
-3
No files matched your search
@@ -15,6 +15,8 @@
|
|||||||
package s3api
|
package s3api
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bufio"
|
||||||
|
"encoding/xml"
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/http/httptest"
|
"net/http/httptest"
|
||||||
@@ -287,3 +289,91 @@ func TestCustomMountValidation(t *testing.T) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TestRequestHostHeader sends raw requests to a running server, since Go
|
||||||
|
// HTTP clients always set a Host header, and checks that an HTTP/1.1
|
||||||
|
// request without one is rejected with 400 Bad Request, as S3 does.
|
||||||
|
func TestRequestHostHeader(t *testing.T) {
|
||||||
|
got := make(chan []net.Addr, 1)
|
||||||
|
sa, err := newTestS3ApiServer(WithOnListenAddrs(func(addrs []net.Addr) { got <- addrs }))
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("New() error = %v", err)
|
||||||
|
}
|
||||||
|
served := make(chan error, 1)
|
||||||
|
go func() { served <- sa.ServeMultiPort([]string{"127.0.0.1:0"}) }()
|
||||||
|
|
||||||
|
var addr string
|
||||||
|
select {
|
||||||
|
case addrs := <-got:
|
||||||
|
addr = addrs[0].String()
|
||||||
|
case err := <-served:
|
||||||
|
t.Fatalf("ServeMultiPort() returned before the listen hook fired: %v", err)
|
||||||
|
case <-time.After(10 * time.Second):
|
||||||
|
t.Fatal("listen hook did not fire")
|
||||||
|
}
|
||||||
|
t.Cleanup(func() {
|
||||||
|
if err := sa.ShutDown(); err != nil {
|
||||||
|
t.Errorf("ShutDown() error = %v", err)
|
||||||
|
}
|
||||||
|
<-served
|
||||||
|
})
|
||||||
|
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
request string
|
||||||
|
wantStatus int
|
||||||
|
wantCode string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "missing host",
|
||||||
|
request: "GET / HTTP/1.1\r\n\r\n",
|
||||||
|
wantStatus: http.StatusBadRequest,
|
||||||
|
wantCode: "BadRequest",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "empty host",
|
||||||
|
request: "GET / HTTP/1.1\r\nHost:\r\n\r\n",
|
||||||
|
wantStatus: http.StatusBadRequest,
|
||||||
|
wantCode: "BadRequest",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "host present",
|
||||||
|
request: "GET / HTTP/1.1\r\nHost: " + addr + "\r\n\r\n",
|
||||||
|
wantStatus: http.StatusForbidden,
|
||||||
|
wantCode: "AccessDenied",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
conn, err := net.DialTimeout("tcp", addr, 5*time.Second)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("dial: %v", err)
|
||||||
|
}
|
||||||
|
defer conn.Close()
|
||||||
|
if err := conn.SetDeadline(time.Now().Add(10 * time.Second)); err != nil {
|
||||||
|
t.Fatalf("set deadline: %v", err)
|
||||||
|
}
|
||||||
|
if _, err := conn.Write([]byte(tt.request)); err != nil {
|
||||||
|
t.Fatalf("write request: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := http.ReadResponse(bufio.NewReader(conn), nil)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("read response: %v", err)
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
|
||||||
|
if resp.StatusCode != tt.wantStatus {
|
||||||
|
t.Fatalf("status = %d, want %d", resp.StatusCode, tt.wantStatus)
|
||||||
|
}
|
||||||
|
var apiErr struct{ Code string }
|
||||||
|
if err := xml.NewDecoder(resp.Body).Decode(&apiErr); err != nil {
|
||||||
|
t.Fatalf("decode error response: %v", err)
|
||||||
|
}
|
||||||
|
if apiErr.Code != tt.wantCode {
|
||||||
|
t.Fatalf("error code = %q, want %q", apiErr.Code, tt.wantCode)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -105,9 +105,6 @@ export RUN_USERS=true
|
|||||||
|
|
||||||
# tags: openssl,ListBuckets,required-headers,host,invalid-header
|
# tags: openssl,ListBuckets,required-headers,host,invalid-header
|
||||||
@test "REST - missing host parameter" {
|
@test "REST - missing host parameter" {
|
||||||
if [ "$DIRECT" != "true" ]; then
|
|
||||||
skip "https://github.com/versity/versitygw/issues/1530"
|
|
||||||
fi
|
|
||||||
run send_openssl_go_command "400" "-missingHostParam"
|
run send_openssl_go_command "400" "-missingHostParam"
|
||||||
assert_success
|
assert_success
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user