- <?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" | 20 years ago | |
#12 | 4801 | Daniel Sabsay | Copyright and default user name cleaned up | 20 years ago | |
#11 | 4800 | Daniel Sabsay | Final documentation update GET method updated Log now reports depot host & port being... served « |
20 years ago | |
#10 | 4799 | Daniel Sabsay | Remove otiose debug logging code | 20 years ago | |
#9 | 4796 | Daniel Sabsay | Cosmetic change to log mechanism | 20 years ago | |
#8 | 4779 | Daniel Sabsay | A few bugs chased | 20 years ago | |
#7 | 4778 | Daniel Sabsay | Improvements in logging (now shows response headers) Change in directory searching mechan...ism Now appropriately handles If-Modified-Since headers « |
20 years ago | |
#6 | 4774 | Daniel Sabsay | Repackaged functions all working | 20 years ago | |
#5 | 4750 | Daniel Sabsay | Mac Finder can now mount the root (repository) level. Directory last-modified dates are n...ow retrieved. Full log implementation now shows both sides of dialog. « |
20 years ago | |
#4 | 4749 | Daniel Sabsay | The code now uses no persistant workspaces or changelists. Switched the faux directory me...chanism to use deleted placeholder files. Switched the logging mechanism to use the webserver logging methods. « |
20 years ago | |
#3 | 4725 | Daniel Sabsay | Changes to the DELETE and LIST logic | 20 years ago | |
#2 | 4717 | Daniel Sabsay | Updated and clarified the Read Me section | 20 years ago | |
#1 | 4711 | Daniel Sabsay | PUT works for first time | 20 years ago |