From 90c3ec87490497605dacb158668d3f8c07f4dcdc Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 24 Apr 2024 23:16:11 +0100 Subject: [PATCH] Ignore image responses on non-200 status (#3693) * Ignore image responses on non-200 status * Fix tests --- __tests__/lib/images.test.ts | 29 +++++++++++++++++++++++++++-- src/lib/media/manip.ts | 16 +++++++++++----- 2 files changed, 38 insertions(+), 7 deletions(-) diff --git a/__tests__/lib/images.test.ts b/__tests__/lib/images.test.ts index 38b722e2..595f566c 100644 --- a/__tests__/lib/images.test.ts +++ b/__tests__/lib/images.test.ts @@ -1,9 +1,10 @@ +import ImageResizer from '@bam.tech/react-native-image-resizer' +import RNFetchBlob from 'rn-fetch-blob' + import { downloadAndResize, DownloadAndResizeOpts, } from '../../src/lib/media/manip' -import ImageResizer from '@bam.tech/react-native-image-resizer' -import RNFetchBlob from 'rn-fetch-blob' describe('downloadAndResize', () => { const errorSpy = jest.spyOn(global.console, 'error') @@ -30,6 +31,7 @@ describe('downloadAndResize', () => { const mockedFetch = RNFetchBlob.fetch as jest.Mock mockedFetch.mockResolvedValueOnce({ path: jest.fn().mockReturnValue('file://downloaded-image.jpg'), + info: jest.fn().mockReturnValue({status: 200}), flush: jest.fn(), }) @@ -84,6 +86,7 @@ describe('downloadAndResize', () => { const mockedFetch = RNFetchBlob.fetch as jest.Mock mockedFetch.mockResolvedValueOnce({ path: jest.fn().mockReturnValue('file://downloaded-image'), + info: jest.fn().mockReturnValue({status: 200}), flush: jest.fn(), }) @@ -118,4 +121,26 @@ describe('downloadAndResize', () => { {mode: 'cover'}, ) }) + + it('should return undefined for non-200 response', async () => { + const mockedFetch = RNFetchBlob.fetch as jest.Mock + mockedFetch.mockResolvedValueOnce({ + path: jest.fn().mockReturnValue('file://downloaded-image'), + info: jest.fn().mockReturnValue({status: 400}), + flush: jest.fn(), + }) + + const opts: DownloadAndResizeOpts = { + uri: 'https://example.com/image', + width: 100, + height: 100, + maxSize: 500000, + mode: 'cover', + timeout: 10000, + } + + const result = await downloadAndResize(opts) + expect(errorSpy).not.toHaveBeenCalled() + expect(result).toBeUndefined() + }) }) diff --git a/src/lib/media/manip.ts b/src/lib/media/manip.ts index a681627e..e0adf0dd 100644 --- a/src/lib/media/manip.ts +++ b/src/lib/media/manip.ts @@ -1,13 +1,14 @@ -import RNFetchBlob from 'rn-fetch-blob' -import ImageResizer from '@bam.tech/react-native-image-resizer' import {Image as RNImage, Share as RNShare} from 'react-native' -import {Image} from 'react-native-image-crop-picker' import * as RNFS from 'react-native-fs' +import {Image} from 'react-native-image-crop-picker' import uuid from 'react-native-uuid' -import * as Sharing from 'expo-sharing' import * as MediaLibrary from 'expo-media-library' -import {Dimensions} from './types' +import * as Sharing from 'expo-sharing' +import ImageResizer from '@bam.tech/react-native-image-resizer' +import RNFetchBlob from 'rn-fetch-blob' + import {isAndroid, isIOS} from 'platform/detection' +import {Dimensions} from './types' export async function compressIfNeeded( img: Image, @@ -63,6 +64,11 @@ export async function downloadAndResize(opts: DownloadAndResizeOpts) { downloadRes = await downloadResPromise clearTimeout(to1) + const status = downloadRes.info().status + if (status !== 200) { + return + } + let localUri = downloadRes.path() if (!localUri.startsWith('file://')) { localUri = `file://${localUri}`