From f19cc71c52fee93c4969ba7e58d2eef6f97c1bd9 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:26:56 +0100
Subject: [PATCH] =?UTF-8?q?UploadController:=20casse=20putContentAction=20?=
 =?UTF-8?q?en=20deux=20sous-m=C3=A9thodes.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 Controller/UploadController.php | 78 +++++++++++++++++++++------------
 1 file changed, 51 insertions(+), 27 deletions(-)

diff --git a/Controller/UploadController.php b/Controller/UploadController.php
index 57ba0ef6..6f75b842 100644
--- a/Controller/UploadController.php
+++ b/Controller/UploadController.php
@@ -102,47 +102,71 @@ class UploadController extends Controller
      */
     public function putContentAction(Request $request, UploadedFile $file)
     {
-        $this->validateCsrfToken($request);
+            $this->validateCsrfToken($request);
 
-        if(null !== $range = $request->headers->get('Content-Range', null)) {
-            $matches = [];
-            if(!preg_match('@^bytes (\d+)-(\d+)/(\d+)$@', $range, $matches)) {
-                throw new BadRequestHttpException("Invalid Content-Range");
-            }
+            list($offset, $maxlen, $complete) = $this->handleRangeHeader($request);
 
-            $start = intval($matches[1]);
-            $end   = intval($matches[2]);
-            $total = intval($matches[3]);
+            // Demande un filehandle plutôt que charger le contenu en mémoire
+            $input = $request->getContent(true);
+            $file->copyFrom($input, $maxlen, $offset);
+            fclose($input);
 
-            if($start < 0 || $start >= $end || $end >= $total) {
-                throw new HttpException(Response::HTTP_REQUESTED_RANGE_NOT_SATISFIABLE);
+            if($complete) {
+                return $this->completeUpload($file);
             }
 
-            $offset = $start;
-            $maxlen = 1 + ($end - $start);
-            $complete = $end === ($total-1);
-        } else {
-            $offset = 0;
-            $maxlen = PHP_INT_MAX;
-            $complete = true;
+            return $this->createResponse(Response::HTTP_OK, 'Chunk received');
         }
 
-        // Demande un filehandle plutôt que charger le contenu en mémoire
-        $input = $request->getContent(true);
-        $file->copyFrom($input, $maxlen, $offset);
-        fclose($input);
+    /**
+     *
+     * @param Request $request
+     * @return array
+     */
+    protected function handleRangeHeader(Request $request)
+    {
 
-        if(!$complete) {
-            return $this->createResponse(Response::HTTP_OK, 'Chunk received');
+        if(null === $range = $request->headers->get('Content-Range', null)) {
+            return [0, PHP_INT_MAX, true];
+        }
+
+        $matches = [];
+        if(!preg_match('@^bytes (\d+)-(\d+)/(\d+)$@', $range, $matches)) {
+            throw new BadRequestHttpException("Invalid Content-Range");
         }
 
-        $this->fileManager->completed($file);
+        $start = intval($matches[1]);
+        $end   = intval($matches[2]);
+        $total = intval($matches[3]);
+
+        if($start < 0 || $start >= $end || $end >= $total) {
+            throw new HttpException(Response::HTTP_REQUESTED_RANGE_NOT_SATISFIABLE);
+        }
+
+        return [$start, 1 + ($end - $start), $end === ($total-1)];
+    }
+
+    /**
+     *
+     * @param UploadedFileInterface $file
+     * @return Response
+     */
+    protected function completeUpload(UploadedFileInterface $file)
+    {
+        $status = Response::HTTP_OK;
+        $message = 'File uploaded';
+        try {
+            $this->fileManager->completed($file);
+        } catch(RejectedFileException $ex) {
+            $status = Response::HTTP_FORBIDDEN;
+            $message = 'File rejected: '.$ex->getMessage();
+        }
 
         $parameters = ['id' => $file->getId()];
 
         return $this->createResponse(
-            Response::HTTP_OK,
-            'File uploaded',
+            $status,
+            $message,
             [
                 'files' => [
                     array_merge(
-- 
GitLab