diff --git a/main.go b/main.go index 2dcd1ea5c..e1039be8e 100644 --- a/main.go +++ b/main.go @@ -348,12 +348,42 @@ func writeToPumps(keys []interface{}, job *health.Job, startTime time.Time, purg } } +func getDecodingSettings(pump pumps.Pump) (decodingRequest, decodingResponse bool) { + decodingResponse = pump.GetDecodedResponse() || SystemConfig.DecodeRawResponse + decodingRequest = pump.GetDecodedRequest() || SystemConfig.DecodeRawRequest + return decodingRequest, decodingResponse +} + +func decodeBase64Data(record *analytics.AnalyticsRecord, decodeRequest, decodeResponse bool) { + // DECODING RAW REQUEST AND RESPONSE FROM BASE 64 + if decodeRequest { + rawRequest, err := base64.StdEncoding.DecodeString(record.RawRequest) + if err == nil { + record.RawRequest = string(rawRequest) + } + } + if decodeResponse { + rawResponse, err := base64.StdEncoding.DecodeString(record.RawResponse) + if err == nil { + record.RawResponse = string(rawResponse) + } + } +} + +func trimRawData(record *analytics.AnalyticsRecord, pump pumps.Pump) { + if pump.GetMaxRecordSize() != 0 { + record.TrimRawData(pump.GetMaxRecordSize()) + } else { + record.TrimRawData(SystemConfig.MaxRecordSize) + } +} + func filterData(pump pumps.Pump, keys []interface{}) []interface{} { shouldTrim := SystemConfig.MaxRecordSize != 0 || pump.GetMaxRecordSize() != 0 filters := pump.GetFilters() ignoreFields := pump.GetIgnoreFields() - getDecodingResponse := pump.GetDecodedResponse() - getDecodingRequest := pump.GetDecodedRequest() + getDecodingRequest, getDecodingResponse := getDecodingSettings(pump) + // Checking to see if all the config options are empty/false if !getDecodingRequest && !getDecodingResponse && !filters.HasFilter() && !pump.GetOmitDetailedRecording() && !shouldTrim && len(ignoreFields) == 0 { return keys @@ -371,11 +401,7 @@ func filterData(pump pumps.Pump, keys []interface{}) []interface{} { decoded.RawResponse = "" } else { if shouldTrim { - if pump.GetMaxRecordSize() != 0 { - decoded.TrimRawData(pump.GetMaxRecordSize()) - } else { - decoded.TrimRawData(SystemConfig.MaxRecordSize) - } + trimRawData(&decoded, pump) } } if filters.ShouldFilter(decoded) { @@ -384,19 +410,7 @@ func filterData(pump pumps.Pump, keys []interface{}) []interface{} { if len(ignoreFields) > 0 { decoded.RemoveIgnoredFields(ignoreFields) } - // DECODING RAW REQUEST AND RESPONSE FROM BASE 64 - if getDecodingRequest { - rawRequest, err := base64.StdEncoding.DecodeString(decoded.RawRequest) - if err == nil { - decoded.RawRequest = string(rawRequest) - } - } - if getDecodingResponse { - rawResponse, err := base64.StdEncoding.DecodeString(decoded.RawResponse) - if err == nil { - decoded.RawResponse = string(rawResponse) - } - } + decodeBase64Data(&decoded, getDecodingRequest, getDecodingResponse) filteredKeys[newLenght] = decoded newLenght++ } diff --git a/main_test.go b/main_test.go index ffdce45b4..2aa12b145 100644 --- a/main_test.go +++ b/main_test.go @@ -376,3 +376,122 @@ func TestDecodedKey(t *testing.T) { }) } } + +func TestGetDecodingSettings(t *testing.T) { + originalSystemConfig := SystemConfig + t.Cleanup(func() { + SystemConfig = originalSystemConfig + }) + + testCases := []struct { + name string + pumpDecodeRequest bool + pumpDecodeResponse bool + globalDecodeRequest bool + globalDecodeResponse bool + expectedDecodeRequest bool + expectedDecodeResponse bool + }{ + { + name: "pump level settings both enabled", + pumpDecodeRequest: true, + pumpDecodeResponse: true, + globalDecodeRequest: false, + globalDecodeResponse: false, + expectedDecodeRequest: true, + expectedDecodeResponse: true, + }, + { + name: "pump level settings both disabled, global both enabled", + pumpDecodeRequest: false, + pumpDecodeResponse: false, + globalDecodeRequest: true, + globalDecodeResponse: true, + expectedDecodeRequest: true, + expectedDecodeResponse: true, + }, + { + name: "pump level settings both disabled, global both disabled", + pumpDecodeRequest: false, + pumpDecodeResponse: false, + globalDecodeRequest: false, + globalDecodeResponse: false, + expectedDecodeRequest: false, + expectedDecodeResponse: false, + }, + { + name: "pump request enabled, pump response disabled, global both enabled", + pumpDecodeRequest: true, + pumpDecodeResponse: false, + globalDecodeRequest: true, + globalDecodeResponse: true, + expectedDecodeRequest: true, + expectedDecodeResponse: true, + }, + { + name: "pump request disabled, pump response enabled, global both enabled", + pumpDecodeRequest: false, + pumpDecodeResponse: true, + globalDecodeRequest: true, + globalDecodeResponse: true, + expectedDecodeRequest: true, + expectedDecodeResponse: true, + }, + { + name: "pump request enabled, pump response disabled, global request disabled, global response enabled", + pumpDecodeRequest: true, + pumpDecodeResponse: false, + globalDecodeRequest: false, + globalDecodeResponse: true, + expectedDecodeRequest: true, + expectedDecodeResponse: true, + }, + { + name: "pump request disabled, pump response enabled, global request enabled, global response disabled", + pumpDecodeRequest: false, + pumpDecodeResponse: true, + globalDecodeRequest: true, + globalDecodeResponse: false, + expectedDecodeRequest: true, + expectedDecodeResponse: true, + }, + { + name: "pump request enabled, pump response disabled, global both disabled", + pumpDecodeRequest: true, + pumpDecodeResponse: false, + globalDecodeRequest: false, + globalDecodeResponse: false, + expectedDecodeRequest: true, + expectedDecodeResponse: false, + }, + { + name: "pump request disabled, pump response enabled, global both disabled", + pumpDecodeRequest: false, + pumpDecodeResponse: true, + globalDecodeRequest: false, + globalDecodeResponse: false, + expectedDecodeRequest: false, + expectedDecodeResponse: true, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + SystemConfig = TykPumpConfiguration{ + DecodeRawRequest: tc.globalDecodeRequest, + DecodeRawResponse: tc.globalDecodeResponse, + } + + mockedPump := &MockedPump{} + mockedPump.SetDecodingRequest(tc.pumpDecodeRequest) + mockedPump.SetDecodingResponse(tc.pumpDecodeResponse) + + actualDecodeRequest, actualDecodeResponse := getDecodingSettings(mockedPump) + + assert.Equal(t, tc.expectedDecodeRequest, actualDecodeRequest, + "DecodeRequest mismatch: expected %v, got %v", tc.expectedDecodeRequest, actualDecodeRequest) + assert.Equal(t, tc.expectedDecodeResponse, actualDecodeResponse, + "DecodeResponse mismatch: expected %v, got %v", tc.expectedDecodeResponse, actualDecodeResponse) + }) + } +}