blob: ba4d4c36135661c21709b50af782bd91dfe1ca55 [file] [log] [blame]
package main
import (
"fmt"
"io"
"net/http"
"net/http/httptest"
"net/url"
"testing"
)
func TestForward(t *testing.T) {
// Test backend which proudly proclaims the value of the X-Forwarded-For header it received.
backendServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "hello %s %s\n", r.Host, r.Header.Get("X-Forwarded-For"))
}))
defer backendServer.Close()
rpURL, err := url.Parse(backendServer.URL)
if err != nil {
t.Fatalf("parsing test backend URL failed: %v", err)
}
// Configure and run proxy.
flagUpstream = rpURL.Host
flagUpstreamHost = "example.com"
flagDownstreamHost = "matrix.example.com"
proxy := httptest.NewServer(newProxy())
defer proxy.Close()
// Run through a few tests.
for i, te := range []struct {
headers map[string]string
host string
want string
}{
{
// 0: expected to succeed
headers: map[string]string{
"Hscloud-Nic-Source-IP": "1.2.3.4",
"Hscloud-Nic-Source-Port": "1337",
},
host: "matrix.example.com",
want: "hello example.com 1.2.3.4:1337, 127.0.0.1\n",
},
{
// 1: expected to succeed
host: "matrix.example.com",
want: "hello example.com 127.0.0.1\n",
},
{
// 2: expected to succeed
host: "matrix.example.com:443",
want: "hello example.com 127.0.0.1\n",
},
{
// 3: expected to fail
host: "example.com",
want: "invalid host\n",
},
} {
req, _ := http.NewRequest("GET", proxy.URL, nil)
req.Host = te.host
for k, v := range te.headers {
req.Header.Set(k, v)
}
resp, err := http.DefaultClient.Do(req)
if err != nil {
t.Fatalf("Get failed: %v", err)
}
b, err := io.ReadAll(resp.Body)
if err != nil {
t.Fatalf("Read failed: %v", err)
}
resp.Body.Close()
if want, got := te.want, string(b); want != got {
t.Errorf("%d: wrong response from upstream, wanted %q, got %q", i, want, got)
}
}
}