| // 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) |
| } |
| } |
| } |