2014-11-30 17:12:33 -08: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 15:15:15 -04:00
hostname , _ , _ := net . SplitHostPort ( r . Host )
2014-11-30 17:12:33 -08: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 15:15:15 -04:00
setProxyUpstreamHostHeader ( proxyHandler , proxyURL )
2014-11-30 17:12:33 -08: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 17:17:40 -04: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 )
}
}