blob: e05640b9909fefbb8c86ede826de8b0b752c66d8 [file] [log] [blame]
// Copyright 2019 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
//go:build go1.16 && (linux || darwin)
package main
import (
"io"
"net/http"
"net/http/httptest"
"testing"
)
// TestProxyURL tests that the response served from proxyURL is not a
// redirect, even if its backend URL serves a redirect. That is, our
// proxy should do the redirect following, not defer that to the
// client.
func TestProxyURL(t *testing.T) {
const content = "some content"
const header = "X-Some-Header"
tsTarget := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.RequestURI == "/bar" {
w.Header().Set(header, content)
io.WriteString(w, content)
}
}))
defer tsTarget.Close()
tsBackend := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.RequestURI == "/foo" {
if v := r.Header.Get(header); v != content {
t.Errorf("header(%q) = %q in handler; want %q", header, v, content)
w.WriteHeader(400)
return
}
http.Redirect(w, r, tsTarget.URL+"/bar", http.StatusFound)
return
}
w.WriteHeader(400)
}))
defer tsBackend.Close()
req := httptest.NewRequest("GET", "/foo", nil)
req.Header.Set(header, content)
rr := httptest.NewRecorder()
proxyURL(rr, req, tsBackend.URL)
got := rr.Result()
gotBody := rr.Body.String()
if got.StatusCode != 200 {
t.Errorf("status = %q; want 200", got.StatusCode)
}
if gotBody != content {
t.Errorf("content = %q; want %q", gotBody, content)
}
if h := got.Header.Get(header); h != content {
t.Errorf("header(%q) = %q; want %q", header, h, content)
}
}