Esempio n. 1
0
 private function findMethod(&$parameters, &$methodName, &$method, $serverKey, $httpRequestMethod)
 {
     $methodName = isset($parameters[METHOD]) ? $parameters[METHOD] : null;
     $method = null;
     if (empty($methodName)) {
         // Find route
         $requestUri = isset($_SERVER["REQUEST_URI"]) ? $_SERVER["REQUEST_URI"] : null;
         $method = findRoute($requestUri, $parameters, $httpRequestMethod, $serverKey);
         if (!empty($method)) {
             $methodName = $method->getName();
         }
     } else {
         $method = RESTConfigurationLoader::getMethod($methodName, $serverKey);
     }
     if (empty($method)) {
         throw new MashapeException(sprintf(EXCEPTION_METHOD_NOTFOUND, $methodName), EXCEPTION_METHOD_NOTFOUND_CODE);
     }
 }
function findRoute($requestUri, &$routeParameters, $httpRequestMethod, $serverKey)
{
    $routeMethod = null;
    $configuration = RESTConfigurationLoader::loadConfiguration($serverKey);
    $methods = $configuration->getMethods();
    for ($i = 0; $i < count($methods); $i++) {
        if ($methods[$i]->getHttp() != $httpRequestMethod) {
            unset($methods[$i]);
        }
    }
    $requestUri = Explode("?", substr($requestUri, 1));
    $requestUriParts = Explode("/", $requestUri[0]);
    $likelyMethods = array();
    $excludedMethods = array();
    // Backward loop
    for ($i = count($requestUriParts) - 1; $i >= 0; $i--) {
        // Find if there's a path like that, otherwise check for placeholders
        foreach ($methods as $method) {
            $methodName = $method->getName();
            if (in_array($methodName, $excludedMethods)) {
                continue;
            }
            $route = $method->getRoute();
            if (!empty($route)) {
                $routeParts = Explode("/", substr($route, 1));
                if (count($routeParts) <= count($requestUriParts)) {
                    $backwardIndex = count($routeParts) - (count($requestUriParts) - $i);
                    if ($backwardIndex >= 0) {
                        if ($routeParts[$backwardIndex] == $requestUriParts[$i]) {
                            if (!ArrayUtils::existKey($methodName, $likelyMethods)) {
                                $likelyMethods[$methodName] = array();
                            }
                        } else {
                            if (RouteUtils::isRoutePlaceholder($routeParts[$backwardIndex])) {
                                $foundParameters;
                                $placeHolder = RouteUtils::getRoutePlaceholder($routeParts[$backwardIndex]);
                                if (!ArrayUtils::existKey($methodName, $likelyMethods)) {
                                    $foundParameters = array();
                                } else {
                                    $foundParameters = $likelyMethods[$methodName];
                                }
                                $foundParameters[$placeHolder] = $requestUriParts[$i];
                                $likelyMethods[$methodName] = $foundParameters;
                            } else {
                                array_push($excludedMethods, $methodName);
                                unset($likelyMethods[$methodName]);
                            }
                        }
                    }
                }
            }
        }
    }
    if (count($likelyMethods) > 1) {
        // Get the route with the highest matches
        $maxRouteSize = 0;
        foreach ($likelyMethods as $key => $value) {
            $route = RESTConfigurationLoader::getMethod($key, $serverKey)->getRoute();
            $routeSize = count(Explode("/", substr($route, 1)));
            if ($routeSize > $maxRouteSize) {
                $maxRouteSize = $routeSize;
            }
        }
        foreach ($likelyMethods as $key => $value) {
            $route = RESTConfigurationLoader::getMethod($key, $serverKey)->getRoute();
            $routeSize = count(Explode("/", substr($route, 1)));
            if ($routeSize < $maxRouteSize) {
                unset($likelyMethods[$key]);
            }
        }
    }
    if (count($likelyMethods) > 1) {
        $ambiguousMethods = "";
        foreach ($likelyMethods as $key => $value) {
            $ambiguousMethods .= "\"" . $key . "\", ";
        }
        $ambiguousMethods = substr($ambiguousMethods, 0, strlen($ambiguousMethods) - 2);
        throw new MashapeException(sprintf(EXCEPTION_AMBIGUOUS_ROUTE, $ambiguousMethods), EXCEPTION_SYSTEM_ERROR_CODE);
    }
    // Get the first item (just one or none item can exist)
    foreach ($likelyMethods as $key => $value) {
        $routeMethod = RESTConfigurationLoader::getMethod($key, $serverKey);
        $routeParameters = array_merge($routeParameters, $value);
        break;
    }
    return $routeMethod;
}