|
| 1 | +using System; |
| 2 | +using System.Linq; |
| 3 | +using System.Text.Json; |
| 4 | +using System.Text.Json.Serialization; |
| 5 | +using Owl.reCAPTCHA.v3; |
| 6 | + |
| 7 | +namespace Owl.reCAPTCHA |
| 8 | +{ |
| 9 | + public class reCAPTCHASiteVerifyResponseJsonConverter : JsonConverter<reCAPTCHASiteVerifyResponse> |
| 10 | + { |
| 11 | + public override bool CanConvert(Type typeToConvert) |
| 12 | + { |
| 13 | + return typeToConvert == typeof(reCAPTCHASiteVerifyV3Response) || |
| 14 | + typeToConvert == typeof(reCAPTCHASiteVerifyResponse); |
| 15 | + } |
| 16 | + |
| 17 | + public override reCAPTCHASiteVerifyResponse Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) |
| 18 | + { |
| 19 | + var rootElement = JsonDocument.ParseValue(ref reader).RootElement; |
| 20 | + |
| 21 | + var success = rootElement.EnumerateObject().FirstOrDefault(x => x.Name.Equals("success", StringComparison.InvariantCultureIgnoreCase)); |
| 22 | + var challengeTimestamp = rootElement.EnumerateObject().FirstOrDefault(x => x.Name.Equals("challenge_ts", StringComparison.InvariantCultureIgnoreCase)); |
| 23 | + var hostname = rootElement.EnumerateObject().FirstOrDefault(x => x.Name.Equals("hostname", StringComparison.InvariantCultureIgnoreCase)); |
| 24 | + var errorCodes = rootElement.EnumerateObject().FirstOrDefault(x => x.Name.Equals("error-codes", StringComparison.InvariantCultureIgnoreCase)); |
| 25 | + |
| 26 | + if (typeToConvert == typeof(reCAPTCHASiteVerifyResponse)) |
| 27 | + { |
| 28 | + return new reCAPTCHASiteVerifyResponse |
| 29 | + { |
| 30 | + Success = success.Value.ValueKind == JsonValueKind.True, |
| 31 | + ChallengeTs = challengeTimestamp.Value.ValueKind == JsonValueKind.String ? challengeTimestamp.Value.GetDateTime() : DateTime.MinValue, |
| 32 | + HostName = hostname.Value.ValueKind == JsonValueKind.String ? hostname.Value.GetString() : null, |
| 33 | + ErrorCodes = errorCodes.Value.ValueKind == JsonValueKind.Array ? JsonSerializer.Deserialize<string[]>(errorCodes.Value.GetRawText()) : null |
| 34 | + }; |
| 35 | + } |
| 36 | + |
| 37 | + if (typeToConvert == typeof(reCAPTCHASiteVerifyV3Response)) |
| 38 | + { |
| 39 | + var score = rootElement.EnumerateObject().FirstOrDefault(x => x.Name.Equals("score", StringComparison.InvariantCultureIgnoreCase)); |
| 40 | + var action = rootElement.EnumerateObject().FirstOrDefault(x => x.Name.Equals("action", StringComparison.InvariantCultureIgnoreCase)); |
| 41 | + return new reCAPTCHASiteVerifyV3Response |
| 42 | + { |
| 43 | + Success = success.Value.ValueKind == JsonValueKind.True, |
| 44 | + ChallengeTs = challengeTimestamp.Value.ValueKind == JsonValueKind.String ? challengeTimestamp.Value.GetDateTime() : DateTime.MinValue, |
| 45 | + HostName = hostname.Value.ValueKind == JsonValueKind.String ? hostname.Value.GetString() : null, |
| 46 | + ErrorCodes = errorCodes.Value.ValueKind == JsonValueKind.Array ? JsonSerializer.Deserialize<string[]>(errorCodes.Value.GetRawText()) : null, |
| 47 | + Score = score.Value.ValueKind == JsonValueKind.Number ? score.Value.GetSingle() : 0, |
| 48 | + Action = action.Value.ValueKind == JsonValueKind.String ? action.Value.GetString() : null |
| 49 | + }; |
| 50 | + } |
| 51 | + |
| 52 | + throw new JsonException($"Incorrect type: {typeToConvert.FullName}"); |
| 53 | + } |
| 54 | + |
| 55 | + public override void Write(Utf8JsonWriter writer, reCAPTCHASiteVerifyResponse value, JsonSerializerOptions options) |
| 56 | + { |
| 57 | + JsonSerializer.Serialize(writer, value); |
| 58 | + } |
| 59 | + } |
| 60 | +} |
0 commit comments