|
1 | 1 | using k8s.Models; |
2 | | -using Microsoft.AspNetCore.WebUtilities; |
3 | 2 | using Microsoft.Rest; |
4 | 3 | using Microsoft.Rest.Serialization; |
5 | 4 | using System; |
|
14 | 13 | using System.Security.Cryptography.X509Certificates; |
15 | 14 | using System.Threading; |
16 | 15 | using System.Threading.Tasks; |
| 16 | +using System.Text; |
| 17 | +using System.Globalization; |
17 | 18 |
|
18 | 19 | namespace k8s |
19 | 20 | { |
@@ -102,27 +103,23 @@ public partial class Kubernetes |
102 | 103 |
|
103 | 104 | uriBuilder.Path += $"api/v1/namespaces/{@namespace}/pods/{name}/exec"; |
104 | 105 |
|
105 | | - var query = string.Empty; |
| 106 | + var query = new StringBuilder(); |
106 | 107 |
|
107 | 108 | foreach (var c in command) |
108 | 109 | { |
109 | | - query = QueryHelpers.AddQueryString(query, "command", c); |
| 110 | + Utilities.AddQueryParameter(query, "command", c); |
110 | 111 | } |
111 | 112 |
|
112 | | - if (container != null) |
| 113 | + if (!string.IsNullOrEmpty(container)) |
113 | 114 | { |
114 | | - query = QueryHelpers.AddQueryString(query, "container", Uri.EscapeDataString(container)); |
| 115 | + Utilities.AddQueryParameter(query, "container", container); |
115 | 116 | } |
116 | 117 |
|
117 | | - query = QueryHelpers.AddQueryString(query, new Dictionary<string, string> |
118 | | - { |
119 | | - {"stderr", stderr ? "1" : "0"}, |
120 | | - {"stdin", stdin ? "1" : "0"}, |
121 | | - {"stdout", stdout ? "1" : "0"}, |
122 | | - {"tty", tty ? "1" : "0"} |
123 | | - }).TrimStart('?'); |
124 | | - |
125 | | - uriBuilder.Query = query; |
| 118 | + query.Append("&stderr=").Append(stderr ? '1' : '0'); // the query string is guaranteed not to be empty here because it has a 'command' param |
| 119 | + query.Append("&stdin=").Append(stdin ? '1' : '0'); |
| 120 | + query.Append("&stdout=").Append(stdout ? '1' : '0'); |
| 121 | + query.Append("&tty=").Append(tty ? '1' : '0'); |
| 122 | + uriBuilder.Query = query.ToString(1, query.Length-1); // UriBuilder.Query doesn't like leading '?' chars, so trim it |
126 | 123 |
|
127 | 124 | return this.StreamConnectAsync(uriBuilder.Uri, _invocationId, webSocketSubProtol, customHeaders, cancellationToken); |
128 | 125 | } |
@@ -171,14 +168,13 @@ public partial class Kubernetes |
171 | 168 |
|
172 | 169 | uriBuilder.Path += $"api/v1/namespaces/{@namespace}/pods/{name}/portforward"; |
173 | 170 |
|
174 | | - var q = ""; |
| 171 | + var q = new StringBuilder(); |
175 | 172 | foreach (var port in ports) |
176 | 173 | { |
177 | | - q = QueryHelpers.AddQueryString(q, "ports", $"{port}"); |
| 174 | + if (q.Length != 0) q.Append('&'); |
| 175 | + q.Append("ports=").Append(port.ToString(CultureInfo.InvariantCulture)); |
178 | 176 | } |
179 | | - uriBuilder.Query = q.TrimStart('?'); |
180 | | - |
181 | | - |
| 177 | + uriBuilder.Query = q.ToString(); |
182 | 178 |
|
183 | 179 | return StreamConnectAsync(uriBuilder.Uri, _invocationId, webSocketSubProtocol, customHeaders, cancellationToken); |
184 | 180 | } |
@@ -226,14 +222,13 @@ public partial class Kubernetes |
226 | 222 |
|
227 | 223 | uriBuilder.Path += $"api/v1/namespaces/{@namespace}/pods/{name}/attach"; |
228 | 224 |
|
229 | | - uriBuilder.Query = QueryHelpers.AddQueryString(string.Empty, new Dictionary<string, string> |
230 | | - { |
231 | | - { "container", container}, |
232 | | - { "stderr", stderr ? "1": "0"}, |
233 | | - { "stdin", stdin ? "1": "0"}, |
234 | | - { "stdout", stdout ? "1": "0"}, |
235 | | - { "tty", tty ? "1": "0"} |
236 | | - }).TrimStart('?'); |
| 225 | + var query = new StringBuilder(); |
| 226 | + query.Append("?stderr=").Append(stderr ? '1' : '0'); |
| 227 | + query.Append("&stdin=").Append(stdin ? '1' : '0'); |
| 228 | + query.Append("&stdout=").Append(stdout ? '1' : '0'); |
| 229 | + query.Append("&tty=").Append(tty ? '1' : '0'); |
| 230 | + Utilities.AddQueryParameter(query, "container", container); |
| 231 | + uriBuilder.Query = query.ToString(1, query.Length-1); // UriBuilder.Query doesn't like leading '?' chars, so trim it |
237 | 232 |
|
238 | 233 | return StreamConnectAsync(uriBuilder.Uri, _invocationId, webSocketSubProtol, customHeaders, cancellationToken); |
239 | 234 | } |
|
0 commit comments