tangled
alpha
login
or
join now
rockorager.dev
/
ourio
6
fork
atom
An asynchronous IO runtime
6
fork
atom
overview
issues
pulls
pipelines
dns: only send one question at a time
rockorager.dev
10 months ago
510c7448
8896ef65
verified
This commit was signed with the committer's
known signature
.
rockorager.dev
SSH Key Fingerprint:
SHA256:qn/Fjy7CpbcogGEPB14Y53hLnQleZNFY9lkQnuudFLs=
+13
-18
1 changed file
expand all
collapse all
unified
split
src
stda
net
dns.zig
+13
-18
src/stda/net/dns.zig
···
43
self.gpa.free(self.config.nameservers);
44
}
45
46
-
pub fn resolveQueries(self: *Resolver, io: *Ring, queries: []const Question, ctx: ourio.Context) !void {
47
assert(self.config.nameservers.len > 0);
48
49
const conn = try self.gpa.create(Connection);
50
conn.* = .{ .gpa = self.gpa, .ctx = ctx, .config = self.config };
51
-
try conn.writeQuestions(queries);
52
53
try conn.tryNext(io);
54
}
···
470
try self.ctx.cb(io, task);
471
}
472
473
-
fn writeQuestions(self: *Connection, queries: []const Question) !void {
474
-
const header: Header = .{ .question_count = @intCast(queries.len) };
475
var writer = self.write_buffer.writer(self.gpa);
476
try writer.writeAll(&header.asBytes());
477
478
-
for (queries) |query| {
479
-
var iter = std.mem.splitScalar(u8, query.host, '.');
480
-
while (iter.next()) |val| {
481
-
const len: u8 = @intCast(val.len);
482
-
try writer.writeByte(len);
483
-
try writer.writeAll(val);
484
-
}
485
-
try writer.writeByte(0x00);
486
-
try writer.writeInt(u16, @intFromEnum(query.type), .big);
487
-
try writer.writeInt(u16, @intFromEnum(query.class), .big);
488
}
0
0
0
489
}
490
};
491
···
549
550
try io.run(.until_done);
551
552
-
try resolver.resolveQueries(&io, &.{
553
-
.{ .host = "timculverhouse.com" },
554
-
.{ .host = "timculverhouse.com", .type = .AAAA },
555
-
}, .{});
556
try io.run(.until_done);
557
try std.testing.expectEqual(2, resolver.config.nameservers.len);
558
try std.testing.expectEqual(3, resolver.config.attempts);
···
43
self.gpa.free(self.config.nameservers);
44
}
45
46
+
pub fn resolveQuery(self: *Resolver, io: *Ring, query: Question, ctx: ourio.Context) !void {
47
assert(self.config.nameservers.len > 0);
48
49
const conn = try self.gpa.create(Connection);
50
conn.* = .{ .gpa = self.gpa, .ctx = ctx, .config = self.config };
51
+
try conn.writeQuestion(query);
52
53
try conn.tryNext(io);
54
}
···
470
try self.ctx.cb(io, task);
471
}
472
473
+
fn writeQuestion(self: *Connection, query: Question) !void {
474
+
const header: Header = .{ .question_count = 1 };
475
var writer = self.write_buffer.writer(self.gpa);
476
try writer.writeAll(&header.asBytes());
477
478
+
var iter = std.mem.splitScalar(u8, query.host, '.');
479
+
while (iter.next()) |val| {
480
+
const len: u8 = @intCast(val.len);
481
+
try writer.writeByte(len);
482
+
try writer.writeAll(val);
0
0
0
0
0
483
}
484
+
try writer.writeByte(0x00);
485
+
try writer.writeInt(u16, @intFromEnum(query.type), .big);
486
+
try writer.writeInt(u16, @intFromEnum(query.class), .big);
487
}
488
};
489
···
547
548
try io.run(.until_done);
549
550
+
try resolver.resolveQuery(&io, .{ .host = "timculverhouse.com" }, .{});
0
0
0
551
try io.run(.until_done);
552
try std.testing.expectEqual(2, resolver.config.nameservers.len);
553
try std.testing.expectEqual(3, resolver.config.attempts);