/** * Handle REST request. * * @return Mage_Webapi_Controller_Dispatcher_Rest */ public function dispatch() { try { $this->_authentication->authenticate(); $route = $this->_router->match($this->_request); $operation = $this->_request->getOperationName(); $resourceVersion = $this->_request->getResourceVersion(); $this->_apiConfig->validateVersionNumber($resourceVersion, $this->_request->getResourceName()); $method = $this->_apiConfig->getMethodNameByOperation($operation, $resourceVersion); $controllerClassName = $this->_apiConfig->getControllerClassByOperationName($operation); $controllerInstance = $this->_controllerFactory->createActionController($controllerClassName, $this->_request); $versionAfterFallback = $this->_apiConfig->identifyVersionSuffix($operation, $resourceVersion, $controllerInstance); /** * Route check has two stages: * The first is performed against full list of routes that is merged from all resources. * The second stage of route check can be performed only when actual version to be executed is known. */ $this->_router->checkRoute($this->_request, $method, $versionAfterFallback); $this->_apiConfig->checkDeprecationPolicy($route->getResourceName(), $method, $versionAfterFallback); $action = $method . $versionAfterFallback; $this->_authorization->checkResourceAcl($route->getResourceName(), $method); $inputData = $this->_restPresentation->fetchRequestData($controllerInstance, $action); $outputData = call_user_func_array(array($controllerInstance, $action), $inputData); $this->_restPresentation->prepareResponse($method, $outputData); } catch (Exception $e) { $this->_response->setException($e); } $this->_response->sendResponse(); return $this; }
/** * Check whether current request matches any route of specified method or not. Method version is taken into account. * * @param Mage_Webapi_Controller_Request_Rest $request * @param string $methodName * @param string $version * @throws Mage_Webapi_Exception In case when request does not match any route of specified method. */ public function checkRoute(Mage_Webapi_Controller_Request_Rest $request, $methodName, $version) { $resourceName = $request->getResourceName(); $routes = $this->_apiConfig->getMethodRestRoutes($resourceName, $methodName, $version); foreach ($routes as $route) { if ($route->match($request)) { return; } } throw new Mage_Webapi_Exception($this->_helper->__('Request does not match any route.'), Mage_Webapi_Exception::HTTP_NOT_FOUND); }
/** * Test dispatch method. */ public function testDispatch() { $this->_authenticationMock->expects($this->once())->method('authenticate'); /** Init route mock. */ $routeMock = $this->getMockBuilder('Mage_Webapi_Controller_Router_Route_Rest')->disableOriginalConstructor()->getMock(); $routeMock->expects($this->any())->method('getResourceName'); $this->_routerMock->expects($this->once())->method('match')->will($this->returnValue($routeMock)); /** Mock Api Config getMethodNameByOperation method to return isDeleted method of Varien_Onject. */ $this->_apiConfigMock->expects($this->once())->method('getMethodNameByOperation')->will($this->returnValue('isDeleted')); /** Mock Api config identifyVersionSuffix method to return empty string. */ $this->_apiConfigMock->expects($this->once())->method('identifyVersionSuffix')->will($this->returnValue('')); $this->_apiConfigMock->expects($this->once())->method('checkDeprecationPolicy'); $this->_authorizationMock->expects($this->once())->method('checkResourceAcl'); /** Create fake controller mock, e. g. Varien_Object object. */ $controllerMock = $this->getMockBuilder('Varien_Object')->disableOriginalConstructor()->getMock(); /** Assert isDeleted method will be executed once. */ $controllerMock->expects($this->once())->method('isDeleted'); /** Mock factory mock to return fake action controller. */ $this->_controllerFactory->expects($this->once())->method('createActionController')->will($this->returnValue($controllerMock)); /** Mock Rest presentation fetchRequestData method to return empty array. */ $this->_restPresentation->expects($this->once())->method('fetchRequestData')->will($this->returnValue(array())); /** Assert response sendResponse method will be executed once. */ $this->_responseMock->expects($this->once())->method('sendResponse'); $this->_restDispatcher->dispatch(); }
/** * Generate resource location. * * @param Mage_Core_Model_Abstract $createdItem * @return string URL */ protected function _getCreatedItemLocation($createdItem) { $apiTypeRoute = $this->_routeFactory->createRoute('Mage_Webapi_Controller_Router_Route_Webapi', Mage_Webapi_Controller_Router_Route_Webapi::getApiRoute()); $resourceName = $this->_request->getResourceName(); $routeToItem = $this->_routeFactory->createRoute('Zend_Controller_Router_Route', $this->_apiConfig->getRestRouteToItem($resourceName)); $chain = $apiTypeRoute->chain($routeToItem); $params = array(Mage_Webapi_Controller_Router_Route_Webapi::PARAM_API_TYPE => $this->_request->getApiType(), Mage_Webapi_Controller_Router_Route_Rest::PARAM_ID => $createdItem->getId(), Mage_Webapi_Controller_Router_Route_Rest::PARAM_VERSION => $this->_request->getResourceVersion()); $uri = $chain->assemble($params); return '/' . $uri; }
/** * Prepare mocks for SUT constructor for testCheckRoute(). * * @return array */ protected function _prepareMockDataForCheckRouteTest() { $methodName = 'foo'; $version = 'bar'; $request = $this->getMockBuilder('Mage_Webapi_Controller_Request_Rest')->disableOriginalConstructor()->setMethods(array('getResourceName'))->getMock(); $resourceName = 'Resource Name'; $request->expects($this->once())->method('getResourceName')->will($this->returnValue($resourceName)); $this->_apiConfigMock->expects($this->once())->method('getMethodRestRoutes')->with($resourceName, $methodName, $version)->will($this->returnValue(array($this->_routeMock))); return array('request' => $request, 'methodName' => $methodName, 'version' => $version); }