public function amfRequest($service, $data) { $body = new MessageBody($service, "/1", array($data)); $request = new Request(); $streamRequest = new StreamRequest(); $streamRequest->setObjectEncoding(Constants::AMF3_OBJECT_ENCODING); $streamRequest->addAmfBody($body); $request->setStreamRequest($streamRequest); $this->amfRequest = $this->filterAmfRequest($request); if ($this->insulated) { $this->amfResponse = $this->doAmfRequestInProcess($this->amfRequest); } else { $this->amfResponse = $this->doAmfRequest($this->amfRequest); } $response = $this->filterAmfResponse($this->amfResponse); return $response; }
public function testLogout() { $this->_server->setAuth(new TestAsset\Authentication\RightPassword("testuser", "testrole")); $this->_acl->addRole(new Role\GenericRole("testrole")); $this->_acl->allow("testrole", null, null); $this->_server->setAcl($this->_acl); $resp = $this->_callServiceAuth("testuser", ""); $this->assertTrue($resp[0]->getData() instanceof Messaging\AcknowledgeMessage); $this->assertContains("hello", $resp[1]->getData()); // After logout same request should not be allowed $this->setUp(); $this->_server->setAuth(new TestAsset\Authentication\RightPassword("testuser", "testrole")); $this->_server->setAcl($this->_acl); $request = new Request\StreamRequest(); $request->setObjectEncoding(0x3); $this->_addLogout($request); $this->_addServiceCall($request); $this->_server->handle($request); $resp = $this->_server->getResponse()->getAmfBodies(); $this->assertTrue($resp[0]->getData() instanceof Messaging\AcknowledgeMessage); $data = $resp[1]->getData(); $this->assertTrue($data instanceof Messaging\ErrorMessage); $this->assertContains("not allowed", $data->faultString); }
public function testCtorExcection() { $this->_server->setClass('ZendTest\\Amf\\TestAsset\\Server\\testException'); $this->_server->setProduction(false); $message = new Messaging\RemotingMessage(); $message->operation = 'hello'; $message->source = 'ZendTest\\Amf\\TestAsset\\Server\\testException'; $message->body = array("123"); // create a mock message body to place th remoting message inside $newBody = new Value\MessageBody(null, "/1", $message); $request = new Request\StreamRequest(); // at the requested service to a request $request->addAmfBody($newBody); $request->setObjectEncoding(0x3); // let the server handle mock request $this->_server->handle($request); $response = $this->_server->getResponse()->getAMFBodies(); $this->assertTrue($response[0]->getData() instanceof Messaging\ErrorMessage); $this->assertContains("Oops, exception!", $response[0]->getData()->faultString); }
/** * Takes the deserialized AMF request and performs any operations. * * @todo should implement and SPL observer pattern for custom AMF headers * @todo DescribeService support * @param Request\StreamRequest $request * @return Response\StreamResponse */ protected function _handle(Request\StreamRequest $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[Constants::CREDENTIALS_HEADER]) && isset($headers[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[Constants::CREDENTIALS_HEADER]->userid, $headers[Constants::CREDENTIALS_HEADER]->password)) { // use RequestPersistentHeader to clear credentials $response->addAmfHeader( new Value\MessageHeader( Constants::PERSISTENT_HEADER, false, new Value\MessageHeader( Constants::CREDENTIALS_HEADER, false, null))); $handleAuth = false; } } if ($objectEncoding == 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 Value\Messaging\CommandMessage) { // async call with command message $return = $this->_loadCommandMessage($message); } elseif ($message instanceof Value\Messaging\RemotingMessage) { $return = new 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 = Constants::RESULT_METHOD; } catch (\Exception $e) { $return = $this->_errorMessage($objectEncoding, $message, $e->getMessage(), $e->getTraceAsString(),$e->getCode(), $e->getLine()); $responseType = Constants::STATUS_METHOD; } $responseURI = $body->getResponseURI() . $responseType; $newBody = new 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 Value\MessageHeader(Constants::URL_APPEND_HEADER, false, $sessionValue); $response->addAmfHeader($sessionHeader); } // serialize the response and return serialized body. $response->finalize(); }
protected function handleRaw(StreamRequest $request) { // Get the object encoding of the request. $objectEncoding = $request->getObjectEncoding(); // create a stream response object to place the output from the services. $response = new StreamResponse(); // set response encoding $response->setObjectEncoding($objectEncoding); // Iterate through each of the service calls in the AMF request $bodies = $request->getAmfBodies(); foreach ($bodies as $body) { $message = null; /* @var $body \Zend\Amf\Value\MessageBody */ try { if (Constants::AMF0_OBJECT_ENCODING === $objectEncoding) { // 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->handleBodyRequest(new BodyRequest($method, $body->getData(), $source)); } else { throw new \RuntimeException(sprintf('Unable to find the Amf service. targetURI: %s, service: %s', $targetURI, $source)); } } else { // AMF3 read message type $message = $body->getData(); if ($message instanceof CommandMessage) { // async call with command message $return = $this->loadCommandMessage($message); } elseif ($message instanceof RemotingMessage) { $return = new AcknowledgeMessage($message); $return->body = $this->handleBodyRequest(new BodyRequest($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->handleBodyRequest(new BodyRequest($method, $body->getData(), $source)); } else { throw new \RuntimeException(sprintf('Unable to find the Amf service. targetURI: %s, service: %s', $targetURI, $source)); } } } $responseType = Constants::RESULT_METHOD; } catch (\Exception $e) { try { $return = $this->handleException($e, $body); $responseType = Constants::RESULT_METHOD; if (Constants::AMF3_OBJECT_ENCODING === $objectEncoding) { $newMessage = new AcknowledgeMessage($message); $newMessage->body = $return; $return = $newMessage; } } catch (\Exception $e) { $return = $this->errorMessage($objectEncoding, $message, $e->getMessage(), $e->getTraceAsString(), $e->getCode(), $e->getLine()); $responseType = Constants::STATUS_METHOD; } } if ($return instanceof AcknowledgeMessage) { $return->headers->log = $this->log; } $this->log = array(); $responseURI = $body->getResponseURI() . $responseType; $newBody = new MessageBody($responseURI, null, $return); $response->addAmfBody($newBody); } return $response; }