| self.url = self.variable_pool.convert_template(self.node_data.url).text | self.url = self.variable_pool.convert_template(self.node_data.url).text | ||||
| def _init_params(self): | def _init_params(self): | ||||
| params = self.variable_pool.convert_template(self.node_data.params).text | |||||
| self.params = _plain_text_to_dict(params) | |||||
| params = _plain_text_to_dict(self.node_data.params) | |||||
| for key in params: | |||||
| params[key] = self.variable_pool.convert_template(params[key]).text | |||||
| self.params = params | |||||
| def _init_headers(self): | def _init_headers(self): | ||||
| headers = self.variable_pool.convert_template(self.node_data.headers).text | headers = self.variable_pool.convert_template(self.node_data.headers).text | 
| from core.workflow.entities.variable_pool import VariablePool | |||||
| from core.workflow.nodes.http_request import ( | |||||
| BodyData, | |||||
| HttpRequestNodeAuthorization, | |||||
| HttpRequestNodeBody, | |||||
| HttpRequestNodeData, | |||||
| ) | |||||
| from core.workflow.nodes.http_request.entities import HttpRequestNodeTimeout | |||||
| from core.workflow.nodes.http_request.executor import Executor | |||||
| def test_executor_with_json_body_and_number_variable(): | |||||
| # Prepare the variable pool | |||||
| variable_pool = VariablePool( | |||||
| system_variables={}, | |||||
| user_inputs={}, | |||||
| ) | |||||
| variable_pool.add(["pre_node_id", "number"], 42) | |||||
| # Prepare the node data | |||||
| node_data = HttpRequestNodeData( | |||||
| title="Test JSON Body with Number Variable", | |||||
| method="post", | |||||
| url="https://api.example.com/data", | |||||
| authorization=HttpRequestNodeAuthorization(type="no-auth"), | |||||
| headers="Content-Type: application/json", | |||||
| params="", | |||||
| body=HttpRequestNodeBody( | |||||
| type="json", | |||||
| data=[ | |||||
| BodyData( | |||||
| key="", | |||||
| type="text", | |||||
| value='{"number": {{#pre_node_id.number#}}}', | |||||
| ) | |||||
| ], | |||||
| ), | |||||
| ) | |||||
| # Initialize the Executor | |||||
| executor = Executor( | |||||
| node_data=node_data, | |||||
| timeout=HttpRequestNodeTimeout(connect=10, read=30, write=30), | |||||
| variable_pool=variable_pool, | |||||
| ) | |||||
| # Check the executor's data | |||||
| assert executor.method == "post" | |||||
| assert executor.url == "https://api.example.com/data" | |||||
| assert executor.headers == {"Content-Type": "application/json"} | |||||
| assert executor.params == {} | |||||
| assert executor.json == {"number": 42} | |||||
| assert executor.data is None | |||||
| assert executor.files is None | |||||
| assert executor.content is None | |||||
| # Check the raw request (to_log method) | |||||
| raw_request = executor.to_log() | |||||
| assert "POST /data HTTP/1.1" in raw_request | |||||
| assert "Host: api.example.com" in raw_request | |||||
| assert "Content-Type: application/json" in raw_request | |||||
| assert '{"number": 42}' in raw_request | |||||
| def test_executor_with_json_body_and_object_variable(): | |||||
| # Prepare the variable pool | |||||
| variable_pool = VariablePool( | |||||
| system_variables={}, | |||||
| user_inputs={}, | |||||
| ) | |||||
| variable_pool.add(["pre_node_id", "object"], {"name": "John Doe", "age": 30, "email": "john@example.com"}) | |||||
| # Prepare the node data | |||||
| node_data = HttpRequestNodeData( | |||||
| title="Test JSON Body with Object Variable", | |||||
| method="post", | |||||
| url="https://api.example.com/data", | |||||
| authorization=HttpRequestNodeAuthorization(type="no-auth"), | |||||
| headers="Content-Type: application/json", | |||||
| params="", | |||||
| body=HttpRequestNodeBody( | |||||
| type="json", | |||||
| data=[ | |||||
| BodyData( | |||||
| key="", | |||||
| type="text", | |||||
| value="{{#pre_node_id.object#}}", | |||||
| ) | |||||
| ], | |||||
| ), | |||||
| ) | |||||
| # Initialize the Executor | |||||
| executor = Executor( | |||||
| node_data=node_data, | |||||
| timeout=HttpRequestNodeTimeout(connect=10, read=30, write=30), | |||||
| variable_pool=variable_pool, | |||||
| ) | |||||
| # Check the executor's data | |||||
| assert executor.method == "post" | |||||
| assert executor.url == "https://api.example.com/data" | |||||
| assert executor.headers == {"Content-Type": "application/json"} | |||||
| assert executor.params == {} | |||||
| assert executor.json == {"name": "John Doe", "age": 30, "email": "john@example.com"} | |||||
| assert executor.data is None | |||||
| assert executor.files is None | |||||
| assert executor.content is None | |||||
| # Check the raw request (to_log method) | |||||
| raw_request = executor.to_log() | |||||
| assert "POST /data HTTP/1.1" in raw_request | |||||
| assert "Host: api.example.com" in raw_request | |||||
| assert "Content-Type: application/json" in raw_request | |||||
| assert '"name": "John Doe"' in raw_request | |||||
| assert '"age": 30' in raw_request | |||||
| assert '"email": "john@example.com"' in raw_request | |||||
| def test_executor_with_json_body_and_nested_object_variable(): | |||||
| # Prepare the variable pool | |||||
| variable_pool = VariablePool( | |||||
| system_variables={}, | |||||
| user_inputs={}, | |||||
| ) | |||||
| variable_pool.add(["pre_node_id", "object"], {"name": "John Doe", "age": 30, "email": "john@example.com"}) | |||||
| # Prepare the node data | |||||
| node_data = HttpRequestNodeData( | |||||
| title="Test JSON Body with Nested Object Variable", | |||||
| method="post", | |||||
| url="https://api.example.com/data", | |||||
| authorization=HttpRequestNodeAuthorization(type="no-auth"), | |||||
| headers="Content-Type: application/json", | |||||
| params="", | |||||
| body=HttpRequestNodeBody( | |||||
| type="json", | |||||
| data=[ | |||||
| BodyData( | |||||
| key="", | |||||
| type="text", | |||||
| value='{"object": {{#pre_node_id.object#}}}', | |||||
| ) | |||||
| ], | |||||
| ), | |||||
| ) | |||||
| # Initialize the Executor | |||||
| executor = Executor( | |||||
| node_data=node_data, | |||||
| timeout=HttpRequestNodeTimeout(connect=10, read=30, write=30), | |||||
| variable_pool=variable_pool, | |||||
| ) | |||||
| # Check the executor's data | |||||
| assert executor.method == "post" | |||||
| assert executor.url == "https://api.example.com/data" | |||||
| assert executor.headers == {"Content-Type": "application/json"} | |||||
| assert executor.params == {} | |||||
| assert executor.json == {"object": {"name": "John Doe", "age": 30, "email": "john@example.com"}} | |||||
| assert executor.data is None | |||||
| assert executor.files is None | |||||
| assert executor.content is None | |||||
| # Check the raw request (to_log method) | |||||
| raw_request = executor.to_log() | |||||
| assert "POST /data HTTP/1.1" in raw_request | |||||
| assert "Host: api.example.com" in raw_request | |||||
| assert "Content-Type: application/json" in raw_request | |||||
| assert '"object": {' in raw_request | |||||
| assert '"name": "John Doe"' in raw_request | |||||
| assert '"age": 30' in raw_request | |||||
| assert '"email": "john@example.com"' in raw_request | |||||
| def test_extract_selectors_from_template_with_newline(): | |||||
| variable_pool = VariablePool() | |||||
| variable_pool.add(("node_id", "custom_query"), "line1\nline2") | |||||
| node_data = HttpRequestNodeData( | |||||
| title="Test JSON Body with Nested Object Variable", | |||||
| method="post", | |||||
| url="https://api.example.com/data", | |||||
| authorization=HttpRequestNodeAuthorization(type="no-auth"), | |||||
| headers="Content-Type: application/json", | |||||
| params="test: {{#node_id.custom_query#}}", | |||||
| body=HttpRequestNodeBody( | |||||
| type="none", | |||||
| data=[], | |||||
| ), | |||||
| ) | |||||
| executor = Executor( | |||||
| node_data=node_data, | |||||
| timeout=HttpRequestNodeTimeout(connect=10, read=30, write=30), | |||||
| variable_pool=variable_pool, | |||||
| ) | |||||
| assert executor.params == {"test": "line1\nline2"} | 
| import json | |||||
| import httpx | import httpx | ||||
| from core.app.entities.app_invoke_entities import InvokeFrom | from core.app.entities.app_invoke_entities import InvokeFrom | ||||
| HttpRequestNodeBody, | HttpRequestNodeBody, | ||||
| HttpRequestNodeData, | HttpRequestNodeData, | ||||
| ) | ) | ||||
| from core.workflow.nodes.http_request.entities import HttpRequestNodeTimeout | |||||
| from core.workflow.nodes.http_request.executor import Executor, _plain_text_to_dict | |||||
| from core.workflow.nodes.http_request.executor import _plain_text_to_dict | |||||
| from models.enums import UserFrom | from models.enums import UserFrom | ||||
| from models.workflow import WorkflowNodeExecutionStatus, WorkflowType | from models.workflow import WorkflowNodeExecutionStatus, WorkflowType | ||||
| assert result.status == WorkflowNodeExecutionStatus.SUCCEEDED | assert result.status == WorkflowNodeExecutionStatus.SUCCEEDED | ||||
| assert result.outputs is not None | assert result.outputs is not None | ||||
| assert result.outputs["body"] == "" | assert result.outputs["body"] == "" | ||||
| def test_executor_with_json_body_and_number_variable(): | |||||
| # Prepare the variable pool | |||||
| variable_pool = VariablePool( | |||||
| system_variables={}, | |||||
| user_inputs={}, | |||||
| ) | |||||
| variable_pool.add(["pre_node_id", "number"], 42) | |||||
| # Prepare the node data | |||||
| node_data = HttpRequestNodeData( | |||||
| title="Test JSON Body with Number Variable", | |||||
| method="post", | |||||
| url="https://api.example.com/data", | |||||
| authorization=HttpRequestNodeAuthorization(type="no-auth"), | |||||
| headers="Content-Type: application/json", | |||||
| params="", | |||||
| body=HttpRequestNodeBody( | |||||
| type="json", | |||||
| data=[ | |||||
| BodyData( | |||||
| key="", | |||||
| type="text", | |||||
| value='{"number": {{#pre_node_id.number#}}}', | |||||
| ) | |||||
| ], | |||||
| ), | |||||
| ) | |||||
| # Initialize the Executor | |||||
| executor = Executor( | |||||
| node_data=node_data, | |||||
| timeout=HttpRequestNodeTimeout(connect=10, read=30, write=30), | |||||
| variable_pool=variable_pool, | |||||
| ) | |||||
| # Check the executor's data | |||||
| assert executor.method == "post" | |||||
| assert executor.url == "https://api.example.com/data" | |||||
| assert executor.headers == {"Content-Type": "application/json"} | |||||
| assert executor.params == {} | |||||
| assert executor.json == {"number": 42} | |||||
| assert executor.data is None | |||||
| assert executor.files is None | |||||
| assert executor.content is None | |||||
| # Check the raw request (to_log method) | |||||
| raw_request = executor.to_log() | |||||
| assert "POST /data HTTP/1.1" in raw_request | |||||
| assert "Host: api.example.com" in raw_request | |||||
| assert "Content-Type: application/json" in raw_request | |||||
| assert '{"number": 42}' in raw_request | |||||
| def test_executor_with_json_body_and_object_variable(): | |||||
| # Prepare the variable pool | |||||
| variable_pool = VariablePool( | |||||
| system_variables={}, | |||||
| user_inputs={}, | |||||
| ) | |||||
| variable_pool.add(["pre_node_id", "object"], {"name": "John Doe", "age": 30, "email": "john@example.com"}) | |||||
| # Prepare the node data | |||||
| node_data = HttpRequestNodeData( | |||||
| title="Test JSON Body with Object Variable", | |||||
| method="post", | |||||
| url="https://api.example.com/data", | |||||
| authorization=HttpRequestNodeAuthorization(type="no-auth"), | |||||
| headers="Content-Type: application/json", | |||||
| params="", | |||||
| body=HttpRequestNodeBody( | |||||
| type="json", | |||||
| data=[ | |||||
| BodyData( | |||||
| key="", | |||||
| type="text", | |||||
| value="{{#pre_node_id.object#}}", | |||||
| ) | |||||
| ], | |||||
| ), | |||||
| ) | |||||
| # Initialize the Executor | |||||
| executor = Executor( | |||||
| node_data=node_data, | |||||
| timeout=HttpRequestNodeTimeout(connect=10, read=30, write=30), | |||||
| variable_pool=variable_pool, | |||||
| ) | |||||
| # Check the executor's data | |||||
| assert executor.method == "post" | |||||
| assert executor.url == "https://api.example.com/data" | |||||
| assert executor.headers == {"Content-Type": "application/json"} | |||||
| assert executor.params == {} | |||||
| assert executor.json == {"name": "John Doe", "age": 30, "email": "john@example.com"} | |||||
| assert executor.data is None | |||||
| assert executor.files is None | |||||
| assert executor.content is None | |||||
| # Check the raw request (to_log method) | |||||
| raw_request = executor.to_log() | |||||
| assert "POST /data HTTP/1.1" in raw_request | |||||
| assert "Host: api.example.com" in raw_request | |||||
| assert "Content-Type: application/json" in raw_request | |||||
| assert '"name": "John Doe"' in raw_request | |||||
| assert '"age": 30' in raw_request | |||||
| assert '"email": "john@example.com"' in raw_request | |||||
| def test_executor_with_json_body_and_nested_object_variable(): | |||||
| # Prepare the variable pool | |||||
| variable_pool = VariablePool( | |||||
| system_variables={}, | |||||
| user_inputs={}, | |||||
| ) | |||||
| variable_pool.add(["pre_node_id", "object"], {"name": "John Doe", "age": 30, "email": "john@example.com"}) | |||||
| # Prepare the node data | |||||
| node_data = HttpRequestNodeData( | |||||
| title="Test JSON Body with Nested Object Variable", | |||||
| method="post", | |||||
| url="https://api.example.com/data", | |||||
| authorization=HttpRequestNodeAuthorization(type="no-auth"), | |||||
| headers="Content-Type: application/json", | |||||
| params="", | |||||
| body=HttpRequestNodeBody( | |||||
| type="json", | |||||
| data=[ | |||||
| BodyData( | |||||
| key="", | |||||
| type="text", | |||||
| value='{"object": {{#pre_node_id.object#}}}', | |||||
| ) | |||||
| ], | |||||
| ), | |||||
| ) | |||||
| # Initialize the Executor | |||||
| executor = Executor( | |||||
| node_data=node_data, | |||||
| timeout=HttpRequestNodeTimeout(connect=10, read=30, write=30), | |||||
| variable_pool=variable_pool, | |||||
| ) | |||||
| # Check the executor's data | |||||
| assert executor.method == "post" | |||||
| assert executor.url == "https://api.example.com/data" | |||||
| assert executor.headers == {"Content-Type": "application/json"} | |||||
| assert executor.params == {} | |||||
| assert executor.json == {"object": {"name": "John Doe", "age": 30, "email": "john@example.com"}} | |||||
| assert executor.data is None | |||||
| assert executor.files is None | |||||
| assert executor.content is None | |||||
| # Check the raw request (to_log method) | |||||
| raw_request = executor.to_log() | |||||
| assert "POST /data HTTP/1.1" in raw_request | |||||
| assert "Host: api.example.com" in raw_request | |||||
| assert "Content-Type: application/json" in raw_request | |||||
| assert '"object": {' in raw_request | |||||
| assert '"name": "John Doe"' in raw_request | |||||
| assert '"age": 30' in raw_request | |||||
| assert '"email": "john@example.com"' in raw_request |