From 107a2904c1adc95298b061d19ac02da475baf6cf Mon Sep 17 00:00:00 2001 From: Andreas Schamberger Date: Sun, 29 Jan 2012 14:38:12 +0100 Subject: [PATCH] add XML mime filter --- src/BeSimple/SoapClient/SoapClient.php | 2 + src/BeSimple/SoapClient/XmlMimeFilter.php | 75 +++++++++++++++++++++++ tests/AxisInterop/MTOM.php | 27 +++++++- tests/AxisInterop/MTOM.wsdl | 4 +- tests/bootstrap.php | 2 +- 5 files changed, 105 insertions(+), 5 deletions(-) create mode 100644 src/BeSimple/SoapClient/XmlMimeFilter.php diff --git a/src/BeSimple/SoapClient/SoapClient.php b/src/BeSimple/SoapClient/SoapClient.php index 90d8f1d..afa6515 100644 --- a/src/BeSimple/SoapClient/SoapClient.php +++ b/src/BeSimple/SoapClient/SoapClient.php @@ -277,6 +277,8 @@ class SoapClient extends \SoapClient $converter = new SwaTypeConverter(); $converter->setKernel($this->soapKernel); } elseif (Helper::ATTACHMENTS_TYPE_MTOM === $options['attachment_type']) { + $xmlMimeFilter = new XmlMimeFilter($options['attachment_type']); + $this->soapKernel->registerFilter($xmlMimeFilter); $converter = new MtomTypeConverter(); $converter->setKernel($this->soapKernel); } diff --git a/src/BeSimple/SoapClient/XmlMimeFilter.php b/src/BeSimple/SoapClient/XmlMimeFilter.php new file mode 100644 index 0000000..142a271 --- /dev/null +++ b/src/BeSimple/SoapClient/XmlMimeFilter.php @@ -0,0 +1,75 @@ + + * (c) Francis Besset + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace BeSimple\SoapClient; + +use BeSimple\SoapCommon\FilterHelper; +use BeSimple\SoapCommon\Helper; +use BeSimple\SoapCommon\Mime\MultiPart as MimeMultiPart; +use BeSimple\SoapCommon\Mime\Parser as MimeParser; +use BeSimple\SoapCommon\Mime\Part as MimePart; +use BeSimple\SoapCommon\SoapRequest; +use BeSimple\SoapCommon\SoapRequestFilter; +use BeSimple\SoapCommon\SoapResponse; +use BeSimple\SoapCommon\SoapResponseFilter; + +/** + * XML MIME filter that fixes the namespace of xmime:contentType attribute. + * + * @author Andreas Schamberger + */ +class XmlMimeFilter implements SoapRequestFilter +{ + /** + * Reset all properties to default values. + */ + public function resetFilter() + { + } + + /** + * Modify the given request XML. + * + * @param \BeSimple\SoapCommon\SoapRequest $request SOAP request + * + * @return void + */ + public function filterRequest(SoapRequest $request) + { + // get \DOMDocument from SOAP request + $dom = $request->getContentDocument(); + + // create FilterHelper + $filterHelper = new FilterHelper($dom); + + // add the neccessary namespaces + $filterHelper->addNamespace(Helper::PFX_XMLMIME, Helper::NS_XMLMIME); + + // get xsd:base64binary elements + $xpath = new \DOMXPath($dom); + $xpath->registerNamespace('XOP', Helper::NS_XOP); + $query = '//XOP:Include/..'; + $nodes = $xpath->query($query); + + // exchange attributes + if ($nodes->length > 0) { + foreach ($nodes as $node) { + if ($node->hasAttribute('contentType')) { + $contentType = $node->getAttribute('contentType'); + $node->removeAttribute('contentType'); + $filterHelper->setAttribute($node, Helper::NS_XMLMIME, 'contentType', $contentType); + } + } + } + + } +} \ No newline at end of file diff --git a/tests/AxisInterop/MTOM.php b/tests/AxisInterop/MTOM.php index cbfe886..2579c1d 100644 --- a/tests/AxisInterop/MTOM.php +++ b/tests/AxisInterop/MTOM.php @@ -7,12 +7,32 @@ require '../bootstrap.php'; echo '
';
 
+class base64Binary
+{
+    public $_;
+    public $contentType;
+}
+
+class AttachmentType
+{
+    public $fileName;
+    public $binaryData;
+}
+
+class AttachmentRequest extends AttachmentType
+{
+}
+
 $options = array(
     'soap_version'    => SOAP_1_1,
     'features'        => SOAP_SINGLE_ELEMENT_ARRAYS, // make sure that result is array for size=1
     'trace'           => true, // enables use of the methods  SoapClient->__getLastRequest,  SoapClient->__getLastRequestHeaders,  SoapClient->__getLastResponse and  SoapClient->__getLastResponseHeaders
     'attachment_type' => BeSimpleSoapHelper::ATTACHMENTS_TYPE_MTOM,
     'cache_wsdl'      => WSDL_CACHE_NONE,
+    'classmap'        => array(
+        'base64Binary'      => 'base64Binary',
+        'AttachmentRequest' => 'AttachmentRequest',
+    ),
 );
 
 /*
@@ -28,10 +48,13 @@ $sc = new BeSimpleSoapClient('MTOM.wsdl', $options);
 //var_dump($sc->__getTypes());
 
 try {
+    $b64 = new base64Binary();
+    $b64->_ = 'This is a test. :)';
+    $b64->contentType = 'text/plain';
 
-    $attachment = new stdClass();
+    $attachment = new AttachmentRequest();
     $attachment->fileName = 'test123.txt';
-    $attachment->binaryData = 'This is a test.';
+    $attachment->binaryData = $b64;
 
     var_dump($sc->attachment($attachment));
 
diff --git a/tests/AxisInterop/MTOM.wsdl b/tests/AxisInterop/MTOM.wsdl
index 178ee35..f0c9a6d 100644
--- a/tests/AxisInterop/MTOM.wsdl
+++ b/tests/AxisInterop/MTOM.wsdl
@@ -80,10 +80,10 @@
   
   
     
-      
+      
     
     
-      
+      
     
   
 
diff --git a/tests/bootstrap.php b/tests/bootstrap.php
index d2872c6..2fa215e 100644
--- a/tests/bootstrap.php
+++ b/tests/bootstrap.php
@@ -26,7 +26,7 @@ spl_autoload_register(function($class) {
             return true;
         }
     } elseif (0 === strpos($class, 'BeSimple\SoapCommon\\')) {
-        $path = __DIR__.'/../vendor/besimple-soapcommon/src/'.($class = strtr($class, '\\', '/')).'.php';
+        $path = __DIR__.'/../../BeSimpleSoapCommon/src/'.($class = strtr($class, '\\', '/')).'.php';
         if (file_exists($path) && is_readable($path)) {
             require_once $path;