示例#1
0
 /**
  * Decode the header section of the message
  *
  * @param \LibDNS\Decoder\DecodingContext $decodingContext
  * @param \LibDNS\Messages\Message $message
  * @throws \UnexpectedValueException When the header section is invalid
  */
 private function decodeHeader(DecodingContext $decodingContext, Message $message)
 {
     $header = unpack('nid/nmeta/nqd/nan/nns/nar', $this->readDataFromPacket($decodingContext->getPacket(), 12));
     if (!$header) {
         throw new \UnexpectedValueException('Decode error: Header unpack failed');
     }
     $message->setID($header['id']);
     $message->setType(($header['meta'] & 0b1000000000000000) >> 15);
     $message->setOpCode(($header['meta'] & 0b111100000000000) >> 11);
     $message->isAuthoritative(($header['meta'] & 0b10000000000) >> 10);
     $message->isTruncated(($header['meta'] & 0b1000000000) >> 9);
     $message->isRecursionDesired(($header['meta'] & 0b100000000) >> 8);
     $message->isRecursionAvailable(($header['meta'] & 0b10000000) >> 7);
     $message->setResponseCode($header['meta'] & 0b1111);
     $decodingContext->setExpectedQuestionRecords($header['qd']);
     $decodingContext->setExpectedAnswerRecords($header['an']);
     $decodingContext->setExpectedAuthorityRecords($header['ns']);
     $decodingContext->setExpectedAdditionalRecords($header['ar']);
 }
示例#2
0
 /**
  * Encode a Message to raw network data
  *
  * @param \LibDNS\Messages\Message $message  The Message to encode
  * @param bool $compress Enable message compression
  * @return string
  */
 public function encode(Message $message, $compress = true)
 {
     $packet = $this->packetFactory->create();
     $encodingContext = $this->encodingContextFactory->create($packet, $compress);
     foreach ($message->getQuestionRecords() as $record) {
         /** @var \LibDNS\Records\Question $record */
         $this->encodeQuestionRecord($encodingContext, $record);
     }
     foreach ($message->getAnswerRecords() as $record) {
         /** @var \LibDNS\Records\Resource $record */
         $this->encodeResourceRecord($encodingContext, $record);
     }
     foreach ($message->getAuthorityRecords() as $record) {
         /** @var \LibDNS\Records\Resource $record */
         $this->encodeResourceRecord($encodingContext, $record);
     }
     foreach ($message->getAdditionalRecords() as $record) {
         /** @var \LibDNS\Records\Resource $record */
         $this->encodeResourceRecord($encodingContext, $record);
     }
     return $this->encodeHeader($encodingContext, $message) . $packet->read($packet->getLength());
 }