-
Notifications
You must be signed in to change notification settings - Fork 301
/
Copy pathKubernetesRequestDigest.cs
111 lines (98 loc) · 3.45 KB
/
KubernetesRequestDigest.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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
// Derived from
// https://github.com/kubernetes-client/java/blob/master/util/src/main/java/io/kubernetes/client/apimachinery/KubernetesResource.java
using System.Net.Http;
using System.Text.RegularExpressions;
using System.Web;
namespace k8s
{
internal class KubernetesRequestDigest
{
private static readonly Regex ResourcePattern =
new Regex(@"^/(api|apis)(/\S+)?/v\d\w*/\S+", RegexOptions.Compiled);
public string Path { get; }
public bool IsNonResourceRequest { get; }
public string ApiGroup { get; }
public string ApiVersion { get; }
public string Kind { get; }
public string Verb { get; }
public KubernetesRequestDigest(string urlPath, bool isNonResourceRequest, string apiGroup, string apiVersion, string kind, string verb)
{
this.Path = urlPath;
this.IsNonResourceRequest = isNonResourceRequest;
this.ApiGroup = apiGroup;
this.ApiVersion = apiVersion;
this.Kind = kind;
this.Verb = verb;
}
public static KubernetesRequestDigest Parse(HttpRequestMessage request)
{
if (request == null)
{
throw new ArgumentNullException(nameof(request));
}
string urlPath = request.RequestUri.AbsolutePath;
if (!IsResourceRequest(urlPath))
{
return NonResource(urlPath);
}
try
{
string apiGroup;
string apiVersion;
string kind;
var parts = urlPath.Split('/');
var namespaced = urlPath.IndexOf("/namespaces/", StringComparison.Ordinal) != -1;
if (urlPath.StartsWith("/api/v1", StringComparison.Ordinal))
{
apiGroup = "";
apiVersion = "v1";
if (namespaced)
{
kind = parts[5];
}
else
{
kind = parts[3];
}
}
else
{
apiGroup = parts[2];
apiVersion = parts[3];
if (namespaced)
{
kind = parts[6];
}
else
{
kind = parts[4];
}
}
return new KubernetesRequestDigest(
urlPath,
false,
apiGroup,
apiVersion,
kind,
HasWatchParameter(request) ? "WATCH" : request.Method.ToString());
}
catch (Exception)
{
return NonResource(urlPath);
}
}
private static KubernetesRequestDigest NonResource(string urlPath)
{
var digest = new KubernetesRequestDigest(urlPath, true, "nonresource", "na", "na", "na");
return digest;
}
public static bool IsResourceRequest(string urlPath)
{
return ResourcePattern.Matches(urlPath).Count > 0;
}
private static bool HasWatchParameter(HttpRequestMessage request)
{
return !string.IsNullOrEmpty(HttpUtility.ParseQueryString(request.RequestUri.Query).Get("watch"));
}
}
}