Example #1
0
 /**
  * Constructor.
  *
  */
 public function __construct()
 {
     $this->request = new \Zend_Amf_Request_Http();
     $this->objectEncoding = $this->request->getObjectEncoding();
     $this->response = new \Zend_Amf_Response_Http();
     $this->response->setObjectEncoding($this->objectEncoding);
 }
Example #2
0
 public function testAmf3XmlParameterDeserializedToNativePhpSimpleXml()
 {
     $myRequest = file_get_contents(dirname(__FILE__) . '/Request/mock/xmlAmf3Request.bin');
     // send the mock object request to be deserialized
     $this->_request->initialize($myRequest);
     // Make sure the encoding type is properly set.
     $this->assertEquals(0x3, $this->_request->getObjectEncoding());
     // Make sure that no headers where recieved
     $this->assertEquals(0, sizeof($this->_request->getAmfHeaders()));
     // Make sure that the message body was set after deserialization
     $this->assertEquals(1, sizeof($this->_request->getAmfBodies()));
     $bodies = $this->_request->getAmfBodies();
     $this->assertTrue($bodies[0] instanceof Zend_Amf_Value_MessageBody);
     $message = $bodies[0]->getData();
     $this->assertTrue($message instanceof Zend_Amf_Value_Messaging_RemotingMessage);
     // Make sure that our endpoint is properly set.
     $this->assertEquals('returnXml', $message->operation);
     $this->assertEquals('RoundTrip', $message->source);
     $data = $message->body;
     // Make sure that we are dealing with a PHP simpleXml element
     $this->assertTrue($data[0] instanceof SimpleXMLElement);
     // Make sure that the xml was deserialized properly and check its value
     $this->assertEquals('hello', (string) $data[0]->p);
 }
Example #3
0
 /**
  * Takes the deserialized AMF request and performs any operations.
  *
  * @todo   should implement and SPL observer pattern for custom AMF headers
  * @todo   DescribeService support
  * @param  Zend_Amf_Request $request
  * @return Zend_Amf_Response
  * @throws Zend_Amf_server_Exception|Exception
  */
 protected function _handle(Zend_Amf_Request $request)
 {
     // Get the object encoding of the request.
     $objectEncoding = $request->getObjectEncoding();
     // create a response object to place the output from the services.
     $response = $this->getResponse();
     // set response encoding
     $response->setObjectEncoding($objectEncoding);
     $responseBody = $request->getAmfBodies();
     $handleAuth = false;
     if ($this->_auth) {
         $headers = $request->getAmfHeaders();
         if (isset($headers[Zend_Amf_Constants::CREDENTIALS_HEADER]) && isset($headers[Zend_Amf_Constants::CREDENTIALS_HEADER]->userid)) {
             $handleAuth = true;
         }
     }
     // Iterate through each of the service calls in the AMF request
     foreach ($responseBody as $body) {
         try {
             if ($handleAuth) {
                 if ($this->_handleAuth($headers[Zend_Amf_Constants::CREDENTIALS_HEADER]->userid, $headers[Zend_Amf_Constants::CREDENTIALS_HEADER]->password)) {
                     // use RequestPersistentHeader to clear credentials
                     $response->addAmfHeader(new Zend_Amf_Value_MessageHeader(Zend_Amf_Constants::PERSISTENT_HEADER, false, new Zend_Amf_Value_MessageHeader(Zend_Amf_Constants::CREDENTIALS_HEADER, false, null)));
                     $handleAuth = false;
                 }
             }
             if ($objectEncoding == Zend_Amf_Constants::AMF0_OBJECT_ENCODING) {
                 // AMF0 Object Encoding
                 $targetURI = $body->getTargetURI();
                 $message = '';
                 // Split the target string into its values.
                 $source = substr($targetURI, 0, strrpos($targetURI, '.'));
                 if ($source) {
                     // Break off method name from namespace into source
                     $method = substr(strrchr($targetURI, '.'), 1);
                     $return = $this->_dispatch($method, $body->getData(), $source);
                 } else {
                     // Just have a method name.
                     $return = $this->_dispatch($targetURI, $body->getData());
                 }
             } else {
                 // AMF3 read message type
                 $message = $body->getData();
                 if ($message instanceof Zend_Amf_Value_Messaging_CommandMessage) {
                     // async call with command message
                     $return = $this->_loadCommandMessage($message);
                 } elseif ($message instanceof Zend_Amf_Value_Messaging_RemotingMessage) {
                     require_once 'Zend/Amf/Value/Messaging/AcknowledgeMessage.php';
                     $return = new Zend_Amf_Value_Messaging_AcknowledgeMessage($message);
                     $return->body = $this->_dispatch($message->operation, $message->body, $message->source);
                 } else {
                     // Amf3 message sent with netConnection
                     $targetURI = $body->getTargetURI();
                     // Split the target string into its values.
                     $source = substr($targetURI, 0, strrpos($targetURI, '.'));
                     if ($source) {
                         // Break off method name from namespace into source
                         $method = substr(strrchr($targetURI, '.'), 1);
                         $return = $this->_dispatch($method, $body->getData(), $source);
                     } else {
                         // Just have a method name.
                         $return = $this->_dispatch($targetURI, $body->getData());
                     }
                 }
             }
             $responseType = Zend_AMF_Constants::RESULT_METHOD;
         } catch (Exception $e) {
             $return = $this->_errorMessage($objectEncoding, $message, $e->getMessage(), $e->getTraceAsString(), $e->getCode(), $e->getLine());
             $responseType = Zend_AMF_Constants::STATUS_METHOD;
         }
         $responseURI = $body->getResponseURI() . $responseType;
         $newBody = new Zend_Amf_Value_MessageBody($responseURI, null, $return);
         $response->addAmfBody($newBody);
     }
     // Add a session header to the body if session is requested.
     if ($this->isSession()) {
         $currentID = session_id();
         $joint = "?";
         if (isset($_SERVER['QUERY_STRING'])) {
             if (!strpos($_SERVER['QUERY_STRING'], $currentID) !== FALSE) {
                 if (strrpos($_SERVER['QUERY_STRING'], "?") !== FALSE) {
                     $joint = "&";
                 }
             }
         }
         // create a new AMF message header with the session id as a variable.
         $sessionValue = $joint . $this->_sessionName . "=" . $currentID;
         $sessionHeader = new Zend_Amf_Value_MessageHeader(Zend_Amf_Constants::URL_APPEND_HEADER, false, $sessionValue);
         $response->addAmfHeader($sessionHeader);
     }
     // serialize the response and return serialized body.
     $response->finalize();
 }
Example #4
0
 /**
  * Takes the deserialized AMF request and performs any operations.
  *
  * @todo   should implement and SPL observer pattern for custom AMF headers
  * @todo   implement AMF header authentication
  * @param  Zend_Amf_Request $request
  * @return Zend_Amf_Response
  * @throws Zend_Amf_server_Exception|Exception
  */
 protected function _handle(Zend_Amf_Request $request)
 {
     // Get the object encoding of the request.
     $objectEncoding = $request->getObjectEncoding();
     // create a response object to place the output from the services.
     $response = $this->getResponse();
     // set reponse encoding
     $response->setObjectEncoding($objectEncoding);
     $responseBody = $request->getAmfBodies();
     // Iterate through each of the service calls in the AMF request
     foreach ($responseBody as $body) {
         try {
             if ($objectEncoding == Zend_Amf_Constants::AMF0_OBJECT_ENCODING) {
                 // AMF0 Object Encoding
                 $targetURI = $body->getTargetURI();
                 // Split the target string into its values.
                 $source = substr($targetURI, 0, strrpos($targetURI, '.'));
                 if ($source) {
                     // Break off method name from namespace into source
                     $method = substr(strrchr($targetURI, '.'), 1);
                     $return = $this->_dispatch($method, $body->getData(), $source);
                 } else {
                     // Just have a method name.
                     $return = $this->_dispatch($targetURI, $body->getData());
                 }
             } else {
                 // AMF3 read message type
                 $message = $body->getData();
                 if ($message instanceof Zend_Amf_Value_Messaging_CommandMessage) {
                     // async call with command message
                     $return = $this->_loadCommandMessage($message);
                 } elseif ($message instanceof Zend_Amf_Value_Messaging_RemotingMessage) {
                     require_once 'Zend/Amf/Value/Messaging/AcknowledgeMessage.php';
                     $return = new Zend_Amf_Value_Messaging_AcknowledgeMessage($message);
                     $return->body = $this->_dispatch($message->operation, $message->body, $message->source);
                 } else {
                     // Amf3 message sent with netConnection
                     $targetURI = $body->getTargetURI();
                     // Split the target string into its values.
                     $source = substr($targetURI, 0, strrpos($targetURI, '.'));
                     if ($source) {
                         // Break off method name from namespace into source
                         $method = substr(strrchr($targetURI, '.'), 1);
                         $return = $this->_dispatch($method, array($body->getData()), $source);
                     } else {
                         // Just have a method name.
                         $return = $this->_dispatch($targetURI, $body->getData());
                     }
                 }
             }
             $responseType = Zend_AMF_Constants::RESULT_METHOD;
         } catch (Exception $e) {
             switch ($objectEncoding) {
                 case Zend_Amf_Constants::AMF0_OBJECT_ENCODING:
                     $return = array('description' => $this->isProduction() ? '' : $e->getMessage(), 'detail' => $this->isProduction() ? '' : $e->getTraceAsString(), 'line' => $this->isProduction() ? 0 : $e->getLine(), 'code' => $e->getCode());
                     break;
                 case Zend_Amf_Constants::AMF3_OBJECT_ENCODING:
                     require_once 'Zend/Amf/Value/Messaging/ErrorMessage.php';
                     $return = new Zend_Amf_Value_Messaging_ErrorMessage($message);
                     $return->faultString = $this->isProduction() ? '' : $e->getMessage();
                     $return->faultCode = $e->getCode();
                     $return->faultDetail = $this->isProduction() ? '' : $e->getTraceAsString();
                     break;
             }
             $responseType = Zend_AMF_Constants::STATUS_METHOD;
         }
         $responseURI = $body->getResponseURI() . $responseType;
         $newBody = new Zend_Amf_Value_MessageBody($responseURI, null, $return);
         $response->addAmfBody($newBody);
     }
     // serialize the response and return serialized body.
     $response->finalize();
 }