Skip to content

Commit

Permalink
Registry: Allow the DNS server to send multiple messages
Browse files Browse the repository at this point in the history
This is required for zone transfer.
  • Loading branch information
Geod24 committed Sep 9, 2021
1 parent 80cebb4 commit 19f26be
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 10 deletions.
12 changes: 7 additions & 5 deletions source/agora/node/Registry.d
Original file line number Diff line number Diff line change
Expand Up @@ -208,13 +208,15 @@ public class NameRegistry: NameRegistryAPI
Params:
query = The query received by the server
Returns:
An answer that matches the query
sender = A delegate that allows to send a `Message` to the client.
A server may send multiple `Message`s as a response to a
single query, e.g. when doing zone transfer.
***************************************************************************/

public Message answerQuestions (in Message query) @safe
public void answerQuestions (
in Message query, scope void delegate (in Message) @safe sender)
@safe
{
Message reply;
reply.header.RA = false; // TODO: Implement
Expand Down Expand Up @@ -253,7 +255,7 @@ public class NameRegistry: NameRegistryAPI
log.trace("{} DNS query: {} => {}",
(reply.header.RCODE == Header.RCode.NoError) ? "Fullfilled" : "Unsuccessfull",
query, reply);
return reply.fill(query.header);
sender(reply.fill(query.header));
}

/***************************************************************************
Expand Down
15 changes: 10 additions & 5 deletions source/agora/node/Runner.d
Original file line number Diff line number Diff line change
Expand Up @@ -294,14 +294,17 @@ private void runDNSServer_canThrow (in RegistryConfig config, NameRegistry regis
ubyte[2048] buffer;
// `recv` will store the peer address here so we can respond
NetworkAddress peer;
scope ppeer = &peer;
while (true)
{
try
{
auto pack = udp.recv(buffer, &peer);
auto pack = udp.recv(buffer, ppeer);
auto query = deserializeFull!Message(pack);
auto resp = registry.answerQuestions(query);
udp.send(serializeFull(resp), &peer);
registry.answerQuestions(
query,
(in Message msg) @safe => udp.send(msg.serializeFull(), ppeer));

}
catch (Exception exc)
{
Expand Down Expand Up @@ -369,8 +372,10 @@ private void runTCPDNSServer_canThrow (TCPConnection conn, NameRegistry registry
try
{
auto query = deserializeFull!Message(reader);
auto resp = registry.answerQuestions(query);
resp.serializePart(&conn.write);
registry.answerQuestions(
query,
(in Message msg) @safe => msg.serializePart(&conn.write));

}
catch (Exception exc)
{
Expand Down

0 comments on commit 19f26be

Please sign in to comment.