/* * OpenAPI Petstore * * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. * * The version of the OpenAPI document: 1.0.0 * Generated by: https://github.com/openapitools/openapi-generator.git */ using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Reflection; using System.Security.Cryptography.X509Certificates; using System.Text; namespace Org.OpenAPITools.Client { /// /// Represents a set of configuration settings /// public class Configuration : IReadableConfiguration { #region Constants /// /// Version of the package. /// /// Version of the package. public const string Version = "1.0.0"; /// /// Identifier for ISO 8601 DateTime Format /// /// See https://msdn.microsoft.com/en-us/library/az4se3k1(v=vs.110).aspx#Anchor_8 for more information. // ReSharper disable once InconsistentNaming public const string ISO8601_DATETIME_FORMAT = "o"; #endregion Constants #region Static Members /// /// Default creation of exceptions for a given method name and response object /// public static readonly ExceptionFactory DefaultExceptionFactory = (methodName, response) => { var status = (int)response.StatusCode; if (status >= 400) { return new ApiException(status, string.Format("Error calling {0}: {1}", methodName, response.RawContent), response.RawContent, response.Headers); } return null; }; #endregion Static Members #region Private Members /// /// Defines the base path of the target API server. /// Example: http://localhost:3000/v1/ /// private string _basePath; /// /// Gets or sets the API key based on the authentication name. /// This is the key and value comprising the "secret" for accessing an API. /// /// The API key. private IDictionary _apiKey; /// /// Gets or sets the prefix (e.g. Token) of the API key based on the authentication name. /// /// The prefix of the API key. private IDictionary _apiKeyPrefix; private string _dateTimeFormat = ISO8601_DATETIME_FORMAT; private string _tempFolderPath = Path.GetTempPath(); /// /// Gets or sets the servers defined in the OpenAPI spec. /// /// The servers private IList> _servers; #endregion Private Members #region Constructors /// /// Initializes a new instance of the class /// [System.Diagnostics.CodeAnalysis.SuppressMessage("ReSharper", "VirtualMemberCallInConstructor")] public Configuration() { Proxy = null; UserAgent = "OpenAPI-Generator/1.0.0/csharp"; BasePath = "http://petstore.swagger.io/v2"; DefaultHeaders = new ConcurrentDictionary(); ApiKey = new ConcurrentDictionary(); ApiKeyPrefix = new ConcurrentDictionary(); Servers = new List>() { { new Dictionary { {"url", "http://petstore.swagger.io/v2"}, {"description", "No description provided"}, } } }; // Setting Timeout has side effects (forces ApiClient creation). Timeout = 100000; } /// /// Initializes a new instance of the class /// [System.Diagnostics.CodeAnalysis.SuppressMessage("ReSharper", "VirtualMemberCallInConstructor")] public Configuration( IDictionary defaultHeaders, IDictionary apiKey, IDictionary apiKeyPrefix, string basePath = "http://petstore.swagger.io/v2") : this() { if (string.IsNullOrWhiteSpace(basePath)) throw new ArgumentException("The provided basePath is invalid.", "basePath"); if (defaultHeaders == null) throw new ArgumentNullException("defaultHeaders"); if (apiKey == null) throw new ArgumentNullException("apiKey"); if (apiKeyPrefix == null) throw new ArgumentNullException("apiKeyPrefix"); BasePath = basePath; foreach (var keyValuePair in defaultHeaders) { DefaultHeaders.Add(keyValuePair); } foreach (var keyValuePair in apiKey) { ApiKey.Add(keyValuePair); } foreach (var keyValuePair in apiKeyPrefix) { ApiKeyPrefix.Add(keyValuePair); } } #endregion Constructors #region Properties /// /// Gets or sets the base path for API access. /// public virtual string BasePath { get { return _basePath; } set { _basePath = value; } } /// /// Gets or sets the default header. /// [Obsolete("Use DefaultHeaders instead.")] public virtual IDictionary DefaultHeader { get { return DefaultHeaders; } set { DefaultHeaders = value; } } /// /// Gets or sets the default headers. /// public virtual IDictionary DefaultHeaders { get; set; } /// /// Gets or sets the HTTP timeout (milliseconds) of ApiClient. Default to 100000 milliseconds. /// public virtual int Timeout { get; set; } /// /// Gets or sets the proxy /// /// Proxy. public virtual WebProxy Proxy { get; set; } /// /// Gets or sets the HTTP user agent. /// /// Http user agent. public virtual string UserAgent { get; set; } /// /// Gets or sets the username (HTTP basic authentication). /// /// The username. public virtual string Username { get; set; } /// /// Gets or sets the password (HTTP basic authentication). /// /// The password. public virtual string Password { get; set; } /// /// Gets the API key with prefix. /// /// API key identifier (authentication scheme). /// API key with prefix. public string GetApiKeyWithPrefix(string apiKeyIdentifier) { string apiKeyValue; ApiKey.TryGetValue(apiKeyIdentifier, out apiKeyValue); string apiKeyPrefix; if (ApiKeyPrefix.TryGetValue(apiKeyIdentifier, out apiKeyPrefix)) { return apiKeyPrefix + " " + apiKeyValue; } return apiKeyValue; } /// /// Gets or sets certificate collection to be sent with requests. /// /// X509 Certificate collection. public X509CertificateCollection ClientCertificates { get; set; } /// /// Gets or sets the access token for OAuth2 authentication. /// /// This helper property simplifies code generation. /// /// The access token. public virtual string AccessToken { get; set; } /// /// Gets or sets the temporary folder path to store the files downloaded from the server. /// /// Folder path. public virtual string TempFolderPath { get { return _tempFolderPath; } set { if (string.IsNullOrEmpty(value)) { _tempFolderPath = Path.GetTempPath(); return; } // create the directory if it does not exist if (!Directory.Exists(value)) { Directory.CreateDirectory(value); } // check if the path contains directory separator at the end if (value[value.Length - 1] == Path.DirectorySeparatorChar) { _tempFolderPath = value; } else { _tempFolderPath = value + Path.DirectorySeparatorChar; } } } /// /// Gets or sets the date time format used when serializing in the ApiClient /// By default, it's set to ISO 8601 - "o", for others see: /// https://msdn.microsoft.com/en-us/library/az4se3k1(v=vs.110).aspx /// and https://msdn.microsoft.com/en-us/library/8kb3ddd4(v=vs.110).aspx /// No validation is done to ensure that the string you're providing is valid /// /// The DateTimeFormat string public virtual string DateTimeFormat { get { return _dateTimeFormat; } set { if (string.IsNullOrEmpty(value)) { // Never allow a blank or null string, go back to the default _dateTimeFormat = ISO8601_DATETIME_FORMAT; return; } // Caution, no validation when you choose date time format other than ISO 8601 // Take a look at the above links _dateTimeFormat = value; } } /// /// Gets or sets the prefix (e.g. Token) of the API key based on the authentication name. /// /// Whatever you set here will be prepended to the value defined in AddApiKey. /// /// An example invocation here might be: /// /// ApiKeyPrefix["Authorization"] = "Bearer"; /// /// … where ApiKey["Authorization"] would then be used to set the value of your bearer token. /// /// /// OAuth2 workflows should set tokens via AccessToken. /// /// /// The prefix of the API key. public virtual IDictionary ApiKeyPrefix { get { return _apiKeyPrefix; } set { if (value == null) { throw new InvalidOperationException("ApiKeyPrefix collection may not be null."); } _apiKeyPrefix = value; } } /// /// Gets or sets the API key based on the authentication name. /// /// The API key. public virtual IDictionary ApiKey { get { return _apiKey; } set { if (value == null) { throw new InvalidOperationException("ApiKey collection may not be null."); } _apiKey = value; } } /// /// Gets or sets the servers. /// /// The servers. public virtual IList> Servers { get { return _servers; } set { if (value == null) { throw new InvalidOperationException("Servers may not be null."); } _servers = value; } } /// /// Returns URL based on server settings without providing values /// for the variables /// /// Array index of the server settings. /// The server URL. public string GetServerUrl(int index) { return GetServerUrl(index, null); } /// /// Returns URL based on server settings. /// /// Array index of the server settings. /// Dictionary of the variables and the corresponding values. /// The server URL. public string GetServerUrl(int index, Dictionary inputVariables) { if (index < 0 || index >= Servers.Count) { throw new InvalidOperationException($"Invalid index {index} when selecting the server. Must be less than {Servers.Count}."); } if (inputVariables == null) { inputVariables = new Dictionary(); } IReadOnlyDictionary server = Servers[index]; string url = (string)server["url"]; // go through variable and assign a value foreach (KeyValuePair variable in (IReadOnlyDictionary)server["variables"]) { IReadOnlyDictionary serverVariables = (IReadOnlyDictionary)(variable.Value); if (inputVariables.ContainsKey(variable.Key)) { if (((List)serverVariables["enum_values"]).Contains(inputVariables[variable.Key])) { url = url.Replace("{" + variable.Key + "}", inputVariables[variable.Key]); } else { throw new InvalidOperationException($"The variable `{variable.Key}` in the server URL has invalid value #{inputVariables[variable.Key]}. Must be {(List)serverVariables["enum_values"]}"); } } else { // use default value url = url.Replace("{" + variable.Key + "}", (string)serverVariables["default_value"]); } } return url; } #endregion Properties #region Methods /// /// Returns a string with essential information for debugging. /// public static string ToDebugReport() { string report = "C# SDK (Org.OpenAPITools) Debug Report:\n"; report += " OS: " + System.Environment.OSVersion + "\n"; report += " .NET Framework Version: " + System.Environment.Version + "\n"; report += " Version of the API: 1.0.0\n"; report += " SDK Package Version: 1.0.0\n"; return report; } /// /// Add Api Key Header. /// /// Api Key name. /// Api Key value. /// public void AddApiKey(string key, string value) { ApiKey[key] = value; } /// /// Sets the API key prefix. /// /// Api Key name. /// Api Key value. public void AddApiKeyPrefix(string key, string value) { ApiKeyPrefix[key] = value; } #endregion Methods #region Static Members /// /// Merge configurations. /// /// First configuration. /// Second configuration. /// Merged configuration. public static IReadableConfiguration MergeConfigurations(IReadableConfiguration first, IReadableConfiguration second) { if (second == null) return first ?? GlobalConfiguration.Instance; Dictionary apiKey = first.ApiKey.ToDictionary(kvp => kvp.Key, kvp => kvp.Value); Dictionary apiKeyPrefix = first.ApiKeyPrefix.ToDictionary(kvp => kvp.Key, kvp => kvp.Value); Dictionary defaultHeaders = first.DefaultHeaders.ToDictionary(kvp => kvp.Key, kvp => kvp.Value); foreach (var kvp in second.ApiKey) apiKey[kvp.Key] = kvp.Value; foreach (var kvp in second.ApiKeyPrefix) apiKeyPrefix[kvp.Key] = kvp.Value; foreach (var kvp in second.DefaultHeaders) defaultHeaders[kvp.Key] = kvp.Value; var config = new Configuration { ApiKey = apiKey, ApiKeyPrefix = apiKeyPrefix, DefaultHeaders = defaultHeaders, BasePath = second.BasePath ?? first.BasePath, Timeout = second.Timeout, Proxy = second.Proxy ?? first.Proxy, UserAgent = second.UserAgent ?? first.UserAgent, Username = second.Username ?? first.Username, Password = second.Password ?? first.Password, AccessToken = second.AccessToken ?? first.AccessToken, TempFolderPath = second.TempFolderPath ?? first.TempFolderPath, DateTimeFormat = second.DateTimeFormat ?? first.DateTimeFormat }; return config; } #endregion Static Members } }