(t *testing.T)
| 923 | } |
| 924 | |
| 925 | func TestHttpOverProxyProtocol(t *testing.T) { |
| 926 | prometheus.DefaultRegisterer = prometheus.NewRegistry() |
| 927 | |
| 928 | var cfg Config |
| 929 | cfg.RegisterFlags(flag.NewFlagSet("", flag.ExitOnError)) |
| 930 | cfg.ProxyProtocolEnabled = true |
| 931 | setAutoAssignedPorts(DefaultNetwork, &cfg) |
| 932 | |
| 933 | server, err := New(cfg) |
| 934 | require.NoError(t, err) |
| 935 | defer server.Shutdown() |
| 936 | |
| 937 | server.HTTP.HandleFunc("/test-proxy-proto", func(w http.ResponseWriter, r *http.Request) { |
| 938 | ip, _, err := net.SplitHostPort(r.RemoteAddr) |
| 939 | require.NoError(t, err) |
| 940 | _, err = w.Write([]byte(ip)) |
| 941 | require.NoError(t, err) |
| 942 | }) |
| 943 | |
| 944 | go func() { |
| 945 | require.NoError(t, server.Run()) |
| 946 | }() |
| 947 | |
| 948 | t.Run("good PROXY header", func(t *testing.T) { |
| 949 | fakeSourceIP := "1.2.3.4" |
| 950 | proxyHeader := fmt.Sprintf("PROXY TCP4 %s 192.168.0.1 51234 80\r\n", fakeSourceIP) |
| 951 | client := &http.Client{ |
| 952 | Transport: &http.Transport{ |
| 953 | DialContext: proxyDialer(proxyHeader), |
| 954 | }, |
| 955 | } |
| 956 | |
| 957 | res, err := client.Get(httpTarget(server, "/test-proxy-proto")) |
| 958 | require.NoError(t, err) |
| 959 | defer res.Body.Close() |
| 960 | require.Equal(t, res.StatusCode, http.StatusOK) |
| 961 | |
| 962 | body, err := io.ReadAll(res.Body) |
| 963 | require.NoError(t, err) |
| 964 | require.Equal(t, []byte(fakeSourceIP), body) |
| 965 | }) |
| 966 | |
| 967 | t.Run("malformed PROXY header", func(t *testing.T) { |
| 968 | proxyHeader := "badPROXY TCP4 1.2.3.4 192.168.0.1 51234 80\r\n" |
| 969 | client := &http.Client{ |
| 970 | Transport: &http.Transport{ |
| 971 | DialContext: proxyDialer(proxyHeader), |
| 972 | }, |
| 973 | } |
| 974 | |
| 975 | res, err := client.Get(httpTarget(server, "/test-proxy-proto")) |
| 976 | require.NoError(t, err) |
| 977 | defer res.Body.Close() |
| 978 | require.Equal(t, http.StatusBadRequest, res.StatusCode) |
| 979 | }) |
| 980 | |
| 981 | t.Run("no PROXY header", func(t *testing.T) { |
| 982 | client := &http.Client{} |
nothing calls this directly
no test coverage detected