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  }