| <?php |
| /** |
| * File containing the ezcWebdavAutomaticPathFactory class. |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| * @package Webdav |
| * @version //autogentag// |
| * @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved. |
| * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0 |
| */ |
| /** |
| * Path factory that automatically determines configuration. |
| * |
| * An object of this class is meant to be used in {@link |
| * ezcWebdavTransportOptions} as the $pathFactory property. The instance of |
| * {@link ezcWebdavTransport} utilizes the path factory to translate between |
| * external paths/URIs and internal path representations. |
| * |
| * An instance of this class examines several server variables like |
| * <ul> |
| * <li>$_SERVER['DOCUMENT_ROOT']</li> |
| * <li>$_SERVER['SCRIPT_FILENAME']</li> |
| * </ul> |
| * to determine the server configuration. It then examines incoming URIs to |
| * determine which parts must be stripped an reconstructs the information when |
| * serializing a path back to a URI. |
| * |
| * @version //autogentag// |
| * @package Webdav |
| */ |
| class ezcWebdavAutomaticPathFactory implements ezcWebdavPathFactory |
| { |
| /** |
| * Caches paths that are a collection. |
| * |
| * Those will get a '/' appended on re-serialization. Works only if they |
| * had been unserialized before. |
| * |
| * @var array(string=>bool) |
| * |
| * @apichange This property will be renamed to $collectionPaths in the next |
| * major release. |
| */ |
| protected $collectionPathes = array(); |
| |
| /** |
| * Base path on the server. |
| * |
| * Auto-detected during __construct(). |
| * |
| * @var string |
| */ |
| protected $serverFile; |
| |
| /** |
| * Creates a new path factory. |
| * |
| * Creates a new path factory to be used in {@link |
| * ezcWebdavServerConfiguration}. This path factory automatically detects |
| * information from the running web server and automatically determines the |
| * suitable values for parsing paths and generating URIs. |
| * |
| * @return void |
| */ |
| public function __construct() |
| { |
| // Get Docroot and ensure proper definition |
| if ( !isset( $_SERVER['DOCUMENT_ROOT'] ) ) |
| { |
| throw new ezcWebdavMissingServerVariableException( 'DOCUMENT_ROOT' ); |
| } |
| |
| // Ensure trailing slash in doc root. |
| $docRoot = $_SERVER['DOCUMENT_ROOT']; |
| if ( substr( $docRoot, -1, 1 ) !== '/' ) |
| { |
| $docRoot .= '/'; |
| } |
| |
| // Get script filename |
| if ( !isset( $_SERVER['SCRIPT_FILENAME'] ) ) |
| { |
| throw new ezcWebdavMissingServerVariableException( 'SCRIPT_FILENAME' ); |
| } |
| |
| $scriptFileName = $_SERVER['SCRIPT_FILENAME']; |
| |
| // Get script path absolute to doc root |
| $this->serverFile = '/' . str_replace( |
| $docRoot, '', $scriptFileName |
| ); |
| } |
| |
| /** |
| * Parses the given URI to a path suitable to be used in the backend. |
| * |
| * This method retrieves a URI (either full qualified or relative) and |
| * translates it into a local path, which can be understood by the {@link |
| * ezcWebdavBackend} instance used in the {@link ezcWebdavServer}. |
| * |
| * A locally understandable path MUST NOT contain a trailing slash, but |
| * MUST always contain a starting slash. For the root URI the path "/" MUST |
| * be used. |
| * |
| * @param string $uri |
| * @return string |
| */ |
| public function parseUriToPath( $uri ) |
| { |
| $requestPath = parse_url( $uri, PHP_URL_PATH ); |
| $serverBase = dirname( $this->serverFile ); |
| |
| // Check for request path including index.php |
| if ( strpos( $requestPath, $this->serverFile ) === 0 ) |
| { |
| $path = substr( $requestPath, strlen( $this->serverFile ) ); |
| } |
| // Check for request path without index.php, but with some root to cut |
| else if ( $serverBase !== '/' && strpos( $requestPath, $serverBase ) === 0 ) |
| { |
| $path = substr( $requestPath, strlen( $serverBase ) ); |
| $this->serverFile = $serverBase; |
| } |
| // Already a good path, just use it |
| else |
| { |
| $path = $requestPath; |
| $this->serverFile = ''; |
| } |
| |
| if ( substr( $path, -1, 1 ) === '/' ) |
| { |
| $path = substr( $path, 0, -1 ); |
| $this->collectionPathes[$path] = true; |
| } |
| elseif ( isset( $this->collectionPathes[$path] ) ) |
| { |
| unset( $this->collectionPathes[$path] ); |
| } |
| |
| return ( is_string( $path ) && $path !== '' ? $path : '/' ); |
| } |
| |
| /** |
| * Generates a URI from a local path. |
| * |
| * This method receives a local $path string, representing a resource in |
| * the {@link ezcWebdavBackend} and translates it into a full qualified URI |
| * to be used as external reference. |
| * |
| * @param string $path |
| * @return string |
| */ |
| public function generateUriFromPath( $path ) |
| { |
| $proto = ( isset( $_SERVER['HTTPS'] ) && $_SERVER['HTTPS'] !== 'off' ? 'https' : 'http' ); |
| $port = ( $proto === 'http' && $_SERVER['SERVER_PORT'] == 80 || $proto === 'https' && $_SERVER['SERVER_PORT'] == 443 ) |
| ? null |
| : $_SERVER['SERVER_PORT']; |
| |
| return $proto . '://' . $_SERVER['SERVER_NAME'] |
| . ( $port !== null ? ':' . $port : '' ) |
| . $this->serverFile |
| . $path |
| . ( isset( $this->collectionPathes[$path] ) ? '/' : '' ); |
| } |
| } |
| |
| ?> |