1 package reverseproxy 2 3 import ( 4 "io" 5 "net" 6 "testing" 7 ) 8 9 func TestRedirect(t *testing.T) { 10 la, err := net.ListenTCP("tcp", nil) 11 if err != nil { 12 t.Fatalf("unexpected error: %s", err) 13 } 14 15 lb, err := net.ListenTCP("tcp", nil) 16 if err != nil { 17 t.Fatalf("unexpected error: %s", err) 18 } 19 20 pna := getUnusedPort() 21 22 pa, err := AddRedirect(HostName(aDomain), pna, la.Addr()) 23 if err != nil { 24 t.Fatalf("unexpected error: %s", err) 25 } 26 27 pb, err := AddRedirect(HostName(bDomain), pna, lb.Addr()) 28 if err != nil { 29 t.Fatalf("unexpected error: %s", err) 30 } 31 32 go func() { 33 c, _ := net.DialTCP("tcp", nil, &net.TCPAddr{Port: int(pna)}) 34 35 c.Write([]byte("GET / HTTP/1.1\r\nHost: " + aDomain + "\r\n\r\nDATA")) 36 c.Close() 37 }() 38 39 go func() { 40 c, _ := net.DialTCP("tcp", nil, &net.TCPAddr{Port: int(pna)}) 41 42 c.Write(tlsServerName(bDomain)) 43 c.Write([]byte("ATAD")) 44 c.Close() 45 }() 46 47 c, err := la.Accept() 48 if err != nil { 49 t.Errorf("test 1: unexpected error: %s", err) 50 51 return 52 } 53 54 d, err := lb.Accept() 55 if err != nil { 56 t.Errorf("test 2: unexpected error: %s", err) 57 58 return 59 } 60 61 buf, err := io.ReadAll(c) 62 n := len(buf) 63 64 if err != nil { 65 t.Errorf("test 3: unexpected error: %s", err) 66 67 return 68 } else if string(buf[n-4:n]) != "DATA" { 69 t.Errorf("test 3: expecting \"DATA\", got %q", buf[n-4:n]) 70 71 return 72 } 73 74 c.Close() 75 76 buf, err = io.ReadAll(d) 77 n = len(buf) 78 79 if err != nil { 80 t.Errorf("test 4: unexpected error: %s", err) 81 82 return 83 } else if string(buf[n-4:n]) != "ATAD" { 84 t.Errorf("test 4: expecting \"ATAD\", got %q", buf[n-4:n]) 85 86 return 87 } 88 89 d.Close() 90 pa.Close() 91 pb.Close() 92 la.Close() 93 lb.Close() 94 } 95