Maj: NuSOAP 0.7.3

This commit is contained in:
Regis Houssin 2009-10-22 10:21:04 +00:00
parent c8db07011a
commit 9fc889c86a
14 changed files with 17298 additions and 15600 deletions

View File

@ -17,8 +17,9 @@ FPDF 1.53 Public domain Yes PDF gene
FPDF_TPL 1.1.2 Apache Software License 2.0 No GPL3 only PDF templates management FPDF_TPL 1.1.2 Apache Software License 2.0 No GPL3 only PDF templates management
FPDI 1.2.1 Apache Software License 2.0 No GPL3 only PDF templates management FPDI 1.2.1 Apache Software License 2.0 No GPL3 only PDF templates management
FPDI_Protection 1.0.2 Apache Software License 2.0 No GPL3 only PDF encryption (8 files) FPDI_Protection 1.0.2 Apache Software License 2.0 No GPL3 only PDF encryption (8 files)
GeoIP x.x Yes GeoIP Maxmind conversion
MagPieRss 0.72 GPL 2.0 Yes Load RSS MagPieRss 0.72 GPL 2.0 Yes Load RSS
NuSoap 0.6.5 LGPL 2.1 Yes Interfaces with third tools NuSoap 0.7.3 LGPL 2.1 Yes Interfaces with third tools
PHP_WriteExcel 0.3.0 LGPL 2.1 Yes Excel files generation PHP_WriteExcel 0.3.0 LGPL 2.1 Yes Excel files generation
PHP_ExcelReader 2.21 MIT License Yes Parse and retrieve information from XLS files PHP_ExcelReader 2.21 MIT License Yes Parse and retrieve information from XLS files
Prototype 1.6.0.3 MIT License Yes Ajax library Prototype 1.6.0.3 MIT License Yes Ajax library
@ -28,7 +29,6 @@ SimpleMail 1.2 GPL Yes SMTP lib
Smarty 2.6.26 LGPL 2.1 Yes Templates engine used by some pages Smarty 2.6.26 LGPL 2.1 Yes Templates engine used by some pages
SMTPs 1.15 GPL Yes SMTPS library SMTPs 1.15 GPL Yes SMTPS library
VCard 2.0 GPL 2.0 Yes Fonctions vcard VCard 2.0 GPL 2.0 Yes Fonctions vcard
GeoIP x.x Yes GeoIP Maxmind conversion
For licenses compatibility informations: For licenses compatibility informations:
http://www.fsf.org/licensing/licenses/index_html http://www.fsf.org/licensing/licenses/index_html

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,86 +1,90 @@
<?php <?php
/** /**
* Contains information for a SOAP fault. * Contains information for a SOAP fault.
* Mainly used for returning faults from deployed functions * Mainly used for returning faults from deployed functions
* in a server instance. * in a server instance.
* @author Dietrich Ayala <dietrich@ganx4.com> * @author Dietrich Ayala <dietrich@ganx4.com>
* @version $Id$ * @version $Id$
* @access public * @access public
*/ */
class soap_fault extends nusoap_base { class nusoap_fault extends nusoap_base {
/** /**
* The fault code (client|server) * The fault code (client|server)
* @var string * @var string
* @access private * @access private
*/ */
var $faultcode; var $faultcode;
/** /**
* The fault actor * The fault actor
* @var string * @var string
* @access private * @access private
*/ */
var $faultactor; var $faultactor;
/** /**
* The fault string, a description of the fault * The fault string, a description of the fault
* @var string * @var string
* @access private * @access private
*/ */
var $faultstring; var $faultstring;
/** /**
* The fault detail, typically a string or array of string * The fault detail, typically a string or array of string
* @var mixed * @var mixed
* @access private * @access private
*/ */
var $faultdetail; var $faultdetail;
/** /**
* constructor * constructor
* *
* @param string $faultcode (client | server) * @param string $faultcode (SOAP-ENV:Client | SOAP-ENV:Server)
* @param string $faultactor only used when msg routed between multiple actors * @param string $faultactor only used when msg routed between multiple actors
* @param string $faultstring human readable error message * @param string $faultstring human readable error message
* @param mixed $faultdetail detail, typically a string or array of string * @param mixed $faultdetail detail, typically a string or array of string
*/ */
function soap_fault($faultcode,$faultactor='',$faultstring='',$faultdetail=''){ function nusoap_fault($faultcode,$faultactor='',$faultstring='',$faultdetail=''){
parent::nusoap_base(); parent::nusoap_base();
$this->faultcode = $faultcode; $this->faultcode = $faultcode;
$this->faultactor = $faultactor; $this->faultactor = $faultactor;
$this->faultstring = $faultstring; $this->faultstring = $faultstring;
$this->faultdetail = $faultdetail; $this->faultdetail = $faultdetail;
} }
/** /**
* serialize a fault * serialize a fault
* *
* @return string The serialization of the fault instance. * @return string The serialization of the fault instance.
* @access public * @access public
*/ */
function serialize(){ function serialize(){
$ns_string = ''; $ns_string = '';
foreach($this->namespaces as $k => $v){ foreach($this->namespaces as $k => $v){
$ns_string .= "\n xmlns:$k=\"$v\""; $ns_string .= "\n xmlns:$k=\"$v\"";
} }
$return_msg = $return_msg =
'<?xml version="1.0" encoding="'.$this->soap_defencoding.'"?>'. '<?xml version="1.0" encoding="'.$this->soap_defencoding.'"?>'.
'<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"'.$ns_string.">\n". '<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"'.$ns_string.">\n".
'<SOAP-ENV:Body>'. '<SOAP-ENV:Body>'.
'<SOAP-ENV:Fault>'. '<SOAP-ENV:Fault>'.
$this->serialize_val($this->faultcode, 'faultcode'). $this->serialize_val($this->faultcode, 'faultcode').
$this->serialize_val($this->faultactor, 'faultactor'). $this->serialize_val($this->faultactor, 'faultactor').
$this->serialize_val($this->faultstring, 'faultstring'). $this->serialize_val($this->faultstring, 'faultstring').
$this->serialize_val($this->faultdetail, 'detail'). $this->serialize_val($this->faultdetail, 'detail').
'</SOAP-ENV:Fault>'. '</SOAP-ENV:Fault>'.
'</SOAP-ENV:Body>'. '</SOAP-ENV:Body>'.
'</SOAP-ENV:Envelope>'; '</SOAP-ENV:Envelope>';
return $return_msg; return $return_msg;
} }
} }
/**
* Backward compatibility
*/
class soap_fault extends nusoap_fault {
}
?> ?>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,107 +1,107 @@
<?php <?php
/** /**
* For creating serializable abstractions of native PHP types. This class * For creating serializable abstractions of native PHP types. This class
* allows element name/namespace, XSD type, and XML attributes to be * allows element name/namespace, XSD type, and XML attributes to be
* associated with a value. This is extremely useful when WSDL is not * associated with a value. This is extremely useful when WSDL is not
* used, but is also useful when WSDL is used with polymorphic types, including * used, but is also useful when WSDL is used with polymorphic types, including
* xsd:anyType and user-defined types. * xsd:anyType and user-defined types.
* *
* @author Dietrich Ayala <dietrich@ganx4.com> * @author Dietrich Ayala <dietrich@ganx4.com>
* @version $Id$ * @version $Id$
* @access public * @access public
*/ */
class soapval extends nusoap_base { class soapval extends nusoap_base {
/** /**
* The XML element name * The XML element name
* *
* @var string * @var string
* @access private * @access private
*/ */
var $name; var $name;
/** /**
* The XML type name (string or false) * The XML type name (string or false)
* *
* @var mixed * @var mixed
* @access private * @access private
*/ */
var $type; var $type;
/** /**
* The PHP value * The PHP value
* *
* @var mixed * @var mixed
* @access private * @access private
*/ */
var $value; var $value;
/** /**
* The XML element namespace (string or false) * The XML element namespace (string or false)
* *
* @var mixed * @var mixed
* @access private * @access private
*/ */
var $element_ns; var $element_ns;
/** /**
* The XML type namespace (string or false) * The XML type namespace (string or false)
* *
* @var mixed * @var mixed
* @access private * @access private
*/ */
var $type_ns; var $type_ns;
/** /**
* The XML element attributes (array or false) * The XML element attributes (array or false)
* *
* @var mixed * @var mixed
* @access private * @access private
*/ */
var $attributes; var $attributes;
/** /**
* constructor * constructor
* *
* @param string $name optional name * @param string $name optional name
* @param mixed $type optional type name * @param mixed $type optional type name
* @param mixed $value optional value * @param mixed $value optional value
* @param mixed $element_ns optional namespace of value * @param mixed $element_ns optional namespace of value
* @param mixed $type_ns optional namespace of type * @param mixed $type_ns optional namespace of type
* @param mixed $attributes associative array of attributes to add to element serialization * @param mixed $attributes associative array of attributes to add to element serialization
* @access public * @access public
*/ */
function soapval($name='soapval',$type=false,$value=-1,$element_ns=false,$type_ns=false,$attributes=false) { function soapval($name='soapval',$type=false,$value=-1,$element_ns=false,$type_ns=false,$attributes=false) {
parent::nusoap_base(); parent::nusoap_base();
$this->name = $name; $this->name = $name;
$this->type = $type; $this->type = $type;
$this->value = $value; $this->value = $value;
$this->element_ns = $element_ns; $this->element_ns = $element_ns;
$this->type_ns = $type_ns; $this->type_ns = $type_ns;
$this->attributes = $attributes; $this->attributes = $attributes;
} }
/** /**
* return serialized value * return serialized value
* *
* @param string $use The WSDL use value (encoded|literal) * @param string $use The WSDL use value (encoded|literal)
* @return string XML data * @return string XML data
* @access public * @access public
*/ */
function serialize($use='encoded') { function serialize($use='encoded') {
return $this->serialize_val($this->value,$this->name,$this->type,$this->element_ns,$this->type_ns,$this->attributes,$use); return $this->serialize_val($this->value, $this->name, $this->type, $this->element_ns, $this->type_ns, $this->attributes, $use, true);
} }
/** /**
* decodes a soapval object into a PHP native type * decodes a soapval object into a PHP native type
* *
* @return mixed * @return mixed
* @access public * @access public
*/ */
function decode(){ function decode(){
return $this->value; return $this->value;
} }
} }
?> ?>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,184 +1,209 @@
<?php <?php
/*
The NuSOAP project home is:
http://sourceforge.net/projects/nusoap/
/**
* caches instances of the wsdl class The primary support for NuSOAP is the mailing list:
* nusoap-general@lists.sourceforge.net
* @author Scott Nichol <snichol@computer.org> */
* @author Ingo Fischer <ingo@apollon.de>
* @version $Id$ /**
* @access public * caches instances of the wsdl class
*/ *
class wsdlcache { * @author Scott Nichol <snichol@users.sourceforge.net>
/** * @author Ingo Fischer <ingo@apollon.de>
* @var resource * @version $Id$
* @access private * @access public
*/ */
var $fplock; class nusoap_wsdlcache {
/** /**
* @var integer * @var resource
* @access private * @access private
*/ */
var $cache_lifetime; var $fplock;
/** /**
* @var string * @var integer
* @access private * @access private
*/ */
var $cache_dir; var $cache_lifetime;
/** /**
* @var string * @var string
* @access public * @access private
*/ */
var $debug_str = ''; var $cache_dir;
/**
/** * @var string
* constructor * @access public
* */
* @param string $cache_dir directory for cache-files var $debug_str = '';
* @param integer $cache_lifetime lifetime for caching-files in seconds or 0 for unlimited
* @access public /**
*/ * constructor
function wsdlcache($cache_dir='.', $cache_lifetime=0) { *
$this->fplock = array(); * @param string $cache_dir directory for cache-files
$this->cache_dir = $cache_dir != '' ? $cache_dir : '.'; * @param integer $cache_lifetime lifetime for caching-files in seconds or 0 for unlimited
$this->cache_lifetime = $cache_lifetime; * @access public
} */
function nusoap_wsdlcache($cache_dir='.', $cache_lifetime=0) {
/** $this->fplock = array();
* creates the filename used to cache a wsdl instance $this->cache_dir = $cache_dir != '' ? $cache_dir : '.';
* $this->cache_lifetime = $cache_lifetime;
* @param string $wsdl The URL of the wsdl instance }
* @return string The filename used to cache the instance
* @access private /**
*/ * creates the filename used to cache a wsdl instance
function createFilename($wsdl) { *
return $this->cache_dir.'/wsdlcache-' . md5($wsdl); * @param string $wsdl The URL of the wsdl instance
} * @return string The filename used to cache the instance
* @access private
/** */
* adds debug data to the class level debug string function createFilename($wsdl) {
* return $this->cache_dir.'/wsdlcache-' . md5($wsdl);
* @param string $string debug data }
* @access private
*/ /**
function debug($string){ * adds debug data to the class level debug string
$this->debug_str .= get_class($this).": $string\n"; *
} * @param string $string debug data
* @access private
/** */
* gets a wsdl instance from the cache function debug($string){
* $this->debug_str .= get_class($this).": $string\n";
* @param string $wsdl The URL of the wsdl instance }
* @return object wsdl The cached wsdl instance, null if the instance is not in the cache
* @access public /**
*/ * gets a wsdl instance from the cache
function get($wsdl) { *
$filename = $this->createFilename($wsdl); * @param string $wsdl The URL of the wsdl instance
if ($this->obtainMutex($filename, "r")) { * @return object wsdl The cached wsdl instance, null if the instance is not in the cache
// check for expired WSDL that must be removed from the cache * @access public
if ($this->cache_lifetime > 0) { */
if (file_exists($filename) && (time() - filemtime($filename) > $this->cache_lifetime)) { function get($wsdl) {
unlink($filename); $filename = $this->createFilename($wsdl);
$this->debug("Expired $wsdl ($filename) from cache"); if ($this->obtainMutex($filename, "r")) {
$this->releaseMutex($filename); // check for expired WSDL that must be removed from the cache
return null; if ($this->cache_lifetime > 0) {
} if (file_exists($filename) && (time() - filemtime($filename) > $this->cache_lifetime)) {
} unlink($filename);
// see what there is to return $this->debug("Expired $wsdl ($filename) from cache");
$fp = @fopen($filename, "r"); $this->releaseMutex($filename);
if ($fp) { return null;
$s = implode("", @file($filename)); }
fclose($fp); }
$this->debug("Got $wsdl ($filename) from cache"); // see what there is to return
} else { if (!file_exists($filename)) {
$s = null; $this->debug("$wsdl ($filename) not in cache (1)");
$this->debug("$wsdl ($filename) not in cache"); $this->releaseMutex($filename);
} return null;
$this->releaseMutex($filename); }
return (!is_null($s)) ? unserialize($s) : null; $fp = @fopen($filename, "r");
} else { if ($fp) {
$this->debug("Unable to obtain mutex for $filename in get"); $s = implode("", @file($filename));
} fclose($fp);
return null; $this->debug("Got $wsdl ($filename) from cache");
} } else {
$s = null;
/** $this->debug("$wsdl ($filename) not in cache (2)");
* obtains the local mutex }
* $this->releaseMutex($filename);
* @param string $filename The Filename of the Cache to lock return (!is_null($s)) ? unserialize($s) : null;
* @param string $mode The open-mode ("r" or "w") or the file - affects lock-mode } else {
* @return boolean Lock successfully obtained ?! $this->debug("Unable to obtain mutex for $filename in get");
* @access private }
*/ return null;
function obtainMutex($filename, $mode) { }
if (isset($this->fplock[md5($filename)])) {
$this->debug("Lock for $filename already exists"); /**
return false; * obtains the local mutex
} *
$this->fplock[md5($filename)] = fopen($filename.".lock", "w"); * @param string $filename The Filename of the Cache to lock
if ($mode == "r") { * @param string $mode The open-mode ("r" or "w") or the file - affects lock-mode
return flock($this->fplock[md5($filename)], LOCK_SH); * @return boolean Lock successfully obtained ?!
} else { * @access private
return flock($this->fplock[md5($filename)], LOCK_EX); */
} function obtainMutex($filename, $mode) {
} if (isset($this->fplock[md5($filename)])) {
$this->debug("Lock for $filename already exists");
/** return false;
* adds a wsdl instance to the cache }
* $this->fplock[md5($filename)] = fopen($filename.".lock", "w");
* @param object wsdl $wsdl_instance The wsdl instance to add if ($mode == "r") {
* @return boolean WSDL successfully cached return flock($this->fplock[md5($filename)], LOCK_SH);
* @access public } else {
*/ return flock($this->fplock[md5($filename)], LOCK_EX);
function put($wsdl_instance) { }
$filename = $this->createFilename($wsdl_instance->wsdl); }
$s = serialize($wsdl_instance);
if ($this->obtainMutex($filename, "w")) { /**
$fp = fopen($filename, "w"); * adds a wsdl instance to the cache
fputs($fp, $s); *
fclose($fp); * @param object wsdl $wsdl_instance The wsdl instance to add
$this->debug("Put $wsdl_instance->wsdl ($filename) in cache"); * @return boolean WSDL successfully cached
$this->releaseMutex($filename); * @access public
return true; */
} else { function put($wsdl_instance) {
$this->debug("Unable to obtain mutex for $filename in put"); $filename = $this->createFilename($wsdl_instance->wsdl);
} $s = serialize($wsdl_instance);
return false; if ($this->obtainMutex($filename, "w")) {
} $fp = fopen($filename, "w");
if (! $fp) {
/** $this->debug("Cannot write $wsdl_instance->wsdl ($filename) in cache");
* releases the local mutex $this->releaseMutex($filename);
* return false;
* @param string $filename The Filename of the Cache to lock }
* @return boolean Lock successfully released fputs($fp, $s);
* @access private fclose($fp);
*/ $this->debug("Put $wsdl_instance->wsdl ($filename) in cache");
function releaseMutex($filename) { $this->releaseMutex($filename);
$ret = flock($this->fplock[md5($filename)], LOCK_UN); return true;
fclose($this->fplock[md5($filename)]); } else {
unset($this->fplock[md5($filename)]); $this->debug("Unable to obtain mutex for $filename in put");
if (! $ret) { }
$this->debug("Not able to release lock for $filename"); return false;
} }
return $ret;
} /**
* releases the local mutex
/** *
* removes a wsdl instance from the cache * @param string $filename The Filename of the Cache to lock
* * @return boolean Lock successfully released
* @param string $wsdl The URL of the wsdl instance * @access private
* @return boolean Whether there was an instance to remove */
* @access public function releaseMutex($filename) {
*/ $ret = flock($this->fplock[md5($filename)], LOCK_UN);
function remove($wsdl) { fclose($this->fplock[md5($filename)]);
$filename = $this->createFilename($wsdl); unset($this->fplock[md5($filename)]);
// ignore errors obtaining mutex if (! $ret) {
$this->obtainMutex($filename, "w"); $this->debug("Not able to release lock for $filename");
$ret = unlink($filename); }
$this->debug("Removed ($ret) $wsdl ($filename) from cache"); return $ret;
$this->releaseMutex($filename); }
return $ret;
} /**
} * removes a wsdl instance from the cache
?> *
* @param string $wsdl The URL of the wsdl instance
* @return boolean Whether there was an instance to remove
* @access public
*/
function remove($wsdl) {
$filename = $this->createFilename($wsdl);
if (!file_exists($filename)) {
$this->debug("$wsdl ($filename) not in cache to be removed");
return false;
}
// ignore errors obtaining mutex
$this->obtainMutex($filename, "w");
$ret = unlink($filename);
$this->debug("Removed ($ret) $wsdl ($filename) from cache");
$this->releaseMutex($filename);
return $ret;
}
}
/**
* For backward compatibility
*/
class wsdlcache extends nusoap_wsdlcache {
}
?>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,478 +1,501 @@
<?php <?php
/* /*
$Id$ $Id$
NuSOAP - Web Services Toolkit for PHP NuSOAP - Web Services Toolkit for PHP
Copyright (c) 2002 NuSphere Corporation Copyright (c) 2002 NuSphere Corporation
This library is free software; you can redistribute it and/or This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version. version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful, This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details. Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
If you have any questions or comments, please email: The NuSOAP project home is:
http://sourceforge.net/projects/nusoap/
Dietrich Ayala
dietrich@ganx4.com The primary support for NuSOAP is the mailing list:
http://dietrich.ganx4.com/nusoap nusoap-general@lists.sourceforge.net
NuSphere Corporation If you have any questions or comments, please email:
http://www.nusphere.com
Dietrich Ayala
*/ dietrich@ganx4.com
http://dietrich.ganx4.com/nusoap
/*require_once('nusoap.php');*/
/* PEAR Mail_MIME library */ NuSphere Corporation
require_once('Mail/mimeDecode.php'); http://www.nusphere.com
require_once('Mail/mimePart.php');
*/
/**
* soapclientmime client supporting MIME attachments defined at /*require_once('nusoap.php');*/
* http://www.w3.org/TR/SOAP-attachments. It depends on the PEAR Mail_MIME library. /* PEAR Mail_MIME library */
* require_once('Mail/mimeDecode.php');
* @author Scott Nichol <snichol@sourceforge.net> require_once('Mail/mimePart.php');
* @author Thanks to Guillaume and Henning Reich for posting great attachment code to the mail list
* @version $Id$ /**
* @access public * nusoap_client_mime client supporting MIME attachments defined at
*/ * http://www.w3.org/TR/SOAP-attachments. It depends on the PEAR Mail_MIME library.
class soapclientmime extends soapclient { *
/** * @author Scott Nichol <snichol@users.sourceforge.net>
* @var array Each array element in the return is an associative array with keys * @author Thanks to Guillaume and Henning Reich for posting great attachment code to the mail list
* data, filename, contenttype, cid * @version $Id$
* @access private * @access public
*/ */
var $requestAttachments = array(); class nusoap_client_mime extends nusoap_client {
/** /**
* @var array Each array element in the return is an associative array with keys * @var array Each array element in the return is an associative array with keys
* data, filename, contenttype, cid * data, filename, contenttype, cid
* @access private * @access private
*/ */
var $responseAttachments; var $requestAttachments = array();
/** /**
* @var string * @var array Each array element in the return is an associative array with keys
* @access private * data, filename, contenttype, cid
*/ * @access private
var $mimeContentType; */
var $responseAttachments;
/** /**
* adds a MIME attachment to the current request. * @var string
* * @access private
* If the $data parameter contains an empty string, this method will read */
* the contents of the file named by the $filename parameter. var $mimeContentType;
*
* If the $cid parameter is false, this method will generate the cid. /**
* * adds a MIME attachment to the current request.
* @param string $data The data of the attachment *
* @param string $filename The filename of the attachment (default is empty string) * If the $data parameter contains an empty string, this method will read
* @param string $contenttype The MIME Content-Type of the attachment (default is application/octet-stream) * the contents of the file named by the $filename parameter.
* @param string $cid The content-id (cid) of the attachment (default is false) *
* @return string The content-id (cid) of the attachment * If the $cid parameter is false, this method will generate the cid.
* @access public *
*/ * @param string $data The data of the attachment
function addAttachment($data, $filename = '', $contenttype = 'application/octet-stream', $cid = false) { * @param string $filename The filename of the attachment (default is empty string)
if (! $cid) { * @param string $contenttype The MIME Content-Type of the attachment (default is application/octet-stream)
$cid = md5(uniqid(time())); * @param string $cid The content-id (cid) of the attachment (default is false)
} * @return string The content-id (cid) of the attachment
* @access public
$info['data'] = $data; */
$info['filename'] = $filename; function addAttachment($data, $filename = '', $contenttype = 'application/octet-stream', $cid = false) {
$info['contenttype'] = $contenttype; if (! $cid) {
$info['cid'] = $cid; $cid = md5(uniqid(time()));
}
$this->requestAttachments[] = $info;
$info['data'] = $data;
return $cid; $info['filename'] = $filename;
} $info['contenttype'] = $contenttype;
$info['cid'] = $cid;
/**
* clears the MIME attachments for the current request. $this->requestAttachments[] = $info;
*
* @access public return $cid;
*/ }
function clearAttachments() {
$this->requestAttachments = array(); /**
} * clears the MIME attachments for the current request.
*
/** * @access public
* gets the MIME attachments from the current response. */
* function clearAttachments() {
* Each array element in the return is an associative array with keys $this->requestAttachments = array();
* data, filename, contenttype, cid. These keys correspond to the parameters }
* for addAttachment.
* /**
* @return array The attachments. * gets the MIME attachments from the current response.
* @access public *
*/ * Each array element in the return is an associative array with keys
function getAttachments() { * data, filename, contenttype, cid. These keys correspond to the parameters
return $this->responseAttachments; * for addAttachment.
} *
* @return array The attachments.
/** * @access public
* gets the HTTP body for the current request. */
* function getAttachments() {
* @param string $soapmsg The SOAP payload return $this->responseAttachments;
* @return string The HTTP body, which includes the SOAP payload }
* @access private
*/ /**
function getHTTPBody($soapmsg) { * gets the HTTP body for the current request.
if (count($this->requestAttachments) > 0) { *
$params['content_type'] = 'multipart/related; type=text/xml'; * @param string $soapmsg The SOAP payload
$mimeMessage =& new Mail_mimePart('', $params); * @return string The HTTP body, which includes the SOAP payload
unset($params); * @access private
*/
$params['content_type'] = 'text/xml'; function getHTTPBody($soapmsg) {
$params['encoding'] = '8bit'; if (count($this->requestAttachments) > 0) {
$params['charset'] = $this->soap_defencoding; $params['content_type'] = 'multipart/related; type="text/xml"';
$mimeMessage->addSubpart($soapmsg, $params); $mimeMessage =& new Mail_mimePart('', $params);
unset($params);
foreach ($this->requestAttachments as $att) {
unset($params); $params['content_type'] = 'text/xml';
$params['encoding'] = '8bit';
$params['content_type'] = $att['contenttype']; $params['charset'] = $this->soap_defencoding;
$params['encoding'] = 'base64'; $mimeMessage->addSubpart($soapmsg, $params);
$params['disposition'] = 'attachment';
$params['dfilename'] = $att['filename']; foreach ($this->requestAttachments as $att) {
$params['cid'] = $att['cid']; unset($params);
if ($att['data'] == '' && $att['filename'] <> '') { $params['content_type'] = $att['contenttype'];
if ($fd = fopen($att['filename'], 'rb')) { $params['encoding'] = 'base64';
$data = fread($fd, filesize($att['filename'])); $params['disposition'] = 'attachment';
fclose($fd); $params['dfilename'] = $att['filename'];
} else { $params['cid'] = $att['cid'];
$data = '';
} if ($att['data'] == '' && $att['filename'] <> '') {
$mimeMessage->addSubpart($data, $params); if ($fd = fopen($att['filename'], 'rb')) {
} else { $data = fread($fd, filesize($att['filename']));
$mimeMessage->addSubpart($att['data'], $params); fclose($fd);
} } else {
} $data = '';
}
$output = $mimeMessage->encode(); $mimeMessage->addSubpart($data, $params);
$mimeHeaders = $output['headers']; } else {
$mimeMessage->addSubpart($att['data'], $params);
foreach ($mimeHeaders as $k => $v) { }
$this->debug("MIME header $k: $v"); }
if (strtolower($k) == 'content-type') {
// PHP header() seems to strip leading whitespace starting $output = $mimeMessage->encode();
// the second line, so force everything to one line $mimeHeaders = $output['headers'];
$this->mimeContentType = str_replace("\r\n", " ", $v);
} foreach ($mimeHeaders as $k => $v) {
} $this->debug("MIME header $k: $v");
if (strtolower($k) == 'content-type') {
return $output['body']; // PHP header() seems to strip leading whitespace starting
} // the second line, so force everything to one line
$this->mimeContentType = str_replace("\r\n", " ", $v);
return parent::getHTTPBody($soapmsg); }
} }
/** return $output['body'];
* gets the HTTP content type for the current request. }
*
* Note: getHTTPBody must be called before this. return parent::getHTTPBody($soapmsg);
* }
* @return string the HTTP content type for the current request.
* @access private /**
*/ * gets the HTTP content type for the current request.
function getHTTPContentType() { *
if (count($this->requestAttachments) > 0) { * Note: getHTTPBody must be called before this.
return $this->mimeContentType; *
} * @return string the HTTP content type for the current request.
return parent::getHTTPContentType(); * @access private
} */
function getHTTPContentType() {
/** if (count($this->requestAttachments) > 0) {
* gets the HTTP content type charset for the current request. return $this->mimeContentType;
* returns false for non-text content types. }
* return parent::getHTTPContentType();
* Note: getHTTPBody must be called before this. }
*
* @return string the HTTP content type charset for the current request. /**
* @access private * gets the HTTP content type charset for the current request.
*/ * returns false for non-text content types.
function getHTTPContentTypeCharset() { *
if (count($this->requestAttachments) > 0) { * Note: getHTTPBody must be called before this.
return false; *
} * @return string the HTTP content type charset for the current request.
return parent::getHTTPContentTypeCharset(); * @access private
} */
function getHTTPContentTypeCharset() {
/** if (count($this->requestAttachments) > 0) {
* processes SOAP message returned from server return false;
* }
* @param array $headers The HTTP headers return parent::getHTTPContentTypeCharset();
* @param string $data unprocessed response data from server }
* @return mixed value of the message, decoded into a PHP type
* @access private /**
*/ * processes SOAP message returned from server
function parseResponse($headers, $data) { *
$this->debug('Entering parseResponse() for payload of length ' . strlen($data) . ' and type of ' . $headers['content-type']); * @param array $headers The HTTP headers
$this->responseAttachments = array(); * @param string $data unprocessed response data from server
if (strstr($headers['content-type'], 'multipart/related')) { * @return mixed value of the message, decoded into a PHP type
$this->debug('Decode multipart/related'); * @access private
$input = ''; */
foreach ($headers as $k => $v) { function parseResponse($headers, $data) {
$input .= "$k: $v\r\n"; $this->debug('Entering parseResponse() for payload of length ' . strlen($data) . ' and type of ' . $headers['content-type']);
} $this->responseAttachments = array();
$params['input'] = $input . "\r\n" . $data; if (strstr($headers['content-type'], 'multipart/related')) {
$params['include_bodies'] = true; $this->debug('Decode multipart/related');
$params['decode_bodies'] = true; $input = '';
$params['decode_headers'] = true; foreach ($headers as $k => $v) {
$input .= "$k: $v\r\n";
$structure = Mail_mimeDecode::decode($params); }
$params['input'] = $input . "\r\n" . $data;
foreach ($structure->parts as $part) { $params['include_bodies'] = true;
if (!isset($part->disposition)) { $params['decode_bodies'] = true;
$this->debug('Have root part of type ' . $part->headers['content-type']); $params['decode_headers'] = true;
$return = parent::parseResponse($part->headers, $part->body);
} else { $structure = Mail_mimeDecode::decode($params);
$this->debug('Have an attachment of type ' . $part->headers['content-type']);
$info['data'] = $part->body; foreach ($structure->parts as $part) {
$info['filename'] = isset($part->d_parameters['filename']) ? $part->d_parameters['filename'] : ''; if (!isset($part->disposition) && (strstr($part->headers['content-type'], 'text/xml'))) {
$info['contenttype'] = $part->headers['content-type']; $this->debug('Have root part of type ' . $part->headers['content-type']);
$info['cid'] = $part->headers['content-id']; $root = $part->body;
$this->responseAttachments[] = $info; $return = parent::parseResponse($part->headers, $part->body);
} } else {
} $this->debug('Have an attachment of type ' . $part->headers['content-type']);
$info['data'] = $part->body;
if (isset($return)) { $info['filename'] = isset($part->d_parameters['filename']) ? $part->d_parameters['filename'] : '';
return $return; $info['contenttype'] = $part->headers['content-type'];
} $info['cid'] = $part->headers['content-id'];
$this->responseAttachments[] = $info;
$this->setError('No root part found in multipart/related content'); }
return; }
}
$this->debug('Not multipart/related'); if (isset($return)) {
return parent::parseResponse($headers, $data); $this->responseData = $root;
} return $return;
} }
/** $this->setError('No root part found in multipart/related content');
* nusoapservermime server supporting MIME attachments defined at return '';
* http://www.w3.org/TR/SOAP-attachments. It depends on the PEAR Mail_MIME library. }
* $this->debug('Not multipart/related');
* @author Scott Nichol <snichol@sourceforge.net> return parent::parseResponse($headers, $data);
* @author Thanks to Guillaume and Henning Reich for posting great attachment code to the mail list }
* @version $Id$ }
* @access public
*/ /*
class nusoapservermime extends soap_server { * For backwards compatiblity, define soapclientmime unless the PHP SOAP extension is loaded.
/** */
* @var array Each array element in the return is an associative array with keys if (!extension_loaded('soap')) {
* data, filename, contenttype, cid class soapclientmime extends nusoap_client_mime {
* @access private }
*/ }
var $requestAttachments = array();
/** /**
* @var array Each array element in the return is an associative array with keys * nusoap_server_mime server supporting MIME attachments defined at
* data, filename, contenttype, cid * http://www.w3.org/TR/SOAP-attachments. It depends on the PEAR Mail_MIME library.
* @access private *
*/ * @author Scott Nichol <snichol@users.sourceforge.net>
var $responseAttachments; * @author Thanks to Guillaume and Henning Reich for posting great attachment code to the mail list
/** * @version $Id$
* @var string * @access public
* @access private */
*/ class nusoap_server_mime extends nusoap_server {
var $mimeContentType; /**
* @var array Each array element in the return is an associative array with keys
/** * data, filename, contenttype, cid
* adds a MIME attachment to the current response. * @access private
* */
* If the $data parameter contains an empty string, this method will read var $requestAttachments = array();
* the contents of the file named by the $filename parameter. /**
* * @var array Each array element in the return is an associative array with keys
* If the $cid parameter is false, this method will generate the cid. * data, filename, contenttype, cid
* * @access private
* @param string $data The data of the attachment */
* @param string $filename The filename of the attachment (default is empty string) var $responseAttachments;
* @param string $contenttype The MIME Content-Type of the attachment (default is application/octet-stream) /**
* @param string $cid The content-id (cid) of the attachment (default is false) * @var string
* @return string The content-id (cid) of the attachment * @access private
* @access public */
*/ var $mimeContentType;
function addAttachment($data, $filename = '', $contenttype = 'application/octet-stream', $cid = false) {
if (! $cid) { /**
$cid = md5(uniqid(time())); * adds a MIME attachment to the current response.
} *
* If the $data parameter contains an empty string, this method will read
$info['data'] = $data; * the contents of the file named by the $filename parameter.
$info['filename'] = $filename; *
$info['contenttype'] = $contenttype; * If the $cid parameter is false, this method will generate the cid.
$info['cid'] = $cid; *
* @param string $data The data of the attachment
$this->responseAttachments[] = $info; * @param string $filename The filename of the attachment (default is empty string)
* @param string $contenttype The MIME Content-Type of the attachment (default is application/octet-stream)
return $cid; * @param string $cid The content-id (cid) of the attachment (default is false)
} * @return string The content-id (cid) of the attachment
* @access public
/** */
* clears the MIME attachments for the current response. function addAttachment($data, $filename = '', $contenttype = 'application/octet-stream', $cid = false) {
* if (! $cid) {
* @access public $cid = md5(uniqid(time()));
*/ }
function clearAttachments() {
$this->responseAttachments = array(); $info['data'] = $data;
} $info['filename'] = $filename;
$info['contenttype'] = $contenttype;
/** $info['cid'] = $cid;
* gets the MIME attachments from the current request.
* $this->responseAttachments[] = $info;
* Each array element in the return is an associative array with keys
* data, filename, contenttype, cid. These keys correspond to the parameters return $cid;
* for addAttachment. }
*
* @return array The attachments. /**
* @access public * clears the MIME attachments for the current response.
*/ *
function getAttachments() { * @access public
return $this->requestAttachments; */
} function clearAttachments() {
$this->responseAttachments = array();
/** }
* gets the HTTP body for the current response.
* /**
* @param string $soapmsg The SOAP payload * gets the MIME attachments from the current request.
* @return string The HTTP body, which includes the SOAP payload *
* @access private * Each array element in the return is an associative array with keys
*/ * data, filename, contenttype, cid. These keys correspond to the parameters
function getHTTPBody($soapmsg) { * for addAttachment.
if (count($this->responseAttachments) > 0) { *
$params['content_type'] = 'multipart/related; type=text/xml'; * @return array The attachments.
$mimeMessage =& new Mail_mimePart('', $params); * @access public
unset($params); */
function getAttachments() {
$params['content_type'] = 'text/xml'; return $this->requestAttachments;
$params['encoding'] = '8bit'; }
$params['charset'] = $this->soap_defencoding;
$mimeMessage->addSubpart($soapmsg, $params); /**
* gets the HTTP body for the current response.
foreach ($this->responseAttachments as $att) { *
unset($params); * @param string $soapmsg The SOAP payload
* @return string The HTTP body, which includes the SOAP payload
$params['content_type'] = $att['contenttype']; * @access private
$params['encoding'] = 'base64'; */
$params['disposition'] = 'attachment'; function getHTTPBody($soapmsg) {
$params['dfilename'] = $att['filename']; if (count($this->responseAttachments) > 0) {
$params['cid'] = $att['cid']; $params['content_type'] = 'multipart/related; type="text/xml"';
$mimeMessage =& new Mail_mimePart('', $params);
if ($att['data'] == '' && $att['filename'] <> '') { unset($params);
if ($fd = fopen($att['filename'], 'rb')) {
$data = fread($fd, filesize($att['filename'])); $params['content_type'] = 'text/xml';
fclose($fd); $params['encoding'] = '8bit';
} else { $params['charset'] = $this->soap_defencoding;
$data = ''; $mimeMessage->addSubpart($soapmsg, $params);
}
$mimeMessage->addSubpart($data, $params); foreach ($this->responseAttachments as $att) {
} else { unset($params);
$mimeMessage->addSubpart($att['data'], $params);
} $params['content_type'] = $att['contenttype'];
} $params['encoding'] = 'base64';
$params['disposition'] = 'attachment';
$output = $mimeMessage->encode(); $params['dfilename'] = $att['filename'];
$mimeHeaders = $output['headers']; $params['cid'] = $att['cid'];
foreach ($mimeHeaders as $k => $v) { if ($att['data'] == '' && $att['filename'] <> '') {
$this->debug("MIME header $k: $v"); if ($fd = fopen($att['filename'], 'rb')) {
if (strtolower($k) == 'content-type') { $data = fread($fd, filesize($att['filename']));
// PHP header() seems to strip leading whitespace starting fclose($fd);
// the second line, so force everything to one line } else {
$this->mimeContentType = str_replace("\r\n", " ", $v); $data = '';
} }
} $mimeMessage->addSubpart($data, $params);
} else {
return $output['body']; $mimeMessage->addSubpart($att['data'], $params);
} }
}
return parent::getHTTPBody($soapmsg);
} $output = $mimeMessage->encode();
$mimeHeaders = $output['headers'];
/**
* gets the HTTP content type for the current response. foreach ($mimeHeaders as $k => $v) {
* $this->debug("MIME header $k: $v");
* Note: getHTTPBody must be called before this. if (strtolower($k) == 'content-type') {
* // PHP header() seems to strip leading whitespace starting
* @return string the HTTP content type for the current response. // the second line, so force everything to one line
* @access private $this->mimeContentType = str_replace("\r\n", " ", $v);
*/ }
function getHTTPContentType() { }
if (count($this->responseAttachments) > 0) {
return $this->mimeContentType; return $output['body'];
} }
return parent::getHTTPContentType();
} return parent::getHTTPBody($soapmsg);
}
/**
* gets the HTTP content type charset for the current response. /**
* returns false for non-text content types. * gets the HTTP content type for the current response.
* *
* Note: getHTTPBody must be called before this. * Note: getHTTPBody must be called before this.
* *
* @return string the HTTP content type charset for the current response. * @return string the HTTP content type for the current response.
* @access private * @access private
*/ */
function getHTTPContentTypeCharset() { function getHTTPContentType() {
if (count($this->responseAttachments) > 0) { if (count($this->responseAttachments) > 0) {
return false; return $this->mimeContentType;
} }
return parent::getHTTPContentTypeCharset(); return parent::getHTTPContentType();
} }
/** /**
* processes SOAP message received from client * gets the HTTP content type charset for the current response.
* * returns false for non-text content types.
* @param array $headers The HTTP headers *
* @param string $data unprocessed request data from client * Note: getHTTPBody must be called before this.
* @return mixed value of the message, decoded into a PHP type *
* @access private * @return string the HTTP content type charset for the current response.
*/ * @access private
function parseRequest($headers, $data) { */
$this->debug('Entering parseRequest() for payload of length ' . strlen($data) . ' and type of ' . $headers['content-type']); function getHTTPContentTypeCharset() {
$this->requestAttachments = array(); if (count($this->responseAttachments) > 0) {
if (strstr($headers['content-type'], 'multipart/related')) { return false;
$this->debug('Decode multipart/related'); }
$input = ''; return parent::getHTTPContentTypeCharset();
foreach ($headers as $k => $v) { }
$input .= "$k: $v\r\n";
} /**
$params['input'] = $input . "\r\n" . $data; * processes SOAP message received from client
$params['include_bodies'] = true; *
$params['decode_bodies'] = true; * @param array $headers The HTTP headers
$params['decode_headers'] = true; * @param string $data unprocessed request data from client
* @return mixed value of the message, decoded into a PHP type
$structure = Mail_mimeDecode::decode($params); * @access private
*/
foreach ($structure->parts as $part) { function parseRequest($headers, $data) {
if (!isset($part->disposition)) { $this->debug('Entering parseRequest() for payload of length ' . strlen($data) . ' and type of ' . $headers['content-type']);
$this->debug('Have root part of type ' . $part->headers['content-type']); $this->requestAttachments = array();
$return = parent::parseRequest($part->headers, $part->body); if (strstr($headers['content-type'], 'multipart/related')) {
} else { $this->debug('Decode multipart/related');
$this->debug('Have an attachment of type ' . $part->headers['content-type']); $input = '';
$info['data'] = $part->body; foreach ($headers as $k => $v) {
$info['filename'] = isset($part->d_parameters['filename']) ? $part->d_parameters['filename'] : ''; $input .= "$k: $v\r\n";
$info['contenttype'] = $part->headers['content-type']; }
$info['cid'] = $part->headers['content-id']; $params['input'] = $input . "\r\n" . $data;
$this->requestAttachments[] = $info; $params['include_bodies'] = true;
} $params['decode_bodies'] = true;
} $params['decode_headers'] = true;
if (isset($return)) { $structure = Mail_mimeDecode::decode($params);
return $return;
} foreach ($structure->parts as $part) {
if (!isset($part->disposition) && (strstr($part->headers['content-type'], 'text/xml'))) {
$this->setError('No root part found in multipart/related content'); $this->debug('Have root part of type ' . $part->headers['content-type']);
return; $return = parent::parseRequest($part->headers, $part->body);
} } else {
$this->debug('Not multipart/related'); $this->debug('Have an attachment of type ' . $part->headers['content-type']);
return parent::parseRequest($headers, $data); $info['data'] = $part->body;
} $info['filename'] = isset($part->d_parameters['filename']) ? $part->d_parameters['filename'] : '';
} $info['contenttype'] = $part->headers['content-type'];
?> $info['cid'] = $part->headers['content-id'];
$this->requestAttachments[] = $info;
}
}
if (isset($return)) {
return $return;
}
$this->setError('No root part found in multipart/related content');
return;
}
$this->debug('Not multipart/related');
return parent::parseRequest($headers, $data);
}
}
/*
* For backwards compatiblity
*/
class nusoapservermime extends nusoap_server_mime {
}
?>