Skip to content
This repository was archived by the owner on Apr 15, 2025. It is now read-only.

Commit 1456130

Browse files
committed
Remove use of content-type header to determine file extension use filename and default to .bin
1 parent 507ecb5 commit 1456130

File tree

2 files changed

+18
-131
lines changed

2 files changed

+18
-131
lines changed

src/FileSystem.js

Lines changed: 2 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -143,85 +143,12 @@ export class FileSystem {
143143
const urlParts = new URL(url);
144144
const urlExt = urlParts.pathname.split('.').pop();
145145

146-
let extension = null;
147-
switch (urlExt) {
148-
case 'png':
149-
case 'PNG':
150-
extension = 'png';
151-
break;
152-
case 'gif':
153-
case 'GIF':
154-
extension = 'gif';
155-
break;
156-
case 'jpg':
157-
case 'JPG':
158-
case 'jpeg':
159-
case 'JPEG':
160-
extension = 'jpg';
161-
break;
162-
case 'BMP':
163-
case 'bmp':
164-
extension = 'bmp';
165-
break;
166-
default:
167-
extension = await this.getExtensionFromContentTypeHeader(url);
168-
}
169-
170-
if (!extension) {
171-
throw new Error('Unable to determine remote image filetype.');
172-
}
146+
// react-native enforces Image src to default to a file extension of png
147+
let extension = urlExt === urlParts.pathname ? 'bin' : urlExt;
173148

174149
return sha1(url).toString() + '.' + extension;
175150
}
176151

177-
/**
178-
*
179-
* Used to determine appropriate file extension for a remote file that doesn't include
180-
* an extension in the url. This method will attempt to determine extension using server
181-
* "Content-Type" response header.
182-
*
183-
* @param url {String} - An absolute url.
184-
* @returns extension {string} - A file extension appropriate for remote file.
185-
*/
186-
async getExtensionFromContentTypeHeader(url) {
187-
let extension = null;
188-
let contentType = null;
189-
190-
// Request "Content-type" header from server.
191-
try {
192-
const response = await fetch(url, {
193-
method: 'HEAD',
194-
});
195-
196-
if (response.headers.get('content-type')) {
197-
const rawContentType = response.headers.get('content-type'); // headers are case-insensitive, fetch standard is all lower case.
198-
contentType = rawContentType.toLowerCase();
199-
}
200-
} catch (error) {
201-
console.warn(error); // eslint-disable-line no-console
202-
}
203-
204-
// Use content type header to determine extension.
205-
switch (contentType) {
206-
case 'image/png':
207-
extension = 'png';
208-
break;
209-
case 'image/gif':
210-
extension = 'gif';
211-
break;
212-
case 'image/jpeg':
213-
extension = 'jpg';
214-
break;
215-
case 'image/bmp':
216-
extension = 'bmp';
217-
break;
218-
default:
219-
extension = null;
220-
}
221-
222-
return extension;
223-
}
224-
225152
/**
226153
*
227154
* Convenience method used to get the associated local file path of a web image that has been written to disk.

tests/FileSystem.test.js

Lines changed: 16 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// Define globals for eslint.
2-
/* global describe it jest */
2+
/* global describe it */
33

44
// Load dependencies
55
import should from 'should'; // eslint-disable-line no-unused-vars
@@ -121,75 +121,35 @@ describe('FileSystem', function () {
121121
pngFilenameTwo.should.equal('09091b8880ddb982968a0fe28abed5034f9a43b8.png');
122122
});
123123

124-
it('#getFileNameFromUrl should handle PNG/JPG/GIF/BMP urls without file extensions by using content-type header.', async () => {
124+
it('#getFileNameFromUrl should handle PNG/JPG/GIF/BMP urls and urls without file extensions.', async () => {
125125
const fileSystem = FileSystemFactory();
126126

127-
// Mock fetch
128-
fetch = jest.fn(); // eslint-disable-line no-global-assign
129-
130-
// Test PNG
131-
fetch.mockResolvedValueOnce({
132-
headers: {
133-
get: (headerName) => {
134-
headerName.should.equals('content-type');
135-
136-
return 'image/png';
137-
},
138-
},
139-
});
140-
141127
const pngFilename = await fileSystem.getFileNameFromUrl(
142-
'https://cdn2.hubspot.net/hub/42284/file-14233687-jpg/images/test_in_red'
128+
'https://cdn2.hubspot.net/hub/42284/file-14233687-jpg/images/test_in_red.png'
143129
);
144-
pngFilename.should.equal('831eb245a3d9032cdce450f8760d2b8ddb442a3d.png');
145-
146-
// Test JPG
147-
fetch.mockResolvedValueOnce({
148-
headers: {
149-
get: (headerName) => {
150-
headerName.should.equals('content-type');
151-
152-
return 'image/jpeg';
153-
},
154-
},
155-
});
130+
pngFilename.should.equal('b89a6739cdfd993a9b5d43b2ff4aa216e17c63ae.png');
156131

157132
const jpgFilename = await fileSystem.getFileNameFromUrl(
158-
'https://cdn2.hubspot.net/hub/42284/file-14233687-jpg/images/test_in_red'
133+
'https://cdn2.hubspot.net/hub/42284/file-14233687-jpg/images/test_in_red.jpg'
159134
);
160-
jpgFilename.should.equal('831eb245a3d9032cdce450f8760d2b8ddb442a3d.jpg');
161-
162-
// Test GIF
163-
fetch.mockResolvedValueOnce({
164-
headers: {
165-
get: (headerName) => {
166-
headerName.should.equals('content-type');
167-
168-
return 'image/gif';
169-
},
170-
},
171-
});
135+
jpgFilename.should.equal('6adf4569ecc3bf8c378bb4d47b1995cd85c5a13c.jpg');
172136

173137
const gifFilename = await fileSystem.getFileNameFromUrl(
174-
'https://cdn2.hubspot.net/hub/42284/file-14233687-jpg/images/test_in_red'
138+
'https://cdn2.hubspot.net/hub/42284/file-14233687-jpg/images/test_in_red.gif'
175139
);
176-
gifFilename.should.equal('831eb245a3d9032cdce450f8760d2b8ddb442a3d.gif');
177-
178-
// Test BMP
179-
fetch.mockResolvedValueOnce({
180-
headers: {
181-
get: (headerName) => {
182-
headerName.should.equals('content-type');
183-
184-
return 'image/bmp';
185-
},
186-
},
187-
});
140+
gifFilename.should.equal('f0bc1d93ca75e6e355188391e3d0f1aab6d30bad.gif');
188141

189142
const bmpFilename = await fileSystem.getFileNameFromUrl(
143+
'https://cdn2.hubspot.net/hub/42284/file-14233687-jpg/images/test_in_red.bmp'
144+
);
145+
bmpFilename.should.equal('ca15f1856605a6a5ca1d426a12f91efdc061b31c.bmp');
146+
147+
const unknownFilename = await fileSystem.getFileNameFromUrl(
190148
'https://cdn2.hubspot.net/hub/42284/file-14233687-jpg/images/test_in_red'
191149
);
192-
bmpFilename.should.equal('831eb245a3d9032cdce450f8760d2b8ddb442a3d.bmp');
150+
unknownFilename.should.equal(
151+
'831eb245a3d9032cdce450f8760d2b8ddb442a3d.bin'
152+
);
193153
});
194154

195155
it('#getLocalFilePathFromUrl should return local filepath if it exists on local fs in permanent dir.', () => {

0 commit comments

Comments
 (0)