/** * Implements module logic. * * @param \AppserverIo\DnsServer\Interfaces\DnsRequestInterface $request A request object * @param \AppserverIo\DnsServer\Interfaces\DnsResponseInterface $response A response object * @param \AppserverIo\Server\Interfaces\RequestContextInterface $requestContext A requests context instance * * @return void */ public function process(DnsRequestInterface $request, DnsResponseInterface $response, RequestContextInterface $requestContext) { // load the answer from our DNS database $answer = $this->getStackableResolver()->getAnswer($question = $request->getQuestion()); // merge the flags $flags = array_merge($request->getFlags(), array('qr' => 1, 'ra' => 0)); // prepare the numbers for the encoding $ancount = count($answer); $qdcount = count($question); $nscount = count($authority = $request->getAuthority()); $arcount = count($additional = $request->getAdditional()); // prepare the encoded DNS response $res = pack('nnnnnn', $request->getData('packet_id'), DnsUtil::singleton()->encodeFlags($flags), $qdcount, $ancount, $nscount, $arcount); $res .= DnsUtil::singleton()->encodeQuestionResourceRecord($question, strlen($res)); $res .= DnsUtil::singleton()->encodeResourceRecord($answer, strlen($res)); $res .= DnsUtil::singleton()->encodeResourceRecord($authority, strlen($res)); $res .= DnsUtil::singleton()->encodeResourceRecord($additional, strlen($res)); // append the response to the body stream $response->appendBodyStream($res); }
/** * Parses the request data from the passed buffer. * * @param string $buffer The buffer to decode the data from * * @return void */ public function parse($buffer) { // create a local copy of the requst $request = $this->getRequest(); // set the raw data in the request $request->setRawData($rawData = unpack('npacket_id/nflags/nqdcount/nancount/nnscount/narcount', $buffer)); // load the offset to start extracting the data $offset = $request->getOffset(); // initialize the request with the extracted DNS values $request->setFlags(DnsUtil::singleton()->decodeFlags($rawData['flags'])); $request->setQuestion(DnsUtil::singleton()->decodeQuestionResourceRecord($buffer, $offset, $rawData['qdcount'])); $request->setAnswer(DnsUtil::singleton()->decodeResourceRecord($buffer, $offset, $rawData['ancount'])); $request->setAuthority(DnsUtil::singleton()->decodeResourceRecord($buffer, $offset, $rawData['nscount'])); $request->setAdditional(DnsUtil::singleton()->decodeResourceRecord($buffer, $offset, $rawData['arcount'])); }