@@ -44,14 +44,7 @@ public static function lookup(Message $query, Zone $zone): Message
4444 if (empty ($ records )) {
4545 // SOA is stored separately; if querying SOA at the zone apex, return it
4646 if ($ question ->type === Record::TYPE_SOA && $ question ->name === $ zone ->name ) {
47- return Message::response (
48- header: $ query ->header ,
49- responseCode: Message::RCODE_NOERROR ,
50- questions: $ query ->questions ,
51- answers: [$ zone ->soa ],
52- authoritative: true ,
53- recursionAvailable: false
54- );
47+ return self ::soaApexResponse ($ query , $ zone );
5548 }
5649
5750 return Message::response (
@@ -171,14 +164,7 @@ private static function handleExactMatch(array $records, Message $query, Zone $z
171164 if ($ isAuthoritative ) {
172165 // SOA is stored separately in Zone; handle SOA queries at the zone apex
173166 if ($ question ->type === Record::TYPE_SOA && $ question ->name === $ zone ->name ) {
174- return Message::response (
175- header: $ query ->header ,
176- responseCode: Message::RCODE_NOERROR ,
177- questions: $ query ->questions ,
178- answers: [$ zone ->soa ],
179- authoritative: true ,
180- recursionAvailable: false
181- );
167+ return self ::soaApexResponse ($ query , $ zone );
182168 }
183169
184170 // Path E1: Exact match of type
@@ -239,6 +225,21 @@ private static function handleExactMatch(array $records, Message $query, Zone $z
239225 }
240226 }
241227
228+ /**
229+ * Build an authoritative SOA answer for the zone apex.
230+ */
231+ private static function soaApexResponse (Message $ query , Zone $ zone ): Message
232+ {
233+ return Message::response (
234+ header: $ query ->header ,
235+ responseCode: Message::RCODE_NOERROR ,
236+ questions: $ query ->questions ,
237+ answers: [$ zone ->soa ],
238+ authoritative: true ,
239+ recursionAvailable: false
240+ );
241+ }
242+
242243 /**
243244 * Randomize RRSet order for load balancing.
244245 *
0 commit comments