@@ -72,7 +72,7 @@ func TestMatchHTTPHost(t *testing.T) {
7272 }
7373 t .Run (name , func (t * testing.T ) {
7474 br := bufio .NewReader (tt .r )
75- r := httpHostMatch {equals (tt .host ), noopTarget {}}
75+ r := httpHostMatch {matcher : equals (tt .host ), target : noopTarget {}}
7676 m , name := r .match (br )
7777 got := m != nil
7878 if got != tt .want {
@@ -247,6 +247,50 @@ func TestProxyHTTP(t *testing.T) {
247247 }
248248}
249249
250+ func TestProxyHTTPFunc (t * testing.T ) {
251+ front := newLocalListener (t )
252+ defer front .Close ()
253+
254+ backFoo := newLocalListener (t )
255+ defer backFoo .Close ()
256+ backBar := newLocalListener (t )
257+ defer backBar .Close ()
258+
259+ p := testProxy (t , front )
260+ p .AddHTTPHostRouteFunc (testFrontAddr , func (ctx context.Context , httpHost string ) (_ Target , ok bool ) {
261+ if httpHost == "bar.com" {
262+ return To (backBar .Addr ().String ()), true
263+ }
264+ t .Fatalf ("failed to match %q" , httpHost )
265+ return nil , false
266+ })
267+ if err := p .Start (); err != nil {
268+ t .Fatal (err )
269+ }
270+
271+ toFront , err := net .Dial ("tcp" , front .Addr ().String ())
272+ if err != nil {
273+ t .Fatal (err )
274+ }
275+ defer toFront .Close ()
276+
277+ const msg = "GET / HTTP/1.1\r \n Host: bar.com\r \n \r \n "
278+ io .WriteString (toFront , msg )
279+
280+ fromProxy , err := backBar .Accept ()
281+ if err != nil {
282+ t .Fatal (err )
283+ }
284+
285+ buf := make ([]byte , len (msg ))
286+ if _ , err := io .ReadFull (fromProxy , buf ); err != nil {
287+ t .Fatal (err )
288+ }
289+ if string (buf ) != msg {
290+ t .Fatalf ("got %q; want %q" , buf , msg )
291+ }
292+ }
293+
250294func TestProxySNI (t * testing.T ) {
251295 front := newLocalListener (t )
252296 defer front .Close ()
0 commit comments