An asynchronous IO runtime

dns: only send one question at a time

rockorager.dev 510c7448 8896ef65

verified
+13 -18
+13 -18
src/stda/net/dns.zig
··· 43 43 self.gpa.free(self.config.nameservers); 44 44 } 45 45 46 - pub fn resolveQueries(self: *Resolver, io: *Ring, queries: []const Question, ctx: ourio.Context) !void { 46 + pub fn resolveQuery(self: *Resolver, io: *Ring, query: Question, ctx: ourio.Context) !void { 47 47 assert(self.config.nameservers.len > 0); 48 48 49 49 const conn = try self.gpa.create(Connection); 50 50 conn.* = .{ .gpa = self.gpa, .ctx = ctx, .config = self.config }; 51 - try conn.writeQuestions(queries); 51 + try conn.writeQuestion(query); 52 52 53 53 try conn.tryNext(io); 54 54 } ··· 470 470 try self.ctx.cb(io, task); 471 471 } 472 472 473 - fn writeQuestions(self: *Connection, queries: []const Question) !void { 474 - const header: Header = .{ .question_count = @intCast(queries.len) }; 473 + fn writeQuestion(self: *Connection, query: Question) !void { 474 + const header: Header = .{ .question_count = 1 }; 475 475 var writer = self.write_buffer.writer(self.gpa); 476 476 try writer.writeAll(&header.asBytes()); 477 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); 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); 488 483 } 484 + try writer.writeByte(0x00); 485 + try writer.writeInt(u16, @intFromEnum(query.type), .big); 486 + try writer.writeInt(u16, @intFromEnum(query.class), .big); 489 487 } 490 488 }; 491 489 ··· 549 547 550 548 try io.run(.until_done); 551 549 552 - try resolver.resolveQueries(&io, &.{ 553 - .{ .host = "timculverhouse.com" }, 554 - .{ .host = "timculverhouse.com", .type = .AAAA }, 555 - }, .{}); 550 + try resolver.resolveQuery(&io, .{ .host = "timculverhouse.com" }, .{}); 556 551 try io.run(.until_done); 557 552 try std.testing.expectEqual(2, resolver.config.nameservers.len); 558 553 try std.testing.expectEqual(3, resolver.config.attempts);