<?php //========================================================= // p4DAV.php Implements a Perforce WebDAV server //========================================================= // // +----------------------------------------------------------------+ // | PHP Version 4 and 5 | // +----------------------------------------------------------------+ // | Author: Daniel Sabsay <danielsabsay@pacbell.net> [Jan. 2005] | // | Derived from the open source HTTP_WebDAV_Server class (0.99.1) | // | Original Name = davserver.php | // | by: Hartmut Holzgraefe <hholzgra@php.net> | // | Christian Stocker <chregu@bitflux.ch> | // +----------------------------------------------------------------+ // // Runs as a helper for Apache HTTP requests of this pattern... // http://[thisdomain]/p4/[Perforce path without initial //] // Requires a directory for temporary files (set below). // Requires the service of the Perforce command-line client P4. // Triggered by the following directive included in Apache's conf.ini file... // AliasMatch ^/p4.* [mydir]/p4DAV.php // Serves a single Perforce repository whose IP address is specified below // Resides in a directory [mydir] with these companion files... // 1) p4DAV.php [this file] (heavily modified from davserver.php) // 2) DepotServer.php (heavily modified from FileSystem.php) // 3) DAVServer.php (derived with slight mods from Server.php) // 4) Tools (a directory, unmodified from open-source distribution) containing... // 4.1) _parse_lockinfo.php // 4.2) _parse_propfind.php // 4.3) _parse_proppatch.php //********************************************************** // You must edit the section below to your specifications //********************************************************** $prefix = '/p4'; // Webserver DAV trigger prefix (Apache AliasMatch) $base = $_SERVER['DOCUMENT_ROOT'].'/davroot/';// temporary file directory $depot_host = 'localhost'; // Perforce repository $depot_port = '1666'; // Perforce contact port $depot_agent = '/usr/local/bin/p4'; // Perforce command-line client $admin_user = ' '; // Perforce admin user $admin_passwd = ' '; // Perforce admin password $logging = 1; // Log level: 0=errors, 1=connections, 2=details, 3=debug //*************************************************************************** require_once realpath('.').'/DepotServer.php'; $URI = $_SERVER['REQUEST_URI']; $path = (strlen($URI)>strlen($prefix))? substr($URI,strlen($prefix)):'/'; $method = strtoupper($_SERVER['REQUEST_METHOD']); // PHP messages destroy XML output, so switch them off ini_set('display_errors', E_USER_NOTICE); //********************************* // BASIC CONNECTION HEADER //********************************* if ($logging>0) { error_log('DAV REQ - repository='.$depot_host.':'.$depot_port.' log level = '.$logging); error_log($method.'=>'.$path.' '.strftime('%c',time())); $request_hdrs = apache_request_headers(); unset($request_hdrs['Accept-Language']); // suppress junk $log = ''; foreach ($request_hdrs as $k=>$v) { $log .= $k.'='.$v.'--'; } error_log($log); } //********************************* // CONFIGURE SERVER INSTANCE //********************************* $P = new Depot_Filesystem; // instantiate server class $P->prefix = $prefix; $P->base = $base; $P->path = $path; $P->logging = $logging; $P->depot_host = $depot_host; $P->depot_port = $depot_port; $P->depot_agent = $depot_agent; $P->admin_user = $admin_user; // used for deleting faux directory placeholders $P->admin_passwd = $admin_passwd; //****************** // INVOKE SERVER //****************** $P->ServeRequest($method); flush(); // release any buffered output to client //********************************* // BASIC CONNECTION TRAILER //********************************* if ($logging>0) { error_log('DAV RESPONSE'); $response_hdrs = apache_response_headers(); $log = ''; foreach ($response_hdrs as $k=>$v) { $log .= $k.'='.$v.'--'; } error_log($log); } ?>
# | Change | User | Description | Committed | |
---|---|---|---|---|---|
#13 | 4802 | Daniel Sabsay | Change default repository address to "localhost" | ||
#12 | 4801 | Daniel Sabsay | Copyright and default user name cleaned up | ||
#11 | 4800 | Daniel Sabsay |
Final documentation update GET method updated Log now reports depot host & port being served |
||
#10 | 4799 | Daniel Sabsay | Remove otiose debug logging code | ||
#9 | 4796 | Daniel Sabsay | Cosmetic change to log mechanism | ||
#8 | 4779 | Daniel Sabsay | A few bugs chased | ||
#7 | 4778 | Daniel Sabsay |
Improvements in logging (now shows response headers) Change in directory searching mechanism Now appropriately handles If-Modified-Since headers |
||
#6 | 4774 | Daniel Sabsay | Repackaged functions all working | ||
#5 | 4750 | Daniel Sabsay |
Mac Finder can now mount the root (repository) level. Directory last-modified dates are now retrieved. Full log implementation now shows both sides of dialog. |
||
#4 | 4749 | Daniel Sabsay |
The code now uses no persistant workspaces or changelists. Switched the faux directory mechanism to use deleted placeholder files. Switched the logging mechanism to use the webserver logging methods. |
||
#3 | 4725 | Daniel Sabsay | Changes to the DELETE and LIST logic | ||
#2 | 4717 | Daniel Sabsay | Updated and clarified the Read Me section | ||
#1 | 4711 | Daniel Sabsay | PUT works for first time |