/** * 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']); }