From 36bcec8e4078ef30b74c311e9d2929f8c00c2ed8 Mon Sep 17 00:00:00 2001
From: Noach Magedman <noach@seekingalpha.com>
Date: Fri, 13 Oct 2023 19:20:55 +0300
Subject: [PATCH] fix: Improve FileProxy Handling, set Content-Type (#30427)

Co-authored-by: Diego Sampaio <8591547+sampaiodiego@users.noreply.github.com>
---
 .changeset/tough-apples-turn.md               |  5 ++++
 .../app/file-upload/server/lib/FileUpload.ts  | 27 ++++++++++++++++++-
 2 files changed, 31 insertions(+), 1 deletion(-)
 create mode 100644 .changeset/tough-apples-turn.md

diff --git a/.changeset/tough-apples-turn.md b/.changeset/tough-apples-turn.md
new file mode 100644
index 00000000000..056a0645186
--- /dev/null
+++ b/.changeset/tough-apples-turn.md
@@ -0,0 +1,5 @@
+---
+"@rocket.chat/meteor": patch
+---
+
+Forward headers when using proxy for file uploads
diff --git a/apps/meteor/app/file-upload/server/lib/FileUpload.ts b/apps/meteor/app/file-upload/server/lib/FileUpload.ts
index 8f929a17fe3..e512e5d09bf 100644
--- a/apps/meteor/app/file-upload/server/lib/FileUpload.ts
+++ b/apps/meteor/app/file-upload/server/lib/FileUpload.ts
@@ -562,7 +562,32 @@ export const FileUpload = {
 	) {
 		res.setHeader('Content-Disposition', `${forceDownload ? 'attachment' : 'inline'}; filename="${encodeURI(fileName)}"`);
 
-		request.get(fileUrl, (fileRes) => fileRes.pipe(res));
+		request.get(fileUrl, (fileRes) => {
+			if (fileRes.statusCode !== 200) {
+				res.setHeader('x-rc-proxyfile-status', String(fileRes.statusCode));
+				res.setHeader('content-length', 0);
+				res.writeHead(500);
+				res.end();
+				return;
+			}
+
+			// eslint-disable-next-line prettier/prettier
+			const headersToProxy = [
+				'age',
+				'cache-control',
+				'content-length',
+				'content-type',
+				'date',
+				'expired',
+				'last-modified',
+			];
+
+			headersToProxy.forEach((header) => {
+				fileRes.headers[header] && res.setHeader(header, String(fileRes.headers[header]));
+			});
+
+			fileRes.pipe(res);
+		});
 	},
 
 	generateJWTToFileUrls({ rid, userId, fileId }: { rid: string; userId: string; fileId: string }) {
-- 
GitLab