1 // Copyright 2011 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
5 // Implementation of Server
19 // A Server is an HTTP server listening on a system-chosen port on the
20 // local loopback interface, for use in end-to-end HTTP tests.
22 URL string // base URL of form http://ipaddr:port with no trailing slash
24 TLS *tls.Config // nil if not using using TLS
27 // historyListener keeps track of all connections that it's ever
29 type historyListener struct {
34 func (hs *historyListener) Accept() (c net.Conn, err os.Error) {
35 c, err = hs.Listener.Accept()
37 hs.history = append(hs.history, c)
42 func newLocalListener() net.Listener {
43 l, err := net.Listen("tcp", "127.0.0.1:0")
45 if l, err = net.Listen("tcp6", "[::1]:0"); err != nil {
46 panic(fmt.Sprintf("httptest: failed to listen on a port: %v", err))
52 // NewServer starts and returns a new Server.
53 // The caller should call Close when finished, to shut it down.
54 func NewServer(handler http.Handler) *Server {
56 l := newLocalListener()
57 ts.Listener = &historyListener{l, make([]net.Conn, 0)}
58 ts.URL = "http://" + l.Addr().String()
59 server := &http.Server{Handler: handler}
60 go server.Serve(ts.Listener)
64 // NewTLSServer starts and returns a new Server using TLS.
65 // The caller should call Close when finished, to shut it down.
66 func NewTLSServer(handler http.Handler) *Server {
67 l := newLocalListener()
70 cert, err := tls.X509KeyPair(localhostCert, localhostKey)
72 panic(fmt.Sprintf("httptest: NewTLSServer: %v", err))
78 NextProtos: []string{"http/1.1"},
79 Certificates: []tls.Certificate{cert},
81 tlsListener := tls.NewListener(l, ts.TLS)
83 ts.Listener = &historyListener{tlsListener, make([]net.Conn, 0)}
84 ts.URL = "https://" + l.Addr().String()
85 server := &http.Server{Handler: handler}
86 go server.Serve(ts.Listener)
90 // Close shuts down the server.
91 func (s *Server) Close() {
95 // CloseClientConnections closes any currently open HTTP connections
96 // to the test Server.
97 func (s *Server) CloseClientConnections() {
98 hl, ok := s.Listener.(*historyListener)
102 for _, conn := range hl.history {
107 // localhostCert is a PEM-encoded TLS cert with SAN DNS names
108 // "127.0.0.1" and "[::1]", expiring at the last second of 2049 (the end
110 var localhostCert = []byte(`-----BEGIN CERTIFICATE-----
111 MIIBwTCCASugAwIBAgIBADALBgkqhkiG9w0BAQUwADAeFw0xMTAzMzEyMDI1MDda
112 Fw00OTEyMzEyMzU5NTlaMAAwggCdMAsGCSqGSIb3DQEBAQOCAIwAMIIAhwKCAIB6
113 oy4iT42G6qk+GGn5VL5JlnJT6ZG5cqaMNFaNGlIxNb6CPUZLKq2sM3gRaimsktIw
114 nNAcNwQGHpe1tZo+J/Pl04JTt71Y/TTAxy7OX27aZf1Rpt0SjdZ7vTPnFDPNsHGe
115 KBKvPt55l2+YKjkZmV7eRevsVbpkNvNGB+T5d4Ge/wIBA6NPME0wDgYDVR0PAQH/
116 BAQDAgCgMA0GA1UdDgQGBAQBAgMEMA8GA1UdIwQIMAaABAECAwQwGwYDVR0RBBQw
117 EoIJMTI3LjAuMC4xggVbOjoxXTALBgkqhkiG9w0BAQUDggCBAHC3gbdvc44vs+wD
118 g2kONiENnx8WKc0UTGg/TOXS3gaRb+CUIQtHWja65l8rAfclEovjHgZ7gx8brO0W
119 JuC6p3MUAKsgOssIrrRIx2rpnfcmFVMzguCmrMNVmKUAalw18Yp0F72xYAIitVQl
120 kJrLdIhBajcJRYu/YGltHQRaXuVt
121 -----END CERTIFICATE-----
124 // localhostKey is the private key for localhostCert.
125 var localhostKey = []byte(`-----BEGIN RSA PRIVATE KEY-----
126 MIIBkgIBAQKCAIB6oy4iT42G6qk+GGn5VL5JlnJT6ZG5cqaMNFaNGlIxNb6CPUZL
127 Kq2sM3gRaimsktIwnNAcNwQGHpe1tZo+J/Pl04JTt71Y/TTAxy7OX27aZf1Rpt0S
128 jdZ7vTPnFDPNsHGeKBKvPt55l2+YKjkZmV7eRevsVbpkNvNGB+T5d4Ge/wIBAwKC
129 AIBRwh7Bil5Z8cYpZZv7jdQxDvbim7Z7ocRdeDmzZuF2I9RW04QyHHPIIlALnBvI
130 YeF1veASz1gEFGUjzmbUGqKYSbCoTzXoev+F4bmbRxcX9sOmtslqvhMSHRSzA5NH
131 aDVI3Hn4wvBVD8gePu8ACWqvPGbCiql11OKCMfjlPn2uuwJAx/24/F5DjXZ6hQQ7
132 HxScOxKrpx5WnA9r1wZTltOTZkhRRzuLc21WJeE3M15QUdWi3zZxCKRFoth65HEs
133 jy9YHQJAnPueRI44tz79b5QqVbeaOMUr7ZCb1Kp0uo6G+ANPLdlfliAupwij2eIz
134 mHRJOWk0jBtXfRft1McH2H51CpXAyw==
135 -----END RSA PRIVATE KEY-----