| <?php |
| /** |
| * File containing the ezcWebdavMicrosoftCompatibleTransport 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 |
| */ |
| /** |
| * Transport layer for Microsoft clients with RFC incompatiblities. |
| * |
| * Clients seen, which need this: |
| * - Microsoft Data Access Internet Publishing Provider Cache Manager |
| * - Microsoft Data Access Internet Publishing Provider DAV 1.1 |
| * - Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1) |
| * |
| * Still not working: |
| * - Microsoft-WebDAV-MiniRedir/5.1.2600 |
| * |
| * Seen, but unknown: |
| * - Mozilla/2.0 (compatible; MS FrontPage 4.0) |
| * - MSFrontPage/4.0 |
| * |
| * @version //autogentag// |
| * @package Webdav |
| */ |
| class ezcWebdavMicrosoftCompatibleTransport extends ezcWebdavTransport |
| { |
| |
| /** |
| * Flattens a processed response object to headers and body. |
| * |
| * Takes a given {@link ezcWebdavDisplayInformation} object and returns an |
| * array containg the headers and body it represents. |
| * |
| * The returned information can be processed (send out to the client) by |
| * {@link ezcWebdavTransport::sendResponse()}. |
| * |
| * @param ezcWebdavDisplayInformation $info |
| * @return ezcWebdavOutputResult |
| */ |
| protected function flattenResponse( ezcWebdavDisplayInformation $info ) |
| { |
| $output = parent::flattenResponse( $info ); |
| |
| // Add MS specific header |
| $output->headers['MS-Author-Via'] = 'DAV'; |
| |
| // MS seems always want it this way, even when we do not support |
| // locking |
| $output->headers['DAV'] = '1, 2'; |
| |
| if ( $info instanceof ezcWebdavXmlDisplayInformation ) |
| { |
| // Only mangle output if XML is to be sent (which does not include |
| // GET of XML files, but only response XML). |
| $this->mangleXml( $output ); |
| } |
| |
| return $output; |
| } |
| |
| /** |
| * Performs MS specific XML mangling on output. |
| * |
| * MS user agents show strange behaviour regarding XML processing. The |
| * following quirks are resolved by this method, to make such user agents |
| * accept the generated XML: |
| * |
| * - Add special namespace declarations and special shortcuts for the DAV: |
| * namespace |
| * - Rename shortcuts for some elements into these special ones |
| * - Add special XML attributes not defined in the RFC but expected by user |
| * agents |
| * - Remove all non-significant whitespaces |
| * - Add a newline at the end of the body |
| * |
| * @param ezcWebdavOutputResult $output |
| */ |
| private function mangleXml( ezcWebdavOutputResult $output ) |
| { |
| // Add date namespace to response elements for MS clients |
| // |
| // Mimic Apache mod_dav behaviour for DAV: namespace |
| $output->body = preg_replace( |
| '(<D:response([^>]*)>)', |
| '<D:response\\1 xmlns:lp1="DAV:" xmlns:lp2="http://apache.org/dav/props/" xmlns:ns0="urn:uuid:c2f41010-65b3-11d1-a29f-00aa00c14882/">', |
| $output->body |
| ); |
| |
| // Set creationdate namespace |
| $output->body = preg_replace( |
| '(<D:creationdate([^>]*)>)', |
| '<D:creationdate\\1 ns0:dt="dateTime.tz">', |
| $output->body |
| ); |
| |
| // Set getlastmodified namespace |
| $output->body = preg_replace( |
| '(<D:getlastmodified([^>]*)>)', |
| '<D:getlastmodified\\1 ns0:dt="dateTime.rfc1123">', |
| $output->body |
| ); |
| |
| // Put some elements in DAV: namespace with other namespace identifier |
| // to mimic Apache mod_dav behaviour for DAV: namespace |
| $output->body = preg_replace( |
| '(D:(resourcetype|creationdate|getlastmodified|getetag)([^>]*))', |
| 'lp1:\\1\\2', |
| $output->body |
| ); |
| |
| // Remove all unessecary whitespaces |
| $output->body = preg_replace( |
| '(>\s+<)', |
| '><', |
| $output->body |
| ); |
| |
| // MS IE7 requires a newline after the XML. |
| $output->body .= "\n"; |
| } |
| |
| /** |
| * Parses the PROPFIND request and returns a request object. |
| * |
| * Microsoft clients may send an empty request, so that we guess, that they |
| * meant an allprop request, fill the body struct accordingly and then |
| * dispatch to the original method. |
| * |
| * @param string $path |
| * @param string $body |
| * @return ezcWebdavPropFindRequest |
| */ |
| protected function parsePropFindRequest( $path, $body ) |
| { |
| // Empty request seem to actually mean an allprop request. |
| if ( trim( $body ) === '' ) |
| { |
| $body = '<?xml version="1.0" encoding="utf-8" ?> |
| <D:propfind xmlns:D="DAV:"> |
| <D:allprop/> |
| </D:propfind>'; |
| } |
| |
| return parent::parsePropFindRequest( $path, $body ); |
| } |
| } |
| ?> |