Skip to content

Commit 1778d44

Browse files
authored
simplify http build code (#754)
* simplify request code * re generate code * remove unused tracing from websocket * dotnet fmt * fix warning * fix warning * make fmt and stylecop happy together
1 parent 743e859 commit 1778d44

File tree

5 files changed

+10258
-24467
lines changed

5 files changed

+10258
-24467
lines changed

gen/KubernetesGenerator/StringHelpers.cs

Lines changed: 11 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System.IO;
44
using System.Linq;
55
using System.Security;
6+
using System.Text.RegularExpressions;
67
using NJsonSchema;
78
using Nustache.Core;
89

@@ -20,8 +21,8 @@ public StringHelpers(GeneralNameHelper generalNameHelper)
2021
public void RegisterHelper()
2122
{
2223
Helpers.Register(nameof(ToXmlDoc), ToXmlDoc);
23-
Helpers.Register(nameof(AddCurly), AddCurly);
24-
Helpers.Register(nameof(EscapeDataString), EscapeDataString);
24+
Helpers.Register(nameof(ToInterpolationPathString), ToInterpolationPathString);
25+
Helpers.Register(nameof(IfGroupPathParamContainsGroup), IfGroupPathParamContainsGroup);
2526
}
2627

2728
private void ToXmlDoc(RenderContext context, IList<object> arguments, IDictionary<string, object> options,
@@ -90,42 +91,23 @@ private static IEnumerable<string> WordWrap(string text, int width)
9091
}
9192
}
9293

93-
public void AddCurly(RenderContext context, IList<object> arguments, IDictionary<string, object> options,
94+
public void ToInterpolationPathString(RenderContext context, IList<object> arguments, IDictionary<string, object> options,
9495
RenderBlock fn, RenderBlock inverse)
9596
{
96-
var s = arguments?.FirstOrDefault() as string;
97-
if (s != null)
97+
var p = arguments?.FirstOrDefault() as string;
98+
if (p != null)
9899
{
99-
context.Write("{" + s + "}");
100+
context.Write(Regex.Replace(p, "{(.+?)}", (m) => "{" + generalNameHelper.GetDotNetName(m.Groups[1].Value) + "}"));
100101
}
101102
}
102103

103-
public void EscapeDataString(RenderContext context, IList<object> arguments,
104-
IDictionary<string, object> options,
104+
public void IfGroupPathParamContainsGroup(RenderContext context, IList<object> arguments, IDictionary<string, object> options,
105105
RenderBlock fn, RenderBlock inverse)
106106
{
107-
var name = generalNameHelper.GetDotNetName(arguments[0] as string);
108-
var type = arguments[1] as JsonObjectType?;
109-
110-
if (name == "pretty")
111-
{
112-
context.Write($"{name}.Value ? \"true\" : \"false\"");
113-
return;
114-
}
115-
116-
switch (type)
107+
var p = arguments?.FirstOrDefault() as string;
108+
if (p?.StartsWith("apis/{group}") == true)
117109
{
118-
case JsonObjectType.String:
119-
context.Write($"System.Uri.EscapeDataString({name})");
120-
break;
121-
case JsonObjectType.Boolean:
122-
context.Write($"{name}.Value ? \"true\" : \"false\"");
123-
break;
124-
case JsonObjectType.Integer:
125-
context.Write($"{name}.Value");
126-
break;
127-
default:
128-
throw new ArgumentException("type not supportted");
110+
fn(null);
129111
}
130112
}
131113
}

gen/KubernetesGenerator/templates/Kubernetes.cs.template

Lines changed: 19 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -46,42 +46,33 @@ namespace k8s
4646
{{/operation.parameters}}
4747

4848
// Construct URL
49-
var _baseUrl = BaseUri.AbsoluteUri;
50-
var _url = new System.Uri(new System.Uri(_baseUrl + (_baseUrl.EndsWith("/") ? "" : "/")), "{{path}}").ToString();
51-
{{#operation.parameters}}
52-
{{#IfKindIs . "path"}}
53-
_url = _url.Replace("{{AddCurly name}}", {{GetDotNetName name}});
54-
{{/IfKindIs . "path"}}
55-
{{/operation.parameters}}
56-
_url = _url.Replace("/apis//", "/api/");
57-
List<string> _queryParameters = new List<string>();
49+
var url = new System.Uri(BaseUri, $"{{ToInterpolationPathString path}}").ToString();
50+
{{#IfGroupPathParamContainsGroup path}}
51+
url = url.Replace("/apis//", "/api/");
52+
{{/IfGroupPathParamContainsGroup}}
53+
var q = new QueryBuilder();
5854
{{#operation.parameters}}
5955
{{#IfKindIs . "query"}}
60-
if ({{GetDotNetName name}} != null)
61-
{
62-
_queryParameters.Add(string.Format("{{name}}={0}", {{EscapeDataString name type}}));
63-
}
56+
q.Append("{{name}}", {{GetDotNetName name}});
6457
{{/IfKindIs . "query"}}
6558
{{/operation.parameters}}
66-
if (_queryParameters.Count > 0)
67-
{
68-
_url += "?" + string.Join("&", _queryParameters);
69-
}
59+
url += q.ToString();
60+
7061
// Create HTTP transport
71-
var _httpRequest = CreateRequest(_url, HttpMethod.{{Method}}, customHeaders);
62+
var httpRequest = CreateRequest(url, HttpMethod.{{Method}}, customHeaders);
7263
{{#IfParamContains operation "body"}}
73-
var _httpResponse = await SendRequest(body, _httpRequest, cancellationToken);
64+
var httpResponse = await SendRequest(body, httpRequest, cancellationToken);
7465
{{/IfParamContains operation "body"}}
7566
{{#IfParamDoesNotContain operation "body"}}
76-
var _httpResponse = await SendRequestRaw("", _httpRequest, cancellationToken);
67+
var httpResponse = await SendRequestRaw("", httpRequest, cancellationToken);
7768
{{/IfParamDoesNotContain operation "body"}}
7869
// Create Result
7970
{{#IfReturnType operation "void"}}
80-
HttpOperationResponse _result = new HttpOperationResponse() { Request = _httpRequest, Response = _httpResponse };
71+
HttpOperationResponse result = new HttpOperationResponse() { Request = httpRequest, Response = httpResponse };
8172
{{/IfReturnType operation "void"}}
8273
{{#IfReturnType operation "obj"}}
83-
var _result = await CreateResultAsync{{GetReturnType operation "<>"}}(_httpRequest,
84-
_httpResponse,
74+
var result = await CreateResultAsync{{GetReturnType operation "<>"}}(httpRequest,
75+
httpResponse,
8576
{{#IfParamContains operation "watch"}}
8677
watch,
8778
{{/IfParamContains operation "watch"}}
@@ -91,12 +82,12 @@ namespace k8s
9182
cancellationToken);
9283
{{/IfReturnType operation "obj"}}
9384
{{#IfReturnType operation "stream"}}
94-
var _result = new HttpOperationResponse{{GetReturnType operation "<>"}}() {
95-
Request = _httpRequest,
96-
Response = _httpResponse,
97-
Body = await _httpResponse.Content.ReadAsStreamAsync().ConfigureAwait(false) };
85+
var result = new HttpOperationResponse{{GetReturnType operation "<>"}}() {
86+
Request = httpRequest,
87+
Response = httpResponse,
88+
Body = await httpResponse.Content.ReadAsStreamAsync().ConfigureAwait(false) };
9889
{{/IfReturnType operation "stream"}}
99-
return _result;
90+
return result;
10091
}
10192
{{/.}}
10293
}

src/KubernetesClient/Kubernetes.WebSocket.cs

Lines changed: 5 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -83,27 +83,6 @@ public virtual Task<WebSocket> WebSocketNamespacedPodExecAsync(string name, stri
8383
}
8484
}
8585

86-
// Tracing
87-
var shouldTrace = ServiceClientTracing.IsEnabled;
88-
string invocationId = null;
89-
if (shouldTrace)
90-
{
91-
invocationId = ServiceClientTracing.NextInvocationId.ToString();
92-
var tracingParameters = new Dictionary<string, object>();
93-
tracingParameters.Add("command", command);
94-
tracingParameters.Add("container", container);
95-
tracingParameters.Add("name", name);
96-
tracingParameters.Add("namespace", @namespace);
97-
tracingParameters.Add("stderr", stderr);
98-
tracingParameters.Add("stdin", stdin);
99-
tracingParameters.Add("stdout", stdout);
100-
tracingParameters.Add("tty", tty);
101-
tracingParameters.Add("webSocketSubProtol", webSocketSubProtol);
102-
tracingParameters.Add("cancellationToken", cancellationToken);
103-
ServiceClientTracing.Enter(invocationId, this, nameof(WebSocketNamespacedPodExecAsync),
104-
tracingParameters);
105-
}
106-
10786
// Construct URL
10887
var uriBuilder = new UriBuilder(BaseUri);
10988
uriBuilder.Scheme = BaseUri.Scheme == "https" ? "wss" : "ws";
@@ -137,7 +116,7 @@ public virtual Task<WebSocket> WebSocketNamespacedPodExecAsync(string name, stri
137116
uriBuilder.Query =
138117
query.ToString(1, query.Length - 1); // UriBuilder.Query doesn't like leading '?' chars, so trim it
139118

140-
return StreamConnectAsync(uriBuilder.Uri, invocationId, webSocketSubProtol, customHeaders,
119+
return StreamConnectAsync(uriBuilder.Uri, webSocketSubProtol, customHeaders,
141120
cancellationToken);
142121
}
143122

@@ -162,21 +141,6 @@ public Task<WebSocket> WebSocketNamespacedPodPortForwardAsync(string name, strin
162141
throw new ArgumentNullException(nameof(ports));
163142
}
164143

165-
// Tracing
166-
var shouldTrace = ServiceClientTracing.IsEnabled;
167-
string invocationId = null;
168-
if (shouldTrace)
169-
{
170-
invocationId = ServiceClientTracing.NextInvocationId.ToString();
171-
var tracingParameters = new Dictionary<string, object>();
172-
tracingParameters.Add("name", name);
173-
tracingParameters.Add("@namespace", @namespace);
174-
tracingParameters.Add("ports", ports);
175-
tracingParameters.Add("webSocketSubProtocol", webSocketSubProtocol);
176-
tracingParameters.Add("cancellationToken", cancellationToken);
177-
ServiceClientTracing.Enter(invocationId, this, nameof(WebSocketNamespacedPodPortForwardAsync),
178-
tracingParameters);
179-
}
180144

181145
// Construct URL
182146
var uriBuilder = new UriBuilder(BaseUri);
@@ -202,7 +166,7 @@ public Task<WebSocket> WebSocketNamespacedPodPortForwardAsync(string name, strin
202166

203167
uriBuilder.Query = q.ToString();
204168

205-
return StreamConnectAsync(uriBuilder.Uri, invocationId, webSocketSubProtocol, customHeaders,
169+
return StreamConnectAsync(uriBuilder.Uri, webSocketSubProtocol, customHeaders,
206170
cancellationToken);
207171
}
208172

@@ -222,26 +186,6 @@ public Task<WebSocket> WebSocketNamespacedPodAttachAsync(string name, string @na
222186
throw new ArgumentNullException(nameof(@namespace));
223187
}
224188

225-
// Tracing
226-
var shouldTrace = ServiceClientTracing.IsEnabled;
227-
string invocationId = null;
228-
if (shouldTrace)
229-
{
230-
invocationId = ServiceClientTracing.NextInvocationId.ToString();
231-
var tracingParameters = new Dictionary<string, object>();
232-
tracingParameters.Add("container", container);
233-
tracingParameters.Add("name", name);
234-
tracingParameters.Add("namespace", @namespace);
235-
tracingParameters.Add("stderr", stderr);
236-
tracingParameters.Add("stdin", stdin);
237-
tracingParameters.Add("stdout", stdout);
238-
tracingParameters.Add("tty", tty);
239-
tracingParameters.Add("webSocketSubProtol", webSocketSubProtol);
240-
tracingParameters.Add("cancellationToken", cancellationToken);
241-
ServiceClientTracing.Enter(invocationId, this, nameof(WebSocketNamespacedPodAttachAsync),
242-
tracingParameters);
243-
}
244-
245189
// Construct URL
246190
var uriBuilder = new UriBuilder(BaseUri);
247191
uriBuilder.Scheme = BaseUri.Scheme == "https" ? "wss" : "ws";
@@ -262,21 +206,17 @@ public Task<WebSocket> WebSocketNamespacedPodAttachAsync(string name, string @na
262206
uriBuilder.Query =
263207
query.ToString(1, query.Length - 1); // UriBuilder.Query doesn't like leading '?' chars, so trim it
264208

265-
return StreamConnectAsync(uriBuilder.Uri, invocationId, webSocketSubProtol, customHeaders,
209+
return StreamConnectAsync(uriBuilder.Uri, webSocketSubProtol, customHeaders,
266210
cancellationToken);
267211
}
268212

269-
protected async Task<WebSocket> StreamConnectAsync(Uri uri, string invocationId = null,
270-
string webSocketSubProtocol = null, Dictionary<string, List<string>> customHeaders = null,
271-
CancellationToken cancellationToken = default)
213+
protected async Task<WebSocket> StreamConnectAsync(Uri uri, string webSocketSubProtocol = null, Dictionary<string, List<string>> customHeaders = null, CancellationToken cancellationToken = default)
272214
{
273215
if (uri == null)
274216
{
275217
throw new ArgumentNullException(nameof(uri));
276218
}
277219

278-
var shouldTrace = ServiceClientTracing.IsEnabled;
279-
280220
// Create WebSocket transport objects
281221
var webSocketBuilder = CreateWebSocketBuilder();
282222

@@ -387,22 +327,10 @@ protected async Task<WebSocket> StreamConnectAsync(Uri uri, string invocationId
387327
throw ex;
388328
}
389329
}
390-
catch (Exception ex)
330+
catch (Exception)
391331
{
392-
if (shouldTrace)
393-
{
394-
ServiceClientTracing.Error(invocationId, ex);
395-
}
396-
397332
throw;
398333
}
399-
finally
400-
{
401-
if (shouldTrace)
402-
{
403-
ServiceClientTracing.Exit(invocationId, null);
404-
}
405-
}
406334

407335
return webSocket;
408336
}

src/KubernetesClient/Kubernetes.cs

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,20 @@ namespace k8s
99
{
1010
public partial class Kubernetes
1111
{
12+
private Uri baseuri;
13+
1214
/// <summary>
1315
/// The base URI of the service.
1416
/// </summary>
15-
public Uri BaseUri { get; set; }
17+
public Uri BaseUri
18+
{
19+
get => baseuri;
20+
set
21+
{
22+
var baseUrl = value?.AbsoluteUri ?? throw new ArgumentNullException(nameof(BaseUri));
23+
baseuri = new Uri(baseUrl + (baseUrl.EndsWith("/") ? "" : "/"));
24+
}
25+
}
1626

1727
/// <summary>
1828
/// Subscription credentials which uniquely identify client subscription.
@@ -132,6 +142,7 @@ public Kubernetes(ServiceClientCredentials credentials, params DelegatingHandler
132142
/// <exception cref="ArgumentNullException">
133143
/// Thrown when a required parameter is null
134144
/// </exception>
145+
[Obsolete]
135146
public Kubernetes(ServiceClientCredentials credentials, HttpClient httpClient, bool disposeHttpClient)
136147
: this(httpClient, disposeHttpClient)
137148
{
@@ -249,6 +260,43 @@ private async Task<HttpOperationResponse<T>> CreateResultAsync<T>(HttpRequestMes
249260
return result;
250261
}
251262

263+
private class QueryBuilder
264+
{
265+
private List<string> parameters = new List<string>();
266+
267+
public void Append(string key, params object[] values)
268+
{
269+
foreach (var value in values)
270+
{
271+
switch (value)
272+
{
273+
case int intval:
274+
parameters.Add($"{key}={intval}");
275+
break;
276+
case string strval:
277+
parameters.Add($"{key}={Uri.EscapeDataString(strval)}");
278+
break;
279+
case bool boolval:
280+
parameters.Add($"{key}={(boolval ? "true" : "false")}");
281+
break;
282+
default:
283+
// null
284+
break;
285+
}
286+
}
287+
}
288+
289+
public override string ToString()
290+
{
291+
if (parameters.Count > 0)
292+
{
293+
return "?" + string.Join("&", parameters);
294+
}
295+
296+
return "";
297+
}
298+
}
299+
252300
private HttpRequestMessage CreateRequest(string url, HttpMethod method, IDictionary<string, IList<string>> customHeaders)
253301
{
254302
var httpRequest = new HttpRequestMessage();

0 commit comments

Comments
 (0)