DoHResponse.fromJson constructor

DoHResponse.fromJson(
  1. Map<String, dynamic> json
)

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');
  }
}