From 6d4676f20485b40f2aaa7c343a539f6a208ad634 Mon Sep 17 00:00:00 2001 From: Eric Allam Date: Tue, 12 Dec 2023 13:14:25 +0000 Subject: [PATCH] Auto update endpoint URL on redirect (#791) --- .../webapp/app/services/endpointApi.server.ts | 1 + .../endpoints/performEndpointIndexService.ts | 43 ++++++++++++++++++- apps/webapp/package.json | 3 +- 3 files changed, 45 insertions(+), 2 deletions(-) diff --git a/apps/webapp/app/services/endpointApi.server.ts b/apps/webapp/app/services/endpointApi.server.ts index 4ae09dee24..7731be6e7e 100644 --- a/apps/webapp/app/services/endpointApi.server.ts +++ b/apps/webapp/app/services/endpointApi.server.ts @@ -123,6 +123,7 @@ export class EndpointApi { "x-trigger-api-key": this.apiKey, "x-trigger-action": "INDEX_ENDPOINT", }, + redirect: "manual", }); return { diff --git a/apps/webapp/app/services/endpoints/performEndpointIndexService.ts b/apps/webapp/app/services/endpoints/performEndpointIndexService.ts index c3f91a1fe6..5ec7db1da8 100644 --- a/apps/webapp/app/services/endpoints/performEndpointIndexService.ts +++ b/apps/webapp/app/services/endpoints/performEndpointIndexService.ts @@ -13,6 +13,7 @@ import { fromZodError } from "zod-validation-error"; import { IndexEndpointStats } from "@trigger.dev/core"; import { RegisterHttpEndpointService } from "../triggers/registerHttpEndpoint.server"; import { RegisterWebhookService } from "../triggers/registerWebhook.server"; +import { EndpointIndex } from "@trigger.dev/database"; export class PerformEndpointIndexService { #prismaClient: PrismaClient; @@ -29,7 +30,7 @@ export class PerformEndpointIndexService { this.#prismaClient = prismaClient; } - public async call(id: string) { + public async call(id: string, redirectCount = 0): Promise { const endpointIndex = await this.#prismaClient.endpointIndex.update({ where: { id, @@ -66,6 +67,39 @@ export class PerformEndpointIndexService { }); } + if (isRedirect(response.status)) { + // Update the endpoint URL with the response.headers.location + logger.debug("Endpoint is redirecting", { + headers: Object.fromEntries(response.headers.entries()), + }); + + const location = response.headers.get("location"); + + if (!location) { + return updateEndpointIndexWithError(this.#prismaClient, id, { + message: `Endpoint ${endpointIndex.endpoint.url} is redirecting but no location header is present`, + }); + } + + if (redirectCount > 5) { + return updateEndpointIndexWithError(this.#prismaClient, id, { + message: `Endpoint ${endpointIndex.endpoint.url} is redirecting too many times`, + }); + } + + await this.#prismaClient.endpoint.update({ + where: { + id: endpointIndex.endpoint.id, + }, + data: { + url: location, + }, + }); + + // Re-run the endpoint index + return await this.call(id, redirectCount + 1); + } + if (response.status === 401) { const body = await safeBodyFromResponse(response, errorParser); @@ -378,3 +412,10 @@ async function updateEndpointIndexWithError( }, }); } + +const redirectStatus = [301, 302, 303, 307, 308]; +const redirectStatusSet = new Set(redirectStatus); + +function isRedirect(status: number) { + return redirectStatusSet.has(status); +} diff --git a/apps/webapp/package.json b/apps/webapp/package.json index a54942a951..448bcaf8e1 100644 --- a/apps/webapp/package.json +++ b/apps/webapp/package.json @@ -9,6 +9,7 @@ "build:remix": "remix build", "build:server": "esbuild --platform=node --format=cjs ./server.ts --outdir=build", "dev": "cross-env PORT=3030 remix dev", + "dev:manual": "cross-env PORT=3030 remix dev -c \"node ./build/server.js\"", "format": "prettier --write .", "lint": "eslint --cache --cache-location ./node_modules/.cache/eslint .", "start": "cross-env NODE_ENV=production node --max-old-space-size=8192 ./build/server.js", @@ -188,4 +189,4 @@ "engines": { "node": ">=16.0.0" } -} +} \ No newline at end of file