[#13] Client: Use code analyzers
All checks were successful
DCO / DCO (pull_request) Successful in 35s
All checks were successful
DCO / DCO (pull_request) Successful in 35s
Signed-off-by: Pavel Gross <p.gross@yadro.com>
This commit is contained in:
parent
d7dbbf8da8
commit
d1271df207
102 changed files with 2168 additions and 733 deletions
901
.editorconfig
Normal file
901
.editorconfig
Normal file
|
@ -0,0 +1,901 @@
|
|||
[*.cs]
|
||||
|
||||
# CA1001: Types that own disposable fields should be disposable
|
||||
dotnet_diagnostic.CA1001.severity = warning
|
||||
|
||||
# CA1000: Do not declare static members on generic types
|
||||
dotnet_diagnostic.CA1000.severity = warning
|
||||
|
||||
# CA1002: Do not expose generic lists
|
||||
dotnet_diagnostic.CA1002.severity = warning
|
||||
|
||||
# CA1003: Use generic event handler instances
|
||||
dotnet_diagnostic.CA1003.severity = warning
|
||||
|
||||
# CA1005: Avoid excessive parameters on generic types
|
||||
dotnet_diagnostic.CA1005.severity = warning
|
||||
|
||||
# CA1008: Enums should have zero value
|
||||
dotnet_diagnostic.CA1008.severity = warning
|
||||
|
||||
# CA1010: Generic interface should also be implemented
|
||||
dotnet_diagnostic.CA1010.severity = warning
|
||||
|
||||
# CA1012: Abstract types should not have public constructors
|
||||
dotnet_diagnostic.CA1012.severity = warning
|
||||
|
||||
# CA1014: Mark assemblies with CLSCompliant
|
||||
dotnet_diagnostic.CA1014.severity = warning
|
||||
|
||||
# CA1016: Mark assemblies with assembly version
|
||||
dotnet_diagnostic.CA1016.severity = warning
|
||||
|
||||
# CA1017: Mark assemblies with ComVisible
|
||||
dotnet_diagnostic.CA1017.severity = warning
|
||||
|
||||
# CA1018: Mark attributes with AttributeUsageAttribute
|
||||
dotnet_diagnostic.CA1018.severity = warning
|
||||
|
||||
# CA1019: Define accessors for attribute arguments
|
||||
dotnet_diagnostic.CA1019.severity = warning
|
||||
|
||||
# CA1021: Avoid out parameters
|
||||
dotnet_diagnostic.CA1021.severity = warning
|
||||
|
||||
# CA1024: Use properties where appropriate
|
||||
dotnet_diagnostic.CA1024.severity = warning
|
||||
|
||||
# CA1027: Mark enums with FlagsAttribute
|
||||
dotnet_diagnostic.CA1027.severity = warning
|
||||
|
||||
# CA1028: Enum Storage should be Int32
|
||||
dotnet_diagnostic.CA1028.severity = warning
|
||||
|
||||
# CA1030: Use events where appropriate
|
||||
dotnet_diagnostic.CA1030.severity = warning
|
||||
|
||||
# CA1031: Do not catch general exception types
|
||||
dotnet_diagnostic.CA1031.severity = warning
|
||||
|
||||
# CA1033: Interface methods should be callable by child types
|
||||
dotnet_diagnostic.CA1033.severity = warning
|
||||
|
||||
# CA1034: Nested types should not be visible
|
||||
dotnet_diagnostic.CA1034.severity = warning
|
||||
|
||||
# CA1036: Override methods on comparable types
|
||||
dotnet_diagnostic.CA1036.severity = warning
|
||||
|
||||
# CA1040: Avoid empty interfaces
|
||||
dotnet_diagnostic.CA1040.severity = warning
|
||||
|
||||
# CA1041: Provide ObsoleteAttribute message
|
||||
dotnet_diagnostic.CA1041.severity = warning
|
||||
|
||||
# CA1043: Use Integral Or String Argument For Indexers
|
||||
dotnet_diagnostic.CA1043.severity = warning
|
||||
|
||||
# CA1044: Properties should not be write only
|
||||
dotnet_diagnostic.CA1044.severity = warning
|
||||
|
||||
# CA1045: Do not pass types by reference
|
||||
dotnet_diagnostic.CA1045.severity = warning
|
||||
|
||||
# CA1046: Do not overload equality operator on reference types
|
||||
dotnet_diagnostic.CA1046.severity = warning
|
||||
|
||||
# CA1050: Declare types in namespaces
|
||||
dotnet_diagnostic.CA1050.severity = warning
|
||||
|
||||
# CA1051: Do not declare visible instance fields
|
||||
dotnet_diagnostic.CA1051.severity = warning
|
||||
|
||||
# CA1052: Static holder types should be Static or NotInheritable
|
||||
dotnet_diagnostic.CA1052.severity = warning
|
||||
|
||||
# CA1054: URI-like parameters should not be strings
|
||||
dotnet_diagnostic.CA1054.severity = warning
|
||||
|
||||
# CA1055: URI-like return values should not be strings
|
||||
dotnet_diagnostic.CA1055.severity = warning
|
||||
|
||||
# CA1056: URI-like properties should not be strings
|
||||
dotnet_diagnostic.CA1056.severity = warning
|
||||
|
||||
# CA1058: Types should not extend certain base types
|
||||
dotnet_diagnostic.CA1058.severity = warning
|
||||
|
||||
# CA1060: Move pinvokes to native methods class
|
||||
dotnet_diagnostic.CA1060.severity = warning
|
||||
|
||||
# CA1061: Do not hide base class methods
|
||||
dotnet_diagnostic.CA1061.severity = warning
|
||||
|
||||
# CA1062: Validate arguments of public methods
|
||||
dotnet_diagnostic.CA1062.severity = warning
|
||||
|
||||
# CA1063: Implement IDisposable Correctly
|
||||
dotnet_diagnostic.CA1063.severity = warning
|
||||
|
||||
# CA1064: Exceptions should be public
|
||||
dotnet_diagnostic.CA1064.severity = warning
|
||||
|
||||
# CA1065: Do not raise exceptions in unexpected locations
|
||||
dotnet_diagnostic.CA1065.severity = warning
|
||||
|
||||
# CA1066: Implement IEquatable when overriding Object.Equals
|
||||
dotnet_diagnostic.CA1066.severity = warning
|
||||
|
||||
# CA1067: Override Object.Equals(object) when implementing IEquatable<T>
|
||||
dotnet_diagnostic.CA1067.severity = warning
|
||||
|
||||
# CA1068: CancellationToken parameters must come last
|
||||
dotnet_diagnostic.CA1068.severity = warning
|
||||
|
||||
# CA1069: Enums values should not be duplicated
|
||||
dotnet_diagnostic.CA1069.severity = warning
|
||||
|
||||
# CA1070: Do not declare event fields as virtual
|
||||
dotnet_diagnostic.CA1070.severity = warning
|
||||
|
||||
# CA1303: Do not pass literals as localized parameters
|
||||
dotnet_diagnostic.CA1303.severity = warning
|
||||
|
||||
# CA1304: Specify CultureInfo
|
||||
dotnet_diagnostic.CA1304.severity = warning
|
||||
|
||||
# CA1305: Specify IFormatProvider
|
||||
dotnet_diagnostic.CA1305.severity = warning
|
||||
|
||||
# CA1307: Specify StringComparison for clarity
|
||||
dotnet_diagnostic.CA1307.severity = warning
|
||||
|
||||
# CA1308: Normalize strings to uppercase
|
||||
dotnet_diagnostic.CA1308.severity = warning
|
||||
|
||||
# CA1310: Specify StringComparison for correctness
|
||||
dotnet_diagnostic.CA1310.severity = warning
|
||||
|
||||
# CA1401: P/Invokes should not be visible
|
||||
dotnet_diagnostic.CA1401.severity = warning
|
||||
|
||||
# CA1416: Validate platform compatibility
|
||||
dotnet_diagnostic.CA1416.severity = warning
|
||||
|
||||
# CA1417: Do not use 'OutAttribute' on string parameters for P/Invokes
|
||||
dotnet_diagnostic.CA1417.severity = warning
|
||||
|
||||
# CA1418: Use valid platform string
|
||||
dotnet_diagnostic.CA1418.severity = warning
|
||||
|
||||
# CA1419: Provide a parameterless constructor that is as visible as the containing type for concrete types derived from 'System.Runtime.InteropServices.SafeHandle'
|
||||
dotnet_diagnostic.CA1419.severity = warning
|
||||
|
||||
# CA1420: Property, type, or attribute requires runtime marshalling
|
||||
dotnet_diagnostic.CA1420.severity = warning
|
||||
|
||||
# CA1421: This method uses runtime marshalling even when the 'DisableRuntimeMarshallingAttribute' is applied
|
||||
dotnet_diagnostic.CA1421.severity = warning
|
||||
|
||||
# CA1422: Validate platform compatibility
|
||||
dotnet_diagnostic.CA1422.severity = warning
|
||||
|
||||
# CA1501: Avoid excessive inheritance
|
||||
dotnet_diagnostic.CA1501.severity = warning
|
||||
|
||||
# CA1502: Avoid excessive complexity
|
||||
dotnet_diagnostic.CA1502.severity = warning
|
||||
|
||||
# CA1505: Avoid unmaintainable code
|
||||
dotnet_diagnostic.CA1505.severity = warning
|
||||
|
||||
# CA1506: Avoid excessive class coupling
|
||||
# dotnet_diagnostic.CA1506.severity = warning
|
||||
|
||||
# CA1509: Invalid entry in code metrics rule specification file
|
||||
dotnet_diagnostic.CA1509.severity = warning
|
||||
|
||||
# CA1510: Use ArgumentNullException throw helper
|
||||
dotnet_diagnostic.CA1510.severity = warning
|
||||
|
||||
# CA1511: Use ArgumentException throw helper
|
||||
dotnet_diagnostic.CA1511.severity = warning
|
||||
|
||||
# CA1512: Use ArgumentOutOfRangeException throw helper
|
||||
dotnet_diagnostic.CA1512.severity = warning
|
||||
|
||||
# CA1513: Use ObjectDisposedException throw helper
|
||||
dotnet_diagnostic.CA1513.severity = warning
|
||||
|
||||
# CA1700: Do not name enum values 'Reserved'
|
||||
dotnet_diagnostic.CA1700.severity = warning
|
||||
|
||||
# CA1707: Identifiers should not contain underscores
|
||||
dotnet_diagnostic.CA1707.severity = warning
|
||||
|
||||
# CA1708: Identifiers should differ by more than case
|
||||
dotnet_diagnostic.CA1708.severity = warning
|
||||
|
||||
# CA1710: Identifiers should have correct suffix
|
||||
dotnet_diagnostic.CA1710.severity = warning
|
||||
|
||||
# CA1711: Identifiers should not have incorrect suffix
|
||||
dotnet_diagnostic.CA1711.severity = warning
|
||||
|
||||
# CA1712: Do not prefix enum values with type name
|
||||
dotnet_diagnostic.CA1712.severity = warning
|
||||
|
||||
# CA1713: Events should not have 'Before' or 'After' prefix
|
||||
dotnet_diagnostic.CA1713.severity = warning
|
||||
|
||||
# CA1715: Identifiers should have correct prefix
|
||||
dotnet_diagnostic.CA1715.severity = warning
|
||||
|
||||
# CA1716: Identifiers should not match keywords
|
||||
dotnet_diagnostic.CA1716.severity = warning
|
||||
|
||||
# CA1720: Identifier contains type name
|
||||
dotnet_diagnostic.CA1720.severity = warning
|
||||
|
||||
# CA1721: Property names should not match get methods
|
||||
dotnet_diagnostic.CA1721.severity = warning
|
||||
|
||||
# CA1724: Type names should not match namespaces
|
||||
dotnet_diagnostic.CA1724.severity = warning
|
||||
|
||||
# CA1725: Parameter names should match base declaration
|
||||
dotnet_diagnostic.CA1725.severity = warning
|
||||
|
||||
# CA1727: Use PascalCase for named placeholders
|
||||
dotnet_diagnostic.CA1727.severity = warning
|
||||
|
||||
# CA1806: Do not ignore method results
|
||||
dotnet_diagnostic.CA1806.severity = warning
|
||||
|
||||
# CA1810: Initialize reference type static fields inline
|
||||
dotnet_diagnostic.CA1810.severity = warning
|
||||
|
||||
# CA1813: Avoid unsealed attributes
|
||||
dotnet_diagnostic.CA1813.severity = warning
|
||||
|
||||
# CA1814: Prefer jagged arrays over multidimensional
|
||||
dotnet_diagnostic.CA1814.severity = warning
|
||||
|
||||
# CA1815: Override equals and operator equals on value types
|
||||
dotnet_diagnostic.CA1815.severity = warning
|
||||
|
||||
# CA1816: Dispose methods should call SuppressFinalize
|
||||
dotnet_diagnostic.CA1816.severity = warning
|
||||
|
||||
# CA1819: Properties should not return arrays
|
||||
# dotnet_diagnostic.CA1819.severity = warning
|
||||
|
||||
# CA1820: Test for empty strings using string length
|
||||
dotnet_diagnostic.CA1820.severity = warning
|
||||
|
||||
# CA1821: Remove empty Finalizers
|
||||
dotnet_diagnostic.CA1821.severity = warning
|
||||
|
||||
# CA1822: Mark members as static
|
||||
dotnet_diagnostic.CA1822.severity = warning
|
||||
|
||||
# CA1823: Avoid unused private fields
|
||||
dotnet_diagnostic.CA1823.severity = warning
|
||||
|
||||
# CA1826: Do not use Enumerable methods on indexable collections
|
||||
dotnet_diagnostic.CA1826.severity = warning
|
||||
|
||||
# CA1827: Do not use Count() or LongCount() when Any() can be used
|
||||
dotnet_diagnostic.CA1827.severity = warning
|
||||
|
||||
# CA1828: Do not use CountAsync() or LongCountAsync() when AnyAsync() can be used
|
||||
dotnet_diagnostic.CA1828.severity = warning
|
||||
|
||||
# CA1829: Use Length/Count property instead of Count() when available
|
||||
dotnet_diagnostic.CA1829.severity = warning
|
||||
|
||||
# CA1830: Prefer strongly-typed Append and Insert method overloads on StringBuilder
|
||||
dotnet_diagnostic.CA1830.severity = warning
|
||||
|
||||
# CA1831: Use AsSpan or AsMemory instead of Range-based indexers when appropriate
|
||||
dotnet_diagnostic.CA1831.severity = warning
|
||||
|
||||
# CA1832: Use AsSpan or AsMemory instead of Range-based indexers when appropriate
|
||||
dotnet_diagnostic.CA1832.severity = warning
|
||||
|
||||
# CA1833: Use AsSpan or AsMemory instead of Range-based indexers when appropriate
|
||||
dotnet_diagnostic.CA1833.severity = warning
|
||||
|
||||
# CA1834: Consider using 'StringBuilder.Append(char)' when applicable
|
||||
dotnet_diagnostic.CA1834.severity = warning
|
||||
|
||||
# CA1835: Prefer the 'Memory'-based overloads for 'ReadAsync' and 'WriteAsync'
|
||||
dotnet_diagnostic.CA1835.severity = warning
|
||||
|
||||
# CA1836: Prefer IsEmpty over Count
|
||||
dotnet_diagnostic.CA1836.severity = warning
|
||||
|
||||
# CA1837: Use 'Environment.ProcessId'
|
||||
dotnet_diagnostic.CA1837.severity = warning
|
||||
|
||||
# CA1838: Avoid 'StringBuilder' parameters for P/Invokes
|
||||
dotnet_diagnostic.CA1838.severity = warning
|
||||
|
||||
# CA1839: Use 'Environment.ProcessPath'
|
||||
dotnet_diagnostic.CA1839.severity = warning
|
||||
|
||||
# CA1840: Use 'Environment.CurrentManagedThreadId'
|
||||
dotnet_diagnostic.CA1840.severity = warning
|
||||
|
||||
# CA1842: Do not use 'WhenAll' with a single task
|
||||
dotnet_diagnostic.CA1842.severity = warning
|
||||
|
||||
# CA1843: Do not use 'WaitAll' with a single task
|
||||
dotnet_diagnostic.CA1843.severity = warning
|
||||
|
||||
# CA1844: Provide memory-based overrides of async methods when subclassing 'Stream'
|
||||
dotnet_diagnostic.CA1844.severity = warning
|
||||
|
||||
# CA1846: Prefer 'AsSpan' over 'Substring'
|
||||
dotnet_diagnostic.CA1846.severity = warning
|
||||
|
||||
# CA1847: Use char literal for a single character lookup
|
||||
dotnet_diagnostic.CA1847.severity = warning
|
||||
|
||||
# CA1848: Use the LoggerMessage delegates
|
||||
dotnet_diagnostic.CA1848.severity = warning
|
||||
|
||||
# CA1849: Call async methods when in an async method
|
||||
dotnet_diagnostic.CA1849.severity = warning
|
||||
|
||||
# CA1850: Prefer static 'HashData' method over 'ComputeHash'
|
||||
dotnet_diagnostic.CA1850.severity = warning
|
||||
|
||||
# CA1852: Seal internal types
|
||||
dotnet_diagnostic.CA1852.severity = warning
|
||||
|
||||
# CA1853: Unnecessary call to 'Dictionary.ContainsKey(key)'
|
||||
dotnet_diagnostic.CA1853.severity = warning
|
||||
|
||||
# CA1854: Prefer the 'IDictionary.TryGetValue(TKey, out TValue)' method
|
||||
dotnet_diagnostic.CA1854.severity = warning
|
||||
|
||||
# CA1858: Use 'StartsWith' instead of 'IndexOf'
|
||||
dotnet_diagnostic.CA1858.severity = warning
|
||||
|
||||
# CA1859: Use concrete types when possible for improved performance
|
||||
dotnet_diagnostic.CA1859.severity = warning
|
||||
|
||||
# CA1860: Avoid using 'Enumerable.Any()' extension method
|
||||
dotnet_diagnostic.CA1860.severity = warning
|
||||
|
||||
# CA1861: Avoid constant arrays as arguments
|
||||
dotnet_diagnostic.CA1861.severity = warning
|
||||
|
||||
# CA1862: Use the 'StringComparison' method overloads to perform case-insensitive string comparisons
|
||||
dotnet_diagnostic.CA1862.severity = warning
|
||||
|
||||
# CA1863: Use 'CompositeFormat'
|
||||
dotnet_diagnostic.CA1863.severity = warning
|
||||
|
||||
# CA1864: Prefer the 'IDictionary.TryAdd(TKey, TValue)' method
|
||||
dotnet_diagnostic.CA1864.severity = warning
|
||||
|
||||
# CA1868: Unnecessary call to 'Contains(item)'
|
||||
dotnet_diagnostic.CA1868.severity = warning
|
||||
|
||||
# CA1869: Cache and reuse 'JsonSerializerOptions' instances
|
||||
dotnet_diagnostic.CA1869.severity = warning
|
||||
|
||||
# CA2000: Dispose objects before losing scope
|
||||
dotnet_diagnostic.CA2000.severity = warning
|
||||
|
||||
# CA2002: Do not lock on objects with weak identity
|
||||
dotnet_diagnostic.CA2002.severity = warning
|
||||
|
||||
# CA2007: Consider calling ConfigureAwait on the awaited task
|
||||
dotnet_diagnostic.CA2007.severity = warning
|
||||
|
||||
# CA2008: Do not create tasks without passing a TaskScheduler
|
||||
dotnet_diagnostic.CA2008.severity = warning
|
||||
|
||||
# CA2009: Do not call ToImmutableCollection on an ImmutableCollection value
|
||||
dotnet_diagnostic.CA2009.severity = warning
|
||||
|
||||
# CA2011: Avoid infinite recursion
|
||||
dotnet_diagnostic.CA2011.severity = warning
|
||||
|
||||
# CA2012: Use ValueTasks correctly
|
||||
dotnet_diagnostic.CA2012.severity = warning
|
||||
|
||||
# CA2013: Do not use ReferenceEquals with value types
|
||||
dotnet_diagnostic.CA2013.severity = warning
|
||||
|
||||
# CA2015: Do not define finalizers for types derived from MemoryManager<T>
|
||||
dotnet_diagnostic.CA2015.severity = warning
|
||||
|
||||
# CA2017: Parameter count mismatch
|
||||
dotnet_diagnostic.CA2017.severity = warning
|
||||
|
||||
# CA2018: 'Buffer.BlockCopy' expects the number of bytes to be copied for the 'count' argument
|
||||
dotnet_diagnostic.CA2018.severity = warning
|
||||
|
||||
# CA2019: Improper 'ThreadStatic' field initialization
|
||||
dotnet_diagnostic.CA2019.severity = warning
|
||||
|
||||
# CA2021: Do not call Enumerable.Cast<T> or Enumerable.OfType<T> with incompatible types
|
||||
dotnet_diagnostic.CA2021.severity = warning
|
||||
|
||||
# CA2100: Review SQL queries for security vulnerabilities
|
||||
dotnet_diagnostic.CA2100.severity = warning
|
||||
|
||||
# CA2101: Specify marshaling for P/Invoke string arguments
|
||||
dotnet_diagnostic.CA2101.severity = warning
|
||||
|
||||
# CA2119: Seal methods that satisfy private interfaces
|
||||
dotnet_diagnostic.CA2119.severity = warning
|
||||
|
||||
# CA2153: Do Not Catch Corrupted State Exceptions
|
||||
dotnet_diagnostic.CA2153.severity = warning
|
||||
|
||||
# CA2200: Rethrow to preserve stack details
|
||||
dotnet_diagnostic.CA2200.severity = warning
|
||||
|
||||
# CA2201: Do not raise reserved exception types
|
||||
dotnet_diagnostic.CA2201.severity = warning
|
||||
|
||||
# CA2207: Initialize value type static fields inline
|
||||
dotnet_diagnostic.CA2207.severity = warning
|
||||
|
||||
# CA2208: Instantiate argument exceptions correctly
|
||||
dotnet_diagnostic.CA2208.severity = warning
|
||||
|
||||
# CA2211: Non-constant fields should not be visible
|
||||
dotnet_diagnostic.CA2211.severity = warning
|
||||
|
||||
# CA2213: Disposable fields should be disposed
|
||||
dotnet_diagnostic.CA2213.severity = warning
|
||||
|
||||
# CA2214: Do not call overridable methods in constructors
|
||||
dotnet_diagnostic.CA2214.severity = warning
|
||||
|
||||
# CA2215: Dispose methods should call base class dispose
|
||||
dotnet_diagnostic.CA2215.severity = warning
|
||||
|
||||
# CA2216: Disposable types should declare finalizer
|
||||
dotnet_diagnostic.CA2216.severity = warning
|
||||
|
||||
# CA2217: Do not mark enums with FlagsAttribute
|
||||
dotnet_diagnostic.CA2217.severity = warning
|
||||
|
||||
# CA2219: Do not raise exceptions in finally clauses
|
||||
dotnet_diagnostic.CA2219.severity = warning
|
||||
|
||||
# CA2225: Operator overloads have named alternates
|
||||
dotnet_diagnostic.CA2225.severity = warning
|
||||
|
||||
# CA2226: Operators should have symmetrical overloads
|
||||
dotnet_diagnostic.CA2226.severity = warning
|
||||
|
||||
# CA2227: Collection properties should be read only
|
||||
dotnet_diagnostic.CA2227.severity = warning
|
||||
|
||||
# CA2231: Overload operator equals on overriding value type Equals
|
||||
dotnet_diagnostic.CA2231.severity = warning
|
||||
|
||||
# CA2235: Mark all non-serializable fields
|
||||
dotnet_diagnostic.CA2235.severity = warning
|
||||
|
||||
# CA2237: Mark ISerializable types with serializable
|
||||
dotnet_diagnostic.CA2237.severity = warning
|
||||
|
||||
# CA2241: Provide correct arguments to formatting methods
|
||||
dotnet_diagnostic.CA2241.severity = warning
|
||||
|
||||
# CA2242: Test for NaN correctly
|
||||
dotnet_diagnostic.CA2242.severity = warning
|
||||
|
||||
# CA2243: Attribute string literals should parse correctly
|
||||
dotnet_diagnostic.CA2243.severity = warning
|
||||
|
||||
# CA2244: Do not duplicate indexed element initializations
|
||||
dotnet_diagnostic.CA2244.severity = warning
|
||||
|
||||
# CA2245: Do not assign a property to itself
|
||||
dotnet_diagnostic.CA2245.severity = warning
|
||||
|
||||
# CA2246: Assigning symbol and its member in the same statement
|
||||
dotnet_diagnostic.CA2246.severity = warning
|
||||
|
||||
# CA2247: Argument passed to TaskCompletionSource constructor should be TaskCreationOptions enum instead of TaskContinuationOptions enum
|
||||
dotnet_diagnostic.CA2247.severity = warning
|
||||
|
||||
# CA2248: Provide correct 'enum' argument to 'Enum.HasFlag'
|
||||
dotnet_diagnostic.CA2248.severity = warning
|
||||
|
||||
# CA2249: Consider using 'string.Contains' instead of 'string.IndexOf'
|
||||
dotnet_diagnostic.CA2249.severity = warning
|
||||
|
||||
# CA2250: Use 'ThrowIfCancellationRequested'
|
||||
dotnet_diagnostic.CA2250.severity = warning
|
||||
|
||||
# CA2251: Use 'string.Equals'
|
||||
dotnet_diagnostic.CA2251.severity = warning
|
||||
|
||||
# CA2253: Named placeholders should not be numeric values
|
||||
dotnet_diagnostic.CA2253.severity = warning
|
||||
|
||||
# CA2254: Template should be a static expression
|
||||
dotnet_diagnostic.CA2254.severity = warning
|
||||
|
||||
# CA2255: The 'ModuleInitializer' attribute should not be used in libraries
|
||||
dotnet_diagnostic.CA2255.severity = warning
|
||||
|
||||
# CA2256: All members declared in parent interfaces must have an implementation in a DynamicInterfaceCastableImplementation-attributed interface
|
||||
dotnet_diagnostic.CA2256.severity = warning
|
||||
|
||||
# CA2257: Members defined on an interface with the 'DynamicInterfaceCastableImplementationAttribute' should be 'static'
|
||||
dotnet_diagnostic.CA2257.severity = warning
|
||||
|
||||
# CA2258: Providing a 'DynamicInterfaceCastableImplementation' interface in Visual Basic is unsupported
|
||||
dotnet_diagnostic.CA2258.severity = warning
|
||||
|
||||
# CA2259: 'ThreadStatic' only affects static fields
|
||||
dotnet_diagnostic.CA2259.severity = warning
|
||||
|
||||
# CA2261: Do not use ConfigureAwaitOptions.SuppressThrowing with Task<TResult>
|
||||
dotnet_diagnostic.CA2261.severity = warning
|
||||
|
||||
# CA2300: Do not use insecure deserializer BinaryFormatter
|
||||
dotnet_diagnostic.CA2300.severity = warning
|
||||
|
||||
# CA2301: Do not call BinaryFormatter.Deserialize without first setting BinaryFormatter.Binder
|
||||
dotnet_diagnostic.CA2301.severity = warning
|
||||
|
||||
# CA2302: Ensure BinaryFormatter.Binder is set before calling BinaryFormatter.Deserialize
|
||||
dotnet_diagnostic.CA2302.severity = warning
|
||||
|
||||
# CA2305: Do not use insecure deserializer LosFormatter
|
||||
dotnet_diagnostic.CA2305.severity = warning
|
||||
|
||||
# CA2310: Do not use insecure deserializer NetDataContractSerializer
|
||||
dotnet_diagnostic.CA2310.severity = warning
|
||||
|
||||
# CA2311: Do not deserialize without first setting NetDataContractSerializer.Binder
|
||||
dotnet_diagnostic.CA2311.severity = warning
|
||||
|
||||
# CA2312: Ensure NetDataContractSerializer.Binder is set before deserializing
|
||||
dotnet_diagnostic.CA2312.severity = warning
|
||||
|
||||
# CA2315: Do not use insecure deserializer ObjectStateFormatter
|
||||
dotnet_diagnostic.CA2315.severity = warning
|
||||
|
||||
# CA2321: Do not deserialize with JavaScriptSerializer using a SimpleTypeResolver
|
||||
dotnet_diagnostic.CA2321.severity = warning
|
||||
|
||||
# CA2322: Ensure JavaScriptSerializer is not initialized with SimpleTypeResolver before deserializing
|
||||
dotnet_diagnostic.CA2322.severity = warning
|
||||
|
||||
# CA2326: Do not use TypeNameHandling values other than None
|
||||
dotnet_diagnostic.CA2326.severity = warning
|
||||
|
||||
# CA2327: Do not use insecure JsonSerializerSettings
|
||||
dotnet_diagnostic.CA2327.severity = warning
|
||||
|
||||
# CA2328: Ensure that JsonSerializerSettings are secure
|
||||
dotnet_diagnostic.CA2328.severity = warning
|
||||
|
||||
# CA2329: Do not deserialize with JsonSerializer using an insecure configuration
|
||||
dotnet_diagnostic.CA2329.severity = warning
|
||||
|
||||
# CA2330: Ensure that JsonSerializer has a secure configuration when deserializing
|
||||
dotnet_diagnostic.CA2330.severity = warning
|
||||
|
||||
# CA2350: Do not use DataTable.ReadXml() with untrusted data
|
||||
dotnet_diagnostic.CA2350.severity = warning
|
||||
|
||||
# CA2351: Do not use DataSet.ReadXml() with untrusted data
|
||||
dotnet_diagnostic.CA2351.severity = warning
|
||||
|
||||
# CA2361: Ensure auto-generated class containing DataSet.ReadXml() is not used with untrusted data
|
||||
dotnet_diagnostic.CA2361.severity = warning
|
||||
|
||||
# CA3001: Review code for SQL injection vulnerabilities
|
||||
dotnet_diagnostic.CA3001.severity = warning
|
||||
|
||||
# CA3002: Review code for XSS vulnerabilities
|
||||
dotnet_diagnostic.CA3002.severity = warning
|
||||
|
||||
# CA3003: Review code for file path injection vulnerabilities
|
||||
dotnet_diagnostic.CA3003.severity = warning
|
||||
|
||||
# CA3004: Review code for information disclosure vulnerabilities
|
||||
dotnet_diagnostic.CA3004.severity = warning
|
||||
|
||||
# CA3005: Review code for LDAP injection vulnerabilities
|
||||
dotnet_diagnostic.CA3005.severity = warning
|
||||
|
||||
# CA3006: Review code for process command injection vulnerabilities
|
||||
dotnet_diagnostic.CA3006.severity = warning
|
||||
|
||||
# CA3007: Review code for open redirect vulnerabilities
|
||||
dotnet_diagnostic.CA3007.severity = warning
|
||||
|
||||
# CA3008: Review code for XPath injection vulnerabilities
|
||||
dotnet_diagnostic.CA3008.severity = warning
|
||||
|
||||
# CA3009: Review code for XML injection vulnerabilities
|
||||
dotnet_diagnostic.CA3009.severity = warning
|
||||
|
||||
# CA3010: Review code for XAML injection vulnerabilities
|
||||
dotnet_diagnostic.CA3010.severity = warning
|
||||
|
||||
# CA3011: Review code for DLL injection vulnerabilities
|
||||
dotnet_diagnostic.CA3011.severity = warning
|
||||
|
||||
# CA3012: Review code for regex injection vulnerabilities
|
||||
dotnet_diagnostic.CA3012.severity = warning
|
||||
|
||||
# CA3061: Do Not Add Schema By URL
|
||||
dotnet_diagnostic.CA3061.severity = warning
|
||||
|
||||
# CA3075: Insecure DTD processing in XML
|
||||
dotnet_diagnostic.CA3075.severity = warning
|
||||
|
||||
# CA3076: Insecure XSLT script processing
|
||||
dotnet_diagnostic.CA3076.severity = warning
|
||||
|
||||
# CA3077: Insecure Processing in API Design, XmlDocument and XmlTextReader
|
||||
dotnet_diagnostic.CA3077.severity = warning
|
||||
|
||||
# CA3147: Mark Verb Handlers With Validate Antiforgery Token
|
||||
dotnet_diagnostic.CA3147.severity = warning
|
||||
|
||||
# CA5350: Do Not Use Weak Cryptographic Algorithms
|
||||
dotnet_diagnostic.CA5350.severity = warning
|
||||
|
||||
# CA5351: Do Not Use Broken Cryptographic Algorithms
|
||||
dotnet_diagnostic.CA5351.severity = warning
|
||||
|
||||
# CA5358: Review cipher mode usage with cryptography experts
|
||||
dotnet_diagnostic.CA5358.severity = warning
|
||||
|
||||
# CA5359: Do Not Disable Certificate Validation
|
||||
dotnet_diagnostic.CA5359.severity = warning
|
||||
|
||||
# CA5360: Do Not Call Dangerous Methods In Deserialization
|
||||
dotnet_diagnostic.CA5360.severity = warning
|
||||
|
||||
# CA5361: Do Not Disable SChannel Use of Strong Crypto
|
||||
dotnet_diagnostic.CA5361.severity = warning
|
||||
|
||||
# CA5362: Potential reference cycle in deserialized object graph
|
||||
dotnet_diagnostic.CA5362.severity = warning
|
||||
|
||||
# CA5363: Do Not Disable Request Validation
|
||||
dotnet_diagnostic.CA5363.severity = warning
|
||||
|
||||
# CA5364: Do Not Use Deprecated Security Protocols
|
||||
dotnet_diagnostic.CA5364.severity = warning
|
||||
|
||||
# CA5365: Do Not Disable HTTP Header Checking
|
||||
dotnet_diagnostic.CA5365.severity = warning
|
||||
|
||||
# CA5366: Use XmlReader for 'DataSet.ReadXml()'
|
||||
dotnet_diagnostic.CA5366.severity = warning
|
||||
|
||||
# CA5367: Do Not Serialize Types With Pointer Fields
|
||||
dotnet_diagnostic.CA5367.severity = warning
|
||||
|
||||
# CA5368: Set ViewStateUserKey For Classes Derived From Page
|
||||
dotnet_diagnostic.CA5368.severity = warning
|
||||
|
||||
# CA5369: Use XmlReader for 'XmlSerializer.Deserialize()'
|
||||
dotnet_diagnostic.CA5369.severity = warning
|
||||
|
||||
# CA5370: Use XmlReader for XmlValidatingReader constructor
|
||||
dotnet_diagnostic.CA5370.severity = warning
|
||||
|
||||
# CA5371: Use XmlReader for 'XmlSchema.Read()'
|
||||
dotnet_diagnostic.CA5371.severity = warning
|
||||
|
||||
# CA5372: Use XmlReader for XPathDocument constructor
|
||||
dotnet_diagnostic.CA5372.severity = warning
|
||||
|
||||
# CA5373: Do not use obsolete key derivation function
|
||||
dotnet_diagnostic.CA5373.severity = warning
|
||||
|
||||
# CA5374: Do Not Use XslTransform
|
||||
dotnet_diagnostic.CA5374.severity = warning
|
||||
|
||||
# CA5375: Do Not Use Account Shared Access Signature
|
||||
dotnet_diagnostic.CA5375.severity = warning
|
||||
|
||||
# CA5376: Use SharedAccessProtocol HttpsOnly
|
||||
dotnet_diagnostic.CA5376.severity = warning
|
||||
|
||||
# CA5377: Use Container Level Access Policy
|
||||
dotnet_diagnostic.CA5377.severity = warning
|
||||
|
||||
# CA5378: Do not disable ServicePointManagerSecurityProtocols
|
||||
dotnet_diagnostic.CA5378.severity = warning
|
||||
|
||||
# CA5379: Ensure Key Derivation Function algorithm is sufficiently strong
|
||||
dotnet_diagnostic.CA5379.severity = warning
|
||||
|
||||
# CA5380: Do Not Add Certificates To Root Store
|
||||
dotnet_diagnostic.CA5380.severity = warning
|
||||
|
||||
# CA5381: Ensure Certificates Are Not Added To Root Store
|
||||
dotnet_diagnostic.CA5381.severity = warning
|
||||
|
||||
# CA5382: Use Secure Cookies In ASP.NET Core
|
||||
dotnet_diagnostic.CA5382.severity = warning
|
||||
|
||||
# CA5383: Ensure Use Secure Cookies In ASP.NET Core
|
||||
dotnet_diagnostic.CA5383.severity = warning
|
||||
|
||||
# CA5384: Do Not Use Digital Signature Algorithm (DSA)
|
||||
dotnet_diagnostic.CA5384.severity = warning
|
||||
|
||||
# CA5385: Use Rivest-Shamir-Adleman (RSA) Algorithm With Sufficient Key Size
|
||||
dotnet_diagnostic.CA5385.severity = warning
|
||||
|
||||
# CA5386: Avoid hardcoding SecurityProtocolType value
|
||||
dotnet_diagnostic.CA5386.severity = warning
|
||||
|
||||
# CA5387: Do Not Use Weak Key Derivation Function With Insufficient Iteration Count
|
||||
dotnet_diagnostic.CA5387.severity = warning
|
||||
|
||||
# CA5388: Ensure Sufficient Iteration Count When Using Weak Key Derivation Function
|
||||
dotnet_diagnostic.CA5388.severity = warning
|
||||
|
||||
# CA5389: Do Not Add Archive Item's Path To The Target File System Path
|
||||
dotnet_diagnostic.CA5389.severity = warning
|
||||
|
||||
# CA5390: Do not hard-code encryption key
|
||||
dotnet_diagnostic.CA5390.severity = warning
|
||||
|
||||
# CA5391: Use antiforgery tokens in ASP.NET Core MVC controllers
|
||||
dotnet_diagnostic.CA5391.severity = warning
|
||||
|
||||
# CA5392: Use DefaultDllImportSearchPaths attribute for P/Invokes
|
||||
dotnet_diagnostic.CA5392.severity = warning
|
||||
|
||||
# CA5393: Do not use unsafe DllImportSearchPath value
|
||||
dotnet_diagnostic.CA5393.severity = warning
|
||||
|
||||
# CA5394: Do not use insecure randomness
|
||||
dotnet_diagnostic.CA5394.severity = warning
|
||||
|
||||
# CA5395: Miss HttpVerb attribute for action methods
|
||||
dotnet_diagnostic.CA5395.severity = warning
|
||||
|
||||
# CA5396: Set HttpOnly to true for HttpCookie
|
||||
dotnet_diagnostic.CA5396.severity = warning
|
||||
|
||||
# CA5397: Do not use deprecated SslProtocols values
|
||||
dotnet_diagnostic.CA5397.severity = warning
|
||||
|
||||
# CA5398: Avoid hardcoded SslProtocols values
|
||||
dotnet_diagnostic.CA5398.severity = warning
|
||||
|
||||
# CA5399: HttpClients should enable certificate revocation list checks
|
||||
dotnet_diagnostic.CA5399.severity = warning
|
||||
|
||||
# CA5400: Ensure HttpClient certificate revocation list check is not disabled
|
||||
dotnet_diagnostic.CA5400.severity = warning
|
||||
|
||||
# CA5401: Do not use CreateEncryptor with non-default IV
|
||||
dotnet_diagnostic.CA5401.severity = warning
|
||||
|
||||
# CA5402: Use CreateEncryptor with the default IV
|
||||
dotnet_diagnostic.CA5402.severity = warning
|
||||
|
||||
# CA5403: Do not hard-code certificate
|
||||
dotnet_diagnostic.CA5403.severity = warning
|
||||
|
||||
# CA5404: Do not disable token validation checks
|
||||
dotnet_diagnostic.CA5404.severity = warning
|
||||
|
||||
# CA5405: Do not always skip token validation in delegates
|
||||
dotnet_diagnostic.CA5405.severity = warning
|
||||
|
||||
# CA1032: Implement standard exception constructors
|
||||
dotnet_diagnostic.CA1032.severity = warning
|
||||
|
||||
# CA1200: Avoid using cref tags with a prefix
|
||||
dotnet_diagnostic.CA1200.severity = warning
|
||||
|
||||
# CA1309: Use ordinal string comparison
|
||||
dotnet_diagnostic.CA1309.severity = warning
|
||||
|
||||
# CA1311: Specify a culture or use an invariant version
|
||||
dotnet_diagnostic.CA1311.severity = warning
|
||||
|
||||
# CA1507: Use nameof to express symbol names
|
||||
dotnet_diagnostic.CA1507.severity = warning
|
||||
|
||||
# CA1508: Avoid dead conditional code
|
||||
dotnet_diagnostic.CA1508.severity = warning
|
||||
|
||||
# CA1802: Use literals where appropriate
|
||||
dotnet_diagnostic.CA1802.severity = warning
|
||||
|
||||
# CA1805: Do not initialize unnecessarily
|
||||
dotnet_diagnostic.CA1805.severity = warning
|
||||
|
||||
# CA1812: Avoid uninstantiated internal classes
|
||||
dotnet_diagnostic.CA1812.severity = warning
|
||||
|
||||
# CA1824: Mark assemblies with NeutralResourcesLanguageAttribute
|
||||
dotnet_diagnostic.CA1824.severity = warning
|
||||
|
||||
# CA1825: Avoid zero-length array allocations
|
||||
dotnet_diagnostic.CA1825.severity = warning
|
||||
|
||||
# CA1841: Prefer Dictionary.Contains methods
|
||||
dotnet_diagnostic.CA1841.severity = warning
|
||||
|
||||
# CA1845: Use span-based 'string.Concat'
|
||||
dotnet_diagnostic.CA1845.severity = warning
|
||||
|
||||
# CA1851: Possible multiple enumerations of 'IEnumerable' collection
|
||||
dotnet_diagnostic.CA1851.severity = warning
|
||||
|
||||
# CA1855: Prefer 'Clear' over 'Fill'
|
||||
dotnet_diagnostic.CA1855.severity = warning
|
||||
|
||||
# CA1856: Incorrect usage of ConstantExpected attribute
|
||||
dotnet_diagnostic.CA1856.severity = warning
|
||||
|
||||
# CA1857: A constant is expected for the parameter
|
||||
dotnet_diagnostic.CA1857.severity = warning
|
||||
|
||||
# CA1865: Use char overload
|
||||
dotnet_diagnostic.CA1865.severity = warning
|
||||
|
||||
# CA1866: Use char overload
|
||||
dotnet_diagnostic.CA1866.severity = warning
|
||||
|
||||
# CA1867: Use char overload
|
||||
dotnet_diagnostic.CA1867.severity = warning
|
||||
|
||||
# CA1870: Use a cached 'SearchValues' instance
|
||||
dotnet_diagnostic.CA1870.severity = warning
|
||||
|
||||
# CA2014: Do not use stackalloc in loops
|
||||
dotnet_diagnostic.CA2014.severity = warning
|
||||
|
||||
# CA2016: Forward the 'CancellationToken' parameter to methods
|
||||
dotnet_diagnostic.CA2016.severity = warning
|
||||
|
||||
# CA2020: Prevent behavioral change
|
||||
dotnet_diagnostic.CA2020.severity = warning
|
||||
|
||||
# CA2234: Pass system uri objects instead of strings
|
||||
dotnet_diagnostic.CA2234.severity = warning
|
||||
|
||||
# CA2252: This API requires opting into preview features
|
||||
dotnet_diagnostic.CA2252.severity = warning
|
||||
|
||||
# CA2260: Use correct type parameter
|
||||
dotnet_diagnostic.CA2260.severity = warning
|
||||
|
||||
# CA2352: Unsafe DataSet or DataTable in serializable type can be vulnerable to remote code execution attacks
|
||||
dotnet_diagnostic.CA2352.severity = warning
|
||||
|
||||
# CA2353: Unsafe DataSet or DataTable in serializable type
|
||||
dotnet_diagnostic.CA2353.severity = warning
|
||||
|
||||
# CA2354: Unsafe DataSet or DataTable in deserialized object graph can be vulnerable to remote code execution attacks
|
||||
dotnet_diagnostic.CA2354.severity = warning
|
||||
|
||||
# CA2355: Unsafe DataSet or DataTable type found in deserializable object graph
|
||||
dotnet_diagnostic.CA2355.severity = warning
|
||||
|
||||
# CA2356: Unsafe DataSet or DataTable type in web deserializable object graph
|
||||
dotnet_diagnostic.CA2356.severity = warning
|
||||
|
||||
# CA2362: Unsafe DataSet or DataTable in auto-generated serializable type can be vulnerable to remote code execution attacks
|
||||
dotnet_diagnostic.CA2362.severity = warning
|
|
@ -1,6 +1,8 @@
|
|||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 17
|
||||
VisualStudioVersion = 17.5.002.0
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FrostFS.SDK.ClientV2", "src\FrostFS.SDK.ClientV2\FrostFS.SDK.ClientV2.csproj", "{50D8F61F-C302-4AC9-8D8A-AB0B8C0988C3}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FrostFS.SDK.Cryptography", "src\FrostFS.SDK.Cryptography\FrostFS.SDK.Cryptography.csproj", "{3D804F4A-B0B2-47A5-B006-BE447BE64B50}"
|
||||
|
@ -9,6 +11,11 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FrostFS.SDK.ProtosV2", "src
|
|||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FrostFS.SDK.Tests", "src\FrostFS.SDK.Tests\FrostFS.SDK.Tests.csproj", "{8FDA7E0D-9C75-4874-988E-6592CD28F76C}"
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{2F030ACD-F87C-4E83-9A68-4CC5DF03AD90}"
|
||||
ProjectSection(SolutionItems) = preProject
|
||||
.editorconfig = .editorconfig
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
|
@ -32,4 +39,7 @@ Global
|
|||
{8FDA7E0D-9C75-4874-988E-6592CD28F76C}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{8FDA7E0D-9C75-4874-988E-6592CD28F76C}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
|
|
18
src/FrostFS.SDK.ClientV2/Exceptions/FrostFsException.cs
Normal file
18
src/FrostFS.SDK.ClientV2/Exceptions/FrostFsException.cs
Normal file
|
@ -0,0 +1,18 @@
|
|||
using System;
|
||||
|
||||
namespace FrostFS.SDK.ClientV2;
|
||||
|
||||
public class FrostFsException : Exception
|
||||
{
|
||||
public FrostFsException()
|
||||
{
|
||||
}
|
||||
|
||||
public FrostFsException(string message) : base(message)
|
||||
{
|
||||
}
|
||||
|
||||
public FrostFsException(string message, Exception innerException) : base(message, innerException)
|
||||
{
|
||||
}
|
||||
}
|
|
@ -2,6 +2,17 @@ using System;
|
|||
|
||||
namespace FrostFS.SDK.ClientV2;
|
||||
|
||||
public class InvalidObjectException() : Exception()
|
||||
public class InvalidObjectException : Exception
|
||||
{
|
||||
public InvalidObjectException()
|
||||
{
|
||||
}
|
||||
|
||||
public InvalidObjectException(string message) : base(message)
|
||||
{
|
||||
}
|
||||
|
||||
public InvalidObjectException(string message, Exception innerException) : base(message, innerException)
|
||||
{
|
||||
}
|
||||
}
|
|
@ -2,7 +2,24 @@ using System;
|
|||
|
||||
namespace FrostFS.SDK.ClientV2;
|
||||
|
||||
public class ResponseException(FrostFsResponseStatus status) : Exception()
|
||||
public class ResponseException : Exception
|
||||
{
|
||||
public FrostFsResponseStatus Status { get; set; } = status;
|
||||
public FrostFsResponseStatus? Status { get; private set; }
|
||||
|
||||
public ResponseException()
|
||||
{
|
||||
}
|
||||
|
||||
public ResponseException(FrostFsResponseStatus status)
|
||||
{
|
||||
Status = status;
|
||||
}
|
||||
|
||||
public ResponseException(string message) : base(message)
|
||||
{
|
||||
}
|
||||
|
||||
public ResponseException(string message, Exception innerException) : base(message, innerException)
|
||||
{
|
||||
}
|
||||
}
|
|
@ -4,14 +4,23 @@
|
|||
<TargetFramework>netstandard2.0</TargetFramework>
|
||||
<LangVersion>12.0</LangVersion>
|
||||
<Nullable>enable</Nullable>
|
||||
<AnalysisMode>AllEnabledByDefault</AnalysisMode>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup>
|
||||
<EnableNETAnalyzers>true</EnableNETAnalyzers>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<EnableNETAnalyzers>true</EnableNETAnalyzers>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup>
|
||||
<CodeAnalysisTreatWarningsAsErrors>true</CodeAnalysisTreatWarningsAsErrors>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.Bcl.AsyncInterfaces" Version="8.0.0" />
|
||||
<PackageReference Include="Microsoft.CodeAnalysis.NetAnalyzers" Version="8.0.0">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
</PackageReference>
|
||||
<PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="8.0.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="8.0.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.Options" Version="8.0.2" />
|
||||
|
|
|
@ -3,6 +3,9 @@ using System.Collections.Generic;
|
|||
using System.Net.Http;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
using Frostfs.V2.Ape;
|
||||
using Frostfs.V2.Apemanager;
|
||||
|
||||
using FrostFS.Container;
|
||||
using FrostFS.Netmap;
|
||||
using FrostFS.Object;
|
||||
|
@ -15,35 +18,33 @@ using Grpc.Core.Interceptors;
|
|||
using Grpc.Net.Client;
|
||||
|
||||
using Microsoft.Extensions.Options;
|
||||
using Frostfs.V2.Apemanager;
|
||||
using Frostfs.V2.Ape;
|
||||
|
||||
namespace FrostFS.SDK.ClientV2;
|
||||
|
||||
public class Client : IFrostFSClient
|
||||
public class FrostFSClient : IFrostFSClient
|
||||
{
|
||||
private bool isDisposed;
|
||||
|
||||
|
||||
internal ContainerService.ContainerServiceClient? ContainerServiceClient { get; set; }
|
||||
|
||||
|
||||
internal NetmapService.NetmapServiceClient? NetmapServiceClient { get; set; }
|
||||
|
||||
internal APEManagerService.APEManagerServiceClient? ApeManagerServiceClient { get; set; }
|
||||
|
||||
internal SessionService.SessionServiceClient? SessionServiceClient { get; set; }
|
||||
|
||||
|
||||
internal ObjectService.ObjectServiceClient? ObjectServiceClient { get; set; }
|
||||
|
||||
internal ClientEnvironment ClientCtx { get; set; }
|
||||
|
||||
public static IFrostFSClient GetInstance(IOptions<ClientSettings> clientOptions, GrpcChannelOptions? channelOptions = null)
|
||||
{
|
||||
return new Client(clientOptions, channelOptions);
|
||||
return new FrostFSClient(clientOptions, channelOptions);
|
||||
}
|
||||
|
||||
public static IFrostFSClient GetSingleOwnerInstance(IOptions<SingleOwnerClientSettings> clientOptions, GrpcChannelOptions? channelOptions = null)
|
||||
{
|
||||
return new Client(clientOptions, channelOptions);
|
||||
return new FrostFSClient(clientOptions, channelOptions);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -64,10 +65,15 @@ public class Client : IFrostFSClient
|
|||
ContainerService.ContainerServiceClient containerService,
|
||||
ObjectService.ObjectServiceClient objectService)
|
||||
{
|
||||
return new Client(clientOptions, channelOptions, containerService, netmapService, sessionService, objectService);
|
||||
if (clientOptions is null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(clientOptions));
|
||||
}
|
||||
|
||||
return new FrostFSClient(clientOptions, channelOptions, containerService, netmapService, sessionService, objectService);
|
||||
}
|
||||
|
||||
private Client(
|
||||
private FrostFSClient(
|
||||
IOptions<SingleOwnerClientSettings> settings,
|
||||
GrpcChannelOptions? channelOptions,
|
||||
ContainerService.ContainerServiceClient containerService,
|
||||
|
@ -75,6 +81,11 @@ public class Client : IFrostFSClient
|
|||
SessionService.SessionServiceClient sessionService,
|
||||
ObjectService.ObjectServiceClient objectService)
|
||||
{
|
||||
if (settings is null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(settings));
|
||||
}
|
||||
|
||||
var ecdsaKey = settings.Value.Key.LoadWif();
|
||||
FrostFsOwner.FromKey(ecdsaKey);
|
||||
|
||||
|
@ -85,13 +96,13 @@ public class Client : IFrostFSClient
|
|||
channel: InitGrpcChannel(settings.Value.Host, channelOptions),
|
||||
version: new FrostFsVersion(2, 13));
|
||||
|
||||
ContainerServiceClient = containerService;
|
||||
NetmapServiceClient = netmapService;
|
||||
SessionServiceClient = sessionService;
|
||||
ObjectServiceClient = objectService;
|
||||
ContainerServiceClient = containerService ?? throw new ArgumentNullException(nameof(containerService));
|
||||
NetmapServiceClient = netmapService ?? throw new ArgumentNullException(nameof(netmapService));
|
||||
SessionServiceClient = sessionService ?? throw new ArgumentNullException(nameof(sessionService));
|
||||
ObjectServiceClient = objectService ?? throw new ArgumentNullException(nameof(objectService));
|
||||
}
|
||||
|
||||
private Client(IOptions<ClientSettings> options, GrpcChannelOptions? channelOptions)
|
||||
private FrostFSClient(IOptions<ClientSettings> options, GrpcChannelOptions? channelOptions)
|
||||
{
|
||||
var clientSettings = (options?.Value) ?? throw new ArgumentException("Options must be initialized");
|
||||
|
||||
|
@ -110,14 +121,14 @@ public class Client : IFrostFSClient
|
|||
// CheckFrostFsVersionSupport(new Context { Timeout = TimeSpan.FromSeconds(20) });
|
||||
}
|
||||
|
||||
private Client(IOptions<SingleOwnerClientSettings> options, GrpcChannelOptions? channelOptions)
|
||||
private FrostFSClient(IOptions<SingleOwnerClientSettings> options, GrpcChannelOptions? channelOptions)
|
||||
{
|
||||
var clientSettings = (options?.Value) ?? throw new ArgumentException("Options must be initialized");
|
||||
|
||||
clientSettings.Validate();
|
||||
|
||||
var ecdsaKey = clientSettings.Key.LoadWif();
|
||||
|
||||
|
||||
var channel = InitGrpcChannel(clientSettings.Host, channelOptions);
|
||||
|
||||
ClientCtx = new ClientEnvironment(
|
||||
|
@ -128,7 +139,7 @@ public class Client : IFrostFSClient
|
|||
version: new FrostFsVersion(2, 13));
|
||||
|
||||
// TODO: define timeout logic
|
||||
CheckFrostFsVersionSupport(new Context { Timeout = TimeSpan.FromSeconds(20)});
|
||||
// CheckFrostFsVersionSupport(new Context { Timeout = TimeSpan.FromSeconds(20) });
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
|
@ -149,18 +160,31 @@ public class Client : IFrostFSClient
|
|||
#region ApeManagerImplementation
|
||||
public Task<byte[]> AddChainAsync(PrmApeChainAdd args)
|
||||
{
|
||||
if (args is null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(args));
|
||||
}
|
||||
|
||||
var service = GetApeManagerService(args);
|
||||
return service.AddChainAsync(args);
|
||||
}
|
||||
|
||||
public Task RemoveChainAsync(PrmApeChainRemove args)
|
||||
{
|
||||
if (args is null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(args));
|
||||
}
|
||||
|
||||
var service = GetApeManagerService(args);
|
||||
return service.RemoveChainAsync(args);
|
||||
}
|
||||
|
||||
public Task<Chain[]> ListChainAsync(PrmApeChainList args)
|
||||
{
|
||||
if (args is null)
|
||||
throw new ArgumentNullException(nameof(args));
|
||||
|
||||
var service = GetApeManagerService(args);
|
||||
return service.ListChainAsync(args);
|
||||
}
|
||||
|
@ -169,6 +193,9 @@ public class Client : IFrostFSClient
|
|||
#region ContainerImplementation
|
||||
public Task<FrostFsContainerInfo> GetContainerAsync(PrmContainerGet args)
|
||||
{
|
||||
if (args is null)
|
||||
throw new ArgumentNullException(nameof(args));
|
||||
|
||||
var service = GetContainerService(args);
|
||||
return service.GetContainerAsync(args);
|
||||
}
|
||||
|
@ -176,18 +203,24 @@ public class Client : IFrostFSClient
|
|||
public IAsyncEnumerable<FrostFsContainerId> ListContainersAsync(PrmContainerGetAll? args = null)
|
||||
{
|
||||
args ??= new PrmContainerGetAll();
|
||||
var service = GetContainerService(args);
|
||||
var service = GetContainerService(args);
|
||||
return service.ListContainersAsync(args);
|
||||
}
|
||||
|
||||
public Task<FrostFsContainerId> CreateContainerAsync(PrmContainerCreate args)
|
||||
{
|
||||
if (args is null)
|
||||
throw new ArgumentNullException(nameof(args));
|
||||
|
||||
var service = GetContainerService(args);
|
||||
return service.CreateContainerAsync(args);
|
||||
}
|
||||
|
||||
public Task DeleteContainerAsync(PrmContainerDelete args)
|
||||
{
|
||||
if (args is null)
|
||||
throw new ArgumentNullException(nameof(args));
|
||||
|
||||
var service = GetContainerService(args);
|
||||
return service.DeleteContainerAsync(args);
|
||||
}
|
||||
|
@ -219,36 +252,54 @@ public class Client : IFrostFSClient
|
|||
#region ObjectImplementation
|
||||
public Task<FrostFsObjectHeader> GetObjectHeadAsync(PrmObjectHeadGet args)
|
||||
{
|
||||
if (args is null)
|
||||
throw new ArgumentNullException(nameof(args));
|
||||
|
||||
var service = GetObjectService(args);
|
||||
return service.GetObjectHeadAsync(args);
|
||||
}
|
||||
|
||||
public Task<FrostFsObject> GetObjectAsync(PrmObjectGet args)
|
||||
{
|
||||
if (args is null)
|
||||
throw new ArgumentNullException(nameof(args));
|
||||
|
||||
var service = GetObjectService(args);
|
||||
return service.GetObjectAsync(args);
|
||||
}
|
||||
|
||||
public Task<FrostFsObjectId> PutObjectAsync(PrmObjectPut args)
|
||||
{
|
||||
if (args is null)
|
||||
throw new ArgumentNullException(nameof(args));
|
||||
|
||||
var service = GetObjectService(args);
|
||||
return service.PutObjectAsync(args);
|
||||
}
|
||||
|
||||
public Task<FrostFsObjectId> PutSingleObjectAsync(PrmSingleObjectPut args)
|
||||
{
|
||||
if (args is null)
|
||||
throw new ArgumentNullException(nameof(args));
|
||||
|
||||
var service = GetObjectService(args);
|
||||
return service.PutSingleObjectAsync(args);
|
||||
}
|
||||
|
||||
public Task DeleteObjectAsync(PrmObjectDelete args)
|
||||
{
|
||||
if (args is null)
|
||||
throw new ArgumentNullException(nameof(args));
|
||||
|
||||
var service = GetObjectService(args);
|
||||
return service.DeleteObjectAsync(args);
|
||||
}
|
||||
|
||||
public IAsyncEnumerable<FrostFsObjectId> SearchObjectsAsync(PrmObjectSearch args)
|
||||
{
|
||||
if (args is null)
|
||||
throw new ArgumentNullException(nameof(args));
|
||||
|
||||
var service = GetObjectService(args);
|
||||
return service.SearchObjectsAsync(args);
|
||||
}
|
||||
|
@ -257,17 +308,23 @@ public class Client : IFrostFSClient
|
|||
#region SessionImplementation
|
||||
public async Task<FrostFsSessionToken> CreateSessionAsync(PrmSessionCreate args)
|
||||
{
|
||||
var session = await CreateSessionInternalAsync(args);
|
||||
if (args is null)
|
||||
throw new ArgumentNullException(nameof(args));
|
||||
|
||||
var session = await CreateSessionInternalAsync(args).ConfigureAwait(false);
|
||||
var token = session.Serialize();
|
||||
|
||||
|
||||
return new FrostFsSessionToken(token);
|
||||
}
|
||||
|
||||
internal Task<Session.SessionToken> CreateSessionInternalAsync(PrmSessionCreate args)
|
||||
internal Task<SessionToken> CreateSessionInternalAsync(PrmSessionCreate args)
|
||||
{
|
||||
if (args is null)
|
||||
throw new ArgumentNullException(nameof(args));
|
||||
|
||||
var service = GetSessionService(args);
|
||||
return service.CreateSessionAsync(args);
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region ToolsImplementation
|
||||
|
@ -283,20 +340,24 @@ public class Client : IFrostFSClient
|
|||
private async void CheckFrostFsVersionSupport(Context? ctx = default)
|
||||
{
|
||||
var args = new PrmNodeInfo { Context = ctx };
|
||||
|
||||
if (ctx?.Version == null)
|
||||
throw new InvalidObjectException(nameof(ctx.Version));
|
||||
|
||||
var service = GetNetmapService(args);
|
||||
var localNodeInfo = await service.GetLocalNodeInfoAsync(args);
|
||||
|
||||
if (!localNodeInfo.Version.IsSupported(args.Context!.Version))
|
||||
var localNodeInfo = await service.GetLocalNodeInfoAsync(args).ConfigureAwait(false);
|
||||
|
||||
if (!localNodeInfo.Version.IsSupported(ctx.Version))
|
||||
{
|
||||
var msg = $"FrostFS {localNodeInfo.Version} is not supported.";
|
||||
throw new ApplicationException(msg);
|
||||
throw new FrostFsException(msg);
|
||||
}
|
||||
}
|
||||
|
||||
private CallInvoker? SetupEnvironment(IContext ctx)
|
||||
{
|
||||
if (isDisposed)
|
||||
throw new Exception("Client is disposed.");
|
||||
throw new InvalidObjectException("Client is disposed.");
|
||||
|
||||
ctx.Context ??= new Context();
|
||||
|
||||
|
@ -304,14 +365,14 @@ public class Client : IFrostFSClient
|
|||
{
|
||||
if (ClientCtx.Key == null)
|
||||
{
|
||||
throw new Exception("Key is not initialized.");
|
||||
throw new InvalidObjectException("Key is not initialized.");
|
||||
}
|
||||
|
||||
ctx.Context.Key = ClientCtx.Key.ECDsaKey;
|
||||
}
|
||||
|
||||
if (ctx.Context.OwnerId == null)
|
||||
{
|
||||
{
|
||||
ctx.Context.OwnerId = ClientCtx.Owner ?? FrostFsOwner.FromKey(ctx.Context.Key);
|
||||
}
|
||||
|
||||
|
@ -319,7 +380,7 @@ public class Client : IFrostFSClient
|
|||
{
|
||||
if (ClientCtx.Version == null)
|
||||
{
|
||||
throw new Exception("Version is not initialized.");
|
||||
throw new InvalidObjectException("Version is not initialized.");
|
||||
}
|
||||
|
||||
ctx.Context.Version = ClientCtx.Version;
|
||||
|
@ -336,7 +397,7 @@ public class Client : IFrostFSClient
|
|||
|
||||
if (ctx.Context.Callback != null)
|
||||
callInvoker = AddInvoker(callInvoker, new MetricsInterceptor(ctx.Context.Callback));
|
||||
|
||||
|
||||
return callInvoker;
|
||||
|
||||
CallInvoker AddInvoker(CallInvoker? callInvoker, Interceptor interceptor)
|
||||
|
@ -382,7 +443,7 @@ public class Client : IFrostFSClient
|
|||
|
||||
private ContainerServiceProvider GetContainerService(IContext ctx)
|
||||
{
|
||||
var callInvoker = SetupEnvironment(ctx);
|
||||
var callInvoker = SetupEnvironment(ctx);
|
||||
var client = ContainerServiceClient ?? (callInvoker != null
|
||||
? new ContainerService.ContainerServiceClient(callInvoker)
|
||||
: new ContainerService.ContainerServiceClient(ClientCtx.Channel));
|
||||
|
@ -408,7 +469,7 @@ public class Client : IFrostFSClient
|
|||
|
||||
if (channelOptions != null)
|
||||
return GrpcChannel.ForAddress(uri, channelOptions);
|
||||
|
||||
|
||||
return GrpcChannel.ForAddress(uri, new GrpcChannelOptions
|
||||
{
|
||||
HttpHandler = new HttpClientHandler()
|
|
@ -14,6 +14,11 @@ public class MetricsInterceptor(Action<CallStatistics> callback) : Interceptor
|
|||
ClientInterceptorContext<TRequest, TResponse> context,
|
||||
AsyncUnaryCallContinuation<TRequest, TResponse> continuation)
|
||||
{
|
||||
if (continuation is null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(continuation));
|
||||
}
|
||||
|
||||
var call = continuation(request, context);
|
||||
|
||||
return new AsyncUnaryCall<TResponse>(
|
||||
|
@ -28,7 +33,10 @@ public class MetricsInterceptor(Action<CallStatistics> callback) : Interceptor
|
|||
ClientInterceptorContext<TRequest, TResponse> context,
|
||||
AsyncClientStreamingCallContinuation<TRequest, TResponse> continuation)
|
||||
{
|
||||
var call = continuation(context);
|
||||
if (continuation is null)
|
||||
throw new ArgumentNullException(nameof(continuation));
|
||||
|
||||
var call = continuation(context);
|
||||
|
||||
return new AsyncClientStreamingCall<TRequest, TResponse>(
|
||||
call.RequestStream,
|
||||
|
@ -43,31 +51,31 @@ public class MetricsInterceptor(Action<CallStatistics> callback) : Interceptor
|
|||
{
|
||||
var watch = new Stopwatch();
|
||||
watch.Start();
|
||||
|
||||
var response = await call.ResponseAsync;
|
||||
|
||||
var response = await call.ResponseAsync.ConfigureAwait(false);
|
||||
|
||||
watch.Stop();
|
||||
|
||||
var elapsed = watch.ElapsedTicks * 1_000_000/Stopwatch.Frequency;
|
||||
var elapsed = watch.ElapsedTicks * 1_000_000 / Stopwatch.Frequency;
|
||||
|
||||
callback(new CallStatistics { MethodName = call.ToString(), ElapsedMicroSeconds = elapsed });
|
||||
|
||||
return response;
|
||||
return response;
|
||||
}
|
||||
|
||||
private async Task<TResponse> HandleStreamResponse<TRequest, TResponse>(AsyncClientStreamingCall<TRequest, TResponse> call)
|
||||
{
|
||||
var watch = new Stopwatch();
|
||||
watch.Start();
|
||||
|
||||
var response = await call.ResponseAsync;
|
||||
|
||||
var response = await call.ResponseAsync.ConfigureAwait(false);
|
||||
|
||||
watch.Stop();
|
||||
|
||||
var elapsed = watch.ElapsedTicks * 1_000_000/Stopwatch.Frequency;
|
||||
var elapsed = watch.ElapsedTicks * 1_000_000 / Stopwatch.Frequency;
|
||||
|
||||
callback(new CallStatistics { MethodName = call.ToString(), ElapsedMicroSeconds = elapsed });
|
||||
|
||||
return response;
|
||||
return response;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -36,21 +36,21 @@ public interface IFrostFSClient : IDisposable
|
|||
|
||||
Task DeleteContainerAsync(PrmContainerDelete args);
|
||||
#endregion
|
||||
|
||||
|
||||
#region Object
|
||||
Task<FrostFsObjectHeader> GetObjectHeadAsync(PrmObjectHeadGet args);
|
||||
|
||||
Task<FrostFsObject> GetObjectAsync(PrmObjectGet args);
|
||||
|
||||
Task<FrostFsObjectId> PutObjectAsync(PrmObjectPut args);
|
||||
|
||||
|
||||
Task<FrostFsObjectId> PutSingleObjectAsync(PrmSingleObjectPut args);
|
||||
|
||||
Task DeleteObjectAsync(PrmObjectDelete args);
|
||||
|
||||
IAsyncEnumerable<FrostFsObjectId> SearchObjectsAsync(PrmObjectSearch args);
|
||||
#endregion
|
||||
|
||||
|
||||
#region Tools
|
||||
FrostFsObjectId CalculateObjectId(FrostFsObjectHeader header, Context ctx);
|
||||
#endregion
|
||||
|
|
|
@ -9,14 +9,12 @@ public static class ContainerMapper
|
|||
{
|
||||
public static FrostFsContainerInfo ToModel(this Container.Container container)
|
||||
{
|
||||
if (!Enum.IsDefined(typeof(BasicAcl),(int)container.BasicAcl))
|
||||
throw new ArgumentException($"Unknown BasicACL rule. Value: '{container.BasicAcl}'.");
|
||||
|
||||
BasicAcl acl = (BasicAcl)container.BasicAcl;
|
||||
if (container == null)
|
||||
throw new ArgumentNullException(nameof(container));
|
||||
|
||||
return new FrostFsContainerInfo(acl,
|
||||
return new FrostFsContainerInfo(
|
||||
container.PlacementPolicy.ToModel(),
|
||||
container.Attributes?.Select(a => new FrostFsAttribute(a.Key, a.Value)).ToList(),
|
||||
container.Attributes?.Select(a => new FrostFsAttributePair(a.Key, a.Value)).ToArray(),
|
||||
container.Version?.ToModel(),
|
||||
container.OwnerId?.ToModel(),
|
||||
container.Nonce?.ToUuid());
|
||||
|
|
|
@ -17,19 +17,23 @@ public static class ContainerIdMapper
|
|||
|
||||
public static ContainerID ToMessage(this FrostFsContainerId model)
|
||||
{
|
||||
if (model.Value == null)
|
||||
if (model is null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(model));
|
||||
|
||||
if (!Cache.Containers.TryGetValue(model.Value, out ContainerID? message))
|
||||
}
|
||||
|
||||
var containerId = model.GetValue() ?? throw new ArgumentNullException(nameof(model));
|
||||
|
||||
if (!Cache.Containers.TryGetValue(containerId, out ContainerID? message))
|
||||
{
|
||||
message = new ContainerID
|
||||
{
|
||||