Exemplo n.º 1
0
 /**
  * Given the raw bytes containing the property-flags and
  * property-list from a content-frame-header, parse and insert
  * into a dictionary stored in this object as an attribute named
  * 'properties'.
  */
 public function load_properties($raw_bytes)
 {
     $r = new PhpAmqpLib_Wire_AMQPReader($raw_bytes);
     // Read 16-bit shorts until we get one with a low bit set to zero
     $flags = array();
     while (true) {
         $flag_bits = $r->read_short();
         $flags[] = $flag_bits;
         if (($flag_bits & 1) == 0) {
             break;
         }
     }
     $shift = 0;
     $d = array();
     foreach ($this->prop_types as $key => $proptype) {
         if ($shift == 0) {
             if (!$flags) {
                 break;
             }
             $flag_bits = array_shift($flags);
             $shift = 15;
         }
         if ($flag_bits & 1 << $shift) {
             $d[$key] = $r->{'read_' . $proptype}();
         }
         $shift -= 1;
     }
     $this->properties = $d;
 }
Exemplo n.º 2
0
 /**
  * @return PhpAmqpLib_Message_AMQPMessage
  * @throws _PhpAmqpLib_Exception_AMQPRuntimeException
  */
 public function wait_content()
 {
     $frm = $this->next_frame();
     $frame_type = $frm[0];
     $payload = $frm[1];
     if ($frame_type != 2) {
         throw new PhpAmqpLib_Exception_AMQPRuntimeException('Expecting Content header');
     }
     $this->wait_content_reader->reuse(mb_substr($payload, 0, 12, 'ASCII'));
     // $payload_reader = new AMQPReader(substr($payload,0,12));
     $class_id = $this->wait_content_reader->read_short();
     $weight = $this->wait_content_reader->read_short();
     $body_size = $this->wait_content_reader->read_longlong();
     //hack to avoid creating new instances of AMQPReader;
     $this->msg_property_reader->reuse(mb_substr($payload, 12, mb_strlen($payload, 'ASCII') - 12, 'ASCII'));
     $msg = new PhpAmqpLib_Message_AMQPMessage();
     $msg->load_properties($this->msg_property_reader);
     $msg->body_size = $body_size;
     $body_parts = array();
     $body_received = 0;
     while (bccomp($body_size, $body_received, 0) == 1) {
         $frm = $this->next_frame();
         $frame_type = $frm[0];
         $payload = $frm[1];
         if ($frame_type != 3) {
             $PROTOCOL_CONSTANTS_CLASS = self::$PROTOCOL_CONSTANTS_CLASS;
             $FRAME_TYPES = self::getStaticProperty($PROTOCOL_CONSTANTS_CLASS, 'FRAME_TYPES');
             throw new PhpAmqpLib_Exception_AMQPRuntimeException(sprintf('Expecting Content body, received frame type %s (%s)', $frame_type, $FRAME_TYPES[$frame_type]));
         }
         $body_received = bcadd($body_received, mb_strlen($payload, 'ASCII'), 0);
         if (!is_null($this->body_size_max) && $body_received > $this->body_size_max) {
             $msg->is_truncated = true;
             continue;
         }
         $body_parts[] = $payload;
     }
     $msg->body = implode('', $body_parts);
     if ($this->auto_decode && isset($msg->content_encoding)) {
         try {
             $msg->body = $msg->body->decode($msg->content_encoding);
         } catch (Exception $e) {
             if ($this->debug) {
                 PhpAmqpLib_Helper_MiscHelper::debug_msg('Ignoring body decoding exception: ' . $e->getMessage());
             }
         }
     }
     return $msg;
 }
Exemplo n.º 3
0
 /**
  * Read an AMQP table, and return as a PHP array. keys are strings,
  * values are (type,value) tuples.
  */
 public function read_table()
 {
     $this->bitcount = $this->bits = 0;
     $tlen = $this->read_php_int();
     if ($tlen < 0) {
         throw new PhpAmqpLib_Exception_AMQPOutOfBoundsException("Table is longer than supported");
     }
     $table_data = new PhpAmqpLib_Wire_AMQPReader($this->rawread($tlen), null);
     $result = array();
     while ($table_data->tell() < $tlen) {
         $name = $table_data->read_shortstr();
         $ftype = $table_data->rawread(1);
         $val = $table_data->read_value($ftype);
         $result[$name] = array($ftype, $val);
     }
     return $result;
 }
Exemplo n.º 4
0
 public function wait_content()
 {
     $frm = $this->next_frame();
     $frame_type = $frm[0];
     $payload = $frm[1];
     if ($frame_type != 2) {
         throw new PhpAmqpLib_Exception_AMQPRuntimeException("Expecting Content header");
     }
     $payload_reader = new PhpAmqpLib_Wire_AMQPReader(substr($payload, 0, 12));
     $class_id = $payload_reader->read_short();
     $weight = $payload_reader->read_short();
     $body_size = $payload_reader->read_longlong();
     $msg = new PhpAmqpLib_Message_AMQPMessage();
     $msg->load_properties(substr($payload, 12));
     $body_parts = array();
     $body_received = 0;
     while (bccomp($body_size, $body_received) == 1) {
         $frm = $this->next_frame();
         $frame_type = $frm[0];
         $payload = $frm[1];
         if ($frame_type != 3) {
             $PROTOCOL_CONSTANTS_CLASS = self::$PROTOCOL_CONSTANTS_CLASS;
             throw new PhpAmqpLib_Exception_AMQPRuntimeException("Expecting Content body, received frame type {$frame_type} (" . $PROTOCOL_CONSTANTS_CLASS::$FRAME_TYPES[$frame_type] . ")");
         }
         $body_parts[] = $payload;
         $body_received = bcadd($body_received, strlen($payload));
     }
     $msg->body = implode("", $body_parts);
     if ($this->auto_decode && isset($msg->content_encoding)) {
         try {
             $msg->body = $msg->body->decode($msg->content_encoding);
         } catch (\Exception $e) {
             if ($this->debug) {
                 PhpAmqpLib_Helper_MiscHelper::debug_msg("Ignoring body decoding exception: " . $e->getMessage());
             }
         }
     }
     return $msg;
 }
Exemplo n.º 5
0
 /**
  * Read an AMQP table, and return as a PHP array. keys are strings,
  * values are (type,value) tuples.
  *
  * @param bool $returnObject Whether to return PhpAmqpLib_Wire_AMQPArray instance instead of plain array
  * @return array|PhpAmqpLib_Wire_AMQPTable
  */
 public function read_table($returnObject = false)
 {
     $this->bitcount = $this->bits = 0;
     $tlen = $this->read_php_int();
     if ($tlen < 0) {
         throw new PhpAmqpLib_Exception_AMQPOutOfBoundsException('Table is longer than supported');
     }
     $table_data = new PhpAmqpLib_Wire_AMQPReader($this->rawread($tlen), null);
     $result = $returnObject ? new PhpAmqpLib_Wire_AMQPTable() : array();
     while ($table_data->tell() < $tlen) {
         $name = $table_data->read_shortstr();
         $ftype = PhpAmqpLib_Wire_AMQPAbstractCollection::getDataTypeForSymbol($ftypeSym = $table_data->rawread(1));
         $val = $table_data->read_value($ftype, $returnObject);
         $returnObject ? $result->set($name, $val, $ftype) : ($result[$name] = array($ftypeSym, $val));
     }
     return $result;
 }
Exemplo n.º 6
0
 /**
  * @param PhpAmqpLib_Wire_AMQPReader $args
  * @return array
  */
 public static function basicGetEmpty($args)
 {
     $ret = array();
     $ret[] = $args->read_shortstr();
     return $ret;
 }
 /**
  * Handles connection blocked notifications
  *
  * @param PhpAmqpLib_Wire_AMQPReader $args
  */
 protected function connection_blocked(PhpAmqpLib_Wire_AMQPReader $args)
 {
     // Call the block handler and pass in the reason
     $this->dispatch_to_handler($this->connection_block_handler, array($args->read_shortstr()));
 }
Exemplo n.º 8
0
 /**
  * Returns a failed message
  *
  * @param PhpAmqpLib_Wire_AMQPReader $args
  * @param PhpAmqpLib_Message_AMQPMessage $msg
  */
 protected function basic_return($args, $msg)
 {
     $reply_code = $args->read_short();
     $reply_text = $args->read_shortstr();
     $exchange = $args->read_shortstr();
     $routing_key = $args->read_shortstr();
     if (null !== $this->basic_return_callback) {
         call_user_func_array($this->basic_return_callback, array($reply_code, $reply_text, $exchange, $routing_key, $msg));
     } elseif ($this->debug) {
         PhpAmqpLib_Helper_MiscHelper::debug_msg('Skipping unhandled basic_return message');
     }
 }
Exemplo n.º 9
0
 /**
  * @param PhpAmqpLib_Wire_AMQPReader $args
  * @return array
  */
 public static function testContentOk($args)
 {
     $ret = array();
     $ret[] = $args->read_long();
     return $ret;
 }