diff --git a/.changelog/17936.txt b/.changelog/17936.txt new file mode 100644 index 000000000000..5861a694503c --- /dev/null +++ b/.changelog/17936.txt @@ -0,0 +1,3 @@ +```release-note:bug +services: Fixed a bug that prevented passing query parameters in Nomad native service discovery HTTP health check paths +``` diff --git a/client/serviceregistration/checks/client.go b/client/serviceregistration/checks/client.go index 09f386393782..bbef496a10a7 100644 --- a/client/serviceregistration/checks/client.go +++ b/client/serviceregistration/checks/client.go @@ -155,11 +155,18 @@ func (c *checker) checkHTTP(ctx context.Context, qc *QueryContext, q *Query) *st return qr } - u := (&url.URL{ + relative, err := url.Parse(q.Path) + if err != nil { + qr.Output = err.Error() + qr.Status = structs.CheckFailure + return qr + } + + base := url.URL{ Scheme: q.Protocol, Host: addr, - Path: q.Path, - }).String() + } + u := base.ResolveReference(relative).String() request, err := http.NewRequest(q.Method, u, nil) if err != nil { diff --git a/client/serviceregistration/checks/client_test.go b/client/serviceregistration/checks/client_test.go index f5ee9eaabc6e..71e8d7717cb2 100644 --- a/client/serviceregistration/checks/client_test.go +++ b/client/serviceregistration/checks/client_test.go @@ -39,6 +39,19 @@ func TestChecker_Do_HTTP(t *testing.T) { // create an http server with various responses ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + // handle query param requests with string match because we want to + // test the path is set correctly instead of with escaped query params. + if strings.Contains(r.URL.Path, "query-param") { + if r.URL.RawQuery == "" { + w.WriteHeader(400) + _, _ = io.WriteString(w, "400 bad request") + } else { + w.WriteHeader(200) + _, _ = io.WriteString(w, "200 ok") + } + return + } + switch r.URL.Path { case "/fail": w.WriteHeader(http.StatusInternalServerError) @@ -182,6 +195,16 @@ func TestChecker_Do_HTTP(t *testing.T) { http.StatusCreated, truncate, ), + }, { + name: "query param", + qc: makeQueryContext(), + q: makeQuery(structs.Healthiness, "query-param?a=b"), + expResult: makeExpResult( + structs.Healthiness, + structs.CheckSuccess, + http.StatusOK, + "nomad: http ok", + ), }} for _, tc := range cases {