-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathDNSController.cs
72 lines (63 loc) · 2 KB
/
DNSController.cs
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
[ApiController]
public class DNSController : ControllerBase
{
private readonly UdpClientService udpClientService;
public DNSController(UdpClientService _udpClientService)
{
udpClientService = _udpClientService;
}
[HttpGet("dns-query")]
public async Task Get()
{
var udpClient = udpClientService.Dequeue();
try
{
var dns = this.HttpContext.Request.Query["dns"];
var urlEncodedRequest = dns.First();
var message = WebEncoders.Base64UrlDecode(urlEncodedRequest);
await udpClient.Client.SendAsync(message, SocketFlags.None);
var res = await udpClient.ReceiveAsync();
this.HttpContext.Response.Headers.ContentType = Constants.AcceptedContentType;
await this.HttpContext.Response.Body.WriteAsync(res.Buffer);
return;
}
finally
{
udpClientService.ReturnToQueue(udpClient);
}
}
[HttpPost("dns-query")]
public async Task Post()
{
var udpClient = udpClientService.Dequeue();
try
{
using (var reqMs = new MemoryStream(1048))
{
await this.HttpContext.Request.Body.CopyToAsync(reqMs);
await udpClient.Client.SendAsync(reqMs.GetBuffer(), SocketFlags.None);
}
var res = await udpClient.ReceiveAsync();
this.HttpContext.Response.Headers.ContentType = Constants.AcceptedContentType;
await this.HttpContext.Response.Body.WriteAsync(res.Buffer);
return;
}
finally
{
udpClientService.ReturnToQueue(udpClient);
}
}
private bool ValidInputs(string dnsQuery)
{
if (string.IsNullOrWhiteSpace(dnsQuery))
{
return false;
}
return true;
}
private async Task WriteError(string error)
{
this.HttpContext.Response.StatusCode = 400;
await this.HttpContext.Response.WriteAsync(error);
}
}