From 9b33933e8c9f5cfc09068378634c308e9fb10921 Mon Sep 17 00:00:00 2001
From: Richard Petersen <richard.petersen@open-xchange.com>
Date: Tue, 11 Jan 2022 13:03:11 +0100
Subject: [PATCH] Fix: Binary handling without .buffer()

---
 spec/file_caching_test.js |  24 +++++++++++++++++++++---
 spec/media/image.png      | Bin 0 -> 10341 bytes
 src/files.js              |   2 +-
 3 files changed, 22 insertions(+), 4 deletions(-)
 create mode 100644 spec/media/image.png

diff --git a/spec/file_caching_test.js b/spec/file_caching_test.js
index 6cee9dc..65359a8 100644
--- a/spec/file_caching_test.js
+++ b/spec/file_caching_test.js
@@ -3,6 +3,10 @@ import mockfs from 'mock-fs'
 import request from 'supertest'
 import { createApp } from '../src/createApp'
 import { createMockServer, generateSimpleViteManifest, getRandomPort } from './util.js'
+import fs from 'fs'
+
+const image = fs.readFileSync('./spec/media/image.png')
+const imageStat = fs.statSync('./spec/media/image.png')
 
 describe('File caching service', () => {
   let app
@@ -35,15 +39,23 @@ describe('File caching service', () => {
           isEntry: true,
           imports: ['example.js'],
           css: ['main.css']
-        }
+        },
+        'image.png': {}
       }),
       '/example.js': (req, res) => res.setHeader('content-type', 'application/javascript').status(200).send('this is example'),
       '/test.txt': (req, res) => res.setHeader('content-type', 'text/plain').status(200).send('this is test'),
       '/index.html.js': (req, res) => res.setHeader('content-type', 'application/javascript').status(200).send('this is index.html.js'),
       '/index.html': (req, res) => res.setHeader('content-type', 'text/html').status(200).send('<html><head></head><body>it\'s me</body></html>'),
       '/main.css': (req, res) => res.setHeader('content-type', 'text/css').status(200).send('.foo { color: #000; }'),
-      '/favicon.ico': 'not really a favicon, though'
-
+      '/favicon.ico': 'not really a favicon, though',
+      '/image.png': (req, res) => {
+        // need to do this like this, because jest messes up file system within tests
+        res.set({
+          'Content-Type': 'image/png',
+          'Content-Length': imageStat.size
+        })
+        res.end(image)
+      }
     })
     await request(app).get('/ready')
   })
@@ -96,4 +108,10 @@ describe('File caching service', () => {
     const response = await request(app).get('/unknown-file.txt')
     expect(response.statusCode).toBe(404)
   })
+
+  it('serves binary files', async () => {
+    const response = await request(app).get('/image.png')
+    expect(response.statusCode).toBe(200)
+    expect(response.body.length === imageStat.size)
+  })
 })
diff --git a/spec/media/image.png b/spec/media/image.png
new file mode 100644
index 0000000000000000000000000000000000000000..ead835866c1185dfc6ae3cf7dc3bd350b53ade18
GIT binary patch
literal 10341
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

literal 0
HcmV?d00001

diff --git a/src/files.js b/src/files.js
index b4ec6cd..f5fc29f 100644
--- a/src/files.js
+++ b/src/files.js
@@ -9,7 +9,7 @@ const logger = getLogger()
 async function fetchData (path, baseUrl) {
   const response = await fetch(new URL(path, baseUrl))
   if (!response.ok) throw new Error(`Error fetching file: ${path}`)
-  const content = await response.text()
+  const content = Buffer.from(await response.arrayBuffer())
   const sha256Sum = crypto.createHash('sha256').update(content).digest('base64')
   return [path, {
     'content-type': response.headers.get('content-type'),
-- 
GitLab