1 using Microsoft.AspNetCore.Http.Headers;
2 using Microsoft.Extensions.Primitives;
3 using Microsoft.Net.Http.Headers;
5 using System.Collections.Generic;
6 using System.Globalization;
8 using System.Net.Http.Headers;
9 using System.Reflection;
72 public ProductHeaderValue
UserAgent => ProductInfoHeaderValue.TryParse(
RawUserAgent, out var userAgent) ? userAgent.Product :
null;
109 public static bool CheckCompatibility(
Version otherVersion) => !(
Version.Major != (otherVersion?.Major ??
throw new ArgumentNullException(nameof(otherVersion))) ||
Version.Minor > otherVersion.Minor);
116 public ApiHeaders(ProductHeaderValue userAgent,
string token) : this(userAgent, token, null, null)
118 if (userAgent ==
null)
119 throw new ArgumentNullException(nameof(userAgent));
121 throw new ArgumentNullException(nameof(token));
130 public ApiHeaders(ProductHeaderValue userAgent,
string username,
string password) : this(userAgent, null, username, password)
132 if (userAgent ==
null)
133 throw new ArgumentNullException(nameof(userAgent));
134 if (username ==
null)
135 throw new ArgumentNullException(nameof(username));
136 if (password ==
null)
137 throw new ArgumentNullException(nameof(password));
146 if (requestHeaders ==
null)
147 throw new ArgumentNullException(nameof(requestHeaders));
149 var jsonAccept =
new Microsoft.Net.Http.Headers.MediaTypeHeaderValue(
ApplicationJson);
150 if (!requestHeaders.Accept.Any(x => x.MediaType == jsonAccept.MediaType))
151 throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture,
"Client does not accept {0}!",
ApplicationJson));
153 if (!requestHeaders.Headers.TryGetValue(HeaderNames.UserAgent, out var userAgentValues) || userAgentValues.Count == 0)
154 throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture,
"Missing {0} headers!", HeaderNames.UserAgent));
158 throw new InvalidOperationException(
"Malformed client User-Agent!");
161 if (!requestHeaders.Headers.TryGetValue(
ApiVersionHeader, out var apiUserAgentHeaderValues) || !ProductInfoHeaderValue.TryParse(apiUserAgentHeaderValues.FirstOrDefault(), out var apiUserAgent) || apiUserAgent.Product.Name !=
AssemblyName.Name)
162 throw new InvalidOperationException(
"Missing API version!");
164 if (!
Version.TryParse(apiUserAgent.Product.Version, out var apiVersion))
165 throw new InvalidOperationException(
"Malformed API version!");
169 if (!requestHeaders.Headers.TryGetValue(HeaderNames.Authorization, out StringValues authorization))
170 throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture,
"Missing {0} header!", HeaderNames.Authorization));
171 var auth = authorization.First();
172 var splits =
new List<string>(auth.Split(
' '));
173 var scheme = splits.First();
174 if (String.IsNullOrWhiteSpace(scheme))
175 throw new InvalidOperationException(
"Missing authentication scheme!");
178 var parameter = String.Concat(splits);
179 if (String.IsNullOrEmpty(parameter))
180 throw new InvalidOperationException(
"Missing authentication parameter!");
182 if (requestHeaders.Headers.TryGetValue(
InstanceIdHeader, out var instanceIdValues))
184 var instanceIdString = instanceIdValues.FirstOrDefault();
185 if (instanceIdString !=
default && Int64.TryParse(instanceIdString, out var instanceId))
189 #pragma warning disable CA1308 // Normalize strings to uppercase 190 switch (scheme.ToLowerInvariant())
191 #pragma warning restore CA1308
198 var fail = !requestHeaders.Headers.TryGetValue(
UsernameHeader, out var values);
202 fail = String.IsNullOrWhiteSpace(
Username);
206 throw new InvalidOperationException(
"Missing Username header!");
212 var base64Bytes = Convert.FromBase64String(parameter);
213 joinedString = Encoding.UTF8.GetString(base64Bytes);
217 throw new InvalidOperationException(
"Invalid basic Authorization header!");
220 var basicAuthSplits = joinedString.Split(
new char[] {
':' }, StringSplitOptions.RemoveEmptyEntries);
221 if (basicAuthSplits.Length < 2)
222 throw new InvalidOperationException(
"Invalid basic Authorization header!");
225 Password = String.Concat(basicAuthSplits.Skip(1));
228 throw new InvalidOperationException(
"Invalid authentication scheme!");
239 ApiHeaders(ProductHeaderValue userAgent,
string token,
string username,
string password)
262 throw new ArgumentNullException(nameof(headers));
264 throw new InvalidOperationException(
"Specified instance ID in constructor and SetRequestHeaders!");
267 headers.Accept.Add(
new MediaTypeWithQualityHeaderValue(
ApplicationJson));
271 headers.Authorization =
new AuthenticationHeaderValue(
273 Convert.ToBase64String(Encoding.UTF8.GetBytes($
"{Username}:{Password}")));
275 headers.UserAgent.Add(
new ProductInfoHeaderValue(
UserAgent));
278 if (instanceId.HasValue)