| // 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" | |
| "io/ioutil" | |
| "net/http" | |
| "net/url" | |
| "reflect" | |
| "strings" | |
| "testing" | |
| ) | |
| func TestNewRequest(t *testing.T) { | |
| tests := [...]struct { | |
| method, uri string | |
| body io.Reader | |
| want *http.Request | |
| wantBody string | |
| }{ | |
| // Empty method means GET: | |
| 0: { | |
| 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: "", | |
| }, | |
| // GET with full URL: | |
| 1: { | |
| 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: "", | |
| }, | |
| // GET with full https URL: | |
| 2: { | |
| 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: "", | |
| }, | |
| // Post with known length | |
| 3: { | |
| 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", | |
| }, | |
| // Post with unknown length | |
| 4: { | |
| 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", | |
| }, | |
| // OPTIONS * | |
| 5: { | |
| 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: "*", | |
| }, | |
| }, | |
| } | |
| for i, tt := range tests { | |
| got := NewRequest(tt.method, tt.uri, tt.body) | |
| slurp, err := ioutil.ReadAll(got.Body) | |
| if err != nil { | |
| t.Errorf("%d. ReadAll: %v", i, err) | |
| } | |
| if string(slurp) != tt.wantBody { | |
| t.Errorf("%d. Body = %q; want %q", i, slurp, tt.wantBody) | |
| } | |
| got.Body = nil // before DeepEqual | |
| if !reflect.DeepEqual(got.URL, tt.want.URL) { | |
| t.Errorf("%d. Request.URL mismatch:\n got: %#v\nwant: %#v", i, got.URL, tt.want.URL) | |
| } | |
| if !reflect.DeepEqual(got.Header, tt.want.Header) { | |
| t.Errorf("%d. Request.Header mismatch:\n got: %#v\nwant: %#v", i, got.Header, tt.want.Header) | |
| } | |
| if !reflect.DeepEqual(got.TLS, tt.want.TLS) { | |
| t.Errorf("%d. Request.TLS mismatch:\n got: %#v\nwant: %#v", i, got.TLS, tt.want.TLS) | |
| } | |
| if !reflect.DeepEqual(got, tt.want) { | |
| t.Errorf("%d. Request mismatch:\n got: %#v\nwant: %#v", i, got, tt.want) | |
| } | |
| } | |
| } |