2017-10-07 00:16:47 +00:00
|
|
|
// Copyright 2016 The Go Authors. All rights reserved.
|
|
|
|
// Use of this source code is governed by a BSD-style
|
|
|
|
// license that can be found in the LICENSE file.
|
|
|
|
|
|
|
|
package httptest
|
|
|
|
|
|
|
|
import (
|
|
|
|
"crypto/tls"
|
|
|
|
"io"
|
|
|
|
"net/http"
|
|
|
|
"net/url"
|
|
|
|
"reflect"
|
|
|
|
"strings"
|
|
|
|
"testing"
|
|
|
|
)
|
|
|
|
|
|
|
|
func TestNewRequest(t *testing.T) {
|
2019-06-02 15:48:37 +00:00
|
|
|
for _, tt := range [...]struct {
|
|
|
|
name string
|
|
|
|
|
2017-10-07 00:16:47 +00:00
|
|
|
method, uri string
|
|
|
|
body io.Reader
|
|
|
|
|
|
|
|
want *http.Request
|
|
|
|
wantBody string
|
|
|
|
}{
|
2019-06-02 15:48:37 +00:00
|
|
|
{
|
|
|
|
name: "Empty method means GET",
|
2017-10-07 00:16:47 +00:00
|
|
|
method: "",
|
|
|
|
uri: "/",
|
|
|
|
body: nil,
|
|
|
|
want: &http.Request{
|
|
|
|
Method: "GET",
|
|
|
|
Host: "example.com",
|
|
|
|
URL: &url.URL{Path: "/"},
|
|
|
|
Header: http.Header{},
|
|
|
|
Proto: "HTTP/1.1",
|
|
|
|
ProtoMajor: 1,
|
|
|
|
ProtoMinor: 1,
|
|
|
|
RemoteAddr: "192.0.2.1:1234",
|
|
|
|
RequestURI: "/",
|
|
|
|
},
|
|
|
|
wantBody: "",
|
|
|
|
},
|
|
|
|
|
2019-06-02 15:48:37 +00:00
|
|
|
{
|
|
|
|
name: "GET with full URL",
|
2017-10-07 00:16:47 +00:00
|
|
|
method: "GET",
|
|
|
|
uri: "http://foo.com/path/%2f/bar/",
|
|
|
|
body: nil,
|
|
|
|
want: &http.Request{
|
|
|
|
Method: "GET",
|
|
|
|
Host: "foo.com",
|
|
|
|
URL: &url.URL{
|
|
|
|
Scheme: "http",
|
|
|
|
Path: "/path///bar/",
|
|
|
|
RawPath: "/path/%2f/bar/",
|
|
|
|
Host: "foo.com",
|
|
|
|
},
|
|
|
|
Header: http.Header{},
|
|
|
|
Proto: "HTTP/1.1",
|
|
|
|
ProtoMajor: 1,
|
|
|
|
ProtoMinor: 1,
|
|
|
|
RemoteAddr: "192.0.2.1:1234",
|
|
|
|
RequestURI: "http://foo.com/path/%2f/bar/",
|
|
|
|
},
|
|
|
|
wantBody: "",
|
|
|
|
},
|
|
|
|
|
2019-06-02 15:48:37 +00:00
|
|
|
{
|
|
|
|
name: "GET with full https URL",
|
2017-10-07 00:16:47 +00:00
|
|
|
method: "GET",
|
|
|
|
uri: "https://foo.com/path/",
|
|
|
|
body: nil,
|
|
|
|
want: &http.Request{
|
|
|
|
Method: "GET",
|
|
|
|
Host: "foo.com",
|
|
|
|
URL: &url.URL{
|
|
|
|
Scheme: "https",
|
|
|
|
Path: "/path/",
|
|
|
|
Host: "foo.com",
|
|
|
|
},
|
|
|
|
Header: http.Header{},
|
|
|
|
Proto: "HTTP/1.1",
|
|
|
|
ProtoMajor: 1,
|
|
|
|
ProtoMinor: 1,
|
|
|
|
RemoteAddr: "192.0.2.1:1234",
|
|
|
|
RequestURI: "https://foo.com/path/",
|
|
|
|
TLS: &tls.ConnectionState{
|
|
|
|
Version: tls.VersionTLS12,
|
|
|
|
HandshakeComplete: true,
|
|
|
|
ServerName: "foo.com",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
wantBody: "",
|
|
|
|
},
|
|
|
|
|
2019-06-02 15:48:37 +00:00
|
|
|
{
|
|
|
|
name: "Post with known length",
|
2017-10-07 00:16:47 +00:00
|
|
|
method: "POST",
|
|
|
|
uri: "/",
|
|
|
|
body: strings.NewReader("foo"),
|
|
|
|
want: &http.Request{
|
|
|
|
Method: "POST",
|
|
|
|
Host: "example.com",
|
|
|
|
URL: &url.URL{Path: "/"},
|
|
|
|
Header: http.Header{},
|
|
|
|
Proto: "HTTP/1.1",
|
|
|
|
ContentLength: 3,
|
|
|
|
ProtoMajor: 1,
|
|
|
|
ProtoMinor: 1,
|
|
|
|
RemoteAddr: "192.0.2.1:1234",
|
|
|
|
RequestURI: "/",
|
|
|
|
},
|
|
|
|
wantBody: "foo",
|
|
|
|
},
|
|
|
|
|
2019-06-02 15:48:37 +00:00
|
|
|
{
|
|
|
|
name: "Post with unknown length",
|
2017-10-07 00:16:47 +00:00
|
|
|
method: "POST",
|
|
|
|
uri: "/",
|
|
|
|
body: struct{ io.Reader }{strings.NewReader("foo")},
|
|
|
|
want: &http.Request{
|
|
|
|
Method: "POST",
|
|
|
|
Host: "example.com",
|
|
|
|
URL: &url.URL{Path: "/"},
|
|
|
|
Header: http.Header{},
|
|
|
|
Proto: "HTTP/1.1",
|
|
|
|
ContentLength: -1,
|
|
|
|
ProtoMajor: 1,
|
|
|
|
ProtoMinor: 1,
|
|
|
|
RemoteAddr: "192.0.2.1:1234",
|
|
|
|
RequestURI: "/",
|
|
|
|
},
|
|
|
|
wantBody: "foo",
|
|
|
|
},
|
|
|
|
|
2019-06-02 15:48:37 +00:00
|
|
|
{
|
|
|
|
name: "OPTIONS *",
|
2017-10-07 00:16:47 +00:00
|
|
|
method: "OPTIONS",
|
|
|
|
uri: "*",
|
|
|
|
want: &http.Request{
|
|
|
|
Method: "OPTIONS",
|
|
|
|
Host: "example.com",
|
|
|
|
URL: &url.URL{Path: "*"},
|
|
|
|
Header: http.Header{},
|
|
|
|
Proto: "HTTP/1.1",
|
|
|
|
ProtoMajor: 1,
|
|
|
|
ProtoMinor: 1,
|
|
|
|
RemoteAddr: "192.0.2.1:1234",
|
|
|
|
RequestURI: "*",
|
|
|
|
},
|
|
|
|
},
|
2019-06-02 15:48:37 +00:00
|
|
|
} {
|
|
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
|
|
got := NewRequest(tt.method, tt.uri, tt.body)
|
2022-10-27 18:55:19 +00:00
|
|
|
slurp, err := io.ReadAll(got.Body)
|
2019-06-02 15:48:37 +00:00
|
|
|
if err != nil {
|
|
|
|
t.Errorf("ReadAll: %v", err)
|
|
|
|
}
|
|
|
|
if string(slurp) != tt.wantBody {
|
|
|
|
t.Errorf("Body = %q; want %q", slurp, tt.wantBody)
|
|
|
|
}
|
|
|
|
got.Body = nil // before DeepEqual
|
|
|
|
if !reflect.DeepEqual(got.URL, tt.want.URL) {
|
|
|
|
t.Errorf("Request.URL mismatch:\n got: %#v\nwant: %#v", got.URL, tt.want.URL)
|
|
|
|
}
|
|
|
|
if !reflect.DeepEqual(got.Header, tt.want.Header) {
|
|
|
|
t.Errorf("Request.Header mismatch:\n got: %#v\nwant: %#v", got.Header, tt.want.Header)
|
|
|
|
}
|
|
|
|
if !reflect.DeepEqual(got.TLS, tt.want.TLS) {
|
|
|
|
t.Errorf("Request.TLS mismatch:\n got: %#v\nwant: %#v", got.TLS, tt.want.TLS)
|
|
|
|
}
|
|
|
|
if !reflect.DeepEqual(got, tt.want) {
|
|
|
|
t.Errorf("Request mismatch:\n got: %#v\nwant: %#v", got, tt.want)
|
|
|
|
}
|
|
|
|
})
|
2017-10-07 00:16:47 +00:00
|
|
|
}
|
|
|
|
}
|