github.com/alejandroesc/spdy@v0.0.0-20200317064415-01a02f0eb389/proxy_test.go (about) 1 // Copyright 2014 Jamie Hall. 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. 4 5 package spdy_test 6 7 import ( 8 "bytes" 9 "crypto/tls" 10 "fmt" 11 "io/ioutil" 12 "net" 13 "net/http" 14 "testing" 15 "time" 16 17 "github.com/SlyMarbo/spdy" 18 ) 19 20 func init() { 21 // spdy.EnableDebugOutput() 22 } 23 24 func TestProxyConnect(t *testing.T) { 25 cert, err := tls.X509KeyPair(localhostCert, localhostKey) 26 if err != nil { 27 panic(fmt.Sprintf("could not read certificate: %v", err)) 28 } 29 30 serverTLSConfig := new(tls.Config) 31 serverTLSConfig.Certificates = []tls.Certificate{cert} 32 33 conn, err := net.Listen("tcp", "localhost:0") 34 if err != nil { 35 panic(fmt.Sprintf("could not listen: %v", err)) 36 } 37 38 listener := tls.NewListener(conn, serverTLSConfig) 39 40 errChan := make(chan error) 41 42 go func() { 43 srv := &http.Server{ 44 Addr: conn.Addr().String(), 45 Handler: spdy.ProxyConnections(spdy.ProxyConnHandlerFunc(func(conn spdy.Conn) { 46 req, err := http.NewRequest("GET", "http://example.com/", nil) 47 if err != nil { 48 errChan <- err 49 return 50 } 51 resp, err := conn.RequestResponse(req, nil, 2) 52 if err != nil { 53 errChan <- err 54 return 55 } 56 body, err := ioutil.ReadAll(resp.Body) 57 if err != nil { 58 errChan <- err 59 return 60 } 61 62 if !bytes.Equal(body, []byte("HELLO")) { 63 errChan <- fmt.Errorf("Expected HELLO. Got %v", string(body)) 64 return 65 } 66 67 close(errChan) 68 })), 69 } 70 srv.Serve(listener) 71 println("Serve done") 72 }() 73 74 clientTLSConfig := &tls.Config{InsecureSkipVerify: true} 75 76 url := "https://" + conn.Addr().String() 77 78 go func() { 79 err = spdy.ConnectAndServe(url, clientTLSConfig, &http.Server{ 80 Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 81 if r.Method != "GET" { 82 errChan <- fmt.Errorf("Expected method GET. Got: %v", r.Method) 83 } 84 if r.URL.String() != "http://example.com/" { 85 errChan <- fmt.Errorf("Expected http://example.com. Got %v", r.URL) 86 } 87 w.Write([]byte("HELLO")) 88 }), 89 }) 90 if err != nil { 91 errChan <- fmt.Errorf("ConnectAndServeFailed: %v", err) 92 } 93 }() 94 95 select { 96 case err = <-errChan: 97 if err != nil { 98 t.Error(err) 99 } 100 case <-time.After(time.Second): 101 t.Error("Timeout") 102 } 103 } 104 105 // localhostCert is a PEM-encoded TLS cert with SAN IPs 106 // "127.0.0.1" and "[::1]", expiring at the last second of 2049 (the end 107 // of ASN.1 time). 108 // generated from src/pkg/crypto/tls: 109 // go run generate_cert.go --rsa-bits 512 --host 127.0.0.1,::1,example.com --ca --start-date "Jan 1 00:00:00 1970" --duration=1000000h 110 var localhostCert = []byte(`-----BEGIN CERTIFICATE----- 111 MIIBdzCCASOgAwIBAgIBADALBgkqhkiG9w0BAQUwEjEQMA4GA1UEChMHQWNtZSBD 112 bzAeFw03MDAxMDEwMDAwMDBaFw00OTEyMzEyMzU5NTlaMBIxEDAOBgNVBAoTB0Fj 113 bWUgQ28wWjALBgkqhkiG9w0BAQEDSwAwSAJBAN55NcYKZeInyTuhcCwFMhDHCmwa 114 IUSdtXdcbItRB/yfXGBhiex00IaLXQnSU+QZPRZWYqeTEbFSgihqi1PUDy8CAwEA 115 AaNoMGYwDgYDVR0PAQH/BAQDAgCkMBMGA1UdJQQMMAoGCCsGAQUFBwMBMA8GA1Ud 116 EwEB/wQFMAMBAf8wLgYDVR0RBCcwJYILZXhhbXBsZS5jb22HBH8AAAGHEAAAAAAA 117 AAAAAAAAAAAAAAEwCwYJKoZIhvcNAQEFA0EAAoQn/ytgqpiLcZu9XKbCJsJcvkgk 118 Se6AbGXgSlq+ZCEVo0qIwSgeBqmsJxUu7NCSOwVJLYNEBO2DtIxoYVk+MA== 119 -----END CERTIFICATE-----`) 120 121 // localhostKey is the private key for localhostCert. 122 var localhostKey = []byte(`-----BEGIN RSA PRIVATE KEY----- 123 MIIBPAIBAAJBAN55NcYKZeInyTuhcCwFMhDHCmwaIUSdtXdcbItRB/yfXGBhiex0 124 0IaLXQnSU+QZPRZWYqeTEbFSgihqi1PUDy8CAwEAAQJBAQdUx66rfh8sYsgfdcvV 125 NoafYpnEcB5s4m/vSVe6SU7dCK6eYec9f9wpT353ljhDUHq3EbmE4foNzJngh35d 126 AekCIQDhRQG5Li0Wj8TM4obOnnXUXf1jRv0UkzE9AHWLG5q3AwIhAPzSjpYUDjVW 127 MCUXgckTpKCuGwbJk7424Nb8bLzf3kllAiA5mUBgjfr/WtFSJdWcPQ4Zt9KTMNKD 128 EUO0ukpTwEIl6wIhAMbGqZK3zAAFdq8DD2jPx+UJXnh0rnOkZBzDtJ6/iN69AiEA 129 1Aq8MJgTaYsDQWyU/hDq5YkDJc9e9DSCvUIzqxQWMQE= 130 -----END RSA PRIVATE KEY-----`)