diff --git a/api/core/workflow/entities/variable_pool.py b/api/core/workflow/entities/variable_pool.py index 844b46f352..79788495f0 100644 --- a/api/core/workflow/entities/variable_pool.py +++ b/api/core/workflow/entities/variable_pool.py @@ -167,6 +167,20 @@ class VariablePool(BaseModel): segments.append(variable_factory.build_segment(part)) return SegmentGroup(value=segments) + def convert_template_escape(self, template: str, /): + parts = VARIABLE_PATTERN.split(template) + segments = [] + for part in filter(lambda x: x, parts): + if "." in part and (variable := self.get(part.split("."))): + if isinstance(variable.value, str): + escape_string = variable.value.replace('"', '\\"').replace('\n', '\\n') + segments.append(variable_factory.build_segment(escape_string)) + else: + segments.append(variable) + else: + segments.append(variable_factory.build_segment(part)) + return SegmentGroup(value=segments) + def get_file(self, selector: Sequence[str], /) -> FileSegment | None: segment = self.get(selector) if isinstance(segment, FileSegment): diff --git a/api/core/workflow/nodes/http_request/executor.py b/api/core/workflow/nodes/http_request/executor.py index 5ed2cd6164..d32bf9c8d3 100644 --- a/api/core/workflow/nodes/http_request/executor.py +++ b/api/core/workflow/nodes/http_request/executor.py @@ -172,7 +172,7 @@ class Executor: case "json": if len(data) != 1: raise RequestBodyError("json body type should have exactly one item") - json_string = self.variable_pool.convert_template(data[0].value).text + json_string = self.variable_pool.convert_template_escape(data[0].value).text try: json_object = json.loads(json_string, strict=False) except json.JSONDecodeError as e: