Source File
server.go
Belonging Package
net/http/httptest
package httptest
import (
)
client *http.Client
}
func () net.Listener {
if serveFlag != "" {
, := net.Listen("tcp", serveFlag)
if != nil {
panic(fmt.Sprintf("httptest: failed to listen on %v: %v", serveFlag, ))
}
return
}
, := net.Listen("tcp", "127.0.0.1:0")
if != nil {
if , = net.Listen("tcp6", "[::1]:0"); != nil {
panic(fmt.Sprintf("httptest: failed to listen on a port: %v", ))
}
}
return
}
var serveFlag string
func () {
if strSliceContainsPrefix(os.Args, "-httptest.serve=") || strSliceContainsPrefix(os.Args, "--httptest.serve=") {
flag.StringVar(&serveFlag, "httptest.serve", "", "if non-empty, httptest.NewServer serves on this address and blocks.")
}
}
func ( []string, string) bool {
for , := range {
if strings.HasPrefix(, ) {
return true
}
}
return false
}
func ( http.Handler) *Server {
:= NewUnstartedServer()
.Start()
return
}
func ( *Server) () {
if .URL != "" {
panic("Server already started")
}
if .client == nil {
.client = &http.Client{Transport: &http.Transport{}}
}
, := tls.X509KeyPair(internal.LocalhostCert, internal.LocalhostKey)
if != nil {
panic(fmt.Sprintf("httptest: NewTLSServer: %v", ))
}
:= .TLS
if != nil {
.TLS = .Clone()
} else {
.TLS = new(tls.Config)
}
if .TLS.NextProtos == nil {
:= []string{"http/1.1"}
if .EnableHTTP2 {
= []string{"h2"}
}
.TLS.NextProtos =
}
if len(.TLS.Certificates) == 0 {
.TLS.Certificates = []tls.Certificate{}
}
.certificate, = x509.ParseCertificate(.TLS.Certificates[0].Certificate[0])
if != nil {
panic(fmt.Sprintf("httptest: NewTLSServer: %v", ))
}
:= x509.NewCertPool()
.AddCert(.certificate)
.client.Transport = &http.Transport{
TLSClientConfig: &tls.Config{
RootCAs: ,
},
ForceAttemptHTTP2: .EnableHTTP2,
}
.Listener = tls.NewListener(.Listener, .TLS)
.URL = "https://" + .Listener.Addr().String()
.wrap()
.goServe()
}
func ( http.Handler) *Server {
:= NewUnstartedServer()
.StartTLS()
return
}
type closeIdleTransport interface {
CloseIdleConnections()
}
if , := http.DefaultTransport.(closeIdleTransport); {
.CloseIdleConnections()
}
if .client != nil {
if , := .client.Transport.(closeIdleTransport); {
.CloseIdleConnections()
}
}
.wg.Wait()
}
func ( *Server) () {
.mu.Lock()
defer .mu.Unlock()
var strings.Builder
.WriteString("httptest.Server blocked in Close after 5 seconds, waiting for connections:\n")
for , := range .conns {
fmt.Fprintf(&, " %T %p %v in state %v\n", , , .RemoteAddr(), )
}
log.Print(.String())
}
return
}
}
}
func ( *Server) () *x509.Certificate {
return .certificate
}
.closeConn()
}
case http.StateActive:
if , := .conns[]; {
if != http.StateNew && != http.StateIdle {
panic("invalid state transition")
}
.conns[] =
}
case http.StateIdle:
if , := .conns[]; {
if != http.StateActive {
panic("invalid state transition")
}
.conns[] =
}
if .closed {
.closeConn()
}
case http.StateHijacked, http.StateClosed:
.forgetConn()
}
if != nil {
(, )
}
}
}
func ( *Server) ( net.Conn) { .closeConnChan(, nil) }
![]() |
The pages are generated with Golds v0.3.2-preview. (GOOS=darwin GOARCH=amd64) Golds is a Go 101 project developed by Tapir Liu. PR and bug reports are welcome and can be submitted to the issue list. Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds. |