@@ -72,7 +72,7 @@ func TestMatchHTTPHost(t *testing.T) {
72
72
}
73
73
t .Run (name , func (t * testing.T ) {
74
74
br := bufio .NewReader (tt .r )
75
- r := httpHostMatch {equals (tt .host ), noopTarget {}}
75
+ r := httpHostMatch {matcher : equals (tt .host ), target : noopTarget {}}
76
76
m , name := r .match (br )
77
77
got := m != nil
78
78
if got != tt .want {
@@ -247,6 +247,50 @@ func TestProxyHTTP(t *testing.T) {
247
247
}
248
248
}
249
249
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
+
250
294
func TestProxySNI (t * testing.T ) {
251
295
front := newLocalListener (t )
252
296
defer front .Close ()
0 commit comments