From c394da266ba528fa132df80203d11e6b39a7ccc4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Guillaume=20Perr=C3=A9al?= <guillaume.perreal@irstea.fr>
Date: Wed, 28 Jan 2015 15:27:28 +0100
Subject: [PATCH] =?UTF-8?q?UploadController:=20g=C3=A8re=20proprement=20le?=
 =?UTF-8?q?s=20exceptions.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 Controller/UploadController.php | 59 ++++++++++++++++++++++++++-------
 1 file changed, 47 insertions(+), 12 deletions(-)

diff --git a/Controller/UploadController.php b/Controller/UploadController.php
index 6f75b842..8f590835 100644
--- a/Controller/UploadController.php
+++ b/Controller/UploadController.php
@@ -8,6 +8,7 @@
 namespace Irstea\FileUploadBundle\Controller;
 
 use Irstea\FileUploadBundle\Entity\UploadedFile;
+use Irstea\FileUploadBundle\Exception\RejectedFileException;
 use Irstea\FileUploadBundle\Http\UploadedFileResponse;
 use Irstea\FileUploadBundle\Model\FileManagerInterface;
 use Irstea\FileUploadBundle\Model\UploadedFileInterface;
@@ -23,6 +24,7 @@ use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
 use Symfony\Component\HttpKernel\Exception\HttpException;
 use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
 use Symfony\Component\Routing\RouterInterface;
+use Exception;
 
 /**
  * @Route("/files", service="irstea_file_upload.upload_controller")
@@ -65,18 +67,19 @@ class UploadController extends Controller
      */
     public function createAction(Request $request)
     {
-        $data = $request->request->get('file');
+        try {
+            $data = $request->request->get('file');
 
-        $file = $this->fileManager->create(
-            $data['name'],
-            $data['size'],
-            $data['type'],
-            isset($data['lastModified']) ? $data['lastModified'] : null
-        );
+            $file = $this->fileManager->create(
+                $data['name'],
+                $data['size'],
+                $data['type'],
+                isset($data['lastModified']) ? $data['lastModified'] : null
+            );
 
-        $parameters = ['id' => $file->getId()];
+            $parameters = ['id' => $file->getId()];
 
-        $deleteUrl = $this->router->generate('file_upload_delete', $parameters);
+            $deleteUrl = $this->router->generate('file_upload_delete', $parameters);
 
             return $this->createResponse(
                 Response::HTTP_CREATED,
@@ -92,6 +95,9 @@ class UploadController extends Controller
                 // On a pas de get pour l'instant, le DELETE et ce qui y ressemble le plus
                 [ 'Location' => $deleteUrl ]
             );
+        } catch(\Exception $ex) {
+            return $this->createExceptionResponse($ex);
+        }
     }
 
     /**
@@ -102,6 +108,7 @@ class UploadController extends Controller
      */
     public function putContentAction(Request $request, UploadedFile $file)
     {
+        try {
             $this->validateCsrfToken($request);
 
             list($offset, $maxlen, $complete) = $this->handleRangeHeader($request);
@@ -116,7 +123,11 @@ class UploadController extends Controller
             }
 
             return $this->createResponse(Response::HTTP_OK, 'Chunk received');
+
+        } catch(\Exception $ex) {
+            return $this->createExceptionResponse($ex);
         }
+    }
 
     /**
      *
@@ -209,11 +220,15 @@ class UploadController extends Controller
      */
     public function deleteAction(Request $request, UploadedFile $file)
     {
-        $this->validateCsrfToken($request);
+        try {
+            $this->validateCsrfToken($request);
 
-        $this->fileManager->delete($file);
+            $this->fileManager->delete($file);
 
-        return $this->createResponse();
+            return $this->createResponse();
+        } catch(\Exception $ex) {
+            return $this->createExceptionResponse($ex);
+        }
     }
 
     /**
@@ -245,5 +260,25 @@ class UploadController extends Controller
         return $response;
     }
 
+    /**
+     *
+     * @param \Exception $ex
+     * @return JsonResponse
+     */
+    protected function createExceptionResponse(\Exception $ex)
+    {
+        return $this->createResponse(
+            $ex instanceof HttpException ? $ex->getStatusCode() : Response::HTTP_INTERNAL_SERVER_ERROR,
+            $ex->getMessage(),
+            [
+                'exception' => [
+                    'class' => get_class($ex),
+                    'file' => $ex->getFile(),
+                    'line' => $ex->getLine(),
+                    'code' => $ex->getCode(),
+                    'trace' => $ex->getTraceAsString(),
+                ]
+            ]
+        );
     }
 }
-- 
GitLab