public function process($send = false) {
        try {

            $method = $this->getRequest()->getMethod();

            switch ($method) {
                case 'POST':
                    if(!$this->checkTusVersion()) {
                        throw new Exception\Request('The requested protocol version is not supported', \Zend\Http\Response::STATUS_CODE_405);
                    }
                    $this->buildUuid();
                    $this->processPost();
                    break;

                case 'HEAD':
                    if(!$this->checkTusVersion()) {
                        throw new Exception\Request('The requested protocol version is not supported', \Zend\Http\Response::STATUS_CODE_405);
                    }
                    $this->getUserUuid();
                    $this->processHead();
                    break;

                case 'PATCH':
                    if(!$this->checkTusVersion()) {
                        throw new Exception\Request('The requested protocol version is not supported', \Zend\Http\Response::STATUS_CODE_405);
                    }
                    $this->getUserUuid();
                    $this->processPatch();
                    break;

                case 'OPTIONS':
                    $this->processOptions();
                    break;

                case 'GET':
                    $this->getUserUuid();
                    $this->processGet($send);
                    break;

                default:
                    throw new Exception\Request('The requested method ' . $method . ' is not allowed', \Zend\Http\Response::STATUS_CODE_405);
            }

            $this->addCommonHeader($this->getRequest()->isOptions());

            if ($send === false) {
                return $this->response;
            }
        }
        catch (Exception\BadHeader $e) {
            if ($send === false) {
                throw $e;
            }

            $this->getResponse()->setStatusCode(\Zend\Http\Response::STATUS_CODE_400);
            $this->addCommonHeader();
        }
        catch (Exception\Request $e) {
            if ($send === false) {
                throw $e;
            }

            $this->getResponse()->setStatusCode($e->getCode())
                    ->setContent($e->getMessage());
            $this->addCommonHeader(true);
        }
        catch (\Exception $e) {
            if ($send === false) {
                throw $e;
            }

            $this->getResponse()->setStatusCode(\Zend\Http\Response::STATUS_CODE_500)
                    ->setContent($e->getMessage());
            $this->addCommonHeader();
        }

        $this->getResponse()->sendHeaders();
        $this->getResponse()->sendContent();

        // The process must only sent the HTTP headers and content: kill request after send
        exit;
    }