public function prepare()
{
// prepare the context path
$contextPath = str_replace($this->getContext()->getAppBase(), '', $this->getContext()->getWebappPath());
// set the context path
$this->setContextPath($contextPath);
// Fixed #735 - Endless Loop for URLs without servlet name
// Load the request URI and query string from the server vars, because we have to
// take care about changes from other modules like directory or rewrite module!
$uri = $this->getRequestUri();
$queryString = $this->getQueryString();
// get uri without querystring
$uriWithoutQueryString = str_replace('?' . $queryString, '', $uri);
// initialize the path information and the directory to start with
list($dirname, $basename, $extension) = array_values(pathinfo($uriWithoutQueryString));
// make the registered handlers local
$handlers = $this->getHandlers();
// descent the directory structure down to find the (almost virtual) servlet file
do {
// bingo we found a (again: almost virtual) servlet file
if (isset($handlers[".{$extension}"])) {
// prepare the servlet path (we've to take care, because the
// pathinfo() function converts / to \ on Windows OS
if ($dirname === DIRECTORY_SEPARATOR) {
$servletPath = '/' . $basename;
} else {
$servletPath = $dirname . '/' . $basename;
}
// we set the basename, because this is the servlet path
$this->setServletPath($servletPath);
// we set the path info, what is the request URI with stripped dir- and basename
$this->setPathInfo(str_replace($servletPath, '', $uriWithoutQueryString));
// we've found what we were looking for, so break here
break;
}
// break if we finally can't find a servlet to handle the request
if ($dirname === '/') {
throw new ServletException(sprintf('Can\'t find a handler for URI %s, either ', $uri));
}
// descend down the directory tree
list($dirname, $basename, $extension) = array_values(pathinfo($dirname));
} while ($dirname !== false);
// stop until we reached the root of the URI
// prepare and set the servlet path
$this->setServletPath(str_replace($contextPath, '', $this->getServletPath()));
// prepare the base modifier which allows our apps to provide a base URL
$webappsDir = str_replace($this->getContext()->getBaseDirectory(), '', $this->getContext()->getAppBase());
$relativeRequestPath = strstr($this->getDocumentRoot(), $webappsDir);
$proposedBaseModifier = str_replace(DIRECTORY_SEPARATOR, '/', str_replace($webappsDir, '', $relativeRequestPath));
// prepare the base modifier
if (strpos($proposedBaseModifier, $contextPath) === 0) {
$this->setBaseModifier('');
} else {
$this->setBaseModifier($contextPath);
}
}