public function testResponseShouldAggregateMessageHeaders() { $this->header1 = new Value\MessageHeader('foo', false, 'bar'); $this->header2 = new Value\MessageHeader('bar', true, 'baz'); $this->_response->addAmfHeader($this->header1)->addAmfHeader($this->header2); $headers = $this->_response->getAmfHeaders(); $this->assertEquals(2, count($headers)); $this->assertContains($this->header1, $headers); $this->assertContains($this->header2, $headers); }
/** * Test Amf0 credentials sent to the server * */ public function testAmf0CredentialsInHeader() { $myRequest = file_get_contents(dirname(__FILE__) . '/Request/mock/credentialsheaderAmf0.bin'); // send the mock object request to be deserialized $this->_request->initialize($myRequest); // Make sure that no headers where recieved $this->assertEquals(1, sizeof($this->_request->getAmfHeaders())); $requestHeaders = $this->_request->getAmfHeaders(); $this->assertTrue($requestHeaders[0] instanceof Zend_Amf_Value_MessageHeader); $this->assertEquals('Credentials', $requestHeaders[0]->name); $this->assertFalse($requestHeaders[0]->mustRead); $data = $requestHeaders[0]->data; // Check the resulting header $this->assertEquals('admin', $data->userid); $this->assertEquals('pw123', $data->password); }
/** * 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(); }
public function testResponseHeadersShouldBeSerializedWhenWritingMessage() { $this->testResponseShouldAggregateMessageHeaders(); $this->_response->finalize(); $response = $this->_response->getResponse(); $request = new Zend_Amf_Request(); $request->initialize($response); $headers = $request->getAmfHeaders(); $this->assertEquals(2, count($headers)); }