From 5962f1b6271713e8157ddea158188cf15d4eb938 Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Wed, 8 Feb 2023 12:21:51 -0800 Subject: [PATCH 1/4] Catch json encoding exceptions and display them to the user --- app/Http/Controllers/Api/ImportController.php | 28 +++++++++++++++++-- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/app/Http/Controllers/Api/ImportController.php b/app/Http/Controllers/Api/ImportController.php index 9742cc164..15f46f2df 100644 --- a/app/Http/Controllers/Api/ImportController.php +++ b/app/Http/Controllers/Api/ImportController.php @@ -10,6 +10,7 @@ use App\Models\Asset; use App\Models\Company; use App\Models\Import; use Artisan; +use Illuminate\Database\Eloquent\JsonEncodingException; use Illuminate\Support\Facades\Request; use Illuminate\Support\Facades\Session; use Illuminate\Support\Facades\Storage; @@ -64,7 +65,18 @@ class ImportController extends Controller ini_set('auto_detect_line_endings', '1'); } $reader = Reader::createFromFileObject($file->openFile('r')); //file pointer leak? - $import->header_row = $reader->fetchOne(0); + + try { + $import->header_row = $reader->fetchOne(0); + } catch (JsonEncodingException $e) { + return response()->json( + Helper::formatStandardApiResponse( + 'error', + null, + 'One or more attributes in the header row contain malformed UTF-8 characters'), + 500 + ); + } //duplicate headers check $duplicate_headers = []; @@ -85,8 +97,18 @@ class ImportController extends Controller return response()->json(Helper::formatStandardApiResponse('error', null, implode('; ', $duplicate_headers)), 500); //should this be '4xx'? } - // Grab the first row to display via ajax as the user picks fields - $import->first_row = $reader->fetchOne(1); + try { + // Grab the first row to display via ajax as the user picks fields + $import->first_row = $reader->fetchOne(1); + } catch (JsonEncodingException $e) { + return response()->json( + Helper::formatStandardApiResponse( + 'error', + null, + 'One or more attributes in row 2 contain malformed UTF-8 characters'), + 500 + ); + } $date = date('Y-m-d-his'); $fixed_filename = str_slug($file->getClientOriginalName()); From c2c666aef09e995de739919a6a87423961e4a70b Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Wed, 8 Feb 2023 12:32:57 -0800 Subject: [PATCH 2/4] Formatting --- app/Http/Controllers/Api/ImportController.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/Http/Controllers/Api/ImportController.php b/app/Http/Controllers/Api/ImportController.php index 15f46f2df..54ebea6ba 100644 --- a/app/Http/Controllers/Api/ImportController.php +++ b/app/Http/Controllers/Api/ImportController.php @@ -73,7 +73,8 @@ class ImportController extends Controller Helper::formatStandardApiResponse( 'error', null, - 'One or more attributes in the header row contain malformed UTF-8 characters'), + 'One or more attributes in the header row contain malformed UTF-8 characters' + ), 500 ); } @@ -105,7 +106,8 @@ class ImportController extends Controller Helper::formatStandardApiResponse( 'error', null, - 'One or more attributes in row 2 contain malformed UTF-8 characters'), + 'One or more attributes in row 2 contain malformed UTF-8 characters' + ), 500 ); } From b3881a43a7963831677c364828e1e4633ba4aa8d Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Wed, 8 Feb 2023 12:34:25 -0800 Subject: [PATCH 3/4] Fix return type --- app/Http/Controllers/Api/ImportController.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/Http/Controllers/Api/ImportController.php b/app/Http/Controllers/Api/ImportController.php index 54ebea6ba..d76decfc5 100644 --- a/app/Http/Controllers/Api/ImportController.php +++ b/app/Http/Controllers/Api/ImportController.php @@ -36,7 +36,7 @@ class ImportController extends Controller * Process and store a CSV upload file. * * @param \Illuminate\Http\Request $request - * @return \Illuminate\Http\Response + * @return \Illuminate\Http\JsonResponse */ public function store() { @@ -132,9 +132,9 @@ class ImportController extends Controller } $results = (new ImportsTransformer)->transformImports($results); - return [ + return response()->json([ 'files' => $results, - ]; + ]); } return response()->json(Helper::formatStandardApiResponse('error', null, trans('general.feature_disabled')), 500); From 73f355f3a8036e4d3d6227656616db44878dadff Mon Sep 17 00:00:00 2001 From: Marcus Moore Date: Wed, 8 Feb 2023 12:39:42 -0800 Subject: [PATCH 4/4] Return 422 instead of 500 when import is invalid --- app/Http/Controllers/Api/ImportController.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/Http/Controllers/Api/ImportController.php b/app/Http/Controllers/Api/ImportController.php index d76decfc5..9820b9ca0 100644 --- a/app/Http/Controllers/Api/ImportController.php +++ b/app/Http/Controllers/Api/ImportController.php @@ -57,7 +57,7 @@ class ImportController extends Controller 'text/tsv', ])) { $results['error'] = 'File type must be CSV. Uploaded file is '.$file->getMimeType(); - return response()->json(Helper::formatStandardApiResponse('error', null, $results['error']), 500); + return response()->json(Helper::formatStandardApiResponse('error', null, $results['error']), 422); } //TODO: is there a lighter way to do this? @@ -75,7 +75,7 @@ class ImportController extends Controller null, 'One or more attributes in the header row contain malformed UTF-8 characters' ), - 500 + 422 ); } @@ -95,7 +95,7 @@ class ImportController extends Controller } } if (count($duplicate_headers) > 0) { - return response()->json(Helper::formatStandardApiResponse('error', null, implode('; ', $duplicate_headers)), 500); //should this be '4xx'? + return response()->json(Helper::formatStandardApiResponse('error', null, implode('; ', $duplicate_headers)),422); } try { @@ -108,7 +108,7 @@ class ImportController extends Controller null, 'One or more attributes in row 2 contain malformed UTF-8 characters' ), - 500 + 422 ); } @@ -137,7 +137,7 @@ class ImportController extends Controller ]); } - return response()->json(Helper::formatStandardApiResponse('error', null, trans('general.feature_disabled')), 500); + return response()->json(Helper::formatStandardApiResponse('error', null, trans('general.feature_disabled')), 422); } /**