using System; using System.Collections.Generic; using System.Net.Http; using System.Net.Http.Headers; using Google.Protobuf.WellKnownTypes; using INetMock.Client.Audit.Details; namespace INetMock.Client.Audit { public abstract record EventDetails; public record EmptyDetails : EventDetails; public record GenericDetails : EventDetails { private readonly Any? _detailsAny; public GenericDetails() { _detailsAny = null; } public GenericDetails(Any? any) { _detailsAny = any; } public static implicit operator HttpDetails(GenericDetails gd) { if (gd._detailsAny == null || gd._detailsAny.Value == null) return new(); if (!gd._detailsAny.TypeUrl.EndsWith(HTTPDetailsEntity.Descriptor.FullName)) throw new InvalidOperationException(); return new HttpDetails(gd._detailsAny); } public static implicit operator DnsDetails(GenericDetails gd) { if (gd._detailsAny == null || gd._detailsAny.Value == null) return new(); if (!gd._detailsAny.TypeUrl.EndsWith(HTTPDetailsEntity.Descriptor.FullName)) throw new InvalidOperationException(); return new DnsDetails(gd._detailsAny); } } public record HttpDetails : EventDetails { public HttpDetails() { } public HttpDetails(Any? any) { if (any == null || any.Value == null) return; var detailsEntity = HTTPDetailsEntity.Parser.ParseFrom(any.Value); Method = new HttpMethod(detailsEntity.Method.ToString()); Host = detailsEntity.Host; Uri = detailsEntity.Uri; Proto = detailsEntity.Proto; Headers = new INetMockHttpHeaders(detailsEntity.Headers); } public HttpMethod Method { get; init; } public string Host { get; init; } public string Uri { get; init; } public string Proto { get; init; } public HttpHeaders Headers { get; init; } } public record DnsDetails : EventDetails { public DnsDetails() { } public DNSOpCode OpCode { get; init; } public IReadOnlyList Questions { get; init; } public DnsDetails(Any? any) { if (any == null || any.Value == null) return; var entity = DNSDetailsEntity.Parser.ParseFrom(any.Value); OpCode = entity.Opcode; Questions = entity.Questions; } } }