feat: add FormData, text, and none body types to HTTP request workflow (#14055)

This PR is a cleaned-up and improved version of #13982, excluding file
uploads for FormData.


https://github.com/user-attachments/assets/a85546f6-4e3b-4654-a4ea-e76a11016b96

---------

Co-authored-by: Thomas Trompette <thomas.trompette@sfr.fr>
This commit is contained in:
Naifer
2025-09-11 13:32:19 +01:00
committed by GitHub
parent d2ebd870df
commit 39326e6144
15 changed files with 371 additions and 148 deletions
@@ -1,13 +1,14 @@
import { Injectable } from '@nestjs/common';
import axios, { type AxiosRequestConfig } from 'axios';
import { isDefined } from 'twenty-shared/utils';
import { parseDataFromContentType } from 'twenty-shared/workflow';
import { HttpToolParametersZodSchema } from 'src/engine/core-modules/tool/tools/http-tool/http-tool.schema';
import { type HttpRequestInput } from 'src/engine/core-modules/tool/tools/http-tool/types/http-request-input.type';
import { type ToolInput } from 'src/engine/core-modules/tool/types/tool-input.type';
import { type ToolOutput } from 'src/engine/core-modules/tool/types/tool-output.type';
import { type Tool } from 'src/engine/core-modules/tool/types/tool.type';
@Injectable()
export class HttpTool implements Tool {
description =
@@ -16,16 +17,23 @@ export class HttpTool implements Tool {
async execute(parameters: ToolInput): Promise<ToolOutput> {
const { url, method, headers, body } = parameters as HttpRequestInput;
const headersCopy = { ...headers };
const isMethodForBody = ['POST', 'PUT', 'PATCH'].includes(method);
try {
const axiosConfig: AxiosRequestConfig = {
url,
method: method,
headers,
headers: headersCopy,
};
if (['POST', 'PUT', 'PATCH'].includes(method) && body) {
axiosConfig.data = body;
if (isMethodForBody && body) {
const contentType = headers?.['content-type'];
axiosConfig.data = parseDataFromContentType(body, contentType);
if (isDefined(headersCopy) && contentType === 'multipart/form-data') {
delete headersCopy['content-type'];
}
}
const response = await axios(axiosConfig);