From 71759971a31525199f09983e3e678570537e4a2f Mon Sep 17 00:00:00 2001 From: Dimitra Chatzichrysou Date: Thu, 24 Jul 2025 13:26:32 +0200 Subject: [PATCH 1/2] feat: Make error code configurable --- cmd/main.go | 27 ++++++++++++++++----------- internal/handlers/unidler/handler.go | 2 +- internal/handlers/unidler/unidler.go | 25 +++++++++++++------------ test/e2e/e2e_suite.go | 8 ++++++++ 4 files changed, 38 insertions(+), 24 deletions(-) diff --git a/cmd/main.go b/cmd/main.go index 2e11fc5..5258569 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -74,6 +74,8 @@ func main() { var verifiedUnidling bool var verifiedSecret string + var defaultHTTPErrorCode int + flag.StringVar(&metricsAddr, "metrics-bind-address", "0", "The address the metrics endpoint binds to. "+ "Use :8443 for HTTPS or :8080 for HTTP, or leave as 0 to disable the metrics service.") flag.BoolVar(&secureMetrics, "metrics-secure", true, @@ -108,11 +110,13 @@ func main() { flag.StringVar(&verifiedSecret, "verify-secret", "super-secret-string", "The secret to use for verifying unidling requests.") flag.IntVar(&unidlerHTTPPort, "unidler-port", 5000, "Port for the unidler service to listen on.") + flag.IntVar(&defaultHTTPErrorCode, "default-http-error-code", 404, "Default HTTP error code for ingress") flag.Parse() selectorsFile = variables.GetEnv("SELECTORS_YAML_FILE", selectorsFile) verifiedUnidling = variables.GetEnvBool("VERIFIED_UNIDLING", verifiedUnidling) verifiedSecret = variables.GetEnv("VERIFY_SECRET", verifiedSecret) + defaultHTTPErrorCode = variables.GetEnvInt("DEFAULT_HTTP_ERROR_CODE", defaultHTTPErrorCode) dryRun = variables.GetEnvBool("DRY_RUN", dryRun) @@ -198,17 +202,18 @@ func main() { allowedIPs, _ := unidler.ReadSliceFromFile("/lists/allowedips") blockedIPs, _ := unidler.ReadSliceFromFile("/lists/blockedips") u := &unidler.Unidler{ - Client: mgr.GetClient(), - Log: ctrl.Log.WithName("aergia-controller").WithName("Unidler"), - RefreshInterval: refreshInterval, - Debug: debug, - AllowedUserAgents: allowedAgents, - BlockedUserAgents: blockedAgents, - AllowedIPs: allowedIPs, - BlockedIPs: blockedIPs, - UnidlerHTTPPort: unidlerHTTPPort, - VerifiedUnidling: verifiedUnidling, - VerifiedSecret: verifiedSecret, + Client: mgr.GetClient(), + Log: ctrl.Log.WithName("aergia-controller").WithName("Unidler"), + RefreshInterval: refreshInterval, + Debug: debug, + AllowedUserAgents: allowedAgents, + BlockedUserAgents: blockedAgents, + AllowedIPs: allowedIPs, + BlockedIPs: blockedIPs, + UnidlerHTTPPort: unidlerHTTPPort, + VerifiedUnidling: verifiedUnidling, + VerifiedSecret: verifiedSecret, + DefaultHTTPErrorCode: defaultHTTPErrorCode, } prometheusClient, err := prometheusapi.NewClient(prometheusapi.Config{ diff --git a/internal/handlers/unidler/handler.go b/internal/handlers/unidler/handler.go index 7526951..0f94397 100644 --- a/internal/handlers/unidler/handler.go +++ b/internal/handlers/unidler/handler.go @@ -51,7 +51,7 @@ func (h *Unidler) ingressHandler(path string) func(http.ResponseWriter, *http.Re errCode := r.Header.Get(CodeHeader) code, err := strconv.Atoi(errCode) if err != nil { - code = 404 + code = h.DefaultHTTPErrorCode } w.WriteHeader(code) ns := r.Header.Get(Namespace) diff --git a/internal/handlers/unidler/unidler.go b/internal/handlers/unidler/unidler.go index 1603e24..4b8e93a 100644 --- a/internal/handlers/unidler/unidler.go +++ b/internal/handlers/unidler/unidler.go @@ -33,18 +33,19 @@ const ( // Unidler is the client structure for http handlers. type Unidler struct { - Client ctrlClient.Client - Log logr.Logger - RefreshInterval int - UnidlerHTTPPort int - Debug bool - VerifiedUnidling bool - VerifiedSecret string - Locks sync.Map - AllowedUserAgents []string - BlockedUserAgents []string - AllowedIPs []string - BlockedIPs []string + Client ctrlClient.Client + Log logr.Logger + RefreshInterval int + UnidlerHTTPPort int + Debug bool + VerifiedUnidling bool + VerifiedSecret string + Locks sync.Map + AllowedUserAgents []string + BlockedUserAgents []string + AllowedIPs []string + BlockedIPs []string + DefaultHTTPErrorCode int } type pageData struct { diff --git a/test/e2e/e2e_suite.go b/test/e2e/e2e_suite.go index 1d7071a..2e48aa3 100644 --- a/test/e2e/e2e_suite.go +++ b/test/e2e/e2e_suite.go @@ -295,6 +295,14 @@ var _ = ginkgo.Describe("controller", ginkgo.Ordered, func() { fmt.Printf("metrics: %s", string(output)) err = utils.CheckStringContainsStrings(string(output), metricLabels) gomega.ExpectWithOffset(2, err).NotTo(gomega.HaveOccurred()) + + // verify that 404 HTTP error is being returned for non-existing ingress + ginkgo.By("validating default HTTP error code") + runCmd = fmt.Sprintf(`curl -s -I http://non-existing-domain.%s.nip.io/`, kindIP) + output, _ = utils.RunCommonsCommand(namespace, runCmd) + fmt.Printf("curl: %s", string(output)) + err = utils.CheckStringContainsStrings(string(output), []string{"404 Not Found"}) + gomega.ExpectWithOffset(2, err).NotTo(gomega.HaveOccurred()) // End tests }) }) From 0ac2590fadf9d87dfbfb9e3dbe697ba76a65e9d2 Mon Sep 17 00:00:00 2001 From: Dimitra Chatzichrysou Date: Thu, 24 Jul 2025 15:34:44 +0200 Subject: [PATCH 2/2] Improve naming --- cmd/main.go | 30 ++++++++++++++-------------- internal/handlers/unidler/handler.go | 2 +- internal/handlers/unidler/unidler.go | 26 ++++++++++++------------ test/e2e/e2e_suite.go | 4 ++-- 4 files changed, 31 insertions(+), 31 deletions(-) diff --git a/cmd/main.go b/cmd/main.go index 5258569..2c0b218 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -74,7 +74,7 @@ func main() { var verifiedUnidling bool var verifiedSecret string - var defaultHTTPErrorCode int + var defaultHTTPResponseCode int flag.StringVar(&metricsAddr, "metrics-bind-address", "0", "The address the metrics endpoint binds to. "+ "Use :8443 for HTTPS or :8080 for HTTP, or leave as 0 to disable the metrics service.") @@ -110,13 +110,13 @@ func main() { flag.StringVar(&verifiedSecret, "verify-secret", "super-secret-string", "The secret to use for verifying unidling requests.") flag.IntVar(&unidlerHTTPPort, "unidler-port", 5000, "Port for the unidler service to listen on.") - flag.IntVar(&defaultHTTPErrorCode, "default-http-error-code", 404, "Default HTTP error code for ingress") + flag.IntVar(&defaultHTTPResponseCode, "default-http-response-code", 404, "Default HTTP response code.") flag.Parse() selectorsFile = variables.GetEnv("SELECTORS_YAML_FILE", selectorsFile) verifiedUnidling = variables.GetEnvBool("VERIFIED_UNIDLING", verifiedUnidling) verifiedSecret = variables.GetEnv("VERIFY_SECRET", verifiedSecret) - defaultHTTPErrorCode = variables.GetEnvInt("DEFAULT_HTTP_ERROR_CODE", defaultHTTPErrorCode) + defaultHTTPResponseCode = variables.GetEnvInt("DEFAULT_HTTP_RESPONSE_CODE", defaultHTTPResponseCode) dryRun = variables.GetEnvBool("DRY_RUN", dryRun) @@ -202,18 +202,18 @@ func main() { allowedIPs, _ := unidler.ReadSliceFromFile("/lists/allowedips") blockedIPs, _ := unidler.ReadSliceFromFile("/lists/blockedips") u := &unidler.Unidler{ - Client: mgr.GetClient(), - Log: ctrl.Log.WithName("aergia-controller").WithName("Unidler"), - RefreshInterval: refreshInterval, - Debug: debug, - AllowedUserAgents: allowedAgents, - BlockedUserAgents: blockedAgents, - AllowedIPs: allowedIPs, - BlockedIPs: blockedIPs, - UnidlerHTTPPort: unidlerHTTPPort, - VerifiedUnidling: verifiedUnidling, - VerifiedSecret: verifiedSecret, - DefaultHTTPErrorCode: defaultHTTPErrorCode, + Client: mgr.GetClient(), + Log: ctrl.Log.WithName("aergia-controller").WithName("Unidler"), + RefreshInterval: refreshInterval, + Debug: debug, + AllowedUserAgents: allowedAgents, + BlockedUserAgents: blockedAgents, + AllowedIPs: allowedIPs, + BlockedIPs: blockedIPs, + UnidlerHTTPPort: unidlerHTTPPort, + VerifiedUnidling: verifiedUnidling, + VerifiedSecret: verifiedSecret, + DefaultHTTPResponseCode: defaultHTTPResponseCode, } prometheusClient, err := prometheusapi.NewClient(prometheusapi.Config{ diff --git a/internal/handlers/unidler/handler.go b/internal/handlers/unidler/handler.go index 0f94397..cc600c8 100644 --- a/internal/handlers/unidler/handler.go +++ b/internal/handlers/unidler/handler.go @@ -51,7 +51,7 @@ func (h *Unidler) ingressHandler(path string) func(http.ResponseWriter, *http.Re errCode := r.Header.Get(CodeHeader) code, err := strconv.Atoi(errCode) if err != nil { - code = h.DefaultHTTPErrorCode + code = h.DefaultHTTPResponseCode } w.WriteHeader(code) ns := r.Header.Get(Namespace) diff --git a/internal/handlers/unidler/unidler.go b/internal/handlers/unidler/unidler.go index 4b8e93a..30c83e1 100644 --- a/internal/handlers/unidler/unidler.go +++ b/internal/handlers/unidler/unidler.go @@ -33,19 +33,19 @@ const ( // Unidler is the client structure for http handlers. type Unidler struct { - Client ctrlClient.Client - Log logr.Logger - RefreshInterval int - UnidlerHTTPPort int - Debug bool - VerifiedUnidling bool - VerifiedSecret string - Locks sync.Map - AllowedUserAgents []string - BlockedUserAgents []string - AllowedIPs []string - BlockedIPs []string - DefaultHTTPErrorCode int + Client ctrlClient.Client + Log logr.Logger + RefreshInterval int + UnidlerHTTPPort int + Debug bool + VerifiedUnidling bool + VerifiedSecret string + Locks sync.Map + AllowedUserAgents []string + BlockedUserAgents []string + AllowedIPs []string + BlockedIPs []string + DefaultHTTPResponseCode int } type pageData struct { diff --git a/test/e2e/e2e_suite.go b/test/e2e/e2e_suite.go index 2e48aa3..f10961f 100644 --- a/test/e2e/e2e_suite.go +++ b/test/e2e/e2e_suite.go @@ -296,8 +296,8 @@ var _ = ginkgo.Describe("controller", ginkgo.Ordered, func() { err = utils.CheckStringContainsStrings(string(output), metricLabels) gomega.ExpectWithOffset(2, err).NotTo(gomega.HaveOccurred()) - // verify that 404 HTTP error is being returned for non-existing ingress - ginkgo.By("validating default HTTP error code") + // verify that default HTTP response code is 404 + ginkgo.By("validating default HTTP response code") runCmd = fmt.Sprintf(`curl -s -I http://non-existing-domain.%s.nip.io/`, kindIP) output, _ = utils.RunCommonsCommand(namespace, runCmd) fmt.Printf("curl: %s", string(output))