From 8e4dfd92e2b875f5029aba66d5998286662e57c1 Mon Sep 17 00:00:00 2001 From: sanket-a11y Date: Thu, 22 Jan 2026 13:13:11 +0530 Subject: [PATCH 1/2] feat(common): add option to ignore redirects with custom API call (#10947) Co-authored-by: Olivier Sambourg Co-authored-by: Kishan Parmar <135701940+kishanprmr@users.noreply.github.com> --- packages/pieces/community/common/package.json | 2 +- .../community/common/src/lib/helpers/index.ts | 7 +++++++ .../src/lib/http/axios/axios-http-client.ts | 18 +++++++++++++----- .../common/src/lib/http/core/http-request.ts | 1 + packages/pieces/community/http/package.json | 2 +- .../lib/actions/send-http-request-action.ts | 7 +++++++ 6 files changed, 30 insertions(+), 7 deletions(-) diff --git a/packages/pieces/community/common/package.json b/packages/pieces/community/common/package.json index 48e636b4ecc..182438bf33c 100644 --- a/packages/pieces/community/common/package.json +++ b/packages/pieces/community/common/package.json @@ -1,5 +1,5 @@ { "name": "@activepieces/pieces-common", - "version": "0.11.1", + "version": "0.11.2", "type": "commonjs" } diff --git a/packages/pieces/community/common/src/lib/helpers/index.ts b/packages/pieces/community/common/src/lib/helpers/index.ts index 3ab9d8a8567..21d0f230f0c 100644 --- a/packages/pieces/community/common/src/lib/helpers/index.ts +++ b/packages/pieces/community/common/src/lib/helpers/index.ts @@ -273,6 +273,11 @@ i.e ${getBaseUrlForDescription(baseUrl, auth)}/resource or /resource`, required: false, ...(props?.timeout ?? {}), }), + followRedirects: Property.Checkbox({ + displayName: 'Follow redirects', + required: false, + defaultValue: true, + }), ...extraProps, }, @@ -287,6 +292,7 @@ i.e ${getBaseUrlForDescription(baseUrl, auth)}/resource or /resource`, failsafe, timeout, response_is_binary, + followRedirects, } = context.propsValue; assertNotNullOrUndefined(method, 'Method'); assertNotNullOrUndefined(url, 'URL'); @@ -317,6 +323,7 @@ i.e ${getBaseUrlForDescription(baseUrl, auth)}/resource or /resource`, ...((queryParams as QueryParams) ?? {}), }, timeout: timeout ? timeout * 1000 : 0, + followRedirects, }; // Set response type to arraybuffer if binary response is expected diff --git a/packages/pieces/community/common/src/lib/http/axios/axios-http-client.ts b/packages/pieces/community/common/src/lib/http/axios/axios-http-client.ts index fb89c286c07..b05643e0917 100644 --- a/packages/pieces/community/common/src/lib/http/axios/axios-http-client.ts +++ b/packages/pieces/community/common/src/lib/http/axios/axios-http-client.ts @@ -25,11 +25,12 @@ export class AxiosHttpClient extends BaseHttpClient { try { const axiosInstance = axiosClient || axios; process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0'; - const { urlWithoutQueryParams, queryParams: urlQueryParams } = this.getUrl(request); + const { urlWithoutQueryParams, queryParams: urlQueryParams } = + this.getUrl(request); const headers = this.getHeaders(request); const axiosRequestMethod = this.getAxiosRequestMethod(request.method); const timeout = request.timeout ? request.timeout : 0; - const queryParams = request.queryParams || {} + const queryParams = request.queryParams || {}; const responseType = request.responseType || 'json'; for (const [key, value] of Object.entries(queryParams)) { @@ -44,6 +45,10 @@ export class AxiosHttpClient extends BaseHttpClient { data: request.body, timeout, responseType, + maxRedirects: (request.followRedirects ?? true) ? undefined : 0, + validateStatus: !(request.followRedirects ?? true) + ? (status) => status >= 200 && status < 400 + : undefined, }; if (request.retries && request.retries > 0) { @@ -51,7 +56,11 @@ export class AxiosHttpClient extends BaseHttpClient { retries: request.retries, retryDelay: axiosRetry.exponentialDelay, retryCondition: (error) => { - return axiosRetry.isNetworkOrIdempotentRequestError(error) || (error.response && error.response.status >= 500) || false; + return ( + axiosRetry.isNetworkOrIdempotentRequestError(error) || + (error.response && error.response.status >= 500) || + false + ); }, }); } @@ -65,7 +74,7 @@ export class AxiosHttpClient extends BaseHttpClient { }; } catch (e) { if (axios.isAxiosError(e)) { - const httpError = new HttpError(request.body, e); + const httpError = new HttpError(request.body, e); console.error( '[HttpClient#(sanitized error message)] Request failed:', httpError @@ -76,7 +85,6 @@ export class AxiosHttpClient extends BaseHttpClient { } } - private getAxiosRequestMethod(httpMethod: HttpMethod): string { return httpMethod.toString(); } diff --git a/packages/pieces/community/common/src/lib/http/core/http-request.ts b/packages/pieces/community/common/src/lib/http/core/http-request.ts index b0f7a975715..4b33eb45081 100644 --- a/packages/pieces/community/common/src/lib/http/core/http-request.ts +++ b/packages/pieces/community/common/src/lib/http/core/http-request.ts @@ -14,4 +14,5 @@ export type HttpRequest = { timeout?: number; retries?: number; responseType?: 'arraybuffer' | 'json' | 'blob' | 'text'; + followRedirects?: boolean; }; diff --git a/packages/pieces/community/http/package.json b/packages/pieces/community/http/package.json index 75108a7bab3..bfee0b3dc09 100644 --- a/packages/pieces/community/http/package.json +++ b/packages/pieces/community/http/package.json @@ -1,6 +1,6 @@ { "name": "@activepieces/piece-http", - "version": "0.11.0", + "version": "0.11.1", "dependencies": { "https-proxy-agent": "7.0.4" } diff --git a/packages/pieces/community/http/src/lib/actions/send-http-request-action.ts b/packages/pieces/community/http/src/lib/actions/send-http-request-action.ts index 83dbd44bbab..34dcd7291f6 100644 --- a/packages/pieces/community/http/src/lib/actions/send-http-request-action.ts +++ b/packages/pieces/community/http/src/lib/actions/send-http-request-action.ts @@ -238,6 +238,11 @@ export const httpSendRequestAction = createAction({ displayName: 'Timeout(in seconds)', required: false, }), + followRedirects: Property.Checkbox({ + displayName: 'Follow redirects', + required: false, + defaultValue: true, + }), failureMode: Property.StaticDropdown({ displayName: 'On Failure', required: false, @@ -273,6 +278,7 @@ export const httpSendRequestAction = createAction({ use_proxy, authType, authFields, + followRedirects, } = context.propsValue; assertNotNullOrUndefined(method, 'Method'); @@ -284,6 +290,7 @@ export const httpSendRequestAction = createAction({ headers: headers as HttpHeaders, queryParams: queryParams as QueryParams, timeout: timeout ? timeout * 1000 : 0, + followRedirects, }; switch (authType) { From 97ca2188f43b55402fe1bbda1f4e466f59c1e608 Mon Sep 17 00:00:00 2001 From: Hazem Adel Date: Thu, 22 Jan 2026 10:53:56 +0200 Subject: [PATCH 2/2] fix: track template view event (#10962) --- packages/react-ui/src/app/routes/templates/index.tsx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/react-ui/src/app/routes/templates/index.tsx b/packages/react-ui/src/app/routes/templates/index.tsx index 2c2d237c557..806bc9be66f 100644 --- a/packages/react-ui/src/app/routes/templates/index.tsx +++ b/packages/react-ui/src/app/routes/templates/index.tsx @@ -8,9 +8,11 @@ import { Button } from '@/components/ui/button'; import { SidebarTrigger } from '@/components/ui/sidebar-shadcn'; import { flowHooks } from '@/features/flows/lib/flow-hooks'; import { templatesHooks } from '@/features/templates/hooks/templates-hook'; +import { templatesTelemetryApi } from '@/features/templates/lib/templates-telemetry-api'; import { platformHooks } from '@/hooks/platform-hooks'; import { Template, + TemplateTelemetryEventType, TemplateType, UncategorizedFolderId, } from '@activepieces/shared'; @@ -41,6 +43,10 @@ const TemplatesPage = () => { const handleTemplateSelect = (template: Template) => { navigate(`/templates/${template.id}`); + templatesTelemetryApi.sendEvent({ + eventType: TemplateTelemetryEventType.VIEW, + templateId: template.id, + }); }; const templatesByCategory = useMemo(() => {