about summary refs log tree commit diff
diff options
context:
space:
mode:
authordan <dan.abramov@gmail.com>2024-04-24 23:16:11 +0100
committerGitHub <noreply@github.com>2024-04-24 23:16:11 +0100
commit90c3ec87490497605dacb158668d3f8c07f4dcdc (patch)
tree38450e397ca0b4de68968c6107451f4c30f4be2d
parent15055cb8c46f2b8bb09e3b7a28bbf1f8ec58fbe0 (diff)
downloadvoidsky-90c3ec87490497605dacb158668d3f8c07f4dcdc.tar.zst
Ignore image responses on non-200 status (#3693)
* Ignore image responses on non-200 status

* Fix tests
-rw-r--r--__tests__/lib/images.test.ts29
-rw-r--r--src/lib/media/manip.ts16
2 files changed, 38 insertions, 7 deletions
diff --git a/__tests__/lib/images.test.ts b/__tests__/lib/images.test.ts
index 38b722e2c..595f566c4 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 a681627e6..e0adf0dd2 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}`