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-----`)