/** * Appends AMQP method frame to buffer. * * @param MethodFrame $frame * @param Buffer $buffer */ public function appendMethodFrame(MethodFrame $frame, Buffer $buffer) { $buffer->appendUint16($frame->classId); $buffer->appendUint16($frame->methodId); if ($frame instanceof MethodConnectionStartFrame) { $buffer->appendUint8($frame->versionMajor); $buffer->appendUint8($frame->versionMinor); $this->appendTable($frame->serverProperties, $buffer); $buffer->appendUint32(strlen($frame->mechanisms)); $buffer->append($frame->mechanisms); $buffer->appendUint32(strlen($frame->locales)); $buffer->append($frame->locales); } elseif ($frame instanceof MethodConnectionStartOkFrame) { $this->appendTable($frame->clientProperties, $buffer); $buffer->appendUint8(strlen($frame->mechanism)); $buffer->append($frame->mechanism); $buffer->appendUint32(strlen($frame->response)); $buffer->append($frame->response); $buffer->appendUint8(strlen($frame->locale)); $buffer->append($frame->locale); } elseif ($frame instanceof MethodConnectionSecureFrame) { $buffer->appendUint32(strlen($frame->challenge)); $buffer->append($frame->challenge); } elseif ($frame instanceof MethodConnectionSecureOkFrame) { $buffer->appendUint32(strlen($frame->response)); $buffer->append($frame->response); } elseif ($frame instanceof MethodConnectionTuneFrame) { $buffer->appendInt16($frame->channelMax); $buffer->appendInt32($frame->frameMax); $buffer->appendInt16($frame->heartbeat); } elseif ($frame instanceof MethodConnectionTuneOkFrame) { $buffer->appendInt16($frame->channelMax); $buffer->appendInt32($frame->frameMax); $buffer->appendInt16($frame->heartbeat); } elseif ($frame instanceof MethodConnectionOpenFrame) { $buffer->appendUint8(strlen($frame->virtualHost)); $buffer->append($frame->virtualHost); $buffer->appendUint8(strlen($frame->capabilities)); $buffer->append($frame->capabilities); $this->appendBits([$frame->insist], $buffer); } elseif ($frame instanceof MethodConnectionOpenOkFrame) { $buffer->appendUint8(strlen($frame->knownHosts)); $buffer->append($frame->knownHosts); } elseif ($frame instanceof MethodConnectionCloseFrame) { $buffer->appendInt16($frame->replyCode); $buffer->appendUint8(strlen($frame->replyText)); $buffer->append($frame->replyText); $buffer->appendInt16($frame->closeClassId); $buffer->appendInt16($frame->closeMethodId); } elseif ($frame instanceof MethodConnectionCloseOkFrame) { } elseif ($frame instanceof MethodConnectionBlockedFrame) { $buffer->appendUint8(strlen($frame->reason)); $buffer->append($frame->reason); } elseif ($frame instanceof MethodConnectionUnblockedFrame) { } elseif ($frame instanceof MethodChannelOpenFrame) { $buffer->appendUint8(strlen($frame->outOfBand)); $buffer->append($frame->outOfBand); } elseif ($frame instanceof MethodChannelOpenOkFrame) { $buffer->appendUint32(strlen($frame->channelId)); $buffer->append($frame->channelId); } elseif ($frame instanceof MethodChannelFlowFrame) { $this->appendBits([$frame->active], $buffer); } elseif ($frame instanceof MethodChannelFlowOkFrame) { $this->appendBits([$frame->active], $buffer); } elseif ($frame instanceof MethodChannelCloseFrame) { $buffer->appendInt16($frame->replyCode); $buffer->appendUint8(strlen($frame->replyText)); $buffer->append($frame->replyText); $buffer->appendInt16($frame->closeClassId); $buffer->appendInt16($frame->closeMethodId); } elseif ($frame instanceof MethodChannelCloseOkFrame) { } elseif ($frame instanceof MethodAccessRequestFrame) { $buffer->appendUint8(strlen($frame->realm)); $buffer->append($frame->realm); $this->appendBits([$frame->exclusive, $frame->passive, $frame->active, $frame->write, $frame->read], $buffer); } elseif ($frame instanceof MethodAccessRequestOkFrame) { $buffer->appendInt16($frame->reserved1); } elseif ($frame instanceof MethodExchangeDeclareFrame) { $buffer->appendInt16($frame->reserved1); $buffer->appendUint8(strlen($frame->exchange)); $buffer->append($frame->exchange); $buffer->appendUint8(strlen($frame->exchangeType)); $buffer->append($frame->exchangeType); $this->appendBits([$frame->passive, $frame->durable, $frame->autoDelete, $frame->internal, $frame->nowait], $buffer); $this->appendTable($frame->arguments, $buffer); } elseif ($frame instanceof MethodExchangeDeclareOkFrame) { } elseif ($frame instanceof MethodExchangeDeleteFrame) { $buffer->appendInt16($frame->reserved1); $buffer->appendUint8(strlen($frame->exchange)); $buffer->append($frame->exchange); $this->appendBits([$frame->ifUnused, $frame->nowait], $buffer); } elseif ($frame instanceof MethodExchangeDeleteOkFrame) { } elseif ($frame instanceof MethodExchangeBindFrame) { $buffer->appendInt16($frame->reserved1); $buffer->appendUint8(strlen($frame->destination)); $buffer->append($frame->destination); $buffer->appendUint8(strlen($frame->source)); $buffer->append($frame->source); $buffer->appendUint8(strlen($frame->routingKey)); $buffer->append($frame->routingKey); $this->appendBits([$frame->nowait], $buffer); $this->appendTable($frame->arguments, $buffer); } elseif ($frame instanceof MethodExchangeBindOkFrame) { } elseif ($frame instanceof MethodExchangeUnbindFrame) { $buffer->appendInt16($frame->reserved1); $buffer->appendUint8(strlen($frame->destination)); $buffer->append($frame->destination); $buffer->appendUint8(strlen($frame->source)); $buffer->append($frame->source); $buffer->appendUint8(strlen($frame->routingKey)); $buffer->append($frame->routingKey); $this->appendBits([$frame->nowait], $buffer); $this->appendTable($frame->arguments, $buffer); } elseif ($frame instanceof MethodExchangeUnbindOkFrame) { } elseif ($frame instanceof MethodQueueDeclareFrame) { $buffer->appendInt16($frame->reserved1); $buffer->appendUint8(strlen($frame->queue)); $buffer->append($frame->queue); $this->appendBits([$frame->passive, $frame->durable, $frame->exclusive, $frame->autoDelete, $frame->nowait], $buffer); $this->appendTable($frame->arguments, $buffer); } elseif ($frame instanceof MethodQueueDeclareOkFrame) { $buffer->appendUint8(strlen($frame->queue)); $buffer->append($frame->queue); $buffer->appendInt32($frame->messageCount); $buffer->appendInt32($frame->consumerCount); } elseif ($frame instanceof MethodQueueBindFrame) { $buffer->appendInt16($frame->reserved1); $buffer->appendUint8(strlen($frame->queue)); $buffer->append($frame->queue); $buffer->appendUint8(strlen($frame->exchange)); $buffer->append($frame->exchange); $buffer->appendUint8(strlen($frame->routingKey)); $buffer->append($frame->routingKey); $this->appendBits([$frame->nowait], $buffer); $this->appendTable($frame->arguments, $buffer); } elseif ($frame instanceof MethodQueueBindOkFrame) { } elseif ($frame instanceof MethodQueuePurgeFrame) { $buffer->appendInt16($frame->reserved1); $buffer->appendUint8(strlen($frame->queue)); $buffer->append($frame->queue); $this->appendBits([$frame->nowait], $buffer); } elseif ($frame instanceof MethodQueuePurgeOkFrame) { $buffer->appendInt32($frame->messageCount); } elseif ($frame instanceof MethodQueueDeleteFrame) { $buffer->appendInt16($frame->reserved1); $buffer->appendUint8(strlen($frame->queue)); $buffer->append($frame->queue); $this->appendBits([$frame->ifUnused, $frame->ifEmpty, $frame->nowait], $buffer); } elseif ($frame instanceof MethodQueueDeleteOkFrame) { $buffer->appendInt32($frame->messageCount); } elseif ($frame instanceof MethodQueueUnbindFrame) { $buffer->appendInt16($frame->reserved1); $buffer->appendUint8(strlen($frame->queue)); $buffer->append($frame->queue); $buffer->appendUint8(strlen($frame->exchange)); $buffer->append($frame->exchange); $buffer->appendUint8(strlen($frame->routingKey)); $buffer->append($frame->routingKey); $this->appendTable($frame->arguments, $buffer); } elseif ($frame instanceof MethodQueueUnbindOkFrame) { } elseif ($frame instanceof MethodBasicQosFrame) { $buffer->appendInt32($frame->prefetchSize); $buffer->appendInt16($frame->prefetchCount); $this->appendBits([$frame->global], $buffer); } elseif ($frame instanceof MethodBasicQosOkFrame) { } elseif ($frame instanceof MethodBasicConsumeFrame) { $buffer->appendInt16($frame->reserved1); $buffer->appendUint8(strlen($frame->queue)); $buffer->append($frame->queue); $buffer->appendUint8(strlen($frame->consumerTag)); $buffer->append($frame->consumerTag); $this->appendBits([$frame->noLocal, $frame->noAck, $frame->exclusive, $frame->nowait], $buffer); $this->appendTable($frame->arguments, $buffer); } elseif ($frame instanceof MethodBasicConsumeOkFrame) { $buffer->appendUint8(strlen($frame->consumerTag)); $buffer->append($frame->consumerTag); } elseif ($frame instanceof MethodBasicCancelFrame) { $buffer->appendUint8(strlen($frame->consumerTag)); $buffer->append($frame->consumerTag); $this->appendBits([$frame->nowait], $buffer); } elseif ($frame instanceof MethodBasicCancelOkFrame) { $buffer->appendUint8(strlen($frame->consumerTag)); $buffer->append($frame->consumerTag); } elseif ($frame instanceof MethodBasicPublishFrame) { $buffer->appendInt16($frame->reserved1); $buffer->appendUint8(strlen($frame->exchange)); $buffer->append($frame->exchange); $buffer->appendUint8(strlen($frame->routingKey)); $buffer->append($frame->routingKey); $this->appendBits([$frame->mandatory, $frame->immediate], $buffer); } elseif ($frame instanceof MethodBasicReturnFrame) { $buffer->appendInt16($frame->replyCode); $buffer->appendUint8(strlen($frame->replyText)); $buffer->append($frame->replyText); $buffer->appendUint8(strlen($frame->exchange)); $buffer->append($frame->exchange); $buffer->appendUint8(strlen($frame->routingKey)); $buffer->append($frame->routingKey); } elseif ($frame instanceof MethodBasicDeliverFrame) { $buffer->appendUint8(strlen($frame->consumerTag)); $buffer->append($frame->consumerTag); $buffer->appendInt64($frame->deliveryTag); $this->appendBits([$frame->redelivered], $buffer); $buffer->appendUint8(strlen($frame->exchange)); $buffer->append($frame->exchange); $buffer->appendUint8(strlen($frame->routingKey)); $buffer->append($frame->routingKey); } elseif ($frame instanceof MethodBasicGetFrame) { $buffer->appendInt16($frame->reserved1); $buffer->appendUint8(strlen($frame->queue)); $buffer->append($frame->queue); $this->appendBits([$frame->noAck], $buffer); } elseif ($frame instanceof MethodBasicGetOkFrame) { $buffer->appendInt64($frame->deliveryTag); $this->appendBits([$frame->redelivered], $buffer); $buffer->appendUint8(strlen($frame->exchange)); $buffer->append($frame->exchange); $buffer->appendUint8(strlen($frame->routingKey)); $buffer->append($frame->routingKey); $buffer->appendInt32($frame->messageCount); } elseif ($frame instanceof MethodBasicGetEmptyFrame) { $buffer->appendUint8(strlen($frame->clusterId)); $buffer->append($frame->clusterId); } elseif ($frame instanceof MethodBasicAckFrame) { $buffer->appendInt64($frame->deliveryTag); $this->appendBits([$frame->multiple], $buffer); } elseif ($frame instanceof MethodBasicRejectFrame) { $buffer->appendInt64($frame->deliveryTag); $this->appendBits([$frame->requeue], $buffer); } elseif ($frame instanceof MethodBasicRecoverAsyncFrame) { $this->appendBits([$frame->requeue], $buffer); } elseif ($frame instanceof MethodBasicRecoverFrame) { $this->appendBits([$frame->requeue], $buffer); } elseif ($frame instanceof MethodBasicRecoverOkFrame) { } elseif ($frame instanceof MethodBasicNackFrame) { $buffer->appendInt64($frame->deliveryTag); $this->appendBits([$frame->multiple, $frame->requeue], $buffer); } elseif ($frame instanceof MethodTxSelectFrame) { } elseif ($frame instanceof MethodTxSelectOkFrame) { } elseif ($frame instanceof MethodTxCommitFrame) { } elseif ($frame instanceof MethodTxCommitOkFrame) { } elseif ($frame instanceof MethodTxRollbackFrame) { } elseif ($frame instanceof MethodTxRollbackOkFrame) { } elseif ($frame instanceof MethodConfirmSelectFrame) { $this->appendBits([$frame->nowait], $buffer); } elseif ($frame instanceof MethodConfirmSelectOkFrame) { } else { throw new ProtocolException('Unhandled method frame ' . get_class($frame) . '.'); } }
public function consume($channel, $queue = '', $consumerTag = '', $noLocal = false, $noAck = false, $exclusive = false, $nowait = false, $arguments = []) { $buffer = new Buffer(); $buffer->appendUint16(60); $buffer->appendUint16(20); $buffer->appendInt16(0); $buffer->appendUint8(strlen($queue)); $buffer->append($queue); $buffer->appendUint8(strlen($consumerTag)); $buffer->append($consumerTag); $this->getWriter()->appendBits([$noLocal, $noAck, $exclusive, $nowait], $buffer); $this->getWriter()->appendTable($arguments, $buffer); $frame = new Protocol\MethodFrame(60, 20); $frame->channel = $channel; $frame->payloadSize = $buffer->getLength(); $frame->payload = $buffer; $this->getWriter()->appendFrame($frame, $this->getWriteBuffer()); $this->flushWriteBuffer(); return $this->awaitConsumeOk($channel); }
/** * Appends AMQP frame to buffer. * * @param AbstractFrame $frame * @param Buffer $buffer */ public function appendFrame(AbstractFrame $frame, Buffer $buffer) { if ($frame instanceof MethodFrame && $frame->payload !== null) { // payload already supplied } elseif ($frame instanceof MethodFrame) { $frameBuffer = new Buffer(); $this->appendMethodFrame($frame, $frameBuffer); $frame->payloadSize = $frameBuffer->getLength(); $frame->payload = $frameBuffer; } elseif ($frame instanceof ContentHeaderFrame) { $frameBuffer = new Buffer(); // see https://github.com/pika/pika/blob/master/pika/spec.py class BasicProperties $frameBuffer->appendUint16($frame->classId); $frameBuffer->appendUint16($frame->weight); $frameBuffer->appendUint64($frame->bodySize); $flags = $frame->flags; $frameBuffer->appendUint16($flags); if ($flags & ContentHeaderFrame::FLAG_CONTENT_TYPE) { $frameBuffer->appendUint8(strlen($frame->contentType)); $frameBuffer->append($frame->contentType); } if ($flags & ContentHeaderFrame::FLAG_CONTENT_ENCODING) { $frameBuffer->appendUint8(strlen($frame->contentEncoding)); $frameBuffer->append($frame->contentEncoding); } if ($flags & ContentHeaderFrame::FLAG_HEADERS) { $this->appendTable($frame->headers, $frameBuffer); } if ($flags & ContentHeaderFrame::FLAG_DELIVERY_MODE) { $frameBuffer->appendUint8($frame->deliveryMode); } if ($flags & ContentHeaderFrame::FLAG_PRIORITY) { $frameBuffer->appendUint8($frame->priority); } if ($flags & ContentHeaderFrame::FLAG_CORRELATION_ID) { $frameBuffer->appendUint8(strlen($frame->correlationId)); $frameBuffer->append($frame->correlationId); } if ($flags & ContentHeaderFrame::FLAG_REPLY_TO) { $frameBuffer->appendUint8(strlen($frame->replyTo)); $frameBuffer->append($frame->replyTo); } if ($flags & ContentHeaderFrame::FLAG_EXPIRATION) { $frameBuffer->appendUint8(strlen($frame->expiration)); $frameBuffer->append($frame->expiration); } if ($flags & ContentHeaderFrame::FLAG_MESSAGE_ID) { $frameBuffer->appendUint8(strlen($frame->messageId)); $frameBuffer->append($frame->messageId); } if ($flags & ContentHeaderFrame::FLAG_TIMESTAMP) { $this->appendTimestamp($frame->timestamp, $frameBuffer); } if ($flags & ContentHeaderFrame::FLAG_TYPE) { $frameBuffer->appendUint8(strlen($frame->typeHeader)); $frameBuffer->append($frame->typeHeader); } if ($flags & ContentHeaderFrame::FLAG_USER_ID) { $frameBuffer->appendUint8(strlen($frame->userId)); $frameBuffer->append($frame->userId); } if ($flags & ContentHeaderFrame::FLAG_APP_ID) { $frameBuffer->appendUint8(strlen($frame->appId)); $frameBuffer->append($frame->appId); } if ($flags & ContentHeaderFrame::FLAG_CLUSTER_ID) { $frameBuffer->appendUint8(strlen($frame->clusterId)); $frameBuffer->append($frame->clusterId); } $frame->payloadSize = $frameBuffer->getLength(); $frame->payload = $frameBuffer; } elseif ($frame instanceof ContentBodyFrame) { // body frame's payload is already loaded } elseif ($frame instanceof HeartbeatFrame) { // heartbeat frame is empty } else { throw new ProtocolException("Unhandled frame '" . get_class($frame) . "'."); } $buffer->appendUint8($frame->type); $buffer->appendUint16($frame->channel); $buffer->appendUint32($frame->payloadSize); $buffer->append($frame->payload); $buffer->appendUint8(Constants::FRAME_END); }