We are no longer offering accounts on this server. Consider https://gitlab.freedesktop.org/ as a place to host projects.

Commit 5b51eeee authored by Craig Andrews's avatar Craig Andrews

Bump to version 1.0.0

parent f04dbc8f
...@@ -66,12 +66,13 @@ class Stomp ...@@ -66,12 +66,13 @@ class Stomp
protected $_sessionId; protected $_sessionId;
protected $_read_timeout_seconds = 60; protected $_read_timeout_seconds = 60;
protected $_read_timeout_milliseconds = 0; protected $_read_timeout_milliseconds = 0;
protected $_connect_timeout_seconds = 60;
/** /**
* Constructor * Constructor
* *
* @param string $brokerUri Broker URL * @param string $brokerUri Broker URL
* @throws Stomp_Exception * @throws StompException
*/ */
public function __construct ($brokerUri) public function __construct ($brokerUri)
{ {
...@@ -81,7 +82,7 @@ class Stomp ...@@ -81,7 +82,7 @@ class Stomp
/** /**
* Initialize connection * Initialize connection
* *
* @throws Stomp_Exception * @throws StompException
*/ */
protected function _init () protected function _init ()
{ {
...@@ -103,14 +104,14 @@ class Stomp ...@@ -103,14 +104,14 @@ class Stomp
} }
} else { } else {
require_once 'Stomp/Exception.php'; require_once 'Stomp/Exception.php';
throw new Stomp_Exception("Bad Broker URL {$this->_brokerUri}"); throw new StompException("Bad Broker URL {$this->_brokerUri}");
} }
} }
/** /**
* Process broker URL * Process broker URL
* *
* @param string $url Broker URL * @param string $url Broker URL
* @throws Stomp_Exception * @throws StompException
* @return boolean * @return boolean
*/ */
protected function _processUrl ($url) protected function _processUrl ($url)
...@@ -120,19 +121,19 @@ class Stomp ...@@ -120,19 +121,19 @@ class Stomp
array_push($this->_hosts, array($parsed['host'] , $parsed['port'] , $parsed['scheme'])); array_push($this->_hosts, array($parsed['host'] , $parsed['port'] , $parsed['scheme']));
} else { } else {
require_once 'Stomp/Exception.php'; require_once 'Stomp/Exception.php';
throw new Stomp_Exception("Bad Broker URL $url"); throw new StompException("Bad Broker URL $url");
} }
} }
/** /**
* Make socket connection to the server * Make socket connection to the server
* *
* @throws Stomp_Exception * @throws StompException
*/ */
protected function _makeConnection () protected function _makeConnection ()
{ {
if (count($this->_hosts) == 0) { if (count($this->_hosts) == 0) {
require_once 'Stomp/Exception.php'; require_once 'Stomp/Exception.php';
throw new Stomp_Exception("No broker defined"); throw new StompException("No broker defined");
} }
// force disconnect, if previous established connection exists // force disconnect, if previous established connection exists
...@@ -141,6 +142,9 @@ class Stomp ...@@ -141,6 +142,9 @@ class Stomp
$i = $this->_currentHost; $i = $this->_currentHost;
$att = 0; $att = 0;
$connected = false; $connected = false;
$connect_errno = null;
$connect_errstr = null;
while (! $connected && $att ++ < $this->_attempts) { while (! $connected && $att ++ < $this->_attempts) {
if (isset($this->_params['randomize']) && $this->_params['randomize'] == 'true') { if (isset($this->_params['randomize']) && $this->_params['randomize'] == 'true') {
$i = rand(0, count($this->_hosts) - 1); $i = rand(0, count($this->_hosts) - 1);
...@@ -158,10 +162,10 @@ class Stomp ...@@ -158,10 +162,10 @@ class Stomp
fclose($this->_socket); fclose($this->_socket);
$this->_socket = null; $this->_socket = null;
} }
$this->_socket = @fsockopen($scheme . '://' . $host, $port); $this->_socket = @fsockopen($scheme . '://' . $host, $port, $connect_errno, $connect_errstr, $this->_connect_timeout_seconds);
if (!is_resource($this->_socket) && $att >= $this->_attempts && !array_key_exists($i + 1, $this->_hosts)) { if (!is_resource($this->_socket) && $att >= $this->_attempts && !array_key_exists($i + 1, $this->_hosts)) {
require_once 'Stomp/Exception.php'; require_once 'Stomp/Exception.php';
throw new Stomp_Exception("Could not connect to $host:$port ($att/{$this->_attempts})"); throw new StompException("Could not connect to $host:$port ($att/{$this->_attempts})");
} else if (is_resource($this->_socket)) { } else if (is_resource($this->_socket)) {
$connected = true; $connected = true;
$this->_currentHost = $i; $this->_currentHost = $i;
...@@ -170,7 +174,7 @@ class Stomp ...@@ -170,7 +174,7 @@ class Stomp
} }
if (! $connected) { if (! $connected) {
require_once 'Stomp/Exception.php'; require_once 'Stomp/Exception.php';
throw new Stomp_Exception("Could not connect to a broker"); throw new StompException("Could not connect to a broker");
} }
} }
/** /**
...@@ -179,7 +183,7 @@ class Stomp ...@@ -179,7 +183,7 @@ class Stomp
* @param string $username * @param string $username
* @param string $password * @param string $password
* @return boolean * @return boolean
* @throws Stomp_Exception * @throws StompException
*/ */
public function connect ($username = '', $password = '') public function connect ($username = '', $password = '')
{ {
...@@ -194,18 +198,18 @@ class Stomp ...@@ -194,18 +198,18 @@ class Stomp
if ($this->clientId != null) { if ($this->clientId != null) {
$headers["client-id"] = $this->clientId; $headers["client-id"] = $this->clientId;
} }
$frame = new Stomp_Frame("CONNECT", $headers); $frame = new StompFrame("CONNECT", $headers);
$this->_writeFrame($frame); $this->_writeFrame($frame);
$frame = $this->readFrame(); $frame = $this->readFrame();
if ($frame instanceof Stomp_Frame && $frame->command == 'CONNECTED') { if ($frame instanceof StompFrame && $frame->command == 'CONNECTED') {
$this->_sessionId = $frame->headers["session"]; $this->_sessionId = $frame->headers["session"];
return true; return true;
} else { } else {
require_once 'Stomp/Exception.php'; require_once 'Stomp/Exception.php';
if ($frame instanceof Stomp_Frame) { if ($frame instanceof StompFrame) {
throw new Stomp_Exception("Unexpected command: {$frame->command}", 0, $frame->body); throw new StompException("Unexpected command: {$frame->command}", 0, $frame->body);
} else { } else {
throw new Stomp_Exception("Connection not acknowledged"); throw new StompException("Connection not acknowledged");
} }
} }
} }
...@@ -232,21 +236,21 @@ class Stomp ...@@ -232,21 +236,21 @@ class Stomp
* Send a message to a destination in the messaging system * Send a message to a destination in the messaging system
* *
* @param string $destination Destination queue * @param string $destination Destination queue
* @param string|Stomp_Frame $msg Message * @param string|StompFrame $msg Message
* @param array $properties * @param array $properties
* @param boolean $sync Perform request synchronously * @param boolean $sync Perform request synchronously
* @return boolean * @return boolean
*/ */
public function send ($destination, $msg, $properties = null, $sync = null) public function send ($destination, $msg, $properties = array(), $sync = null)
{ {
if ($msg instanceof Stomp_Frame) { if ($msg instanceof StompFrame) {
$msg->headers['destination'] = $destination; $msg->headers['destination'] = $destination;
$msg->headers = array_merge($msg->headers, $properties); if (is_array($properties)) $msg->headers = array_merge($msg->headers, $properties);
$frame = $msg; $frame = $msg;
} else { } else {
$headers = $properties; $headers = $properties;
$headers['destination'] = $destination; $headers['destination'] = $destination;
$frame = new Stomp_Frame('SEND', $headers, $msg); $frame = new StompFrame('SEND', $headers, $msg);
} }
$this->_prepareReceipt($frame, $sync); $this->_prepareReceipt($frame, $sync);
$this->_writeFrame($frame); $this->_writeFrame($frame);
...@@ -255,10 +259,10 @@ class Stomp ...@@ -255,10 +259,10 @@ class Stomp
/** /**
* Prepair frame receipt * Prepair frame receipt
* *
* @param Stomp_Frame $frame * @param StompFrame $frame
* @param boolean $sync * @param boolean $sync
*/ */
protected function _prepareReceipt (Stomp_Frame $frame, $sync) protected function _prepareReceipt (StompFrame $frame, $sync)
{ {
$receive = $this->sync; $receive = $this->sync;
if ($sync !== null) { if ($sync !== null) {
...@@ -271,12 +275,12 @@ class Stomp ...@@ -271,12 +275,12 @@ class Stomp
/** /**
* Wait for receipt * Wait for receipt
* *
* @param Stomp_Frame $frame * @param StompFrame $frame
* @param boolean $sync * @param boolean $sync
* @return boolean * @return boolean
* @throws Stomp_Exception * @throws StompException
*/ */
protected function _waitForReceipt (Stomp_Frame $frame, $sync) protected function _waitForReceipt (StompFrame $frame, $sync)
{ {
$receive = $this->sync; $receive = $this->sync;
...@@ -289,19 +293,19 @@ class Stomp ...@@ -289,19 +293,19 @@ class Stomp
return true; return true;
} }
$frame = $this->readFrame(); $frame = $this->readFrame();
if ($frame instanceof Stomp_Frame && $frame->command == 'RECEIPT') { if ($frame instanceof StompFrame && $frame->command == 'RECEIPT') {
if ($frame->headers['receipt-id'] == $id) { if ($frame->headers['receipt-id'] == $id) {
return true; return true;
} else { } else {
require_once 'Stomp/Exception.php'; require_once 'Stomp/Exception.php';
throw new Stomp_Exception("Unexpected receipt id {$frame->headers['receipt-id']}", 0, $frame->body); throw new StompException("Unexpected receipt id {$frame->headers['receipt-id']}", 0, $frame->body);
} }
} else { } else {
require_once 'Stomp/Exception.php'; require_once 'Stomp/Exception.php';
if ($frame instanceof Stomp_Frame) { if ($frame instanceof StompFrame) {
throw new Stomp_Exception("Unexpected command {$frame->command}", 0, $frame->body); throw new StompException("Unexpected command {$frame->command}", 0, $frame->body);
} else { } else {
throw new Stomp_Exception("Receipt not received"); throw new StompException("Receipt not received");
} }
} }
} }
...@@ -314,7 +318,7 @@ class Stomp ...@@ -314,7 +318,7 @@ class Stomp
* @param array $properties * @param array $properties
* @param boolean $sync Perform request synchronously * @param boolean $sync Perform request synchronously
* @return boolean * @return boolean
* @throws Stomp_Exception * @throws StompException
*/ */
public function subscribe ($destination, $properties = null, $sync = null) public function subscribe ($destination, $properties = null, $sync = null)
{ {
...@@ -329,7 +333,7 @@ class Stomp ...@@ -329,7 +333,7 @@ class Stomp
} }
} }
$headers['destination'] = $destination; $headers['destination'] = $destination;
$frame = new Stomp_Frame('SUBSCRIBE', $headers); $frame = new StompFrame('SUBSCRIBE', $headers);
$this->_prepareReceipt($frame, $sync); $this->_prepareReceipt($frame, $sync);
$this->_writeFrame($frame); $this->_writeFrame($frame);
if ($this->_waitForReceipt($frame, $sync) == true) { if ($this->_waitForReceipt($frame, $sync) == true) {
...@@ -346,7 +350,7 @@ class Stomp ...@@ -346,7 +350,7 @@ class Stomp
* @param array $properties * @param array $properties
* @param boolean $sync Perform request synchronously * @param boolean $sync Perform request synchronously
* @return boolean * @return boolean
* @throws Stomp_Exception * @throws StompException
*/ */
public function unsubscribe ($destination, $properties = null, $sync = null) public function unsubscribe ($destination, $properties = null, $sync = null)
{ {
...@@ -357,7 +361,7 @@ class Stomp ...@@ -357,7 +361,7 @@ class Stomp
} }
} }
$headers['destination'] = $destination; $headers['destination'] = $destination;
$frame = new Stomp_Frame('UNSUBSCRIBE', $headers); $frame = new StompFrame('UNSUBSCRIBE', $headers);
$this->_prepareReceipt($frame, $sync); $this->_prepareReceipt($frame, $sync);
$this->_writeFrame($frame); $this->_writeFrame($frame);
if ($this->_waitForReceipt($frame, $sync) == true) { if ($this->_waitForReceipt($frame, $sync) == true) {
...@@ -373,7 +377,7 @@ class Stomp ...@@ -373,7 +377,7 @@ class Stomp
* @param string $transactionId * @param string $transactionId
* @param boolean $sync Perform request synchronously * @param boolean $sync Perform request synchronously
* @return boolean * @return boolean
* @throws Stomp_Exception * @throws StompException
*/ */
public function begin ($transactionId = null, $sync = null) public function begin ($transactionId = null, $sync = null)
{ {
...@@ -381,7 +385,7 @@ class Stomp ...@@ -381,7 +385,7 @@ class Stomp
if (isset($transactionId)) { if (isset($transactionId)) {
$headers['transaction'] = $transactionId; $headers['transaction'] = $transactionId;
} }
$frame = new Stomp_Frame('BEGIN', $headers); $frame = new StompFrame('BEGIN', $headers);
$this->_prepareReceipt($frame, $sync); $this->_prepareReceipt($frame, $sync);
$this->_writeFrame($frame); $this->_writeFrame($frame);
return $this->_waitForReceipt($frame, $sync); return $this->_waitForReceipt($frame, $sync);
...@@ -392,7 +396,7 @@ class Stomp ...@@ -392,7 +396,7 @@ class Stomp
* @param string $transactionId * @param string $transactionId
* @param boolean $sync Perform request synchronously * @param boolean $sync Perform request synchronously
* @return boolean * @return boolean
* @throws Stomp_Exception * @throws StompException
*/ */
public function commit ($transactionId = null, $sync = null) public function commit ($transactionId = null, $sync = null)
{ {
...@@ -400,7 +404,7 @@ class Stomp ...@@ -400,7 +404,7 @@ class Stomp
if (isset($transactionId)) { if (isset($transactionId)) {
$headers['transaction'] = $transactionId; $headers['transaction'] = $transactionId;
} }
$frame = new Stomp_Frame('COMMIT', $headers); $frame = new StompFrame('COMMIT', $headers);
$this->_prepareReceipt($frame, $sync); $this->_prepareReceipt($frame, $sync);
$this->_writeFrame($frame); $this->_writeFrame($frame);
return $this->_waitForReceipt($frame, $sync); return $this->_waitForReceipt($frame, $sync);
...@@ -417,7 +421,7 @@ class Stomp ...@@ -417,7 +421,7 @@ class Stomp
if (isset($transactionId)) { if (isset($transactionId)) {
$headers['transaction'] = $transactionId; $headers['transaction'] = $transactionId;
} }
$frame = new Stomp_Frame('ABORT', $headers); $frame = new StompFrame('ABORT', $headers);
$this->_prepareReceipt($frame, $sync); $this->_prepareReceipt($frame, $sync);
$this->_writeFrame($frame); $this->_writeFrame($frame);
return $this->_waitForReceipt($frame, $sync); return $this->_waitForReceipt($frame, $sync);
...@@ -426,15 +430,19 @@ class Stomp ...@@ -426,15 +430,19 @@ class Stomp
* Acknowledge consumption of a message from a subscription * Acknowledge consumption of a message from a subscription
* Note: This operation is always asynchronous * Note: This operation is always asynchronous
* *
* @param string|Stomp_Frame $messageMessage ID * @param string|StompFrame $messageMessage ID
* @param string $transactionId * @param string $transactionId
* @return boolean * @return boolean
* @throws Stomp_Exception * @throws StompException
*/ */
public function ack ($message, $transactionId = null) public function ack ($message, $transactionId = null)
{ {
if ($message instanceof Stomp_Frame) { if ($message instanceof StompFrame) {
$frame = new Stomp_Frame('ACK', $message->headers); $headers = $message->headers;
if (isset($transactionId)) {
$headers['transaction'] = $transactionId;
}
$frame = new StompFrame('ACK', $headers);
$this->_writeFrame($frame); $this->_writeFrame($frame);
return true; return true;
} else { } else {
...@@ -443,7 +451,7 @@ class Stomp ...@@ -443,7 +451,7 @@ class Stomp
$headers['transaction'] = $transactionId; $headers['transaction'] = $transactionId;
} }
$headers['message-id'] = $message; $headers['message-id'] = $message;
$frame = new Stomp_Frame('ACK', $headers); $frame = new StompFrame('ACK', $headers);
$this->_writeFrame($frame); $this->_writeFrame($frame);
return true; return true;
} }
...@@ -461,7 +469,7 @@ class Stomp ...@@ -461,7 +469,7 @@ class Stomp
} }
if (is_resource($this->_socket)) { if (is_resource($this->_socket)) {
$this->_writeFrame(new Stomp_Frame('DISCONNECT', $headers)); $this->_writeFrame(new StompFrame('DISCONNECT', $headers));
fclose($this->_socket); fclose($this->_socket);
} }
$this->_socket = null; $this->_socket = null;
...@@ -474,13 +482,13 @@ class Stomp ...@@ -474,13 +482,13 @@ class Stomp
/** /**
* Write frame to server * Write frame to server
* *
* @param Stomp_Frame $stompFrame * @param StompFrame $stompFrame
*/ */
protected function _writeFrame (Stomp_Frame $stompFrame) protected function _writeFrame (StompFrame $stompFrame)
{ {
if (!is_resource($this->_socket)) { if (!is_resource($this->_socket)) {
require_once 'Stomp/Exception.php'; require_once 'Stomp/Exception.php';
throw new Stomp_Exception('Socket connection hasn\'t been established'); throw new StompException('Socket connection hasn\'t been established');
} }
$data = $stompFrame->__toString(); $data = $stompFrame->__toString();
...@@ -504,9 +512,9 @@ class Stomp ...@@ -504,9 +512,9 @@ class Stomp
} }
/** /**
* Read responce frame from server * Read response frame from server
* *
* @return Stomp_Frame|Stomp_Message_Map|boolean False when no frame to read * @return StompFrame False when no frame to read
*/ */
public function readFrame () public function readFrame ()
{ {
...@@ -516,15 +524,21 @@ class Stomp ...@@ -516,15 +524,21 @@ class Stomp
$rb = 1024; $rb = 1024;
$data = ''; $data = '';
$end = false;
do { do {
$read = fgets($this->_socket, $rb); $read = fread($this->_socket, $rb);
if ($read === false) { if ($read === false) {
$this->_reconnect(); $this->_reconnect();
return $this->readFrame(); return $this->readFrame();
} }
$data .= $read; $data .= $read;
if (strpos($data, "\x00") !== false) {
$end = true;
$data = rtrim($data, "\n");
}
$len = strlen($data); $len = strlen($data);
} while (($len < 2 || ! ($data[$len - 2] == "\x00" && $data[$len - 1] == "\n"))); } while ($len < 2 || $end == false);
list ($header, $body) = explode("\n\n", $data, 2); list ($header, $body) = explode("\n\n", $data, 2);
$header = explode("\n", $header); $header = explode("\n", $header);
...@@ -538,13 +552,14 @@ class Stomp ...@@ -538,13 +552,14 @@ class Stomp
$command = $v; $command = $v;
} }
} }
$frame = new Stomp_Frame($command, $headers, trim($body)); $frame = new StompFrame($command, $headers, trim($body));
if (isset($frame->headers['amq-msg-type']) && $frame->headers['amq-msg-type'] == 'MapMessage') { if (isset($frame->headers['transformation']) && $frame->headers['transformation'] == 'jms-map-json') {
require_once 'Stomp/Message/Map.php'; require_once 'Stomp/Message/Map.php';
return new Stomp_Message_Map($frame); return new StompMessageMap($frame);
} else { } else {
return $frame; return $frame;
} }
return $frame;
} }
/** /**
...@@ -558,10 +573,14 @@ class Stomp ...@@ -558,10 +573,14 @@ class Stomp
$write = null; $write = null;
$except = null; $except = null;
$has_frame_to_read = stream_select($read, $write, $except, $this->_read_timeout_seconds, $this->_read_timeout_milliseconds); $has_frame_to_read = @stream_select($read, $write, $except, $this->_read_timeout_seconds, $this->_read_timeout_milliseconds);
if ($has_frame_to_read !== false)
$has_frame_to_read = count($read);
if ($has_frame_to_read === false) { if ($has_frame_to_read === false) {
throw new Stomp_Exception('Check failed to determin if the socket is readable'); throw new StompException('Check failed to determine if the socket is readable');
} else if ($has_frame_to_read > 0) { } else if ($has_frame_to_read > 0) {
return true; return true;
} else { } else {
......
...@@ -23,10 +23,8 @@ ...@@ -23,10 +23,8 @@
* *
* *
* @package Stomp * @package Stomp
* @author Michael Caplan <mcaplan@labnet.net> */
* @version $Revision: 23 $ class StompException extends Exception
*/
class Stomp_Exception extends Exception
{ {
protected $_details; protected $_details;
...@@ -53,5 +51,5 @@ class Stomp_Exception extends Exception ...@@ -53,5 +51,5 @@ class Stomp_Exception extends Exception
{ {
return $this->_details; return $this->_details;
} }
} }