DoHResponse.fromJson constructor
Create DoH response from JSON
Supports standard DoH JSON format as defined in RFC 8484
Implementation
factory DoHResponse.fromJson(Map<String, dynamic> json) {
try {
final status = (json['Status'] as int?) ?? 0;
final tc = (json['TC'] as bool?) ?? false;
final rd = (json['RD'] as bool?) ?? true;
final ra = (json['RA'] as bool?) ?? true; // Note: Fixed from original TA error
final ad = (json['AD'] as bool?) ?? false;
final cd = (json['CD'] as bool?) ?? false;
// Parse question section
DoHQuestion question = const DoHQuestion();
if (json['Question'] != null) {
if (json['Question'] is List && (json['Question'] as List).isNotEmpty) {
question = DoHQuestion.fromJson(json['Question'][0] as Map<String, dynamic>);
} else if (json['Question'] is Map<String, dynamic>) {
question = DoHQuestion.fromJson(json['Question'] as Map<String, dynamic>);
}
}
// Parse answer section
final answers = <DoHAnswer>[];
if (json['Answer'] is List) {
for (final answerJson in json['Answer'] as List) {
if (answerJson is Map<String, dynamic>) {
answers.add(DoHAnswer.fromJson(answerJson));
}
}
}
// Parse authority section
final authority = <DoHAnswer>[];
if (json['Authority'] is List) {
for (final authJson in json['Authority'] as List) {
if (authJson is Map<String, dynamic>) {
authority.add(DoHAnswer.fromJson(authJson));
}
}
}
// Parse additional section
final additional = <DoHAnswer>[];
if (json['Additional'] is List) {
for (final addJson in json['Additional'] as List) {
if (addJson is Map<String, dynamic>) {
additional.add(DoHAnswer.fromJson(addJson));
}
}
}
return DoHResponse(
status: status,
tc: tc,
rd: rd,
ra: ra,
ad: ad,
cd: cd,
question: question,
answers: answers,
authority: authority,
additional: additional,
);
} catch (e) {
throw FormatException('Invalid DoH response JSON: $e');
}
}