fix: follow redirects when downloading Twilio media
node:https request() doesn't follow redirects by default, causing Twilio media URLs (which 302 to CDN) to save placeholder/metadata instead of actual images. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
committed by
Peter Steinberger
parent
a86cb932cf
commit
06dd9b8ed8
@@ -1,3 +1,5 @@
|
|||||||
|
// ABOUTME: Media storage utilities - downloads from URLs and saves to disk
|
||||||
|
// ABOUTME: Handles both remote URLs (with redirect support) and local file paths
|
||||||
import crypto from "node:crypto";
|
import crypto from "node:crypto";
|
||||||
import { createWriteStream } from "node:fs";
|
import { createWriteStream } from "node:fs";
|
||||||
import fs from "node:fs/promises";
|
import fs from "node:fs/promises";
|
||||||
@@ -48,9 +50,21 @@ async function downloadToFile(
|
|||||||
url: string,
|
url: string,
|
||||||
dest: string,
|
dest: string,
|
||||||
headers?: Record<string, string>,
|
headers?: Record<string, string>,
|
||||||
|
maxRedirects = 5,
|
||||||
): Promise<{ headerMime?: string; sniffBuffer: Buffer; size: number }> {
|
): Promise<{ headerMime?: string; sniffBuffer: Buffer; size: number }> {
|
||||||
return await new Promise((resolve, reject) => {
|
return await new Promise((resolve, reject) => {
|
||||||
const req = request(url, { headers }, (res) => {
|
const req = request(url, { headers }, (res) => {
|
||||||
|
// Follow redirects
|
||||||
|
if (res.statusCode && res.statusCode >= 300 && res.statusCode < 400) {
|
||||||
|
const location = res.headers.location;
|
||||||
|
if (!location || maxRedirects <= 0) {
|
||||||
|
reject(new Error(`Redirect loop or missing Location header`));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const redirectUrl = new URL(location, url).href;
|
||||||
|
resolve(downloadToFile(redirectUrl, dest, headers, maxRedirects - 1));
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (!res.statusCode || res.statusCode >= 400) {
|
if (!res.statusCode || res.statusCode >= 400) {
|
||||||
reject(new Error(`HTTP ${res.statusCode ?? "?"} downloading media`));
|
reject(new Error(`HTTP ${res.statusCode ?? "?"} downloading media`));
|
||||||
return;
|
return;
|
||||||
|
|||||||
Reference in New Issue
Block a user