Beispiel #1
0
 /**
  * Create a new RData object
  *
  * @param \LibDNS\Records\TypeDefinitions\TypeDefinition $typeDefinition
  * @return \LibDNS\Records\RData
  */
 public function build(TypeDefinition $typeDefinition)
 {
     $rData = $this->rDataFactory->create($typeDefinition);
     foreach ($typeDefinition as $index => $type) {
         $rData->setField($index, $this->typeBuilder->build($type->getType()));
     }
     return $rData;
 }
Beispiel #2
0
 /**
  * Decode a resource record
  *
  * @param \LibDNS\Decoder\DecodingContext $decodingContext
  * @return \LibDNS\Records\Resource
  * @throws \UnexpectedValueException When the record is invalid
  * @throws \InvalidArgumentException When a type subtype is unknown
  */
 private function decodeResourceRecord(DecodingContext $decodingContext)
 {
     /** @var \LibDNS\Records\Types\DomainName $domainName */
     $domainName = $this->typeBuilder->build(Types::DOMAIN_NAME);
     $this->decodeDomainName($decodingContext, $domainName);
     $meta = unpack('ntype/nclass/Nttl/nlength', $this->readDataFromPacket($decodingContext->getPacket(), 10));
     $resource = $this->resourceBuilder->build($meta['type']);
     $resource->setName($domainName);
     $resource->setClass($meta['class']);
     $resource->setTTL($meta['ttl']);
     $data = $resource->getData();
     $remainingLength = $meta['length'];
     $fieldDef = $index = null;
     foreach ($resource->getData()->getTypeDefinition() as $index => $fieldDef) {
         $field = $this->typeBuilder->build($fieldDef->getType());
         $remainingLength -= $this->decodeType($decodingContext, $field, $remainingLength);
         $data->setField($index, $field);
     }
     if ($fieldDef->allowsMultiple()) {
         while ($remainingLength) {
             $field = $this->typeBuilder->build($fieldDef->getType());
             $remainingLength -= $this->decodeType($decodingContext, $field, $remainingLength);
             $data->setField(++$index, $field);
         }
     }
     if ($remainingLength !== 0) {
         throw new \UnexpectedValueException('Decode error: Invalid length for record data section');
     }
     return $resource;
 }