diff --git a/app/proxy/proxy_test.go b/app/proxy/proxy_test.go index 1fbbee6..14610c2 100644 --- a/app/proxy/proxy_test.go +++ b/app/proxy/proxy_test.go @@ -497,6 +497,74 @@ func TestHttp_DoLimitedReq(t *testing.T) { } } +func TestHttp_health(t *testing.T) { + port := rand.Intn(10000) + 40000 + h := Http{Timeouts: Timeouts{ResponseHeader: 200 * time.Millisecond}, Address: fmt.Sprintf("127.0.0.1:%d", port), + AccessLog: io.Discard, Signature: true, ProxyHeaders: []string{"hh1:vv1", "hh2:vv2"}, StdOutEnabled: true, + Reporter: &ErrorReporter{Nice: true}} + ctx, cancel := context.WithTimeout(context.Background(), 500*time.Millisecond) + defer cancel() + + ds := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + t.Logf("req: %v", r) + w.Header().Add("h1", "v1") + require.Equal(t, "127.0.0.1", r.Header.Get("X-Real-IP")) + fmt.Fprintf(w, "response %s", r.URL.String()) + })) + + svc := discovery.NewService([]discovery.Provider{ + &provider.Static{Rules: []string{ + "localhost,^/api/(.*)," + ds.URL + "/123/$1,", + "127.0.0.1,^/api/(.*)," + ds.URL + "/567/$1,", + "*,/web,spa:testdata,", + }, + }}, time.Millisecond*10) + + go func() { + _ = svc.Run(context.Background()) + }() + + time.Sleep(50 * time.Millisecond) + h.Matcher, h.Metrics = svc, mgmt.NewMetrics() + + go func() { + _ = h.Run(ctx) + }() + time.Sleep(10 * time.Millisecond) + + client := http.Client{} + + { + req, err := http.NewRequest("POST", "http://127.0.0.1:"+strconv.Itoa(port)+"/api/something", bytes.NewBufferString("abcdefg")) + require.NoError(t, err) + resp, err := client.Do(req) + require.NoError(t, err) + defer resp.Body.Close() + assert.Equal(t, http.StatusOK, resp.StatusCode) + t.Logf("%+v", resp.Header) + + body, err := io.ReadAll(resp.Body) + require.NoError(t, err) + assert.Equal(t, "response /567/something", string(body)) + assert.Equal(t, "reproxy", resp.Header.Get("App-Name")) + assert.Equal(t, "v1", resp.Header.Get("h1")) + assert.Equal(t, "vv1", resp.Header.Get("hh1")) + assert.Equal(t, "vv2", resp.Header.Get("hh2")) + } + + { + req, err := http.NewRequest("GET", "http://127.0.0.1:"+strconv.Itoa(port)+"/health", nil) + require.NoError(t, err) + resp, err := client.Do(req) + require.NoError(t, err) + defer resp.Body.Close() + assert.Equal(t, http.StatusOK, resp.StatusCode) + body, err := io.ReadAll(resp.Body) + require.NoError(t, err) + assert.Equal(t, `{"status": "ok", "services": 2}`, string(body)) + } +} + func TestHttp_toHttp(t *testing.T) { tbl := []struct {