2using System.Collections.Generic;
4using System.Net.Http.Headers;
6using System.Reflection;
9using Microsoft.AspNetCore.Http.Headers;
10using Microsoft.Extensions.Primitives;
11using Microsoft.Net.Http.Headers;
76 public ProductHeaderValue?
UserAgent => ProductInfoHeaderValue.TryParse(
RawUserAgent, out var userAgent) ? userAgent.Product :
null;
118 public static bool CheckCompatibility(
Version otherVersion) => Version.Major == (otherVersion?.Major ??
throw new ArgumentNullException(nameof(otherVersion)));
126 public ApiHeaders(ProductHeaderValue userAgent,
string token,
OAuthProvider? oauthProvider =
null) : this(userAgent, token, null, null)
128 if (userAgent ==
null)
129 throw new ArgumentNullException(nameof(userAgent));
131 throw new ArgumentNullException(nameof(token));
142 public ApiHeaders(ProductHeaderValue userAgent,
string username,
string password) : this(userAgent, null, username, password)
144 if (userAgent ==
null)
145 throw new ArgumentNullException(nameof(userAgent));
146 if (username ==
null)
147 throw new ArgumentNullException(nameof(username));
148 if (password ==
null)
149 throw new ArgumentNullException(nameof(password));
158#pragma warning disable CA1502
159 public ApiHeaders(RequestHeaders requestHeaders,
bool ignoreMissingAuth =
false)
161 if (requestHeaders ==
null)
162 throw new ArgumentNullException(nameof(requestHeaders));
165 var errorBuilder =
new StringBuilder();
167 void AddError(
HeaderTypes headerType,
string message)
170 errorBuilder.AppendLine();
171 badHeaders |= headerType;
172 errorBuilder.Append(message);
176 if (!requestHeaders.Accept.Any(x => jsonAccept.IsSubsetOf(x)))
177 AddError(
HeaderTypes.Accept, $
"Client does not accept {ApplicationJsonMime}!");
179 if (!requestHeaders.Headers.TryGetValue(HeaderNames.UserAgent, out var userAgentValues) || userAgentValues.Count == 0)
180 AddError(
HeaderTypes.UserAgent, $
"Missing {HeaderNames.UserAgent} header!");
185 AddError(
HeaderTypes.UserAgent, $
"Malformed {HeaderNames.UserAgent} header!");
190 if (!requestHeaders.Headers.TryGetValue(
ApiVersionHeader, out var apiUserAgentHeaderValues) || !ProductInfoHeaderValue.TryParse(apiUserAgentHeaderValues.FirstOrDefault(), out var apiUserAgent) || apiUserAgent.Product.Name !=
AssemblyName.Name)
191 AddError(
HeaderTypes.Api, $
"Missing {ApiVersionHeader} header!");
192 else if (!
Version.TryParse(apiUserAgent.Product.Version, out apiVersion))
193 AddError(
HeaderTypes.Api, $
"Malformed {ApiVersionHeader} header!");
195 if (!requestHeaders.Headers.TryGetValue(HeaderNames.Authorization, out StringValues authorization))
197 if (!ignoreMissingAuth)
198 AddError(
HeaderTypes.Authorization, $
"Missing {HeaderNames.Authorization} header!");
202 var auth = authorization.First();
203 var splits =
new List<string>(auth.Split(
' '));
204 var scheme = splits.First();
205 if (String.IsNullOrWhiteSpace(scheme))
206 AddError(
HeaderTypes.Authorization,
"Missing authentication scheme!");
210 var parameter = String.Concat(splits);
211 if (String.IsNullOrEmpty(parameter))
212 AddError(
HeaderTypes.Authorization,
"Missing authentication parameter!");
215 if (requestHeaders.Headers.TryGetValue(
InstanceIdHeader, out var instanceIdValues))
217 var instanceIdString = instanceIdValues.FirstOrDefault();
218 if (instanceIdString !=
default && Int64.TryParse(instanceIdString, out var instanceId))
225 if (requestHeaders.Headers.TryGetValue(
OAuthProviderHeader, out StringValues oauthProviderValues))
227 var oauthProviderString = oauthProviderValues.First();
228 if (Enum.TryParse<
OAuthProvider>(oauthProviderString, out var oauthProvider))
231 AddError(
HeaderTypes.OAuthProvider,
"Invalid OAuth provider!");
234 AddError(
HeaderTypes.OAuthProvider, $
"Missing {OAuthProviderHeader} header!");
241 string badBasicAuthHeaderMessage = $
"Invalid basic {HeaderNames.Authorization} header!";
245 var base64Bytes = Convert.FromBase64String(parameter);
246 joinedString = Encoding.UTF8.GetString(base64Bytes);
250 AddError(
HeaderTypes.Authorization, badBasicAuthHeaderMessage);
254 var basicAuthSplits = joinedString.Split(
new char[] {
':' }, StringSplitOptions.RemoveEmptyEntries);
255 if (basicAuthSplits.Length < 2)
257 AddError(
HeaderTypes.Authorization, badBasicAuthHeaderMessage);
262 Password = String.Concat(basicAuthSplits.Skip(1));
265 AddError(
HeaderTypes.Authorization,
"Invalid authentication scheme!");
277#pragma warning restore CA1502
286 ApiHeaders(ProductHeaderValue userAgent,
string? token,
string? username,
string? password)
309 throw new ArgumentNullException(nameof(headers));
311 throw new InvalidOperationException(
"Specified different instance IDs in constructor and SetRequestHeaders!");
315 headers.UserAgent.Add(
new ProductInfoHeaderValue(
UserAgent));
323 headers.Authorization =
new AuthenticationHeaderValue(
325 Convert.ToBase64String(Encoding.UTF8.GetBytes($
"{Username}:{Password}")));
330 if (instanceId.HasValue)
Attribute for bringing in the HTTP API version from MSBuild.
static ApiVersionAttribute Instance
Return the Assembly's instance of the ApiVersionAttribute.
string RawApiVersion
The Version string of the TGS API definition.
OAuthProvider
List of OAuth providers supported by TGS.
HeaderTypes
Types of individual ApiHeaders.