2014-12-01 01:12:33 +00:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"io/ioutil"
|
|
|
|
"net"
|
|
|
|
"net/http"
|
|
|
|
"net/http/httptest"
|
|
|
|
"net/url"
|
|
|
|
"testing"
|
|
|
|
)
|
|
|
|
|
|
|
|
func TestNewReverseProxy(t *testing.T) {
|
|
|
|
backend := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
|
|
w.WriteHeader(200)
|
2015-03-17 19:15:15 +00:00
|
|
|
hostname, _, _ := net.SplitHostPort(r.Host)
|
2014-12-01 01:12:33 +00:00
|
|
|
w.Write([]byte(hostname))
|
|
|
|
}))
|
|
|
|
defer backend.Close()
|
|
|
|
|
|
|
|
backendURL, _ := url.Parse(backend.URL)
|
|
|
|
backendHostname := "upstream.127.0.0.1.xip.io"
|
|
|
|
_, backendPort, _ := net.SplitHostPort(backendURL.Host)
|
|
|
|
backendHost := net.JoinHostPort(backendHostname, backendPort)
|
|
|
|
proxyURL, _ := url.Parse(backendURL.Scheme + "://" + backendHost + "/")
|
|
|
|
|
|
|
|
proxyHandler := NewReverseProxy(proxyURL)
|
2015-03-17 19:15:15 +00:00
|
|
|
setProxyUpstreamHostHeader(proxyHandler, proxyURL)
|
2014-12-01 01:12:33 +00:00
|
|
|
frontend := httptest.NewServer(proxyHandler)
|
|
|
|
defer frontend.Close()
|
|
|
|
|
|
|
|
getReq, _ := http.NewRequest("GET", frontend.URL, nil)
|
|
|
|
res, _ := http.DefaultClient.Do(getReq)
|
|
|
|
bodyBytes, _ := ioutil.ReadAll(res.Body)
|
|
|
|
if g, e := string(bodyBytes), backendHostname; g != e {
|
|
|
|
t.Errorf("got body %q; expected %q", g, e)
|
|
|
|
}
|
|
|
|
}
|
2015-03-17 21:17:40 +00:00
|
|
|
|
|
|
|
func TestEncodedSlashes(t *testing.T) {
|
|
|
|
var seen string
|
|
|
|
backend := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
|
|
w.WriteHeader(200)
|
|
|
|
seen = r.RequestURI
|
|
|
|
}))
|
|
|
|
defer backend.Close()
|
|
|
|
|
|
|
|
b, _ := url.Parse(backend.URL)
|
|
|
|
proxyHandler := NewReverseProxy(b)
|
|
|
|
setProxyDirector(proxyHandler)
|
|
|
|
frontend := httptest.NewServer(proxyHandler)
|
|
|
|
defer frontend.Close()
|
|
|
|
|
|
|
|
f, _ := url.Parse(frontend.URL)
|
|
|
|
encodedPath := "/a%2Fb/"
|
|
|
|
getReq := &http.Request{URL: &url.URL{Scheme: "http", Host: f.Host, Opaque: encodedPath}}
|
|
|
|
_, err := http.DefaultClient.Do(getReq)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("err %s", err)
|
|
|
|
}
|
|
|
|
expected := backend.URL + encodedPath
|
|
|
|
if seen != expected {
|
|
|
|
t.Errorf("got bad request %q expected %q", seen, expected)
|
|
|
|
}
|
|
|
|
}
|