google.golang.org/grpc@v1.72.2/internal/transport/proxy_test.go (about) 1 //go:build !race 2 // +build !race 3 4 /* 5 * 6 * Copyright 2017 gRPC authors. 7 * 8 * Licensed under the Apache License, Version 2.0 (the "License"); 9 * you may not use this file except in compliance with the License. 10 * You may obtain a copy of the License at 11 * 12 * http://www.apache.org/licenses/LICENSE-2.0 13 * 14 * Unless required by applicable law or agreed to in writing, software 15 * distributed under the License is distributed on an "AS IS" BASIS, 16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 17 * See the License for the specific language governing permissions and 18 * limitations under the License. 19 * 20 */ 21 22 package transport 23 24 import ( 25 "context" 26 "net" 27 "net/http" 28 "net/netip" 29 "testing" 30 "time" 31 32 "google.golang.org/grpc/internal/proxyattributes" 33 "google.golang.org/grpc/internal/testutils" 34 "google.golang.org/grpc/internal/testutils/proxyserver" 35 "google.golang.org/grpc/resolver" 36 ) 37 38 func (s) TestHTTPConnectWithServerHello(t *testing.T) { 39 serverMessage := []byte("server-hello") 40 blis, err := testutils.LocalTCPListener() 41 if err != nil { 42 t.Fatalf("failed to listen: %v", err) 43 } 44 reqCheck := func(req *http.Request) { 45 if req.Method != http.MethodConnect { 46 t.Errorf("unexpected Method %q, want %q", req.Method, http.MethodConnect) 47 } 48 host, _, err := net.SplitHostPort(req.URL.Host) 49 if err != nil { 50 t.Error(err) 51 } 52 _, err = netip.ParseAddr(host) 53 if err != nil { 54 t.Error(err) 55 } 56 } 57 pServer := proxyserver.New(t, reqCheck, true) 58 59 msg := []byte{4, 3, 5, 2} 60 recvBuf := make([]byte, len(msg)) 61 done := make(chan error, 1) 62 go func() { 63 in, err := blis.Accept() 64 if err != nil { 65 done <- err 66 return 67 } 68 defer in.Close() 69 in.Write(serverMessage) 70 in.Read(recvBuf) 71 done <- nil 72 }() 73 74 // Dial to proxy server. 75 ctx, cancel := context.WithTimeout(context.Background(), time.Second) 76 defer cancel() 77 c, err := proxyDial(ctx, resolver.Address{Addr: pServer.Addr}, "test", proxyattributes.Options{ConnectAddr: blis.Addr().String()}) 78 if err != nil { 79 t.Fatalf("HTTP connect Dial failed: %v", err) 80 } 81 defer c.Close() 82 c.SetDeadline(time.Now().Add(defaultTestTimeout)) 83 84 // Send msg on the connection. 85 c.Write(msg) 86 if err := <-done; err != nil { 87 t.Fatalf("Failed to accept: %v", err) 88 } 89 90 // Check received msg. 91 if string(recvBuf) != string(msg) { 92 t.Fatalf("Received msg: %v, want %v", recvBuf, msg) 93 } 94 95 if len(serverMessage) > 0 { 96 gotServerMessage := make([]byte, len(serverMessage)) 97 if _, err := c.Read(gotServerMessage); err != nil { 98 t.Errorf("Got error while reading message from server: %v", err) 99 return 100 } 101 if string(gotServerMessage) != string(serverMessage) { 102 t.Errorf("Message from server: %v, want %v", gotServerMessage, serverMessage) 103 } 104 } 105 }