(t *testing.T)
| 85 | } |
| 86 | |
| 87 | func TestXForwardedFor(t *testing.T) { |
| 88 | const prevForwardedFor = "client ip" |
| 89 | const backendResponse = "I am the backend" |
| 90 | const backendStatus = 404 |
| 91 | backend := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { |
| 92 | if r.Header.Get("X-Forwarded-For") == "" { |
| 93 | t.Errorf("didn't get X-Forwarded-For header") |
| 94 | } |
| 95 | if !strings.Contains(r.Header.Get("X-Forwarded-For"), prevForwardedFor) { |
| 96 | t.Errorf("X-Forwarded-For didn't contain prior data") |
| 97 | } |
| 98 | w.WriteHeader(backendStatus) |
| 99 | w.Write([]byte(backendResponse)) |
| 100 | })) |
| 101 | defer backend.Close() |
| 102 | backendURL, err := url.Parse(backend.URL) |
| 103 | if err != nil { |
| 104 | t.Fatal(err) |
| 105 | } |
| 106 | proxyHandler := NewSingleHostReverseProxy(backendURL, inject.CopyInject{}) |
| 107 | frontend := httptest.NewServer(proxyHandler) |
| 108 | defer frontend.Close() |
| 109 | |
| 110 | getReq, _ := http.NewRequest("GET", frontend.URL, nil) |
| 111 | getReq.Host = "some-name" |
| 112 | getReq.Header.Set("Connection", "close") |
| 113 | getReq.Header.Set("X-Forwarded-For", prevForwardedFor) |
| 114 | getReq.Close = true |
| 115 | res, err := http.DefaultClient.Do(getReq) |
| 116 | if err != nil { |
| 117 | t.Fatalf("Get: %v", err) |
| 118 | } |
| 119 | if g, e := res.StatusCode, backendStatus; g != e { |
| 120 | t.Errorf("got res.StatusCode %d; expected %d", g, e) |
| 121 | } |
| 122 | bodyBytes, _ := ioutil.ReadAll(res.Body) |
| 123 | if g, e := string(bodyBytes), backendResponse; g != e { |
| 124 | t.Errorf("got body %q; expected %q", g, e) |
| 125 | } |
| 126 | } |
| 127 | |
| 128 | var proxyQueryTests = []struct { |
| 129 | baseSuffix string // suffix to add to backend URL |
nothing calls this directly
no test coverage detected