-
Notifications
You must be signed in to change notification settings - Fork 10
Expand file tree
/
Copy pathInterceptedHttpMessageHandler.cs
More file actions
86 lines (77 loc) · 3.42 KB
/
InterceptedHttpMessageHandler.cs
File metadata and controls
86 lines (77 loc) · 3.42 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
using System.Net;
using System.Text.Json;
using System.Web;
namespace OpenShock.API.IntegrationTests.HttpMessageHandlers;
sealed class InterceptedHttpMessageHandler : DelegatingHandler
{
private async Task<HttpResponseMessage> HandleCloudflareTurnstileRequest(HttpRequestMessage request, CancellationToken cancellationToken)
{
var formData = request.Content is null ? string.Empty : await request.Content.ReadAsStringAsync(cancellationToken);
var parsedForm = HttpUtility.ParseQueryString(formData);
var responseToken = parsedForm["response"];
var responseDto = responseToken switch
{
"valid-token" => new CloudflareTurnstileVerifyResponseDto
{
Success = true,
ErrorCodes = [],
ChallengeTs = DateTime.UtcNow,
Hostname = "validhost",
Action = "validaction",
Cdata = ""
},
"invalid-token" => new CloudflareTurnstileVerifyResponseDto
{
Success = false,
ErrorCodes = ["invalid-input-response"],
ChallengeTs = DateTime.UtcNow,
Hostname = "invalidhost",
Action = "invalidaction",
Cdata = ""
},
_ => new CloudflareTurnstileVerifyResponseDto
{
Success = false,
ErrorCodes = ["bad-request"],
ChallengeTs = DateTime.UtcNow,
Hostname = "unknownhost",
Action = "unknownaction",
Cdata = ""
}
};
var responseJson = JsonSerializer.Serialize(responseDto);
var responseMessage = new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new StringContent(responseJson, System.Text.Encoding.UTF8, "application/json")
};
return responseMessage;
}
private Task<HttpResponseMessage> HandleMailJetApiHost(HttpRequestMessage request, CancellationToken cancellationToken)
{
return Task.FromResult(new HttpResponseMessage(HttpStatusCode.NotFound));
}
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
return request.RequestUri switch
{
{ Host: "challenges.cloudflare.com", AbsolutePath: "/turnstile/v0/siteverify" } => await HandleCloudflareTurnstileRequest(request, cancellationToken),
{ Host: "api.mailjet.com" } => await HandleMailJetApiHost(request, cancellationToken),
_ => new HttpResponseMessage(HttpStatusCode.NotFound)
};
}
private class CloudflareTurnstileVerifyResponseDto
{
[System.Text.Json.Serialization.JsonPropertyName("success")]
public bool Success { get; init; }
[System.Text.Json.Serialization.JsonPropertyName("error-codes")]
public required string[] ErrorCodes { get; init; }
[System.Text.Json.Serialization.JsonPropertyName("challenge_ts")]
public DateTime ChallengeTs { get; init; }
[System.Text.Json.Serialization.JsonPropertyName("hostname")]
public required string Hostname { get; init; }
[System.Text.Json.Serialization.JsonPropertyName("action")]
public required string Action { get; init; }
[System.Text.Json.Serialization.JsonPropertyName("cdata")]
public required string Cdata { get; init; }
}
}