diff --git a/CHANGELOG.md b/CHANGELOG.md index 5ff6afd7b39..27db6d656e0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -62,7 +62,7 @@ To learn more about active deprecations, we recommend checking [GitHub Discussio ### Fixes -- TODO ([#XXX](https://github.com/kedacore/keda/issues/XXX)) +- **Solace Scaler**: Fix a bug where `queueName` is not properly escaped during URL encode ([#4936](https://github.com/kedacore/keda/issues/4936)) ### Deprecations diff --git a/pkg/scalers/solace_scaler.go b/pkg/scalers/solace_scaler.go index 8ec5b2c7eae..5c0585e1f30 100644 --- a/pkg/scalers/solace_scaler.go +++ b/pkg/scalers/solace_scaler.go @@ -5,6 +5,7 @@ import ( "encoding/json" "fmt" "net/http" + "net/url" "strconv" "strings" @@ -252,7 +253,8 @@ func parseSolaceMetadata(config *ScalerConfig) (*SolaceMetadata, error) { solaceAPIVersion, meta.messageVpn, solaceAPIObjectTypeQueue, - meta.queueName) + url.QueryEscape(meta.queueName), + ) // Get Credentials var e error diff --git a/pkg/scalers/solace_scaler_test.go b/pkg/scalers/solace_scaler_test.go index 3b6df9fd24f..28acc36337b 100644 --- a/pkg/scalers/solace_scaler_test.go +++ b/pkg/scalers/solace_scaler_test.go @@ -4,6 +4,8 @@ import ( "context" "fmt" "net/http" + "net/url" + "strings" "testing" v2 "k8s.io/api/autoscaling/v2" @@ -246,6 +248,23 @@ var testParseSolaceMetadata = []testSolaceMetadata{ 1, true, }, + // +Case - Properly encode queueName + { + "#016 - Properly Encode QueueName- ", + map[string]string{ + "": "", + solaceMetaSempBaseURL: soltestValidBaseURL, + solaceMetaMsgVpn: soltestValidVpn, + solaceMetaUsernameFromEnv: "", + solaceMetaPasswordFromEnv: "", + solaceMetaUsername: soltestValidUsername, + solaceMetaPassword: soltestValidPassword, + solaceMetaQueueName: "with/slash", + solaceMetaMsgCountTarget: soltestValidMsgCountTarget, + }, + 1, + false, + }, } var testSolaceEnvCreds = []testSolaceMetadata{ @@ -513,7 +532,7 @@ var testSolaceExpectedMetricNames = map[string]string{ func TestSolaceParseSolaceMetadata(t *testing.T) { for _, testData := range testParseSolaceMetadata { fmt.Print(testData.testID) - _, err := parseSolaceMetadata(&ScalerConfig{ResolvedEnv: nil, TriggerMetadata: testData.metadata, AuthParams: nil, ScalerIndex: testData.scalerIndex}) + meta, err := parseSolaceMetadata(&ScalerConfig{ResolvedEnv: nil, TriggerMetadata: testData.metadata, AuthParams: nil, ScalerIndex: testData.scalerIndex}) switch { case err != nil && !testData.isError: t.Error("expected success but got error: ", err) @@ -524,6 +543,10 @@ func TestSolaceParseSolaceMetadata(t *testing.T) { default: fmt.Println(" --> PASS") } + if !testData.isError && strings.Contains(testData.metadata["queueName"], "/") && !strings.Contains(meta.endpointURL, url.QueryEscape(testData.metadata["queueName"])) { + t.Error("expected endpointURL to query escape special characters in the URL but got:", meta.endpointURL) + fmt.Println(" --> FAIL") + } } for _, testData := range testSolaceEnvCreds { fmt.Print(testData.testID)