Skip to content

[🐛 Bug]: WebHook provider cannot POST a JSON message with a key named "key". #5333

@manuelluis

Description

@manuelluis

Describe the bug

In the definition of a step in a workflow, if you create a parameter with the key "key", for example a POST in a WebHook:

steps:
- name: webhook
   provider:
     type: webhook
     config: "{{ config }}"
     with:
       url: https://test/test
       method: POST
       body:
         key: ALERT
         host: "{{alert.service}}"
         time: "{{alert.lastReceived}}"
         source: "{{alert.source}}"
         message: "{{alert.description}}"

The data of the POST body will be: "ALERT" and not a JSON with the keys: key, host, time, source and message.

This is because in parse_provider_parameters:

keep/keep/parser/parser.py

Lines 464 to 486 in cfcf490

def parse_provider_parameters(provider_parameters: dict) -> dict:
parsed_provider_parameters = {}
for parameter in provider_parameters:
if keyword.iskeyword(parameter):
# add suffix _ to provider parameters if it's a reserved keyword in python
parameter_name = parameter + "_"
else:
parameter_name = parameter
if isinstance(provider_parameters[parameter], (str, list, int, bool)):
parsed_provider_parameters[parameter_name] = provider_parameters[
parameter
]
elif isinstance(provider_parameters[parameter], dict):
try:
parsed_provider_parameters[parameter_name] = StepProviderParameter(
**provider_parameters[parameter]
)
except Exception:
# It could be a dict/list but not of ProviderParameter type
parsed_provider_parameters[parameter_name] = provider_parameters[
parameter
]
return parsed_provider_parameters

if the parameter is a dictionary it attempt to converted it to a StepProviderParameter and this works if the dict has a key with the name "key" because in the definition of de pydantic model "key" is the only required parameter

from pydantic import BaseModel
class StepProviderParameter(BaseModel):
key: str # the key to render
safe: bool = False # whether to validate this key or fail silently ("safe")
default: str | int | bool = None # default value if this key doesn't exist

Metadata

Metadata

Assignees

No one assigned

    Labels

    BugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions