// 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 provides utilities for HTTP testing.
package httptest import ( "bufio" "bytes" "crypto/tls" "io" "io/ioutil" "net/http" "strings" ) // NewRequest returns a new incoming server Request, suitable // for passing to an http.Handler for testing. // // The target is the RFC 7230 "request-target": it may be either a // path or an absolute URL. If target is an absolute URL, the host name // from the URL is used. Otherwise, "example.com" is used. // // The TLS field is set to a non-nil dummy value if target has scheme // "https". // // The Request.Proto is always HTTP/1.1. // // An empty method means "GET". // // The provided body may be nil. If the body is of type *bytes.Reader, // *strings.Reader, or *bytes.Buffer, the Request.ContentLength is // set. // // NewRequest panics on error for ease of use in testing, where a // panic is acceptable. // // To generate a client HTTP request instead of a server request, see // the NewRequest function in the net/http package. func (, string, io.Reader) *http.Request { if == "" { = "GET" } , := http.ReadRequest(bufio.NewReader(strings.NewReader( + " " + + " HTTP/1.0\r\n\r\n"))) if != nil { panic("invalid NewRequest arguments; " + .Error()) } // HTTP/1.0 was used above to avoid needing a Host field. Change it to 1.1 here. .Proto = "HTTP/1.1" .ProtoMinor = 1 .Close = false if != nil { switch v := .(type) { case *bytes.Buffer: .ContentLength = int64(.Len()) case *bytes.Reader: .ContentLength = int64(.Len()) case *strings.Reader: .ContentLength = int64(.Len()) default: .ContentLength = -1 } if , := .(io.ReadCloser); { .Body = } else { .Body = ioutil.NopCloser() } } // 192.0.2.0/24 is "TEST-NET" in RFC 5737 for use solely in // documentation and example source code and should not be // used publicly. .RemoteAddr = "192.0.2.1:1234" if .Host == "" { .Host = "example.com" } if strings.HasPrefix(, "https://") { .TLS = &tls.ConnectionState{ Version: tls.VersionTLS12, HandshakeComplete: true, ServerName: .Host, } } return }