diff --git a/.gitignore b/.gitignore index bbad74e4..e5c86b4f 100644 --- a/.gitignore +++ b/.gitignore @@ -24,6 +24,7 @@ bld/ [Oo]bj/ [Ll]og/ host/ +NugetPackages/ # DocFX build results _site/ diff --git a/src/Imageflow.Server.Configuration/Imageflow.Server.Configuration.csproj b/src/Imageflow.Server.Configuration/Imageflow.Server.Configuration.csproj index 312ceabd..1ef95072 100644 --- a/src/Imageflow.Server.Configuration/Imageflow.Server.Configuration.csproj +++ b/src/Imageflow.Server.Configuration/Imageflow.Server.Configuration.csproj @@ -1,15 +1,6 @@ - - net8.0 - 11 - enable - enable - true - - - - + @@ -17,8 +8,8 @@ - - + + diff --git a/src/Imageflow.Server.Configuration/packages.lock.json b/src/Imageflow.Server.Configuration/packages.lock.json index d386f25d..65eb51e7 100644 --- a/src/Imageflow.Server.Configuration/packages.lock.json +++ b/src/Imageflow.Server.Configuration/packages.lock.json @@ -1,7 +1,197 @@ { "version": 1, "dependencies": { - "net8.0": { + ".NETStandard,Version=v2.0": { + "Microsoft.SourceLink.GitHub": { + "type": "Direct", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "G5q7OqtwIyGTkeIOAc3u2ZuV/kicQaec5EaRnc0pIeSnh9LUjj+PYQrJYBURvDt7twGl2PKA7nSN0kz1Zw5bnQ==", + "dependencies": { + "Microsoft.Build.Tasks.Git": "8.0.0", + "Microsoft.SourceLink.Common": "8.0.0" + } + }, + "NETStandard.Library": { + "type": "Direct", + "requested": "[2.0.3, )", + "resolved": "2.0.3", + "contentHash": "st47PosZSHrjECdjeIzZQbzivYBJFv6P2nv4cj2ypdI204DO+vZ7l5raGMiX4eXMJ53RfOIg+/s4DHVZ54Nu2A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0" + } + }, + "Tomlyn": { + "type": "Direct", + "requested": "[0.16.2, )", + "resolved": "0.16.2", + "contentHash": "NVvOlecYWwhqQdE461UGHUeJ1t2DtGXU+L00LgtBTgWA16bUmMhUIRaCpSkRX5HqAeid/KlXmdH7Sul0mr6HJA==" + }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "UcSjPsst+DfAdJGVDsu346FX0ci0ah+lw3WRtn18NUwEqRt70HaOQ7lI72vy3+1LxtqI3T5GWwV39rQSrCzAeg==", + "dependencies": { + "System.Threading.Tasks.Extensions": "4.5.4" + } + }, + "Microsoft.Build.Tasks.Git": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ==" + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "Transitive", + "resolved": "2.2.0", + "contentHash": "65MrmXCziWaQFrI0UHkQbesrX5wTwf9XPjY5yFm/VkgJKFJ5gqvXRoXjIZcf2wLi5ZlwGz/oMYfyURVCWbM5iw==", + "dependencies": { + "Microsoft.Extensions.Primitives": "2.2.0" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "2.2.0", + "contentHash": "f9hstgjVmr6rmrfGSpfsVOl2irKAgr1QjrSi3FgnS7kulxband50f2brRLwySAQTADPZeTdow0mpSMcoAdadCw==" + }, + "Microsoft.Extensions.FileProviders.Abstractions": { + "type": "Transitive", + "resolved": "2.2.0", + "contentHash": "EcnaSsPTqx2MGnHrmWOD0ugbuuqVT8iICqSqPzi45V5/MA1LjUNb0kwgcxBGqizV1R+WeBK7/Gw25Jzkyk9bIw==", + "dependencies": { + "Microsoft.Extensions.Primitives": "2.2.0" + } + }, + "Microsoft.Extensions.Hosting.Abstractions": { + "type": "Transitive", + "resolved": "2.2.0", + "contentHash": "+k4AEn68HOJat5gj1TWa6X28WlirNQO9sPIIeQbia+91n03esEtMSSoekSTpMjUzjqtJWQN3McVx0GvSPFHF/Q==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "2.2.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0", + "Microsoft.Extensions.FileProviders.Abstractions": "2.2.0", + "Microsoft.Extensions.Logging.Abstractions": "2.2.0" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "2.2.0", + "contentHash": "B2WqEox8o+4KUOpL7rZPyh6qYjik8tHi2tN8Z9jZkHzED8ElYgZa/h6K+xliB435SqUcWT290Fr2aa8BtZjn8A==" + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "2.2.0", + "contentHash": "azyQtqbm4fSaDzZHD/J+V6oWMFaf2tWP4WEGIYePLCMw3+b2RQdj9ybgbQyjCshcitQKQ4lEDOZjmSlTTrHxUg==", + "dependencies": { + "System.Memory": "4.5.1", + "System.Runtime.CompilerServices.Unsafe": "4.5.1" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==" + }, + "Microsoft.SourceLink.Common": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw==" + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.5.1", + "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" + }, + "System.Interactive.Async": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "f8H1O4ZWDQo344y5NQU76G4SIjWMuKDVXL9OM1dg6K5YZnLkc8iCdQDybBvMcC6ufk61jzXGVAX6UCDu0qDSjA==", + "dependencies": { + "System.Linq.Async": "6.0.1" + } + }, + "System.Linq.Async": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "0YhHcaroWpQ9UCot3Pizah7ryAzQhNvobLMSxeDIGmnXfkQn8u5owvpOH0K6EVB+z9L7u6Cc4W17Br/+jyttEQ==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "6.0.0" + } + }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.5", + "contentHash": "XIWiDvKPXaTveaB7HVganDlOCRoj03l+jrwNvcge/t8vhGYKvqV+dMv6G4SAX2NoNmN0wZfVPTAlFwZcZvVOUw==", + "dependencies": { + "System.Buffers": "4.5.1", + "System.Numerics.Vectors": "4.4.0", + "System.Runtime.CompilerServices.Unsafe": "4.5.3" + } + }, + "System.Numerics.Vectors": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "UiLzLW+Lw6HLed1Hcg+8jSRttrbuXv7DANVj0DkL9g6EnnzbL75EB7EWsw5uRbhxd/4YdG8li5XizGWepmG3PQ==" + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" + }, + "System.Text.Encodings.Web": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ==", + "dependencies": { + "System.Buffers": "4.5.1", + "System.Memory": "4.5.5", + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "System.Threading.Tasks.Extensions": { + "type": "Transitive", + "resolved": "4.5.4", + "contentHash": "zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "4.5.3" + } + }, + "imageflow.server": { + "type": "Project" + }, + "imageflow.server.hybridcache": { + "type": "Project", + "dependencies": { + "Imazen.Common": "[0.1.0--notset, )", + "Imazen.HybridCache": "[0.1.0--notset, )", + "Microsoft.Extensions.Hosting.Abstractions": "[2.2.0, )" + } + }, + "imazen.abstractions": { + "type": "Project", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "[5.0.0, )", + "Microsoft.Extensions.Hosting.Abstractions": "[2.2.0, )", + "System.Buffers": "[4.5.1, )", + "System.Memory": "[4.5.5, )", + "System.Text.Encodings.Web": "[8.0.0, )", + "System.Threading.Tasks.Extensions": "[4.5.4, )" + } + }, + "imazen.common": { + "type": "Project", + "dependencies": { + "Imazen.Abstractions": "[0.1.0--notset, )" + } + }, + "imazen.hybridcache": { + "type": "Project", + "dependencies": { + "Imazen.Common": "[0.1.0--notset, )", + "System.Interactive.Async": "[6.0.1, )" + } + } + }, + "net6.0": { "Microsoft.SourceLink.GitHub": { "type": "Direct", "requested": "[8.0.0, )", @@ -12,11 +202,235 @@ "Microsoft.SourceLink.Common": "8.0.0" } }, - "PolySharp": { + "Tomlyn": { "type": "Direct", - "requested": "[1.14.1, )", - "resolved": "1.14.1", - "contentHash": "mOOmFYwad3MIOL14VCjj02LljyF1GNw1wP0YVlxtcPvqdxjGGMNdNJJxHptlry3MOd8b40Flm8RPOM8JOlN2sQ==" + "requested": "[0.16.2, )", + "resolved": "0.16.2", + "contentHash": "NVvOlecYWwhqQdE461UGHUeJ1t2DtGXU+L00LgtBTgWA16bUmMhUIRaCpSkRX5HqAeid/KlXmdH7Sul0mr6HJA==" + }, + "CommunityToolkit.HighPerformance": { + "type": "Transitive", + "resolved": "8.2.2", + "contentHash": "+zIp8d3sbtYaRbM6hqDs4Ui/z34j7DcUmleruZlYLE4CVxXq+MO8XJyIs42vzeTYFX+k0Iq1dEbBUnQ4z/Gnrw==" + }, + "Imageflow.AllPlatforms": { + "type": "Transitive", + "resolved": "0.10.2", + "contentHash": "xBE1ob69E4z4Qg3v18RJe81J9rXXWvxpUyYiOZLcZZuOnbIF35t+ToPBQIYFDNgc39NFisf1iru3NnytOGM6tg==", + "dependencies": { + "Imageflow.NativeRuntime.osx-x86_64": "2.0.0-preview8", + "Imageflow.NativeRuntime.ubuntu-x86_64": "2.0.0-preview8", + "Imageflow.NativeRuntime.win-x86": "2.0.0-preview8", + "Imageflow.NativeRuntime.win-x86_64": "2.0.0-preview8", + "Imageflow.Net": "0.10.2" + } + }, + "Imageflow.NativeRuntime.osx-x86_64": { + "type": "Transitive", + "resolved": "2.0.0-preview8", + "contentHash": "3wEglrMqVzlnAVBTdK6qcRySdo/4ajBP5ASRuK3yHfBqPp3ld4ke6guxuSZbgDTObIxai7KTLlsIvQZhusymUA==" + }, + "Imageflow.NativeRuntime.ubuntu-x86_64": { + "type": "Transitive", + "resolved": "2.0.0-preview8", + "contentHash": "H8K5kZqcM3IliDRZD3H8BN6TbeLgcW+6FsDZ3EvlqBvu41s+Lv9vxE+c3m1cUQhsYBs76udUhgJFNR1D6x3U5g==" + }, + "Imageflow.NativeRuntime.win-x86": { + "type": "Transitive", + "resolved": "2.0.0-preview8", + "contentHash": "WunIva5NZ2iMPKCyz8ZTkN7SRaW3szBijMg5YK7jaSFZHw8Xiky/GFfghc0XgWTuILxwO4YbY86e8QvW8CBigQ==" + }, + "Imageflow.NativeRuntime.win-x86_64": { + "type": "Transitive", + "resolved": "2.0.0-preview8", + "contentHash": "1rY6C9Hjj7U9toa7FlnveiSBKccZlvCaHwdxPRQS0vDpAZZCJrTA/H7VYdreifpnIDInYcf0i/3oEKzEnj884w==" + }, + "Imageflow.Net": { + "type": "Transitive", + "resolved": "0.10.2", + "contentHash": "4KtF92PRHCU8Gm3wYEGJd+Uk0YBqXUY2CFe2P3N3P8UiG6vSIQRDKUV9LjgstEsis95/9OE4ItfJTpMessJIRQ==", + "dependencies": { + "Microsoft.CSharp": "4.7.0", + "Microsoft.IO.RecyclableMemoryStream": "[1.2.2, 3.0.0)", + "Newtonsoft.Json": "[13.0.3, 14.0.0)" + } + }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "UcSjPsst+DfAdJGVDsu346FX0ci0ah+lw3WRtn18NUwEqRt70HaOQ7lI72vy3+1LxtqI3T5GWwV39rQSrCzAeg==" + }, + "Microsoft.Build.Tasks.Git": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ==" + }, + "Microsoft.CSharp": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==" + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "Transitive", + "resolved": "2.2.0", + "contentHash": "65MrmXCziWaQFrI0UHkQbesrX5wTwf9XPjY5yFm/VkgJKFJ5gqvXRoXjIZcf2wLi5ZlwGz/oMYfyURVCWbM5iw==", + "dependencies": { + "Microsoft.Extensions.Primitives": "2.2.0" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "2.2.0", + "contentHash": "f9hstgjVmr6rmrfGSpfsVOl2irKAgr1QjrSi3FgnS7kulxband50f2brRLwySAQTADPZeTdow0mpSMcoAdadCw==" + }, + "Microsoft.Extensions.FileProviders.Abstractions": { + "type": "Transitive", + "resolved": "2.2.0", + "contentHash": "EcnaSsPTqx2MGnHrmWOD0ugbuuqVT8iICqSqPzi45V5/MA1LjUNb0kwgcxBGqizV1R+WeBK7/Gw25Jzkyk9bIw==", + "dependencies": { + "Microsoft.Extensions.Primitives": "2.2.0" + } + }, + "Microsoft.Extensions.Hosting.Abstractions": { + "type": "Transitive", + "resolved": "2.2.0", + "contentHash": "+k4AEn68HOJat5gj1TWa6X28WlirNQO9sPIIeQbia+91n03esEtMSSoekSTpMjUzjqtJWQN3McVx0GvSPFHF/Q==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "2.2.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0", + "Microsoft.Extensions.FileProviders.Abstractions": "2.2.0", + "Microsoft.Extensions.Logging.Abstractions": "2.2.0" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "2.2.0", + "contentHash": "B2WqEox8o+4KUOpL7rZPyh6qYjik8tHi2tN8Z9jZkHzED8ElYgZa/h6K+xliB435SqUcWT290Fr2aa8BtZjn8A==" + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "Microsoft.IO.RecyclableMemoryStream": { + "type": "Transitive", + "resolved": "1.2.2", + "contentHash": "LA4RBTStohA0hAAs6oKchmIC5M5Mjd5MwfB7vbbl+312N5kXj8abTGOgwZy6ASJYLCiqiiK5kHS0hDGEgfkB8g==" + }, + "Microsoft.SourceLink.Common": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw==" + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "13.0.3", + "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==" + }, + "System.Collections.Immutable": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "AurL6Y5BA1WotzlEvVaIDpqzpIPvYnnldxru8oXJU2yFxFUy3+pNXjXd1ymO+RA0rq0+590Q8gaz2l3Sr7fmqg==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "System.Interactive.Async": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "f8H1O4ZWDQo344y5NQU76G4SIjWMuKDVXL9OM1dg6K5YZnLkc8iCdQDybBvMcC6ufk61jzXGVAX6UCDu0qDSjA==", + "dependencies": { + "System.Linq.Async": "6.0.1" + } + }, + "System.IO.Pipelines": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "FHNOatmUq0sqJOkTx+UF/9YK1f180cnW5FVqnQMvYUN0elp6wFzbtPSiqbo1/ru8ICp43JM1i7kKkk6GsNGHlA==" + }, + "System.Linq.Async": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "0YhHcaroWpQ9UCot3Pizah7ryAzQhNvobLMSxeDIGmnXfkQn8u5owvpOH0K6EVB+z9L7u6Cc4W17Br/+jyttEQ==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "6.0.0" + } + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" + }, + "System.Text.Encodings.Web": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "imageflow.server": { + "type": "Project", + "dependencies": { + "Imageflow.AllPlatforms": "[0.10.2, )", + "Imazen.Common": "[0.1.0--notset, )", + "Imazen.Routing": "[0.1.0--notset, )" + } + }, + "imageflow.server.hybridcache": { + "type": "Project", + "dependencies": { + "Imazen.Common": "[0.1.0--notset, )", + "Imazen.HybridCache": "[0.1.0--notset, )", + "Microsoft.Extensions.Hosting.Abstractions": "[2.2.0, )" + } + }, + "imazen.abstractions": { + "type": "Project", + "dependencies": { + "Microsoft.Extensions.Hosting.Abstractions": "[2.2.0, )", + "System.Text.Encodings.Web": "[8.0.0, )" + } + }, + "imazen.common": { + "type": "Project", + "dependencies": { + "Imazen.Abstractions": "[0.1.0--notset, )" + } + }, + "imazen.hybridcache": { + "type": "Project", + "dependencies": { + "Imazen.Common": "[0.1.0--notset, )", + "System.Interactive.Async": "[6.0.1, )" + } + }, + "imazen.routing": { + "type": "Project", + "dependencies": { + "CommunityToolkit.HighPerformance": "[8.2.2, )", + "Imageflow.Net": "[0.10.2, )", + "Imazen.Abstractions": "[0.1.0--notset, )", + "Imazen.Common": "[0.1.0--notset, )", + "Microsoft.Extensions.Primitives": "[8.0.0, )", + "System.Collections.Immutable": "[8.0.0, )", + "System.IO.Pipelines": "[8.0.0, )" + } + } + }, + "net8.0": { + "Microsoft.SourceLink.GitHub": { + "type": "Direct", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "G5q7OqtwIyGTkeIOAc3u2ZuV/kicQaec5EaRnc0pIeSnh9LUjj+PYQrJYBURvDt7twGl2PKA7nSN0kz1Zw5bnQ==", + "dependencies": { + "Microsoft.Build.Tasks.Git": "8.0.0", + "Microsoft.SourceLink.Common": "8.0.0" + } }, "Tomlyn": { "type": "Direct", diff --git a/src/Imageflow.Server.DiskCache/Imageflow.Server.DiskCache.csproj b/src/Imageflow.Server.DiskCache/Imageflow.Server.DiskCache.csproj index ee44c83d..af4006cc 100644 --- a/src/Imageflow.Server.DiskCache/Imageflow.Server.DiskCache.csproj +++ b/src/Imageflow.Server.DiskCache/Imageflow.Server.DiskCache.csproj @@ -1,17 +1,12 @@ - net6.0 Imageflow.Server.DiskCache - Plugin for caching processed images to disk. Imageflow.Server plugin for caching processed images to disk. - false - latest - enable - + - diff --git a/src/Imageflow.Server.DiskCache/packages.lock.json b/src/Imageflow.Server.DiskCache/packages.lock.json index c427b23e..21ba21e9 100644 --- a/src/Imageflow.Server.DiskCache/packages.lock.json +++ b/src/Imageflow.Server.DiskCache/packages.lock.json @@ -1,7 +1,7 @@ { "version": 1, "dependencies": { - "net6.0": { + ".NETStandard,Version=v2.0": { "Microsoft.SourceLink.GitHub": { "type": "Direct", "requested": "[8.0.0, )", @@ -12,11 +12,162 @@ "Microsoft.SourceLink.Common": "8.0.0" } }, - "PolySharp": { + "NETStandard.Library": { "type": "Direct", - "requested": "[1.14.1, )", - "resolved": "1.14.1", - "contentHash": "mOOmFYwad3MIOL14VCjj02LljyF1GNw1wP0YVlxtcPvqdxjGGMNdNJJxHptlry3MOd8b40Flm8RPOM8JOlN2sQ==" + "requested": "[2.0.3, )", + "resolved": "2.0.3", + "contentHash": "st47PosZSHrjECdjeIzZQbzivYBJFv6P2nv4cj2ypdI204DO+vZ7l5raGMiX4eXMJ53RfOIg+/s4DHVZ54Nu2A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0" + } + }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "W8DPQjkMScOMTtJbPwmPyj9c3zYSFGawDW3jwlBOOsnY+EzZFLgNQ/UMkK35JmkNOVPdCyPr2Tw7Vv9N+KA3ZQ==", + "dependencies": { + "System.Threading.Tasks.Extensions": "4.5.4" + } + }, + "Microsoft.Build.Tasks.Git": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ==" + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "Transitive", + "resolved": "2.2.0", + "contentHash": "65MrmXCziWaQFrI0UHkQbesrX5wTwf9XPjY5yFm/VkgJKFJ5gqvXRoXjIZcf2wLi5ZlwGz/oMYfyURVCWbM5iw==", + "dependencies": { + "Microsoft.Extensions.Primitives": "2.2.0" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "2.2.0", + "contentHash": "f9hstgjVmr6rmrfGSpfsVOl2irKAgr1QjrSi3FgnS7kulxband50f2brRLwySAQTADPZeTdow0mpSMcoAdadCw==" + }, + "Microsoft.Extensions.FileProviders.Abstractions": { + "type": "Transitive", + "resolved": "2.2.0", + "contentHash": "EcnaSsPTqx2MGnHrmWOD0ugbuuqVT8iICqSqPzi45V5/MA1LjUNb0kwgcxBGqizV1R+WeBK7/Gw25Jzkyk9bIw==", + "dependencies": { + "Microsoft.Extensions.Primitives": "2.2.0" + } + }, + "Microsoft.Extensions.Hosting.Abstractions": { + "type": "Transitive", + "resolved": "2.2.0", + "contentHash": "+k4AEn68HOJat5gj1TWa6X28WlirNQO9sPIIeQbia+91n03esEtMSSoekSTpMjUzjqtJWQN3McVx0GvSPFHF/Q==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "2.2.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0", + "Microsoft.Extensions.FileProviders.Abstractions": "2.2.0", + "Microsoft.Extensions.Logging.Abstractions": "2.2.0" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "3.1.3", + "contentHash": "j6r0E+OVinD4s13CIZASYJLLLApStb1yh5Vig7moB2FE1UsMRj4TYJ/xioDjreVA0dyOFpbWny1/n2iSJMbmNg==" + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "2.2.0", + "contentHash": "azyQtqbm4fSaDzZHD/J+V6oWMFaf2tWP4WEGIYePLCMw3+b2RQdj9ybgbQyjCshcitQKQ4lEDOZjmSlTTrHxUg==", + "dependencies": { + "System.Memory": "4.5.1", + "System.Runtime.CompilerServices.Unsafe": "4.5.1" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==" + }, + "Microsoft.SourceLink.Common": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw==" + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.5.1", + "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" + }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.5", + "contentHash": "XIWiDvKPXaTveaB7HVganDlOCRoj03l+jrwNvcge/t8vhGYKvqV+dMv6G4SAX2NoNmN0wZfVPTAlFwZcZvVOUw==", + "dependencies": { + "System.Buffers": "4.5.1", + "System.Numerics.Vectors": "4.4.0", + "System.Runtime.CompilerServices.Unsafe": "4.5.3" + } + }, + "System.Numerics.Vectors": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "UiLzLW+Lw6HLed1Hcg+8jSRttrbuXv7DANVj0DkL9g6EnnzbL75EB7EWsw5uRbhxd/4YdG8li5XizGWepmG3PQ==" + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" + }, + "System.Text.Encodings.Web": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ==", + "dependencies": { + "System.Buffers": "4.5.1", + "System.Memory": "4.5.5", + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "System.Threading.Tasks.Extensions": { + "type": "Transitive", + "resolved": "4.5.4", + "contentHash": "zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "4.5.3" + } + }, + "imazen.abstractions": { + "type": "Project", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "[5.0.0, )", + "Microsoft.Extensions.Hosting.Abstractions": "[2.2.0, )", + "System.Buffers": "[4.5.1, )", + "System.Memory": "[4.5.5, )", + "System.Text.Encodings.Web": "[8.0.0, )", + "System.Threading.Tasks.Extensions": "[4.5.4, )" + } + }, + "imazen.common": { + "type": "Project", + "dependencies": { + "Imazen.Abstractions": "[0.1.0--notset, )" + } + }, + "imazen.diskcache": { + "type": "Project", + "dependencies": { + "Imazen.Common": "[0.1.0--notset, )", + "Microsoft.Extensions.Logging.Abstractions": "[3.1.3, )" + } + } + }, + "net6.0": { + "Microsoft.SourceLink.GitHub": { + "type": "Direct", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "G5q7OqtwIyGTkeIOAc3u2ZuV/kicQaec5EaRnc0pIeSnh9LUjj+PYQrJYBURvDt7twGl2PKA7nSN0kz1Zw5bnQ==", + "dependencies": { + "Microsoft.Build.Tasks.Git": "8.0.0", + "Microsoft.SourceLink.Common": "8.0.0" + } }, "Microsoft.Build.Tasks.Git": { "type": "Transitive", @@ -112,6 +263,109 @@ "Microsoft.Extensions.Logging.Abstractions": "[3.1.3, )" } } + }, + "net8.0": { + "Microsoft.SourceLink.GitHub": { + "type": "Direct", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "G5q7OqtwIyGTkeIOAc3u2ZuV/kicQaec5EaRnc0pIeSnh9LUjj+PYQrJYBURvDt7twGl2PKA7nSN0kz1Zw5bnQ==", + "dependencies": { + "Microsoft.Build.Tasks.Git": "8.0.0", + "Microsoft.SourceLink.Common": "8.0.0" + } + }, + "Microsoft.Build.Tasks.Git": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ==" + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "Transitive", + "resolved": "2.2.0", + "contentHash": "65MrmXCziWaQFrI0UHkQbesrX5wTwf9XPjY5yFm/VkgJKFJ5gqvXRoXjIZcf2wLi5ZlwGz/oMYfyURVCWbM5iw==", + "dependencies": { + "Microsoft.Extensions.Primitives": "2.2.0" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "2.2.0", + "contentHash": "f9hstgjVmr6rmrfGSpfsVOl2irKAgr1QjrSi3FgnS7kulxband50f2brRLwySAQTADPZeTdow0mpSMcoAdadCw==" + }, + "Microsoft.Extensions.FileProviders.Abstractions": { + "type": "Transitive", + "resolved": "2.2.0", + "contentHash": "EcnaSsPTqx2MGnHrmWOD0ugbuuqVT8iICqSqPzi45V5/MA1LjUNb0kwgcxBGqizV1R+WeBK7/Gw25Jzkyk9bIw==", + "dependencies": { + "Microsoft.Extensions.Primitives": "2.2.0" + } + }, + "Microsoft.Extensions.Hosting.Abstractions": { + "type": "Transitive", + "resolved": "2.2.0", + "contentHash": "+k4AEn68HOJat5gj1TWa6X28WlirNQO9sPIIeQbia+91n03esEtMSSoekSTpMjUzjqtJWQN3McVx0GvSPFHF/Q==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "2.2.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0", + "Microsoft.Extensions.FileProviders.Abstractions": "2.2.0", + "Microsoft.Extensions.Logging.Abstractions": "2.2.0" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "3.1.3", + "contentHash": "j6r0E+OVinD4s13CIZASYJLLLApStb1yh5Vig7moB2FE1UsMRj4TYJ/xioDjreVA0dyOFpbWny1/n2iSJMbmNg==" + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "2.2.0", + "contentHash": "azyQtqbm4fSaDzZHD/J+V6oWMFaf2tWP4WEGIYePLCMw3+b2RQdj9ybgbQyjCshcitQKQ4lEDOZjmSlTTrHxUg==", + "dependencies": { + "System.Memory": "4.5.1", + "System.Runtime.CompilerServices.Unsafe": "4.5.1" + } + }, + "Microsoft.SourceLink.Common": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw==" + }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.1", + "contentHash": "sDJYJpGtTgx+23Ayu5euxG5mAXWdkDb4+b0rD0Cab0M1oQS9H0HXGPriKcqpXuiJDTV7fTp/d+fMDJmnr6sNvA==" + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "4.5.1", + "contentHash": "Zh8t8oqolRaFa9vmOZfdQm/qKejdqz0J9kr7o2Fu0vPeoH3BL1EOXipKWwkWtLT1JPzjByrF19fGuFlNbmPpiw==" + }, + "System.Text.Encodings.Web": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ==" + }, + "imazen.abstractions": { + "type": "Project", + "dependencies": { + "Microsoft.Extensions.Hosting.Abstractions": "[2.2.0, )", + "System.Text.Encodings.Web": "[8.0.0, )" + } + }, + "imazen.common": { + "type": "Project", + "dependencies": { + "Imazen.Abstractions": "[0.1.0--notset, )" + } + }, + "imazen.diskcache": { + "type": "Project", + "dependencies": { + "Imazen.Common": "[0.1.0--notset, )", + "Microsoft.Extensions.Logging.Abstractions": "[3.1.3, )" + } + } } } } \ No newline at end of file diff --git a/src/Imageflow.Server.HybridCache/packages.lock.json b/src/Imageflow.Server.HybridCache/packages.lock.json index e51e1814..b8ccc1c0 100644 --- a/src/Imageflow.Server.HybridCache/packages.lock.json +++ b/src/Imageflow.Server.HybridCache/packages.lock.json @@ -33,12 +33,6 @@ "Microsoft.NETCore.Platforms": "1.1.0" } }, - "PolySharp": { - "type": "Direct", - "requested": "[1.14.1, )", - "resolved": "1.14.1", - "contentHash": "mOOmFYwad3MIOL14VCjj02LljyF1GNw1wP0YVlxtcPvqdxjGGMNdNJJxHptlry3MOd8b40Flm8RPOM8JOlN2sQ==" - }, "Microsoft.Bcl.AsyncInterfaces": { "type": "Transitive", "resolved": "6.0.0", @@ -204,12 +198,6 @@ "Microsoft.SourceLink.Common": "8.0.0" } }, - "PolySharp": { - "type": "Direct", - "requested": "[1.14.1, )", - "resolved": "1.14.1", - "contentHash": "mOOmFYwad3MIOL14VCjj02LljyF1GNw1wP0YVlxtcPvqdxjGGMNdNJJxHptlry3MOd8b40Flm8RPOM8JOlN2sQ==" - }, "Microsoft.Bcl.AsyncInterfaces": { "type": "Transitive", "resolved": "6.0.0", @@ -338,12 +326,6 @@ "Microsoft.SourceLink.Common": "8.0.0" } }, - "PolySharp": { - "type": "Direct", - "requested": "[1.14.1, )", - "resolved": "1.14.1", - "contentHash": "mOOmFYwad3MIOL14VCjj02LljyF1GNw1wP0YVlxtcPvqdxjGGMNdNJJxHptlry3MOd8b40Flm8RPOM8JOlN2sQ==" - }, "Microsoft.Bcl.AsyncInterfaces": { "type": "Transitive", "resolved": "6.0.0", diff --git a/src/Imageflow.Server.Storage.AzureBlob/Imageflow.Server.Storage.AzureBlob.csproj b/src/Imageflow.Server.Storage.AzureBlob/Imageflow.Server.Storage.AzureBlob.csproj index f34cfc8c..b4bb31d5 100644 --- a/src/Imageflow.Server.Storage.AzureBlob/Imageflow.Server.Storage.AzureBlob.csproj +++ b/src/Imageflow.Server.Storage.AzureBlob/Imageflow.Server.Storage.AzureBlob.csproj @@ -1,16 +1,11 @@ - netstandard2.0;net6.0;net8.0 Imageflow.Server.Storage.AzureBlob - Plugin for fetching source images from Azure Blob Storage. Imageflow.Server plugin for fetching source images from Azure Blob Storage. - true - latest - enable - - + diff --git a/src/Imageflow.Server.Storage.AzureBlob/packages.lock.json b/src/Imageflow.Server.Storage.AzureBlob/packages.lock.json index aac92055..7c195fc1 100644 --- a/src/Imageflow.Server.Storage.AzureBlob/packages.lock.json +++ b/src/Imageflow.Server.Storage.AzureBlob/packages.lock.json @@ -46,12 +46,6 @@ "Microsoft.NETCore.Platforms": "1.1.0" } }, - "PolySharp": { - "type": "Direct", - "requested": "[1.14.1, )", - "resolved": "1.14.1", - "contentHash": "mOOmFYwad3MIOL14VCjj02LljyF1GNw1wP0YVlxtcPvqdxjGGMNdNJJxHptlry3MOd8b40Flm8RPOM8JOlN2sQ==" - }, "Azure.Core": { "type": "Transitive", "resolved": "1.36.0", @@ -376,12 +370,6 @@ "Microsoft.SourceLink.Common": "8.0.0" } }, - "PolySharp": { - "type": "Direct", - "requested": "[1.14.1, )", - "resolved": "1.14.1", - "contentHash": "mOOmFYwad3MIOL14VCjj02LljyF1GNw1wP0YVlxtcPvqdxjGGMNdNJJxHptlry3MOd8b40Flm8RPOM8JOlN2sQ==" - }, "Azure.Core": { "type": "Transitive", "resolved": "1.36.0", @@ -666,12 +654,6 @@ "Microsoft.SourceLink.Common": "8.0.0" } }, - "PolySharp": { - "type": "Direct", - "requested": "[1.14.1, )", - "resolved": "1.14.1", - "contentHash": "mOOmFYwad3MIOL14VCjj02LljyF1GNw1wP0YVlxtcPvqdxjGGMNdNJJxHptlry3MOd8b40Flm8RPOM8JOlN2sQ==" - }, "Azure.Core": { "type": "Transitive", "resolved": "1.36.0", diff --git a/src/Imageflow.Server.Storage.RemoteReader/Imageflow.Server.Storage.RemoteReader.csproj b/src/Imageflow.Server.Storage.RemoteReader/Imageflow.Server.Storage.RemoteReader.csproj index 9f8d01cf..df7e3a1d 100644 --- a/src/Imageflow.Server.Storage.RemoteReader/Imageflow.Server.Storage.RemoteReader.csproj +++ b/src/Imageflow.Server.Storage.RemoteReader/Imageflow.Server.Storage.RemoteReader.csproj @@ -1,14 +1,10 @@ - netstandard2.0;net6.0;net8.0 Imageflow.Server.Storage.RemoteReader - Plugin for fetching source images from remote URLs. Imageflow.Server plugin for fetching source images from remote URLs. - true - latest - enable - + diff --git a/src/Imageflow.Server.Storage.RemoteReader/packages.lock.json b/src/Imageflow.Server.Storage.RemoteReader/packages.lock.json index bf5bb18e..52780eab 100644 --- a/src/Imageflow.Server.Storage.RemoteReader/packages.lock.json +++ b/src/Imageflow.Server.Storage.RemoteReader/packages.lock.json @@ -33,12 +33,6 @@ "Microsoft.NETCore.Platforms": "1.1.0" } }, - "PolySharp": { - "type": "Direct", - "requested": "[1.14.1, )", - "resolved": "1.14.1", - "contentHash": "mOOmFYwad3MIOL14VCjj02LljyF1GNw1wP0YVlxtcPvqdxjGGMNdNJJxHptlry3MOd8b40Flm8RPOM8JOlN2sQ==" - }, "Microsoft.Bcl.AsyncInterfaces": { "type": "Transitive", "resolved": "5.0.0", @@ -233,12 +227,6 @@ "Microsoft.SourceLink.Common": "8.0.0" } }, - "PolySharp": { - "type": "Direct", - "requested": "[1.14.1, )", - "resolved": "1.14.1", - "contentHash": "mOOmFYwad3MIOL14VCjj02LljyF1GNw1wP0YVlxtcPvqdxjGGMNdNJJxHptlry3MOd8b40Flm8RPOM8JOlN2sQ==" - }, "Microsoft.Build.Tasks.Git": { "type": "Transitive", "resolved": "8.0.0", @@ -369,12 +357,6 @@ "Microsoft.SourceLink.Common": "8.0.0" } }, - "PolySharp": { - "type": "Direct", - "requested": "[1.14.1, )", - "resolved": "1.14.1", - "contentHash": "mOOmFYwad3MIOL14VCjj02LljyF1GNw1wP0YVlxtcPvqdxjGGMNdNJJxHptlry3MOd8b40Flm8RPOM8JOlN2sQ==" - }, "Microsoft.Build.Tasks.Git": { "type": "Transitive", "resolved": "8.0.0", diff --git a/src/Imageflow.Server.Storage.S3/packages.lock.json b/src/Imageflow.Server.Storage.S3/packages.lock.json index 47888563..f5978b94 100644 --- a/src/Imageflow.Server.Storage.S3/packages.lock.json +++ b/src/Imageflow.Server.Storage.S3/packages.lock.json @@ -30,12 +30,6 @@ "Microsoft.NETCore.Platforms": "1.1.0" } }, - "PolySharp": { - "type": "Direct", - "requested": "[1.14.1, )", - "resolved": "1.14.1", - "contentHash": "mOOmFYwad3MIOL14VCjj02LljyF1GNw1wP0YVlxtcPvqdxjGGMNdNJJxHptlry3MOd8b40Flm8RPOM8JOlN2sQ==" - }, "AWSSDK.Core": { "type": "Transitive", "resolved": "3.7.300.28", @@ -267,12 +261,6 @@ "Microsoft.SourceLink.Common": "8.0.0" } }, - "PolySharp": { - "type": "Direct", - "requested": "[1.14.1, )", - "resolved": "1.14.1", - "contentHash": "mOOmFYwad3MIOL14VCjj02LljyF1GNw1wP0YVlxtcPvqdxjGGMNdNJJxHptlry3MOd8b40Flm8RPOM8JOlN2sQ==" - }, "AWSSDK.Core": { "type": "Transitive", "resolved": "3.7.300.28", @@ -435,12 +423,6 @@ "Microsoft.SourceLink.Common": "8.0.0" } }, - "PolySharp": { - "type": "Direct", - "requested": "[1.14.1, )", - "resolved": "1.14.1", - "contentHash": "mOOmFYwad3MIOL14VCjj02LljyF1GNw1wP0YVlxtcPvqdxjGGMNdNJJxHptlry3MOd8b40Flm8RPOM8JOlN2sQ==" - }, "AWSSDK.Core": { "type": "Transitive", "resolved": "3.7.300.28", diff --git a/src/Imageflow.Server/AccessDiagnosticsFrom.cs b/src/Imageflow.Server/AccessDiagnosticsFrom.cs deleted file mode 100644 index ef9aadae..00000000 --- a/src/Imageflow.Server/AccessDiagnosticsFrom.cs +++ /dev/null @@ -1,21 +0,0 @@ -namespace Imageflow.Server -{ - /// - /// Where the diagnostics page can be accessed from - /// - public enum AccessDiagnosticsFrom - { - /// - /// Do not allow unauthenticated access to the diagnostics page, even from localhost - /// - None, - /// - /// Only allow localhost to access the diagnostics page - /// - LocalHost, - /// - /// Allow any host to access the diagnostics page - /// - AnyHost - } -} \ No newline at end of file diff --git a/src/Imageflow.Server/EnforceLicenseWith.cs b/src/Imageflow.Server/EnforceLicenseWith.cs deleted file mode 100644 index fb264e98..00000000 --- a/src/Imageflow.Server/EnforceLicenseWith.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace Imageflow.Server -{ - - public enum EnforceLicenseWith - { - RedDotWatermark = 0, - Http422Error = 1, - Http402Error = 2 - - } - -} \ No newline at end of file diff --git a/src/Imageflow.Server/Imageflow.Server.csproj b/src/Imageflow.Server/Imageflow.Server.csproj index d066c9a8..a9a64b2e 100644 --- a/src/Imageflow.Server/Imageflow.Server.csproj +++ b/src/Imageflow.Server/Imageflow.Server.csproj @@ -1,17 +1,15 @@  + net6.0;net8.0 Imageflow.Server Imageflow .NET Server - Middleware for fetching, processing, and caching images on-demand. Imageflow.Server - Middleware for fetching, processing, and caching images on-demand. Commercial licenses available. - true - 12.0 - enable - + diff --git a/src/Imageflow.Server/ImageflowMiddleware.cs b/src/Imageflow.Server/ImageflowMiddleware.cs index 277d4731..20a554ae 100644 --- a/src/Imageflow.Server/ImageflowMiddleware.cs +++ b/src/Imageflow.Server/ImageflowMiddleware.cs @@ -19,9 +19,12 @@ using System.Collections.Immutable; using System.Globalization; using Imageflow.Server.Internal; +using Imageflow.Server.LegacyOptions; using Imazen.Abstractions.Blobs.LegacyProviders; using Imazen.Abstractions.Logging; using Imazen.Common.Issues; +using Imazen.Routing.Health; +using Imazen.Routing.Layers; using Imazen.Routing.RequestRouting; using Imazen.Routing.RequestRouting.Layers; using Imazen.Routing.Serving; @@ -44,6 +47,7 @@ public class ImageflowMiddleware public ImageflowMiddleware( RequestDelegate next, IWebHostEnvironment env, + IServiceProvider serviceProvider, // You can request IEnumerable to get all of them. IEnumerable loggerFactories, ILoggerFactory legacyLoggerFactory, IEnumerable retainedLogStores, #pragma warning disable CS0618 // Type or member is obsolete @@ -59,6 +63,10 @@ public ImageflowMiddleware( var retainedLogStore = retainedLogStores.FirstOrDefault() ?? new ReLogStore(new ReLogStoreOptions()); var loggerFactory = loggerFactories.FirstOrDefault() ?? new ReLoggerFactory(legacyLoggerFactory, retainedLogStore); + this.logger = loggerFactory.CreateReLogger("ImageflowMiddleware"); + + var startDiag = new StartupDiagnostics(serviceProvider); + startDiag.LogIssues(logger); this.next = next; @@ -67,87 +75,24 @@ public ImageflowMiddleware( licensing = options.Licensing; this.options = options; this.env = env; - this.logger = loggerFactory.CreateReLogger("ImageflowMiddleware"); - - - var providers = blobProviders.ToList(); - var mappedPaths = options.MappedPaths.Cast().ToList(); - if (options.MapWebRoot) - { - if (this.env?.WebRootPath == null) - throw new InvalidOperationException("Cannot call MapWebRoot if env.WebRootPath is null"); - mappedPaths.Add(new PathMapping("/", this.env.WebRootPath)); - } - // Create CacheManagerOptions and pass it to CacheManager - var imageServerOptions = new ImageServerOptions - { - - //LegacyStreamCaches = streamCaches.ToImmutableArray(), - BlobCaches = blobCaches.ToImmutableArray(), - BlobCacheProviders = blobCacheProviders.ToImmutableArray(), - BlobProviders = blobProviders.ToImmutableArray(), - - }; - - var router = CreateRoutes(new RoutingBuilder()); - var routingEngine = router.Build(logger); - imageServer = new ImageServer(licensing, - routingEngine, imageServerOptions, options, loggerFactory); - - var issueProviders = new List(); - issueProviders.AddRange(imageServerOptions.GetAllObjects().OfType()); - var diagnosticsPageInfo = new DiagnosticsPageInfo(diskCaches, streamCaches); + + imageServer = new MiddlewareOptionsServerBuilder(logger, retainedLogStore, options, env, + blobProviders, blobWrapperProviders, blobCaches, blobCacheProviders).Create(); options.Licensing.Initialize(this.options); - diagnosticsPage = new DiagnosticsPage(options,diagnosticsPageInfo, imageServer, env,issueProviders, logger, retainedLogStore); // TODO: restore IInfoProvider support - globalInfoProvider = new GlobalInfoProvider(options, new List(){}, imageServerOptions.GetAllObjects(), env, this.logger); + globalInfoProvider = + new GlobalInfoProvider(options, new List(){}, + null, env, this.logger); options.Licensing.FireHeartbeat(); GlobalPerf.Singleton.SetInfoProviders(new List(){globalInfoProvider}); } - private RoutingBuilder CreateRoutes(RoutingBuilder builder) - { - builder.SetDefaultPreconditionsToRequireImageExtension() - .AddEndpoint(Conditions.HasPathSuffix("/imageflow.ready"), - (_) => - { - options.Licensing?.FireHeartbeat(); - using (new JobContext()) - { - return SmallHttpResponse.NoStore(200, "Imageflow.Server is ready to accept requests."); - } - }); - - builder.AddEndpoint(Conditions.HasPathSuffix("/imageflow.health"), - (_) => - { - options.Licensing?.FireHeartbeat(); - return SmallHttpResponse.NoStore(200, "Imageflow.Server is healthy."); - }); - - builder.AddEndpoint(Conditions.HasPathSuffix("/imageflow.license"), - (req) => - { - options.Licensing?.FireHeartbeat(); - var s = new StringBuilder(8096); - var now = DateTime.UtcNow.ToString(NumberFormatInfo.InvariantInfo); - s.AppendLine($"License page for Imageflow at {req.OriginatingRequest.GetHost().Value} generated {now} UTC"); - s.Append(options.Licensing?.GetLicensePageContents()); - return SmallHttpResponse.NoStoreNoRobots((200, s.ToString())); - }); - - builder.AddEndpoint(DiagnosticsPage.Precondition, diagnosticsPage); - return builder; - } - - - - + public async Task Invoke(HttpContext context) { // For instrumentation @@ -171,14 +116,5 @@ public async Task Invoke(HttpContext context) await next.Invoke(context); } - private static async Task StringResponseNoCache(HttpContext context, int statusCode, string contents) - { - context.Response.StatusCode = statusCode; - context.Response.ContentType = "text/plain; charset=utf-8"; - context.Response.Headers[HeaderNames.CacheControl] = "no-store"; - var bytes = Encoding.UTF8.GetBytes(contents); - context.Response.ContentLength = bytes.Length; - await context.Response.Body.WriteAsync(bytes, 0, bytes.Length); - } } } diff --git a/src/Imageflow.Server/ImageflowMiddlewareOptions.cs b/src/Imageflow.Server/ImageflowMiddlewareOptionsTemp.cs.txt similarity index 75% rename from src/Imageflow.Server/ImageflowMiddlewareOptions.cs rename to src/Imageflow.Server/ImageflowMiddlewareOptionsTemp.cs.txt index 5801a436..a188682d 100644 --- a/src/Imageflow.Server/ImageflowMiddlewareOptions.cs +++ b/src/Imageflow.Server/ImageflowMiddlewareOptionsTemp.cs.txt @@ -21,21 +21,21 @@ public class ImageflowMiddlewareOptionsTemp /// /// /// - public ImageflowMiddlewareOptions AddCommandDefault(string key, string value) + public ImageflowMiddlewareOptionsTemp AddCommandDefault(string key, string value) { if (CommandDefaults.ContainsKey(key)) throw new ArgumentOutOfRangeException(nameof(key), "A default has already been added for this key"); CommandDefaults[key] = value; return this; } - public ImageflowMiddlewareOptions AddPreset(PresetOptions preset) + public ImageflowMiddlewareOptionsTemp AddPreset(PresetOptions preset) { if (Presets.ContainsKey(preset.Name)) throw new ArgumentOutOfRangeException(nameof(preset), "A preset by this name has already been added"); Presets[preset.Name] = preset; return this; } - public ImageflowMiddlewareOptions HandleExtensionlessRequestsUnder(string prefix, StringComparison prefixComparison = StringComparison.Ordinal) + public ImageflowMiddlewareOptionsTemp HandleExtensionlessRequestsUnder(string prefix, StringComparison prefixComparison = StringComparison.Ordinal) { AddHandleExtensionlessRequestsUnder(prefix, prefixComparison); return this; @@ -46,7 +46,7 @@ public ImageflowMiddlewareOptions HandleExtensionlessRequestsUnder(string prefix /// /// /// - public ImageflowMiddlewareOptions SetDiagnosticsPageAccess(AccessDiagnosticsFrom accessDiagnosticsFrom) + public ImageflowMiddlewareOptionsTemp SetDiagnosticsPageAccess(AccessDiagnosticsFrom accessDiagnosticsFrom) { DiagnosticsAccess = (Compat.AccessDiagnosticsFrom)accessDiagnosticsFrom; return this; @@ -57,7 +57,7 @@ public ImageflowMiddlewareOptions SetDiagnosticsPageAccess(AccessDiagnosticsFrom /// /// /// - public ImageflowMiddlewareOptions SetDiagnosticsPagePassword(string password) + public ImageflowMiddlewareOptionsTemp SetDiagnosticsPagePassword(string password) { DiagnosticsPassword = password; return this; @@ -71,7 +71,7 @@ public ImageflowMiddlewareOptions SetDiagnosticsPagePassword(string password) /// Provide the URL to your version control /// system or source code download page. /// - public ImageflowMiddlewareOptions SetMyOpenSourceProjectUrl(string myOpenSourceProjectUrl) + public ImageflowMiddlewareOptionsTemp SetMyOpenSourceProjectUrl(string myOpenSourceProjectUrl) { MyOpenSourceProjectUrl = myOpenSourceProjectUrl; return this; @@ -86,20 +86,20 @@ public ImageflowMiddlewareOptions SetMyOpenSourceProjectUrl(string myOpenSourceP /// /// /// - public ImageflowMiddlewareOptions SetLicenseKey(EnforceLicenseWith enforcementMethod, string licenseKey) + public ImageflowMiddlewareOptionsTemp SetLicenseKey(EnforceLicenseWith enforcementMethod, string licenseKey) { EnforcementMethod = (Compat.EnforceLicenseWith)enforcementMethod; LicenseKey = licenseKey; return this; } - public ImageflowMiddlewareOptions SetRequestSignatureOptions(RequestSignatureOptions options) + public ImageflowMiddlewareOptionsTemp SetRequestSignatureOptions(RequestSignatureOptions options) { RequestSignatureOptions = options; return this; } - public ImageflowMiddlewareOptions AddRewriteHandler(string pathPrefix, Action handler) + public ImageflowMiddlewareOptionsTemp AddRewriteHandler(string pathPrefix, Action handler) { Rewrite.Add(new Compat.UrlHandler> (pathPrefix, (e) => @@ -109,33 +109,33 @@ public ImageflowMiddlewareOptions AddRewriteHandler(string pathPrefix, Action handler) + public ImageflowMiddlewareOptionsTemp AddPreRewriteAuthorizationHandler(string pathPrefix, Func handler) { PreRewriteAuthorization.Add(new Compat.UrlHandler> (pathPrefix, (e) => handler(new UrlEventArgs(e)))); return this; } - public ImageflowMiddlewareOptions AddPostRewriteAuthorizationHandler(string pathPrefix, Func handler) + public ImageflowMiddlewareOptionsTemp AddPostRewriteAuthorizationHandler(string pathPrefix, Func handler) { PostRewriteAuthorization.Add(new Compat.UrlHandler> (pathPrefix, (e) => handler(new UrlEventArgs(e)))); return this; } - public ImageflowMiddlewareOptions AddWatermarkingHandler(string pathPrefix, Action handler) + public ImageflowMiddlewareOptionsTemp AddWatermarkingHandler(string pathPrefix, Action handler) { Watermarking.Add(new Compat.UrlHandler>> (pathPrefix, (e) => handler(new WatermarkingEventArgs(e)))); return this; } - public ImageflowMiddlewareOptions SetMapWebRoot(bool value) + public ImageflowMiddlewareOptionsTemp SetMapWebRoot(bool value) { MapWebRoot = value; return this; } - public ImageflowMiddlewareOptions SetJobSecurityOptions(SecurityOptions securityOptions) + public ImageflowMiddlewareOptionsTemp SetJobSecurityOptions(SecurityOptions securityOptions) { JobSecurityOptions = securityOptions; return this; @@ -146,22 +146,22 @@ public ImageflowMiddlewareOptions SetJobSecurityOptions(SecurityOptions security /// /// /// - public ImageflowMiddlewareOptions SetUsePresetsExclusively(bool value) + public ImageflowMiddlewareOptionsTemp SetUsePresetsExclusively(bool value) { UsePresetsExclusively = value; return this; } - public ImageflowMiddlewareOptions MapPath(string virtualPath, string physicalPath) + public ImageflowMiddlewareOptionsTemp MapPath(string virtualPath, string physicalPath) => MapPath(virtualPath, physicalPath, false); - public ImageflowMiddlewareOptions MapPath(string virtualPath, string physicalPath, bool ignorePrefixCase) + public ImageflowMiddlewareOptionsTemp MapPath(string virtualPath, string physicalPath, bool ignorePrefixCase) { mappedPaths.Add(new Compat.PathMapping(virtualPath, physicalPath, ignorePrefixCase)); return this; } - public ImageflowMiddlewareOptions AddWatermark(NamedWatermark watermark) + public ImageflowMiddlewareOptionsTemp AddWatermark(NamedWatermark watermark) { if (namedWatermarks.Any(w => w.Name.Equals(watermark.Name, StringComparison.OrdinalIgnoreCase))) { @@ -176,7 +176,7 @@ public ImageflowMiddlewareOptions AddWatermark(NamedWatermark watermark) /// /// /// - public ImageflowMiddlewareOptions SetAllowCaching(bool value) + public ImageflowMiddlewareOptionsTemp SetAllowCaching(bool value) { this.AllowCaching = value; return this; @@ -187,7 +187,7 @@ public ImageflowMiddlewareOptions SetAllowCaching(bool value) /// /// /// - public ImageflowMiddlewareOptions SetAllowDiskCaching(bool value) + public ImageflowMiddlewareOptionsTemp SetAllowDiskCaching(bool value) { this.AllowDiskCaching = value; return this; @@ -199,7 +199,7 @@ public ImageflowMiddlewareOptions SetAllowDiskCaching(bool value) /// /// /// - public ImageflowMiddlewareOptions SetDefaultCacheControlString(string cacheControlString) + public ImageflowMiddlewareOptionsTemp SetDefaultCacheControlString(string cacheControlString) { DefaultCacheControlString = cacheControlString; return this; @@ -210,7 +210,7 @@ public ImageflowMiddlewareOptions SetDefaultCacheControlString(string cacheContr /// /// /// - public ImageflowMiddlewareOptions SetApplyDefaultCommandsToQuerylessUrls(bool value) + public ImageflowMiddlewareOptionsTemp SetApplyDefaultCommandsToQuerylessUrls(bool value) { this.ApplyDefaultCommandsToQuerylessUrls = value; return this; diff --git a/src/Imageflow.Server/Internal/DiagnosticsPage.cs b/src/Imageflow.Server/Internal/DiagnosticsPage.cs deleted file mode 100644 index 09c59e53..00000000 --- a/src/Imageflow.Server/Internal/DiagnosticsPage.cs +++ /dev/null @@ -1,282 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Reflection; -using System.Security; -using System.Text; -using System.Threading; -using System.Threading.Tasks; -using Imageflow.Server.Internal; -using Imazen.Abstractions.Logging; -using Imazen.Abstractions.Resulting; -using Imazen.Common.Extensibility.ClassicDiskCache; -using Imazen.Common.Extensibility.StreamCache; -using Imazen.Common.Issues; -using Imazen.Routing; -using Imazen.Routing.RequestRouting; -using Imazen.Routing.RequestRouting.Promises; -using Imazen.Routing.Serving; -using Microsoft.AspNetCore.Hosting; -using Microsoft.AspNetCore.Http; -using Compat = Imazen.Routing.Compatibility.ImageflowServer; - -namespace Imageflow.Server -{ - internal record class DiagnosticsPageInfo( -#pragma warning disable CS0618 // Type or member is obsolete - IEnumerable LegacyDiskCaches, - IEnumerable LegacyStreamCaches); -#pragma warning restore CS0618 // Type or member is obsolete - - internal class DiagnosticsPage : IRoutingEndpoint, IRoutingLayer - { - private readonly IWebHostEnvironment env; - private readonly IImageServer imageServer; - private readonly ImageflowMiddlewareOptions options; - private readonly IReLogStore retainedLogStore; - private readonly IReLogger logger; - private readonly IList issueProviders; - - public DiagnosticsPage(ImageflowMiddlewareOptions imageflowMiddlewareOptions,DiagnosticsPageInfo diagnosticsPageInfo, - IImageServer imageServer, IWebHostEnvironment webHostEnvironment, IList issueProviders, - IReLogger logger, IReLogStore retainedLogStore) - { - this.issueProviders = issueProviders; - this.options = imageflowMiddlewareOptions; - this.imageServer = imageServer; - this.env = webHostEnvironment; - this.logger = logger; - this.retainedLogStore = retainedLogStore; - - // throw exception if any legacy disk caches exist - if (diagnosticsPageInfo.LegacyDiskCaches.Any()) - { - throw new InvalidOperationException( - "IClassicDiskCache is no longer supported. If you're using Imageflow.Server.DiskCache, upgrade to the latest nuget package."); - } - - // throw exception if any legacy stream caches exist - if (diagnosticsPageInfo.LegacyStreamCaches.Any()) - { - throw new InvalidOperationException( - "If you have a custom cache, use IBlobCache instead of IStreamCache. If you're using an Imazen supported cache, upgrade to the latest nuget packages."); - } - - - - } - - public static bool MatchesPath(string path) => "/imageflow.debug".Equals(path, StringComparison.Ordinal); - - - - public bool IsAuthorized(IHttpRequestStreamAdapter request, out string? errorMessage) - { - errorMessage = null; - var providedPassword = request.GetQuery()["password"].ToString(); - var passwordMatch = !string.IsNullOrEmpty(options.DiagnosticsPassword) - && options.DiagnosticsPassword == providedPassword; - - string s; - if (passwordMatch || - options.DiagnosticsAccess == Compat.AccessDiagnosticsFrom.AnyHost || - (options.DiagnosticsAccess == Compat.AccessDiagnosticsFrom.LocalHost && request.IsClientLocalhost())) - { - return true; - } - else - { - s = - "You can configure access to this page via the imageflow.toml [diagnostics] section, or in C# via ImageflowMiddlewareOptions.SetDiagnosticsPageAccess(allowLocalhost, password)\r\n\r\n"; - if (options.DiagnosticsAccess == Compat.AccessDiagnosticsFrom.LocalHost) - { - s += "You can access this page from the localhost\r\n\r\n"; - } - else - { - s += "Access to this page from localhost is disabled\r\n\r\n"; - } - - if (!string.IsNullOrEmpty(options.DiagnosticsPassword)) - { - s += "You can access this page by adding ?password=[insert password] to the URL.\r\n\r\n"; - } - else - { - s += "You can set a password via imageflow.toml [diagnostics] allow_with_password='' or in C# with SetDiagnosticsPageAccess to access this page remotely.\r\n\r\n"; - } - errorMessage = s; - return false; - } - } - - private Task GeneratePage(IRequestSnapshot r) - { - - var request = r.OriginatingRequest; - - var s = new StringBuilder(8096); - var now = DateTime.UtcNow.ToString(NumberFormatInfo.InvariantInfo); - s.AppendLine($"Diagnostics for Imageflow at {request?.GetHost().Value} generated {now} UTC"); - - try - { - using var job = new Bindings.JobContext(); - var version = job.GetVersionInfo(); - s.AppendLine($"libimageflow {version.LongVersionString}"); - } - catch (Exception e) - { - s.AppendLine($"Failed to get libimageflow version: {e.Message}"); - } - - s.AppendLine("Please remember to provide this page when contacting support."); - var issues = issueProviders.SelectMany(p => p.GetIssues()).ToList() ?? - new List(); - - - s.AppendLine($"{issues.Count} issues detected:\r\n"); - foreach (var i in issues.OrderBy(i => i?.Severity)) - s.AppendLine($"{i?.Source}({i?.Severity}):\t{i?.Summary}\n\t\t\t{i?.Details?.Replace("\n", "\r\n\t\t\t")}\n"); - - - s.AppendLine(options.Licensing.Result.ProvidePublicLicensesPage()); - - - imageServer.GetDiagnosticsPageSection(); - - - - - s.AppendLine("\nAccepted querystring keys:\n"); - s.AppendLine(string.Join(", ", PathHelpers.SupportedQuerystringKeys)); - - s.AppendLine("\nAccepted file extensions:\n"); - s.AppendLine(string.Join(", ", PathHelpers.AcceptedImageExtensions)); - - s.AppendLine("\nEnvironment information:\n"); - s.AppendLine( - $"Running on {Environment.OSVersion} and CLR {Environment.Version} and .NET Core {GetNetCoreVersion()}"); - - try { - var wow64 = Environment.GetEnvironmentVariable("PROCESSOR_ARCHITEW6432"); - var arch = Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE"); - s.AppendLine("OS arch: " + arch + (string.IsNullOrEmpty(wow64) - ? "" - : " !! Warning, running as 32-bit on a 64-bit OS(" + wow64 + - "). This will limit ram usage !!")); - } catch (SecurityException) { - s.AppendLine( - "Failed to detect operating system architecture - security restrictions prevent reading environment variables"); - } - //Get loaded assemblies for later use - var assemblies = AppDomain.CurrentDomain.GetAssemblies(); - - //List loaded assemblies, and also detect plugin assemblies that are not being used. - s.AppendLine("\nLoaded assemblies:\n"); - - foreach (var a in assemblies) { - var assemblyName = new AssemblyName(a.FullName); - var line = ""; - var error = a.GetExceptionForReading(); - if (error != null) { - line += $"{assemblyName.Name,-40} Failed to read assembly attributes: {error.Message}"; - } else { - var version = $"{a.GetFileVersion()} ({assemblyName.Version})"; - var infoVersion = $"{a.GetInformationalVersion()}"; - line += $"{assemblyName.Name,-40} File: {version,-25} Informational: {infoVersion,-30}"; - } - - s.AppendLine(line); - } - - s.AppendLine( - "\n\nWhen fetching a remote license file (if you have one), the following information is sent via the querystring."); - foreach (var pair in options.Licensing.Result.GetReportPairs().GetInfo()) { - s.AppendFormat(" {0,32} {1}\n", pair.Key, pair.Value); - } - - - s.AppendLine(options.Licensing.Result.DisplayLastFetchUrl()); - - return Task.FromResult(s.ToString()); - } - - - private static string GetNetCoreVersion() - { - return System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription; - } - - public ValueTask GetInstantPromise(IRequestSnapshot request, CancellationToken cancellationToken = default) - { - return Tasks.ValueResult((IInstantPromise)new PromiseFuncAsync(request, async (r, ct) => - SmallHttpResponse.NoStoreNoRobots((200, await GeneratePage(r))))); - } - - public string Name => "Diagnostics page"; - public IFastCond? FastPreconditions => Precondition; - - public static readonly IFastCond Precondition = Conditions.HasPathSuffix("/imageflow.debug", "/resizer.debug"); - - public ValueTask?> ApplyRouting(MutableRequest request, CancellationToken cancellationToken = default) - { - if (!Precondition.Matches(request)) return default; - if (request.IsChildRequest) return default; - // method not allowed - if (!request.IsGet()) - return new ValueTask?>( - CodeResult.Err((405, "Method not allowed"))); - - if (!IsAuthorized(request.OriginatingRequest, out var errorMessage)) - { - return new ValueTask?>( - CodeResult.Err((401, errorMessage))); - } - return new ValueTask?>( - CodeResult.Ok(this)); - } - - public bool IsBlobEndpoint => false; - - } - - internal static class AssemblyExtensions - { - private static T GetFirstAttribute(this ICustomAttributeProvider a) - { - try - { - var attrs = a.GetCustomAttributes(typeof(T), false); - if (attrs.Length > 0) return (T)attrs[0]; - } - catch(FileNotFoundException) { - //Missing dependencies - } - // ReSharper disable once EmptyGeneralCatchClause - catch (Exception) { } - return default; - } - - public static Exception GetExceptionForReading(this Assembly a) - { - try { - var unused = a.GetCustomAttributes(typeof(T), false); - } catch (Exception e) { - return e; - } - return null; - } - - public static string GetInformationalVersion(this Assembly a) - { - return GetFirstAttribute(a)?.InformationalVersion; - } - public static string GetFileVersion(this Assembly a) - { - return GetFirstAttribute(a)?.Version; - } - } -} \ No newline at end of file diff --git a/src/Imageflow.Server/Internal/Licensing.cs b/src/Imageflow.Server/Internal/Licensing.cs index 6eac7e6d..26989f1a 100644 --- a/src/Imageflow.Server/Internal/Licensing.cs +++ b/src/Imageflow.Server/Internal/Licensing.cs @@ -7,7 +7,7 @@ namespace Imageflow.Server { - internal class Licensing : ILicenseConfig, ILicenseChecker + internal class Licensing : ILicenseConfig, ILicenseChecker, IHasDiagnosticPageSection { private ImageflowMiddlewareOptions? options; @@ -66,9 +66,9 @@ public LicenseErrorAction LicenseEnforcement { return options.EnforcementMethod switch { - Compat.EnforceLicenseWith.RedDotWatermark => LicenseErrorAction.Watermark, - Compat.EnforceLicenseWith.Http422Error => LicenseErrorAction.Http422, - Compat.EnforceLicenseWith.Http402Error => LicenseErrorAction.Http402, + EnforceLicenseWith.RedDotWatermark => LicenseErrorAction.Watermark, + EnforceLicenseWith.Http422Error => LicenseErrorAction.Http422, + EnforceLicenseWith.Http402Error => LicenseErrorAction.Http402, _ => throw new ArgumentOutOfRangeException() }; } @@ -80,11 +80,11 @@ public string EnforcementMethodMessage { return options.EnforcementMethod switch { - Compat.EnforceLicenseWith.RedDotWatermark => + EnforceLicenseWith.RedDotWatermark => "You are using EnforceLicenseWith.RedDotWatermark. If there is a licensing error, an red dot will be drawn on the bottom-right corner of each image. This can be set to EnforceLicenseWith.Http402Error instead (valuable if you are externally caching or storing result images.)", - Compat.EnforceLicenseWith.Http422Error => + EnforceLicenseWith.Http422Error => "You are using EnforceLicenseWith.Http422Error. If there is a licensing error, HTTP status code 422 will be returned instead of serving the image. This can also be set to EnforceLicenseWith.RedDotWatermark.", - Compat.EnforceLicenseWith.Http402Error => + EnforceLicenseWith.Http402Error => "You are using EnforceLicenseWith.Http402Error. If there is a licensing error, HTTP status code 402 will be returned instead of serving the image. This can also be set to EnforceLicenseWith.RedDotWatermark.", _ => throw new ArgumentOutOfRangeException() }; @@ -163,5 +163,24 @@ public void FireHeartbeat() { Heartbeat?.Invoke(this, this); } + + public string? GetDiagnosticsPageSection(DiagnosticsPageArea section) + { + if (section != DiagnosticsPageArea.End) + { + return Result.ProvidePublicLicensesPage(); + } + var s = new System.Text.StringBuilder(); + s.AppendLine( + "\n\nWhen fetching a remote license file (if you have one), the following information is sent via the querystring."); + foreach (var pair in options.Licensing.Result.GetReportPairs().GetInfo()) + { + s.AppendFormat(" {0,32} {1}\n", pair.Key, pair.Value); + } + + + s.AppendLine(options.Licensing.Result.DisplayLastFetchUrl()); + return s.ToString(); + } } } \ No newline at end of file diff --git a/src/Imageflow.Server/LegacyOptions/BlobFetchCache.cs b/src/Imageflow.Server/LegacyOptions/BlobFetchCache.cs deleted file mode 100644 index 7094ce83..00000000 --- a/src/Imageflow.Server/LegacyOptions/BlobFetchCache.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System.Threading.Tasks; -using Imazen.Common.Storage; - -namespace Imageflow.Server -{ - internal class BlobFetchCache - { - public BlobFetchCache(string virtualPath, BlobProvider provider) - { - this.virtualPath = virtualPath; - this.provider = provider; - resultFetched = false; - blobFetched = false; - } - - private readonly BlobProvider provider; - private readonly string virtualPath; - private bool resultFetched; - private bool blobFetched; - private BlobProviderResult? result; - private IBlobData blob; - - internal BlobProviderResult? GetBlobResult() - { - if (resultFetched) return result; - result = provider.GetResult(virtualPath); - resultFetched = true; - return result; - } - - internal async Task GetBlob() - { - if (blobFetched) return blob; - var blobResult = GetBlobResult(); - if (blobResult != null) blob = await blobResult.Value.GetBlob(); - blobFetched = true; - return blob; - } - - } -} \ No newline at end of file diff --git a/src/Imageflow.Server/LegacyOptions/ImageflowMiddlewareOptions.cs b/src/Imageflow.Server/LegacyOptions/ImageflowMiddlewareOptions.cs index c8fb7420..a95e8ec8 100644 --- a/src/Imageflow.Server/LegacyOptions/ImageflowMiddlewareOptions.cs +++ b/src/Imageflow.Server/LegacyOptions/ImageflowMiddlewareOptions.cs @@ -7,6 +7,23 @@ namespace Imageflow.Server { public class ImageflowMiddlewareOptions { + internal class UrlHandler + { + internal UrlHandler(string prefix, T handler) + { + PathPrefix = prefix; + Handler = handler; + } + public string PathPrefix { get; } + + public T Handler { get; } + } + internal struct ExtensionlessPath + { + internal string Prefix { get; set; } + + internal StringComparison PrefixComparison { get; set; } + } internal string LicenseKey { get; set; } internal EnforceLicenseWith EnforcementMethod { get; set; } = EnforceLicenseWith.Http422Error; @@ -23,7 +40,8 @@ public class ImageflowMiddlewareOptions /// public bool AllowDiskCaching { get; set; } = true; - internal CacheBackend ActiveCacheBackend { get; set; } + // Removing + // internal CacheBackend ActiveCacheBackend { get; set; } private readonly List namedWatermarks = new List(); public IReadOnlyCollection NamedWatermarks => namedWatermarks; diff --git a/src/Imageflow.Server/LegacyOptions/MiddlewareOptionsServerBuilder.cs b/src/Imageflow.Server/LegacyOptions/MiddlewareOptionsServerBuilder.cs new file mode 100644 index 00000000..90a0cf82 --- /dev/null +++ b/src/Imageflow.Server/LegacyOptions/MiddlewareOptionsServerBuilder.cs @@ -0,0 +1,116 @@ +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Globalization; +using System.Linq; +using System.Text; +using Imageflow.Bindings; +using Imageflow.Server.DependencyInjection; +using Imageflow.Server.Internal; +using Imazen.Abstractions.BlobCache; +using Imazen.Abstractions.Blobs.LegacyProviders; +using Imazen.Abstractions.Logging; +using Imazen.Common.Storage; +using Imazen.Routing.Layers; +using Imazen.Routing.RequestRouting; +using Imazen.Routing.RequestRouting.Layers; +using Imazen.Routing.Serving; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Http; + +namespace Imageflow.Server.LegacyOptions; + +internal class MiddlewareOptionsServerBuilder( + IReLogger logger, + IReLogStore logStore, + ImageflowMiddlewareOptions options, + IWebHostEnvironment env, + IServiceProvider serviceProvider, + IEnumerable blobProviders, + IEnumerable blobWrapperProviders, + IEnumerable blobCaches, + IEnumerable blobCacheProviders) +{ + + public ImageServer Create() + { + var providers = blobProviders.ToList(); + var mappedPaths = options.MappedPaths.Cast().ToList(); + if (options.MapWebRoot) + { + if (env?.WebRootPath == null) + throw new InvalidOperationException("Cannot call MapWebRoot if env.WebRootPath is null"); + mappedPaths.Add(new PathMapping("/", env.WebRootPath)); + } + + var serverContainer = new ImageServerContainer(); + serverContainer.Register(logger); + serverContainer.Register(logStore); + serverContainer.Register(env); + serverContainer.Register(options); + serverContainer.RegisterAll(blobCaches); + serverContainer.RegisterAll(blobCacheProviders); + serverContainer.RegisterAll(blobProviders); + serverContainer.RegisterAll(blobWrapperProviders); + var perfTracker = new NullPerformanceTracker(); + serverContainer.Register(perfTracker); + + var imageServerOptions = new ImageServerOptions + { + + //LegacyStreamCaches = streamCaches.ToImmutableArray(), + BlobCaches = blobCaches.ToImmutableArray(), + BlobCacheProviders = blobCacheProviders.ToImmutableArray(), + BlobProviders = blobProviders.ToImmutableArray(), + + }; + var diagnosticsPage = new DiagnosticsPage(serviceProvider, logger, logStore, + new DiagnosticsPageOptions( + options.DiagnosticsPassword, + (Imazen.Routing.Layers.AccessDiagnosticsFrom)options.DiagnosticsAccess, + // TODO, using a service locator, make it possible to add sections from licensing/imageserver,etc + new List())); + + var router = CreateRoutes(new RoutingBuilder()); + + var routingEngine = router.Build(logger); + + var imageServer = new ImageServer(null, + routingEngine, perfTracker, imageServerOptions, logger); + } + + private RoutingBuilder CreateRoutes(RoutingBuilder builder) + { + builder.SetDefaultPreconditionsToRequireImageExtension() + .AddEndpoint(Conditions.HasPathSuffix("/imageflow.ready"), + (_) => + { + options.Licensing?.FireHeartbeat(); + using (new JobContext()) + { + return SmallHttpResponse.NoStore(200, "Imageflow.Server is ready to accept requests."); + } + }); + + builder.AddEndpoint(Conditions.HasPathSuffix("/imageflow.health"), + (_) => + { + options.Licensing?.FireHeartbeat(); + return SmallHttpResponse.NoStore(200, "Imageflow.Server is healthy."); + }); + + builder.AddEndpoint(Conditions.HasPathSuffix("/imageflow.license"), + (req) => + { + options.Licensing?.FireHeartbeat(); + var s = new StringBuilder(8096); + var now = DateTime.UtcNow.ToString(NumberFormatInfo.InvariantInfo); + s.AppendLine($"License page for Imageflow at {req.OriginatingRequest.GetHost().Value} generated {now} UTC"); + s.Append(options.Licensing?.GetLicensePageContents()); + return SmallHttpResponse.NoStoreNoRobots((200, s.ToString())); + }); + + + return builder; + } +} \ No newline at end of file diff --git a/src/Imageflow.Server/LegacyOptions/OptionsToNewRoutingConverter.cs b/src/Imageflow.Server/LegacyOptions/OptionsToNewRoutingConverter.cs deleted file mode 100644 index d8c19937..00000000 --- a/src/Imageflow.Server/LegacyOptions/OptionsToNewRoutingConverter.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Imageflow.Server; - -internal class OptionsToNewRoutingConverter -{ - public static void ConvertOptionsToNewRouting() - { -} \ No newline at end of file diff --git a/src/Imageflow.Server/LegacyOptions/PathMapping.cs b/src/Imageflow.Server/LegacyOptions/PathMapping.cs index 6ddb8bec..93d96ced 100644 --- a/src/Imageflow.Server/LegacyOptions/PathMapping.cs +++ b/src/Imageflow.Server/LegacyOptions/PathMapping.cs @@ -1,6 +1,8 @@ +using Imazen.Routing.RequestRouting.Layers; + namespace Imageflow.Server { - public readonly struct PathMapping + public readonly struct PathMapping : IPathMapping { public PathMapping(string virtualPath, string physicalPath) { diff --git a/src/Imageflow.Server/UpdatedUrlEventArgs.cs b/src/Imageflow.Server/UpdatedUrlEventArgs.cs index 2f9fd6e5..bdcb580d 100644 --- a/src/Imageflow.Server/UpdatedUrlEventArgs.cs +++ b/src/Imageflow.Server/UpdatedUrlEventArgs.cs @@ -8,7 +8,7 @@ namespace Imageflow.Server public class UpdatedUrlEventArgs { private readonly Compat.MutableRequestEventArgs inner; - internal UrlEventArgs(Compat.MutableRequestEventArgs inner) + internal UpdatedUrlEventArgs(Compat.MutableRequestEventArgs inner) { this.inner = inner; } diff --git a/src/Imageflow.Server/packages.lock.json b/src/Imageflow.Server/packages.lock.json index 72b23ebc..4edcff61 100644 --- a/src/Imageflow.Server/packages.lock.json +++ b/src/Imageflow.Server/packages.lock.json @@ -25,12 +25,6 @@ "Microsoft.SourceLink.Common": "8.0.0" } }, - "PolySharp": { - "type": "Direct", - "requested": "[1.14.1, )", - "resolved": "1.14.1", - "contentHash": "mOOmFYwad3MIOL14VCjj02LljyF1GNw1wP0YVlxtcPvqdxjGGMNdNJJxHptlry3MOd8b40Flm8RPOM8JOlN2sQ==" - }, "CommunityToolkit.HighPerformance": { "type": "Transitive", "resolved": "8.2.2", @@ -212,12 +206,6 @@ "Microsoft.SourceLink.Common": "8.0.0" } }, - "PolySharp": { - "type": "Direct", - "requested": "[1.14.1, )", - "resolved": "1.14.1", - "contentHash": "mOOmFYwad3MIOL14VCjj02LljyF1GNw1wP0YVlxtcPvqdxjGGMNdNJJxHptlry3MOd8b40Flm8RPOM8JOlN2sQ==" - }, "CommunityToolkit.HighPerformance": { "type": "Transitive", "resolved": "8.2.2", diff --git a/src/Imazen.Abstractions/AssemblyAttributes/NugetPackageAttribute.cs b/src/Imazen.Abstractions/AssemblyAttributes/NugetPackageAttribute.cs new file mode 100644 index 00000000..0d2bcb51 --- /dev/null +++ b/src/Imazen.Abstractions/AssemblyAttributes/NugetPackageAttribute.cs @@ -0,0 +1,26 @@ +namespace Imazen.Abstractions.AssemblyAttributes; + +/// An assembly attribute that indicates the nuget package name the assembly is primarily distributed with +/// It can alternately be "{Assembly.Name}" to just inherit that value. +[AttributeUsage(AttributeTargets.Assembly)] +public class NugetPackageAttribute : Attribute +{ + public string PackageName { get; } + + /// + /// + /// + /// + /// {Assembly.Name} to inherit the assembly name, or the name of the nuget package + /// + public NugetPackageAttribute(string packageName) + { + PackageName = packageName; + } + + public override string ToString() + { + return $"This assembly is primarily distributed with the nuget package '{PackageName}'"; + } +} + \ No newline at end of file diff --git a/src/Imazen.Abstractions/AssemblyAttributes/VersionedWithAssembliesAttribute.cs b/src/Imazen.Abstractions/AssemblyAttributes/VersionedWithAssembliesAttribute.cs index 11fd60a5..63c35765 100644 --- a/src/Imazen.Abstractions/AssemblyAttributes/VersionedWithAssembliesAttribute.cs +++ b/src/Imazen.Abstractions/AssemblyAttributes/VersionedWithAssembliesAttribute.cs @@ -1,18 +1,16 @@ -namespace Imazen.Abstractions.AssemblyAttributes +namespace Imazen.Abstractions.AssemblyAttributes; + +/// +/// Indicates that the assembly should match the version of one or more other assemblies. +/// +/// +[AttributeUsage(AttributeTargets.Assembly)] +public class VersionedWithAssembliesAttribute(params string[] assemblyPatterns) : Attribute { - /// - /// Indicates that the assembly should match the version of one or more other assemblies. - /// - /// - [AttributeUsage(AttributeTargets.Assembly)] - public class VersionedWithAssembliesAttribute(params string[] assemblyPatterns) : Attribute - { - public string[] AssemblyPatterns { get; } = assemblyPatterns; + public string[] AssemblyPatterns { get; } = assemblyPatterns; - public override string ToString() - { - return string.Join("This assembly should match the version of , ", AssemblyPatterns); - } - + public override string ToString() + { + return string.Join("This assembly should match the version of , ", AssemblyPatterns); } } \ No newline at end of file diff --git a/src/Imazen.Abstractions/Concurrency/ConcurrencyHelpers.cs b/src/Imazen.Abstractions/Concurrency/ConcurrencyHelpers.cs index 9d79d6c5..0d780083 100644 --- a/src/Imazen.Abstractions/Concurrency/ConcurrencyHelpers.cs +++ b/src/Imazen.Abstractions/Concurrency/ConcurrencyHelpers.cs @@ -1,6 +1,6 @@ namespace Imazen.Routing.Helpers; -internal static class ConcurrencyHelpers +public static class ConcurrencyHelpers { /// /// Bubbles up exceptions and cancellations, and returns the first task that matches the predicate. @@ -11,7 +11,7 @@ internal static class ConcurrencyHelpers /// /// /// - internal static Task WhenAnyMatchesOrDefault( + public static Task WhenAnyMatchesOrDefault( List> allTasks, Func predicate, CancellationToken cancellationToken = default) diff --git a/src/Imazen.Abstractions/Concurrency/NonOverlappingAsyncRunner.cs b/src/Imazen.Abstractions/Concurrency/NonOverlappingAsyncRunner.cs index 83d24071..9ac92026 100644 --- a/src/Imazen.Abstractions/Concurrency/NonOverlappingAsyncRunner.cs +++ b/src/Imazen.Abstractions/Concurrency/NonOverlappingAsyncRunner.cs @@ -9,7 +9,7 @@ namespace Imazen.Routing.Caching.Health; /// If RunNonOverlapping is called, and the background task is not running, it is scheduled with Task.Run /// RunNonOverlapping returns a task that completes when the background task completes, fails, or is cancelled. These results are passed through. -internal class NonOverlappingAsyncRunner( +public class NonOverlappingAsyncRunner( Func> taskFactory, TimeSpan timeout = default, CancellationToken cancellationToken = default) diff --git a/src/Imazen.Abstractions/DependencyInjection/IImageServerContainer.cs b/src/Imazen.Abstractions/DependencyInjection/IImageServerContainer.cs new file mode 100644 index 00000000..c056d4a9 --- /dev/null +++ b/src/Imazen.Abstractions/DependencyInjection/IImageServerContainer.cs @@ -0,0 +1,95 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace Imazen.Abstractions.DependencyInjection; + +public interface IImageServerContainer : IServiceProvider +{ + void Register(Func instanceCreator) where TService : class; + void Register(TService instance) where TService : class; + IEnumerable Resolve(); + + IServiceProvider GetOuterProvider(); +} + +public class ImageServerContainer : IImageServerContainer +{ + private readonly Dictionary> _services = new Dictionary>(); + + public ImageServerContainer(IServiceProvider outerProvider) + { + this.outerProvider = outerProvider; + } + + private IServiceProvider outerProvider; + + public IServiceProvider GetOuterProvider() + { + return outerProvider; + } + + public void Register(Func instanceCreator) where TService : class + { + var instance = instanceCreator(); + if (_services.ContainsKey(typeof(TService))) + { + _services[typeof(TService)].Add(instance); + } + else + { + _services[typeof(TService)] = new List { instance }; + } + } + public void RegisterAll(IEnumerable instances) + { + if (_services.ContainsKey(typeof(TService))) + { + _services[typeof(TService)].AddRange(instances.Cast()); + } + else + { + _services[typeof(TService)] = instances.Cast().ToList(); + } + } + + public void Register(TService instance) where TService : class + { + if (_services.ContainsKey(typeof(TService))) + { + _services[typeof(TService)].Add(instance); + } + else + { + _services[typeof(TService)] = new List { instance }; + } + } + + public IEnumerable Resolve() + { + return _services[typeof(TService)].Cast(); + } + + + + public object GetService(Type serviceType) + { + if (serviceType.IsGenericType && serviceType.GetGenericTypeDefinition() == typeof(IEnumerable<>)) + { + var actualServiceType = serviceType.GetGenericArguments()[0]; + if (_services.TryGetValue(actualServiceType, out var instances)) + { + var method = typeof(Enumerable).GetMethod("Cast").MakeGenericMethod(actualServiceType); + return method.Invoke(null, new object[] { instances }); + } + } + else if (_services.TryGetValue(serviceType, out var instances)) + { + return instances.First(); + } + + return null; + } + + +} \ No newline at end of file diff --git a/src/Imazen.Abstractions/Imazen.Abstractions.csproj b/src/Imazen.Abstractions/Imazen.Abstractions.csproj index 8bb415f0..2f8fff4a 100644 --- a/src/Imazen.Abstractions/Imazen.Abstractions.csproj +++ b/src/Imazen.Abstractions/Imazen.Abstractions.csproj @@ -10,6 +10,11 @@ + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/src/Imazen.Common/Instrumentation/Support/ConcurrentBitArray.cs b/src/Imazen.Abstractions/Internal/ConcurrentBitArray.cs similarity index 99% rename from src/Imazen.Common/Instrumentation/Support/ConcurrentBitArray.cs rename to src/Imazen.Abstractions/Internal/ConcurrentBitArray.cs index a8fb9337..3e475643 100644 --- a/src/Imazen.Common/Instrumentation/Support/ConcurrentBitArray.cs +++ b/src/Imazen.Abstractions/Internal/ConcurrentBitArray.cs @@ -2,7 +2,7 @@ namespace Imazen.Common.Instrumentation.Support { - internal class ConcurrentBitArray + public class ConcurrentBitArray { private readonly long[] _data; private readonly int _bitCount; diff --git a/src/Imazen.Abstractions/VisibleToTests.cs b/src/Imazen.Abstractions/VisibleToTests.cs index 4152a33c..1bbe84d4 100644 --- a/src/Imazen.Abstractions/VisibleToTests.cs +++ b/src/Imazen.Abstractions/VisibleToTests.cs @@ -1,10 +1,19 @@ using System.Runtime.CompilerServices; -[assembly: InternalsVisibleTo("Imazen.Common.Tests")] +// We are exposing PolySharp once +[assembly: InternalsVisibleTo("ImazenShared.Tests")] +[assembly: InternalsVisibleTo("Imazen.Common")] +[assembly: InternalsVisibleTo("Imazen.Routing")] +[assembly: InternalsVisibleTo("Imageflow.Server.Storage.AzureBlob")] +[assembly: InternalsVisibleTo("Imageflow.Server.Storage.S3")] +[assembly: InternalsVisibleTo("Imageflow.Server.Storage.AzureBlob.Tests")] +[assembly: InternalsVisibleTo("Imageflow.Server.Storage.RemoteReader")] +[assembly: InternalsVisibleTo("Imazen.HybridCache")] + + [assembly: InternalsVisibleTo("Imageflow.Server")] [assembly: InternalsVisibleTo("Imageflow.Server.Tests")] [assembly: InternalsVisibleTo("ImageResizer")] [assembly: InternalsVisibleTo("ImageResizer.LicensingTests")] [assembly: InternalsVisibleTo("ImageResizer.HybridCache.Tests")] [assembly: InternalsVisibleTo("ImageResizer.HybridCache.Benchmark")] -[assembly: InternalsVisibleTo("Imazen.Routing")] \ No newline at end of file diff --git a/src/Imazen.Common/FileTypeDetection/FileTypeDetector.cs b/src/Imazen.Common/FileTypeDetection/FileTypeDetector.cs index f53b6339..793b9738 100644 --- a/src/Imazen.Common/FileTypeDetection/FileTypeDetector.cs +++ b/src/Imazen.Common/FileTypeDetection/FileTypeDetector.cs @@ -14,7 +14,12 @@ public class FileTypeDetector /// /// /// - public string? GuessMimeType(byte[] first12Bytes) + public static string? GuessMimeType(byte[] first12Bytes) + { + return MagicBytes.GetImageContentType(first12Bytes); + } + + public static string? GuessMimeType(Span first12Bytes) { return MagicBytes.GetImageContentType(first12Bytes); } diff --git a/src/Imazen.Common/VisibleToTests.cs b/src/Imazen.Common/VisibleToTests.cs index 4152a33c..8a08062f 100644 --- a/src/Imazen.Common/VisibleToTests.cs +++ b/src/Imazen.Common/VisibleToTests.cs @@ -1,10 +1,9 @@ using System.Runtime.CompilerServices; -[assembly: InternalsVisibleTo("Imazen.Common.Tests")] +[assembly: InternalsVisibleTo("ImazenShared.Tests")] [assembly: InternalsVisibleTo("Imageflow.Server")] [assembly: InternalsVisibleTo("Imageflow.Server.Tests")] [assembly: InternalsVisibleTo("ImageResizer")] [assembly: InternalsVisibleTo("ImageResizer.LicensingTests")] [assembly: InternalsVisibleTo("ImageResizer.HybridCache.Tests")] [assembly: InternalsVisibleTo("ImageResizer.HybridCache.Benchmark")] -[assembly: InternalsVisibleTo("Imazen.Routing")] \ No newline at end of file diff --git a/src/Imazen.Common/packages.lock.json b/src/Imazen.Common/packages.lock.json index 73cc483f..6e32bd5b 100644 --- a/src/Imazen.Common/packages.lock.json +++ b/src/Imazen.Common/packages.lock.json @@ -21,12 +21,6 @@ "Microsoft.NETCore.Platforms": "1.1.0" } }, - "PolySharp": { - "type": "Direct", - "requested": "[1.14.1, )", - "resolved": "1.14.1", - "contentHash": "mOOmFYwad3MIOL14VCjj02LljyF1GNw1wP0YVlxtcPvqdxjGGMNdNJJxHptlry3MOd8b40Flm8RPOM8JOlN2sQ==" - }, "Microsoft.Bcl.AsyncInterfaces": { "type": "Transitive", "resolved": "5.0.0", @@ -162,12 +156,6 @@ "Microsoft.SourceLink.Common": "8.0.0" } }, - "PolySharp": { - "type": "Direct", - "requested": "[1.14.1, )", - "resolved": "1.14.1", - "contentHash": "mOOmFYwad3MIOL14VCjj02LljyF1GNw1wP0YVlxtcPvqdxjGGMNdNJJxHptlry3MOd8b40Flm8RPOM8JOlN2sQ==" - }, "Microsoft.Build.Tasks.Git": { "type": "Transitive", "resolved": "8.0.0", @@ -261,12 +249,6 @@ "Microsoft.SourceLink.Common": "8.0.0" } }, - "PolySharp": { - "type": "Direct", - "requested": "[1.14.1, )", - "resolved": "1.14.1", - "contentHash": "mOOmFYwad3MIOL14VCjj02LljyF1GNw1wP0YVlxtcPvqdxjGGMNdNJJxHptlry3MOd8b40Flm8RPOM8JOlN2sQ==" - }, "Microsoft.Build.Tasks.Git": { "type": "Transitive", "resolved": "8.0.0", diff --git a/src/Imazen.DiskCache/packages.lock.json b/src/Imazen.DiskCache/packages.lock.json index f6c3971b..f4033cad 100644 --- a/src/Imazen.DiskCache/packages.lock.json +++ b/src/Imazen.DiskCache/packages.lock.json @@ -27,12 +27,6 @@ "Microsoft.NETCore.Platforms": "1.1.0" } }, - "PolySharp": { - "type": "Direct", - "requested": "[1.14.1, )", - "resolved": "1.14.1", - "contentHash": "mOOmFYwad3MIOL14VCjj02LljyF1GNw1wP0YVlxtcPvqdxjGGMNdNJJxHptlry3MOd8b40Flm8RPOM8JOlN2sQ==" - }, "Microsoft.Bcl.AsyncInterfaces": { "type": "Transitive", "resolved": "5.0.0", @@ -175,12 +169,6 @@ "Microsoft.SourceLink.Common": "8.0.0" } }, - "PolySharp": { - "type": "Direct", - "requested": "[1.14.1, )", - "resolved": "1.14.1", - "contentHash": "mOOmFYwad3MIOL14VCjj02LljyF1GNw1wP0YVlxtcPvqdxjGGMNdNJJxHptlry3MOd8b40Flm8RPOM8JOlN2sQ==" - }, "Microsoft.Build.Tasks.Git": { "type": "Transitive", "resolved": "8.0.0", @@ -281,12 +269,6 @@ "Microsoft.SourceLink.Common": "8.0.0" } }, - "PolySharp": { - "type": "Direct", - "requested": "[1.14.1, )", - "resolved": "1.14.1", - "contentHash": "mOOmFYwad3MIOL14VCjj02LljyF1GNw1wP0YVlxtcPvqdxjGGMNdNJJxHptlry3MOd8b40Flm8RPOM8JOlN2sQ==" - }, "Microsoft.Build.Tasks.Git": { "type": "Transitive", "resolved": "8.0.0", diff --git a/src/Imazen.HybridCache/packages.lock.json b/src/Imazen.HybridCache/packages.lock.json index 9212aaee..596b15a1 100644 --- a/src/Imazen.HybridCache/packages.lock.json +++ b/src/Imazen.HybridCache/packages.lock.json @@ -21,12 +21,6 @@ "Microsoft.NETCore.Platforms": "1.1.0" } }, - "PolySharp": { - "type": "Direct", - "requested": "[1.14.1, )", - "resolved": "1.14.1", - "contentHash": "mOOmFYwad3MIOL14VCjj02LljyF1GNw1wP0YVlxtcPvqdxjGGMNdNJJxHptlry3MOd8b40Flm8RPOM8JOlN2sQ==" - }, "System.Interactive.Async": { "type": "Direct", "requested": "[6.0.1, )", @@ -185,12 +179,6 @@ "Microsoft.SourceLink.Common": "8.0.0" } }, - "PolySharp": { - "type": "Direct", - "requested": "[1.14.1, )", - "resolved": "1.14.1", - "contentHash": "mOOmFYwad3MIOL14VCjj02LljyF1GNw1wP0YVlxtcPvqdxjGGMNdNJJxHptlry3MOd8b40Flm8RPOM8JOlN2sQ==" - }, "System.Interactive.Async": { "type": "Direct", "requested": "[6.0.1, )", @@ -312,12 +300,6 @@ "Microsoft.SourceLink.Common": "8.0.0" } }, - "PolySharp": { - "type": "Direct", - "requested": "[1.14.1, )", - "resolved": "1.14.1", - "contentHash": "mOOmFYwad3MIOL14VCjj02LljyF1GNw1wP0YVlxtcPvqdxjGGMNdNJJxHptlry3MOd8b40Flm8RPOM8JOlN2sQ==" - }, "System.Interactive.Async": { "type": "Direct", "requested": "[6.0.1, )", diff --git a/src/Imazen.Routing/Compatibility/ImageflowServer/AccessDiagnosticsFrom.cs b/src/Imazen.Routing/Compatibility/ImageflowServer/AccessDiagnosticsFrom.cs deleted file mode 100644 index 306cdb48..00000000 --- a/src/Imazen.Routing/Compatibility/ImageflowServer/AccessDiagnosticsFrom.cs +++ /dev/null @@ -1,21 +0,0 @@ -namespace Imazen.Routing.Compatibility.ImageflowServer -{ - /// - /// Where the diagnostics page can be accessed from - /// - internal enum AccessDiagnosticsFrom - { - /// - /// Do not allow unauthenticated access to the diagnostics page, even from localhost - /// - None, - /// - /// Only allow localhost to access the diagnostics page - /// - LocalHost, - /// - /// Allow any host to access the diagnostics page - /// - AnyHost - } -} \ No newline at end of file diff --git a/src/Imazen.Routing/Compatibility/ImageflowServer/ImageflowMiddlewareOptions.cs b/src/Imazen.Routing/Compatibility/ImageflowServer/ImageflowMiddlewareOptions.cs index ba4caafd..cbe84d6c 100644 --- a/src/Imazen.Routing/Compatibility/ImageflowServer/ImageflowMiddlewareOptions.cs +++ b/src/Imazen.Routing/Compatibility/ImageflowServer/ImageflowMiddlewareOptions.cs @@ -2,6 +2,7 @@ using Imazen.Abstractions.Blobs.LegacyProviders; using Imazen.Common.Storage; using Imazen.Routing.Compatibility.ImageflowServer.Internal; +using Imazen.Routing.Layers; using Imazen.Routing.RequestRouting.Layers; namespace Imazen.Routing.Compatibility.ImageflowServer diff --git a/src/Imazen.Routing/Engine/RoutingBuilderExtensions.cs b/src/Imazen.Routing/Engine/RoutingBuilderExtensions.cs new file mode 100644 index 00000000..dff05147 --- /dev/null +++ b/src/Imazen.Routing/Engine/RoutingBuilderExtensions.cs @@ -0,0 +1,15 @@ +using Imazen.Abstractions.DependencyInjection; +using Imazen.Routing.Layers; + +namespace Imazen.Routing.RequestRouting; + +public static class RoutingBuilderExtensions +{ + public static RoutingBuilder AddDiagnosticPage(this RoutingBuilder builder, IImageServerContainer container) + { + var diagnosticsPage = new DiagnosticsPage(container); + builder.AddEndpoint(DiagnosticsPage.Precondition, diagnosticsPage); + builder.AddEndpoint(Conditions.HasPathSuffix("/imageflow.debug"), new DiagnosticsPage(options)); + return builder; + } +} \ No newline at end of file diff --git a/src/Imazen.Routing/Global.cs b/src/Imazen.Routing/Global.cs index c30ddea4..88564d04 100644 --- a/src/Imazen.Routing/Global.cs +++ b/src/Imazen.Routing/Global.cs @@ -4,7 +4,7 @@ using System.Runtime.CompilerServices; -[assembly: InternalsVisibleTo("Imazen.Common.Tests")] +[assembly: InternalsVisibleTo("ImazenShared.Tests")] [assembly: InternalsVisibleTo("Imageflow.Server")] [assembly: InternalsVisibleTo("Imageflow.Server.Tests")] [assembly: InternalsVisibleTo("ImageResizer")] diff --git a/src/Imazen.Routing/Health/DiagnosticsReport.cs b/src/Imazen.Routing/Health/DiagnosticsReport.cs new file mode 100644 index 00000000..2050aedb --- /dev/null +++ b/src/Imazen.Routing/Health/DiagnosticsReport.cs @@ -0,0 +1,196 @@ +using System.Globalization; +using System.Reflection; +using System.Security; +using System.Text; +using Imazen.Abstractions.AssemblyAttributes; +using Imazen.Abstractions.BlobCache; +using Imazen.Abstractions.Blobs; +using Imazen.Abstractions.Blobs.LegacyProviders; +using Imazen.Abstractions.Logging; +using Imazen.Common.Extensibility.ClassicDiskCache; +using Imazen.Common.Extensibility.StreamCache; +using Imazen.Common.Issues; +using Imazen.Common.Storage; +using Imazen.Routing.Helpers; +using Imazen.Routing.Serving; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; + +namespace Imazen.Routing.Health; + +public class StartupDiagnostics(IServiceProvider serviceProvider) +{ + public void LogIssues(IReLogger logger) + { + // Log an error warning if IStreamCache or IClassicDiskCache has any registrations + // Each implementation gets its own error so users know what class & assembly to search for + foreach (var cache in serviceProvider.GetServices()) + { + logger?.WithRetain.LogError( + "IClassicDiskCache is obsolete and ignored. Please use the official caches or implement IBlobCache instead. {FullName} is registered in {Assembly}", + cache.GetType().FullName, cache.GetType().Assembly?.FullName); + } + + foreach (var cache in serviceProvider.GetServices()) + { + logger?.WithRetain.LogError( + "IStreamCache is obsolete and ignored. Please use the official caches or implement IBlobCache instead. {FullName} is registered in {Assembly}", + cache.GetType().FullName, cache.GetType().Assembly?.FullName); + } + } + +} + +public class DiagnosticsReport(IServiceProvider serviceProvider, IReLogStore logStore) +{ + + /// + /// SectionProviders should include Licensing and ImageServer at minimum + /// + /// + /// + /// + public ValueTask GetReport(IHttpRequestStreamAdapter? request, IReadOnlyCollection sectionProviders) + { + + var sections = + GetAllImplementers(serviceProvider).Concat(sectionProviders).Distinct().ToList(); + + + var s = new StringBuilder(8096); + var now = DateTime.UtcNow.ToString(NumberFormatInfo.InvariantInfo); + s.AppendLine($"Diagnostics for Imageflow at {request?.GetHost().Value} generated {now} UTC"); + + try + { + using var job = new Imageflow.Bindings.JobContext(); + var version = job.GetVersionInfo(); + s.AppendLine($"libimageflow {version.LongVersionString}"); + } + catch (Exception e) + { + s.AppendLine($"Failed to get libimageflow version: {e.Message}"); + } + + s.AppendLine("Please remember to provide this page when contacting support."); + + + // get array of loaded assemblies + var assemblies = AppDomain.CurrentDomain.GetAssemblies(); + var summary = assemblies.ExplainVersionMismatches(true); + if (!string.IsNullOrEmpty(summary)) + { + s.AppendLine(summary); + } + + var issues = GetAllImplementers(serviceProvider) + .SelectMany(p => p.GetIssues()).ToList(); + s.AppendLine($"{issues.Count} issues from legacy plugins (those implementing IIssueProvider instead of calling IReLogger.WithRetain.) detected:\r\n"); + foreach (var i in issues.OrderBy(i => i?.Severity)) + s.AppendLine( + $"{i?.Source}({i?.Severity}):\t{i?.Summary}\n\t\t\t{i?.Details?.Replace("\n", "\r\n\t\t\t")}\n"); + + foreach (var sectionProvider in sections) + { + s.AppendLine(sectionProvider.GetDiagnosticsPageSection(DiagnosticsPageArea.Start)); + } + + s.AppendLine("\nAccepted querystring keys:\n"); + s.AppendLine(string.Join(", ", PathHelpers.SupportedQuerystringKeys)); + + s.AppendLine("\nAccepted file extensions:\n"); + s.AppendLine(string.Join(", ", PathHelpers.AcceptedImageExtensions)); + + s.AppendLine("\nEnvironment information:\n"); + s.AppendLine( + $"Running on {Environment.OSVersion} and CLR {Environment.Version} and .NET Core {GetNetCoreVersion()}"); + + try + { + var wow64 = Environment.GetEnvironmentVariable("PROCESSOR_ARCHITEW6432"); + var arch = Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE"); + s.AppendLine("OS arch: " + arch + (string.IsNullOrEmpty(wow64) + ? "" + : " !! Warning, running as 32-bit on a 64-bit OS(" + wow64 + + "). This will limit ram usage !!")); + } + catch (SecurityException) + { + s.AppendLine( + "Failed to detect operating system architecture - security restrictions prevent reading environment variables"); + } + + + //List loaded assemblies, and also detect plugin assemblies that are not being used. + s.AppendLine("\nLoaded assemblies:\n"); + + foreach (var a in assemblies) + { + if (a?.FullName == null) continue; + var assemblyName = new AssemblyName(a.FullName); + var line = ""; + var error = a.GetExceptionForReading(); + if (error != null) + { + line += $"{assemblyName.Name,-40} Failed to read assembly attributes: {error.Message}"; + } + else + { + var version = $"{a.GetFileVersion()} ({assemblyName.Version})"; + var infoVersion = $"{a.GetInformationalVersion()}"; + line += $"{assemblyName.Name,-40} File: {version,-25} Informational: {infoVersion,-30}"; + } + + s.AppendLine(line); + } + + // Now get the sections while passing in DiagnosticsPageArea.End + + foreach (var sectionProvider in sections) + { + var section = sectionProvider.GetDiagnosticsPageSection(DiagnosticsPageArea.End); + if (!string.IsNullOrEmpty(section)) + { + s.AppendLine(section); + } + } + + return Tasks.ValueResult(s.ToString()); + } + + private static List GetAllImplementers(IServiceProvider serviceProvider) + { + void Add(List candidates) + { + foreach (var t in serviceProvider.GetServices()) + { + if (t is not T p) continue; + if (!candidates.Contains(p)) + { + candidates.Add(p); + } + } + } + var c = new List(); + Add(c); + Add(c); + Add(c); + Add(c); + +#pragma warning disable CS0618 // Type or member is obsolete + Add(c); + Add(c); + Add(c); + Add(c); +#pragma warning restore CS0618 // Type or member is obsolete + return c.Distinct().ToList(); + } + private static string GetNetCoreVersion() + { + return System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription; + } +} + + + + diff --git a/src/Imazen.Routing/Helpers/AssemblyHelpers.cs b/src/Imazen.Routing/Helpers/AssemblyHelpers.cs new file mode 100644 index 00000000..31ef5bda --- /dev/null +++ b/src/Imazen.Routing/Helpers/AssemblyHelpers.cs @@ -0,0 +1,329 @@ +using System.Reflection; +using System.Text; +using Imazen.Abstractions.AssemblyAttributes; + +namespace Imazen.Routing.Helpers; + +internal static class AssemblyHelpers +{ + + private static bool TryGetVersionedWithAssemblies(this Assembly a, out string[]? patterns, out Exception? error) + { + patterns = null; + error = null; + try + { + var attrs = a.GetCustomAttributes(typeof(VersionedWithAssembliesAttribute), false); + if (attrs.Length > 0) + { + patterns = ((VersionedWithAssembliesAttribute)attrs[0]).AssemblyPatterns; + return true; + } + } + catch (Exception e) + { + error = e; + } + + return false; + } + + private record struct AssemblyVersionInfo + { + internal string? CompatibilityVersion { get; init; } + internal string? AssemblyVersion { get; init; } + internal string? FileVersion { get; init; } + internal string? InformationalVersion { get; init; } + internal string? FullName { get; init; } + internal string? Commit { get; init; } + internal string? BuildDate { get; init; } + internal string? NugetPackageName { get; init; } + internal Exception? AccessError { get; init; } + + public bool IsFileNotFoundException => AccessError is FileNotFoundException; + + public bool HasCompatibilityVersion => !string.IsNullOrWhiteSpace(CompatibilityVersion); + + public static AssemblyVersionInfo FromAssembly(Assembly a) + { + // catch exceptions (missing dependencies, etc) + try + { + Exception? error = null; + var fullName = a.FullName; + string? version; + try + { + version = a.GetName().Version?.ToString(); + } + catch (Exception e) + { + version = null; + error = e; + } + + var fileVersion = a.TryGetFirstAttribute(ref error)?.Version; + var infoVersion = a.TryGetFirstAttribute(ref error) + ?.InformationalVersion; + var buildDate = a.TryGetFirstAttribute(ref error)?.Value; + var commit = a.TryGetFirstAttribute(ref error)?.Value; + var nugetPackageName = a.TryGetFirstAttribute(ref error)?.PackageName; + return new AssemblyVersionInfo + { + FileVersion = fileVersion, + InformationalVersion = infoVersion, + FullName = fullName, + AssemblyVersion = version, + BuildDate = buildDate, + Commit = commit, + NugetPackageName = nugetPackageName, + CompatibilityVersion = string.IsNullOrWhiteSpace(fileVersion) ? null : fileVersion, + }; + + } + catch (Exception e) + { + return new AssemblyVersionInfo + { + AccessError = e + }; + } + + + } + + private bool VersionMatches(AssemblyVersionInfo other) + { + // file version and assembly version should match. If both are null return false + if (FileVersion == null && other.FileVersion == null) return false; + return FileVersion == other.FileVersion && AssemblyVersion == other.AssemblyVersion; + } + } + + private class AssemblyGroup + { + private List Patterns { get; } = []; + internal List Assemblies { get; } = []; + + internal List VersionInfo { get; } = []; + public int AssemblyCount => Assemblies.Count; + + internal bool HasMissingAssemblyVersionData = false; + internal List? MissingCompatibilityVersionData; + internal bool HasMismatchedFileVersions = false; + internal List? MismatchedFileVersions; + + private bool calculated = false; + + private void CalculateFinal() + { + if (calculated) return; + calculated = true; + + HasMissingAssemblyVersionData = VersionInfo.Any(v => !v.HasCompatibilityVersion); + if (HasMissingAssemblyVersionData) + { + MissingCompatibilityVersionData = VersionInfo.Where(v => !v.HasCompatibilityVersion).ToList(); + } + + HasMismatchedFileVersions = VersionInfo.GroupBy(v => v.CompatibilityVersion).Count() > 1; + if (HasMismatchedFileVersions) + { + MismatchedFileVersions = VersionInfo.Where(v => v.HasCompatibilityVersion) + .OrderBy(v => v.CompatibilityVersion).ToList(); + } + } + + private static bool PatternMatches(string pattern, string? patternOrAssembly) + { + if (string.IsNullOrWhiteSpace(patternOrAssembly)) return false; + if (pattern.Equals(patternOrAssembly, StringComparison.OrdinalIgnoreCase)) return true; + return pattern.EndsWith("*") && + patternOrAssembly.StartsWith(pattern[..^1], StringComparison.OrdinalIgnoreCase); + } + + internal bool Matches(string pattern) + { + return Patterns.Any(p => PatternMatches(pattern, p)) || + VersionInfo.Any(v => PatternMatches(pattern, v.FullName ?? "")); + } + + public void Add(Assembly a) + { + if (Assemblies.Contains(a)) return; + Assemblies.Add(a); + var info = AssemblyVersionInfo.FromAssembly(a); + VersionInfo.Add(info); + if (!a.TryGetVersionedWithAssemblies(out var patterns, out var error)) return; + if (patterns != null) Patterns.AddRange(patterns); + } + + + } + + private static List GetVersionedWithAssemblyGroups(this Assembly[] list) + { + var groups = new List(); + foreach (var a in list) + { + var group = groups.FirstOrDefault(g => g.Matches(a.FullName ?? "")); + if (group == null) + { + group = new AssemblyGroup(); + groups.Add(group); + } + + group.Add(a); + } + + return groups; + } + + internal static string ExplainVersionMismatches(this Assembly[] loadedAssemblies, bool listSuccesses = false) + { + var groups = loadedAssemblies.GetVersionedWithAssemblyGroups(); + + var sb = new StringBuilder(); + foreach (var group in groups) + { + bool ok = group is { HasMissingAssemblyVersionData: false, HasMismatchedFileVersions: false }; + if (ok && group.AssemblyCount > 1 && listSuccesses) + { + // {x} assemblies have compatible versions (version) + sb.AppendLine( + $"OK: {group.Assemblies.Count} assemblies have compatible versions ({group.VersionInfo[0].CompatibilityVersion})"); + } + + if (group.HasMissingAssemblyVersionData) + { + sb.AppendLine( + $"ERROR: Missing compatibility version for {group.MissingCompatibilityVersionData?.Count} assemblies:"); + foreach (var info in group.MissingCompatibilityVersionData!) + { + sb.AppendLine($"ERROR: {info.FullName} {info.AccessError?.Message}"); + } + } + + if (group.HasMismatchedFileVersions) + { + sb.AppendLine($"ERROR: Mismatched file versions for {group.MismatchedFileVersions?.Count} assemblies:"); + foreach (var info in group.MismatchedFileVersions!) + { + sb.AppendLine($" {info.FullName} ({info.FileVersion})"); + } + + sb.AppendLine(); + } + } + + return sb.ToString(); + } + + private static T? GetFirstAttribute(this ICustomAttributeProvider a) + { + try + { + var attrs = a.GetCustomAttributes(typeof(T), false); + if (attrs.Length > 0) return (T)attrs[0]; + } + catch (FileNotFoundException) + { + //Missing dependencies + } + // ReSharper disable once EmptyGeneralCatchClause + catch (Exception) + { + } + + return default; + } + + private static T? TryGetFirstAttribute(this ICustomAttributeProvider a, ref Exception? error) + { + try + { + var attrs = a.GetCustomAttributes(typeof(T), false); + if (attrs.Length > 0) return (T)attrs[0]; + } + catch (Exception e) + { + error = e; + } + + return default; + } + + public static Exception? GetExceptionForReading(this Assembly a) + { + try + { + var unused = a.GetCustomAttributes(typeof(T), false); + } + catch (Exception e) + { + return e; + } + + return null; + } + + public static string? GetInformationalVersion(this Assembly a) + { + return GetFirstAttribute(a)?.InformationalVersion; + } + + public static string? GetFileVersion(this Assembly a) + { + return GetFirstAttribute(a)?.Version; + } + + + + + // Imazen.Abstractions.AssemblyAttributes.VersionedWithAssemblies + // Imazen.Abstractions.AssemblyAttributes.BuildDate + + public static string? GetBuildDate(this Assembly a) + { + return GetFirstAttribute(a)?.Value; + } + + public static string[]? GetVersionedWithAssemblies(this Assembly a) + { + return GetFirstAttribute(a)?.AssemblyPatterns; + } + + public static string? GetCommit(this Assembly a) + { + return GetFirstAttribute(a)?.Value; + } + + // Get nuget package name for an assembly + + public static string? GetNugetPackageName(this Assembly a) + { + return GetFirstAttribute(a)?.PackageName; + } + + public static IReadOnlyCollection> GetMetadataPairs(this Assembly a) + { + // sus, autogenerated, where's the try catch and why no casting? + var pairs = new List>(); + var attrs = a.GetCustomAttributesData(); + foreach (var attr in attrs) + { + if (attr.AttributeType == typeof(AssemblyMetadataAttribute)) + { + + var key = attr.ConstructorArguments[0].Value?.ToString(); + var value = attr.ConstructorArguments[1].Value?.ToString(); + if (key != null && value != null) + { + pairs.Add(new KeyValuePair(key, value)); + } + } + } + + return pairs; + } +} \ No newline at end of file diff --git a/src/Imazen.Routing/Imazen.Routing.csproj b/src/Imazen.Routing/Imazen.Routing.csproj index 77831f77..af190957 100644 --- a/src/Imazen.Routing/Imazen.Routing.csproj +++ b/src/Imazen.Routing/Imazen.Routing.csproj @@ -10,6 +10,10 @@ + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/src/Imazen.Routing/Layers/DiagnosticsPage.cs b/src/Imazen.Routing/Layers/DiagnosticsPage.cs new file mode 100644 index 00000000..e77b1cdb --- /dev/null +++ b/src/Imazen.Routing/Layers/DiagnosticsPage.cs @@ -0,0 +1,149 @@ +using Imazen.Abstractions.Logging; +using Imazen.Abstractions.Resulting; +using Imazen.Common.Extensibility.ClassicDiskCache; +using Imazen.Common.Extensibility.StreamCache; +using Imazen.Routing.Compatibility.ImageflowServer; +using Imazen.Routing.Health; +using Imazen.Routing.RequestRouting; +using Imazen.Routing.RequestRouting.Promises; +using Imazen.Routing.Serving; + +namespace Imazen.Routing.Layers; + + + +public record DiagnosticsPageOptions( + string DiagnosticsPassword, + DiagnosticsPageOptions.AccessDiagnosticsFrom DiagnosticsAccess, + // licensing and server + List AdditionalSections) +{ + + /// + /// Where the diagnostics page can be accessed from + /// + public enum AccessDiagnosticsFrom + { + /// + /// Do not allow unauthenticated access to the diagnostics page, even from localhost + /// + None, + /// + /// Only allow localhost to access the diagnostics page + /// + LocalHost, + /// + /// Allow any host to access the diagnostics page + /// + AnyHost + } +} + +internal class DiagnosticsPage : IRoutingEndpoint, IRoutingLayer +{ + + private readonly IServiceProvider serviceProvider; + private readonly IReLogStore retainedLogStore; + private readonly IReLogger logger; + private readonly DiagnosticsPageOptions options; + + public DiagnosticsPage(IServiceProvider serviceProvider, + IReLogger logger, IReLogStore retainedLogStore, DiagnosticsPageOptions options) + { + DiagnosticsPageOptions options + + this.serviceProvider = serviceProvider; + this.options = options; + this.logger = logger; + this.retainedLogStore = retainedLogStore; + } + + public static bool MatchesPath(string path) => "/imageflow.debug".Equals(path, StringComparison.Ordinal); + + + + public bool IsAuthorized(IHttpRequestStreamAdapter request, out string? errorMessage) + { + errorMessage = null; + var providedPassword = request.GetQuery()["password"].ToString(); + var passwordMatch = !string.IsNullOrEmpty(options.DiagnosticsPassword) + && options.DiagnosticsPassword == providedPassword; + + string s; + if (passwordMatch || + options.DiagnosticsAccess == AccessDiagnosticsFrom.AnyHost || + (options.DiagnosticsAccess == AccessDiagnosticsFrom.LocalHost && request.IsClientLocalhost())) + { + return true; + } + else + { + s = + "You can configure access to this page via the imageflow.toml [diagnostics] section, or in C# via ImageflowMiddlewareOptions.SetDiagnosticsPageAccess(allowLocalhost, password)\r\n\r\n"; + if (options.DiagnosticsAccess == AccessDiagnosticsFrom.LocalHost) + { + s += "You can access this page from the localhost\r\n\r\n"; + } + else + { + s += "Access to this page from localhost is disabled\r\n\r\n"; + } + + if (!string.IsNullOrEmpty(options.DiagnosticsPassword)) + { + s += "You can access this page by adding ?password=[insert password] to the URL.\r\n\r\n"; + } + else + { + s += "You can set a password via imageflow.toml [diagnostics] allow_with_password='' or in C# with SetDiagnosticsPageAccess to access this page remotely.\r\n\r\n"; + } + errorMessage = s; + return false; + } + } + + private async Task GeneratePage(IRequestSnapshot r) + { + + var request = r.OriginatingRequest; + var diagnostics = new DiagnosticsReport(serviceProvider, retainedLogStore); + + var result = await diagnostics.GetReport(request, options.AdditionalSections); + return result; + } + + + + + public ValueTask GetInstantPromise(IRequestSnapshot request, CancellationToken cancellationToken = default) + { + return Tasks.ValueResult((IInstantPromise)new PromiseFuncAsync(request, async (r, ct) => + SmallHttpResponse.NoStoreNoRobots((200, await GeneratePage(r))))); + } + + public string Name => "Diagnostics page"; + public IFastCond? FastPreconditions => Precondition; + + public static readonly IFastCond Precondition = Conditions.HasPathSuffix("/imageflow.debug", "/resizer.debug"); + + public ValueTask?> ApplyRouting(MutableRequest request, CancellationToken cancellationToken = default) + { + if (!Precondition.Matches(request)) return default; + if (request.IsChildRequest) return default; + // method not allowed + if (!request.IsGet()) + return new ValueTask?>( + CodeResult.Err((405, "Method not allowed"))); + + if (!IsAuthorized(request.OriginatingRequest, out var errorMessage)) + { + return new ValueTask?>( + CodeResult.Err((401, errorMessage))); + } + return new ValueTask?>( + CodeResult.Ok(this)); + } + + public bool IsBlobEndpoint => false; + +} \ No newline at end of file diff --git a/src/Imazen.Routing/Serving/IImageServer.cs b/src/Imazen.Routing/Serving/IImageServer.cs index 2fbaffc0..700ba172 100644 --- a/src/Imazen.Routing/Serving/IImageServer.cs +++ b/src/Imazen.Routing/Serving/IImageServer.cs @@ -1,8 +1,18 @@ namespace Imazen.Routing.Serving; -public interface IImageServer where TRequest : IHttpRequestStreamAdapter where TResponse : IHttpResponseStreamAdapter +public interface IHasDiagnosticPageSection +{ + string? GetDiagnosticsPageSection(DiagnosticsPageArea section); +} + +public enum DiagnosticsPageArea +{ + Start, + End +} + +public interface IImageServer: IHasDiagnosticPageSection where TRequest : IHttpRequestStreamAdapter where TResponse : IHttpResponseStreamAdapter { - string GetDiagnosticsPageSection(); bool MightHandleRequest(string? path, TQ query, TContext context) where TQ : IReadOnlyQueryWrapper; ValueTask TryHandleRequestAsync(TRequest request, TResponse response, TContext context, CancellationToken cancellationToken = default); } \ No newline at end of file diff --git a/src/Imazen.Routing/Serving/IPerformanceTracker.cs b/src/Imazen.Routing/Serving/IPerformanceTracker.cs new file mode 100644 index 00000000..d3c48656 --- /dev/null +++ b/src/Imazen.Routing/Serving/IPerformanceTracker.cs @@ -0,0 +1,9 @@ +namespace Imazen.Routing.Serving; + +public interface IPerformanceTracker +{ + void IncrementCounter(string name); +} +internal class NullPerformanceTracker : IPerformanceTracker{ + public void IncrementCounter(string name){} +} \ No newline at end of file diff --git a/src/Imazen.Routing/Serving/ImageServer.cs b/src/Imazen.Routing/Serving/ImageServer.cs index 3ca088b9..00ad4a86 100644 --- a/src/Imazen.Routing/Serving/ImageServer.cs +++ b/src/Imazen.Routing/Serving/ImageServer.cs @@ -1,6 +1,7 @@ using System.Text; using Imazen.Abstractions.Blobs; using Imazen.Abstractions.Blobs.LegacyProviders; +using Imazen.Abstractions.DependencyInjection; using Imazen.Abstractions.Logging; using Imazen.Abstractions.Resulting; using Imazen.Common.Instrumentation; @@ -21,13 +22,15 @@ internal class ImageServer : IImageServer legacyOptions, IReLoggerFactory loggerFactory) + private readonly IPerformanceTracker perf; + public ImageServer(IImageServerContainer container, ILicenseChecker licenseChecker, RoutingEngine routingEngine, IPerformanceTracker perfTracker, + ImageServerOptions imageServerOptions, ImageflowMiddlewareOptions legacyOptions, IReLogger logger) { + perf = perfTracker; this.licenseChecker = licenseChecker; newOptions = imageServerOptions; options = legacyOptions; - logger = loggerFactory.CreateReLogger("ImageServer"); + this.logger = logger.WithSubcategory("ImageServer"); this.routingEngine = routingEngine; var blobFactory = new SimpleReusableBlobFactory(); var sourceCacheOptions = new ServerlessCacheEngineOptions @@ -53,8 +56,12 @@ public ImageServer(ILicenseChecker licenseChecker, RoutingEngine routingEngine, pipeline = new ServerlessCacheEngine(pipeline, outputCacheOptions); } - public string GetDiagnosticsPageSection() + public string GetDiagnosticsPageSection(DiagnosticsPageArea area) { + if (area != DiagnosticsPageArea.Start) + { + return ""; + } var s = new StringBuilder(); s.AppendLine("\nInstalled Caches"); s.AppendLine("\nInstalled Providers and Caches"); @@ -70,7 +77,7 @@ public bool MightHandleRequest(string? path, TQ query, TContext context) whe private ValueTask WriteHttpStatusErrAsync(TResponse response, HttpStatus error, CancellationToken cancellationToken) { - GlobalPerf.Singleton.IncrementCounter($"http_{error.StatusCode}"); + perf.IncrementCounter($"http_{error.StatusCode}"); return SmallHttpResponse.NoStoreNoRobots(error).WriteAsync(response, cancellationToken); } @@ -116,13 +123,13 @@ public async ValueTask TryHandleRequestAsync(TRequest request, TResponse r promisedEtag = CreateEtag(finalPromise); if (promisedEtag == conditionalEtag) { - GlobalPerf.Singleton.IncrementCounter("etag_hit"); + perf.IncrementCounter("etag_hit"); response.SetContentLength(0); response.SetStatusCode(304); return true; } - GlobalPerf.Singleton.IncrementCounter("etag_miss"); + perf.IncrementCounter("etag_miss"); } // Now, let's get the actual blob. @@ -142,7 +149,7 @@ public async ValueTask TryHandleRequestAsync(TRequest request, TResponse r if (blob.Attributes.Etag != null && blob.Attributes.Etag != promisedEtag) { - GlobalPerf.Singleton.IncrementCounter("etag_internal_external_mismatch"); + perf.IncrementCounter("etag_internal_external_mismatch"); } response.SetHeader(HttpHeaderNames.ETag, promisedEtag); @@ -163,7 +170,7 @@ public async ValueTask TryHandleRequestAsync(TRequest request, TResponse r await MagicBytes.ProxyToStream(stream, response, cancellationToken); } - GlobalPerf.Singleton.IncrementCounter("middleware_ok"); + perf.IncrementCounter("middleware_ok"); return true; } else @@ -171,7 +178,7 @@ public async ValueTask TryHandleRequestAsync(TRequest request, TResponse r var nonBlobResponse = await promise.CreateResponseAsync(snapshot, routingEngine, pipeline, cancellationToken); await nonBlobResponse.WriteAsync(response, cancellationToken); - GlobalPerf.Singleton.IncrementCounter("middleware_ok"); + perf.IncrementCounter("middleware_ok"); return true; } @@ -181,7 +188,7 @@ public async ValueTask TryHandleRequestAsync(TRequest request, TResponse r } catch (BlobMissingException e) { - GlobalPerf.Singleton.IncrementCounter("http_404"); + perf.IncrementCounter("http_404"); await SmallHttpResponse.Text(404, "The specified resource does not exist.\r\n" + e.Message) .WriteAsync(response, cancellationToken); @@ -190,8 +197,8 @@ await SmallHttpResponse.Text(404, "The specified resource does not exist.\r\n" + { var errorName = e.GetType().Name; var errorCounter = "middleware_" + errorName; - GlobalPerf.Singleton.IncrementCounter(errorCounter); - GlobalPerf.Singleton.IncrementCounter("middleware_errors"); + perf.IncrementCounter(errorCounter); + perf.IncrementCounter("middleware_errors"); throw; } finally @@ -200,7 +207,7 @@ await SmallHttpResponse.Text(404, "The specified resource does not exist.\r\n" + var imageExtension = PathHelpers.GetImageExtensionFromContentType(response.ContentType); if (imageExtension != null) { - GlobalPerf.Singleton.IncrementCounter("module_response_ext_" + imageExtension); + perf.IncrementCounter("module_response_ext_" + imageExtension); } } diff --git a/src/Imazen.Routing/Serving/MagicBytes.cs b/src/Imazen.Routing/Serving/MagicBytes.cs index 0142d509..be8ca719 100644 --- a/src/Imazen.Routing/Serving/MagicBytes.cs +++ b/src/Imazen.Routing/Serving/MagicBytes.cs @@ -11,7 +11,7 @@ private static string GetContentTypeFromBytes(Span data) { return "application/octet-stream"; } - return Imazen.Common.FileTypeDetection.MagicBytes.GetImageContentType(data) ?? "application/octet-stream"; + return Imazen.Common.FileTypeDetection.FileTypeDetector.GuessMimeType(data) ?? "application/octet-stream"; } interface IByteWritable diff --git a/src/NugetPackages.targets b/src/NugetPackages.targets index 8a7178a3..f8bc0525 100644 --- a/src/NugetPackages.targets +++ b/src/NugetPackages.targets @@ -14,6 +14,9 @@ <_Parameter5>Imazen.HybridCache <_Parameter6>Imazen.DiskCache + + <_Parameter1>{Assembly.Name} + @@ -24,10 +27,6 @@ - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - diff --git a/tests/Imageflow.Server.Tests/Imageflow.Server.Tests.csproj b/tests/Imageflow.Server.Tests/Imageflow.Server.Tests.csproj index e4fa71f3..65b5a532 100644 --- a/tests/Imageflow.Server.Tests/Imageflow.Server.Tests.csproj +++ b/tests/Imageflow.Server.Tests/Imageflow.Server.Tests.csproj @@ -1,26 +1,13 @@ - enable - true net8.0;net6.0 - latest - enable + - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - diff --git a/tests/Imageflow.Server.Tests/packages.lock.json b/tests/Imageflow.Server.Tests/packages.lock.json index 478ceba5..73e1ce17 100644 --- a/tests/Imageflow.Server.Tests/packages.lock.json +++ b/tests/Imageflow.Server.Tests/packages.lock.json @@ -8,6 +8,15 @@ "resolved": "6.0.0", "contentHash": "tW3lsNS+dAEII6YGUX/VMoJjBS1QvsxqJeqLaJXub08y1FSjasFPtQ4UBUsudE9PNrzLjooClMsPtY2cZLdXpQ==" }, + "FluentAssertions": { + "type": "Direct", + "requested": "[6.12.0, )", + "resolved": "6.12.0", + "contentHash": "ZXhHT2YwP9lajrwSKbLlFqsmCCvFJMoRSK9t7sImfnCyd0OB3MhgxdoMcVqxbq1iyxD6mD2fiackWmBb7ayiXQ==", + "dependencies": { + "System.Configuration.ConfigurationManager": "4.4.0" + } + }, "Microsoft.AspNetCore.TestHost": { "type": "Direct", "requested": "[3.1.5, )", @@ -36,22 +45,37 @@ "Microsoft.TestPlatform.TestHost": "17.4.1" } }, + "Moq": { + "type": "Direct", + "requested": "[4.20.70, )", + "resolved": "4.20.70", + "contentHash": "4rNnAwdpXJBuxqrOCzCyICXHSImOTRktCgCWXWykuF1qwoIsVvEnR7PjbMk/eLOxWvhmj5Kwt+kDV3RGUYcNwg==", + "dependencies": { + "Castle.Core": "5.1.1" + } + }, + "PolySharp": { + "type": "Direct", + "requested": "[1.14.1, )", + "resolved": "1.14.1", + "contentHash": "mOOmFYwad3MIOL14VCjj02LljyF1GNw1wP0YVlxtcPvqdxjGGMNdNJJxHptlry3MOd8b40Flm8RPOM8JOlN2sQ==" + }, "xunit": { "type": "Direct", - "requested": "[2.4.1, )", - "resolved": "2.4.1", - "contentHash": "XNR3Yz9QTtec16O0aKcO6+baVNpXmOnPUxDkCY97J+8krUYxPvXT1szYYEUdKk4sB8GOI2YbAjRIOm8ZnXRfzQ==", + "requested": "[2.6.6, )", + "resolved": "2.6.6", + "contentHash": "MAbOOMtZIKyn2lrAmMlvhX0BhDOX/smyrTB+8WTXnSKkrmTGBS2fm8g1PZtHBPj91Dc5DJA7fY+/81TJ/yUFZw==", "dependencies": { - "xunit.analyzers": "0.10.0", - "xunit.assert": "[2.4.1]", - "xunit.core": "[2.4.1]" + "xunit.analyzers": "1.10.0", + "xunit.assert": "2.6.6", + "xunit.core": "[2.6.6]" } }, "xunit.runner.visualstudio": { "type": "Direct", - "requested": "[2.4.5, )", - "resolved": "2.4.5", - "contentHash": "OwHamvBdUKgqsXfBzWiCW/O98BTx81UKzx2bieIOQI7CZFE5NEQZGi8PBQGIKawDW96xeRffiNf20SjfC0x9hw==" + "requested": "[2.5.6, )", + "resolved": "2.5.6", + "contentHash": "CW6uhMXNaQQNMSG1IWhHkBT+V5eqHqn7MP0zfNMhU9wS/sgKX7FGL3rzoaUgt26wkY3bpf7pDVw3IjXhwfiP4w==" }, "AWSSDK.Core": { "type": "Transitive", @@ -125,14 +149,6 @@ "resolved": "8.2.2", "contentHash": "+zIp8d3sbtYaRbM6hqDs4Ui/z34j7DcUmleruZlYLE4CVxXq+MO8XJyIs42vzeTYFX+k0Iq1dEbBUnQ4z/Gnrw==" }, - "FluentAssertions": { - "type": "Transitive", - "resolved": "6.12.0", - "contentHash": "ZXhHT2YwP9lajrwSKbLlFqsmCCvFJMoRSK9t7sImfnCyd0OB3MhgxdoMcVqxbq1iyxD6mD2fiackWmBb7ayiXQ==", - "dependencies": { - "System.Configuration.ConfigurationManager": "4.4.0" - } - }, "Imageflow.AllPlatforms": { "type": "Transitive", "resolved": "0.10.2", @@ -337,11 +353,6 @@ "resolved": "5.0.0", "contentHash": "VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ==" }, - "Microsoft.NETCore.Targets": { - "type": "Transitive", - "resolved": "1.1.0", - "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" - }, "Microsoft.TestPlatform.ObjectModel": { "type": "Transitive", "resolved": "17.4.1", @@ -360,75 +371,6 @@ "Newtonsoft.Json": "13.0.1" } }, - "Microsoft.Win32.Primitives": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "Moq": { - "type": "Transitive", - "resolved": "4.20.70", - "contentHash": "4rNnAwdpXJBuxqrOCzCyICXHSImOTRktCgCWXWykuF1qwoIsVvEnR7PjbMk/eLOxWvhmj5Kwt+kDV3RGUYcNwg==", - "dependencies": { - "Castle.Core": "5.1.1" - } - }, - "NETStandard.Library": { - "type": "Transitive", - "resolved": "1.6.1", - "contentHash": "WcSp3+vP+yHNgS8EV5J7pZ9IRpeDuARBPN28by8zqff1wJQXm26PVU8L3/fYLBJVU7BtDyqNVWq2KlCVvSSR4A==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.Win32.Primitives": "4.3.0", - "System.AppContext": "4.3.0", - "System.Collections": "4.3.0", - "System.Collections.Concurrent": "4.3.0", - "System.Console": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Diagnostics.Tools": "4.3.0", - "System.Diagnostics.Tracing": "4.3.0", - "System.Globalization": "4.3.0", - "System.Globalization.Calendars": "4.3.0", - "System.IO": "4.3.0", - "System.IO.Compression": "4.3.0", - "System.IO.Compression.ZipFile": "4.3.0", - "System.IO.FileSystem": "4.3.0", - "System.IO.FileSystem.Primitives": "4.3.0", - "System.Linq": "4.3.0", - "System.Linq.Expressions": "4.3.0", - "System.Net.Http": "4.3.0", - "System.Net.Primitives": "4.3.0", - "System.Net.Sockets": "4.3.0", - "System.ObjectModel": "4.3.0", - "System.Reflection": "4.3.0", - "System.Reflection.Extensions": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.Handles": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Runtime.InteropServices.RuntimeInformation": "4.3.0", - "System.Runtime.Numerics": "4.3.0", - "System.Security.Cryptography.Algorithms": "4.3.0", - "System.Security.Cryptography.Encoding": "4.3.0", - "System.Security.Cryptography.Primitives": "4.3.0", - "System.Security.Cryptography.X509Certificates": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Text.Encoding.Extensions": "4.3.0", - "System.Text.RegularExpressions": "4.3.0", - "System.Threading": "4.3.0", - "System.Threading.Tasks": "4.3.0", - "System.Threading.Timer": "4.3.0", - "System.Xml.ReaderWriter": "4.3.0", - "System.Xml.XDocument": "4.3.0" - } - }, "Newtonsoft.Json": { "type": "Transitive", "resolved": "13.0.3", @@ -439,160 +381,6 @@ "resolved": "5.11.0", "contentHash": "eaiXkUjC4NPcquGWzAGMXjuxvLwc6XGKMptSyOGQeT0X70BUZObuybJFZLA0OfTdueLd3US23NBPTBb6iF3V1Q==" }, - "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" - }, - "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" - }, - "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" - }, - "runtime.native.System": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0" - } - }, - "runtime.native.System.IO.Compression": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "INBPonS5QPEgn7naufQFXJEp3zX6L4bwHgJ/ZH78aBTpeNfQMtf7C6VrAFhlq2xxWBveIOWyFzQjJ8XzHMhdOQ==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0" - } - }, - "runtime.native.System.Net.Http": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "ZVuZJqnnegJhd2k/PtAbbIcZ3aZeITq3sj06oKfMBSfphW3HDmk/t4ObvbOk/JA/swGR0LNqMksAh/f7gpTROg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0" - } - }, - "runtime.native.System.Security.Cryptography.Apple": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "DloMk88juo0OuOWr56QG7MNchmafTLYWvABy36izkrLI5VledI0rq28KGs1i9wbpeT9NPQrx/wTf8U2vazqQ3Q==", - "dependencies": { - "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "4.3.0" - } - }, - "runtime.native.System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "NS1U+700m4KFRHR5o4vo9DSlTmlCKu/u7dtE5sUHVIPB+xpXxYQvgBgA6wEIeCz6Yfn0Z52/72WYsToCEPJnrw==", - "dependencies": { - "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", - "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", - "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", - "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", - "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", - "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", - "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", - "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", - "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", - "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" - } - }, - "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" - }, - "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" - }, - "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" - }, - "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" - }, - "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" - }, - "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" - }, - "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" - }, - "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" - }, - "System.AppContext": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "fKC+rmaLfeIzUhagxY17Q9siv/sPrjjKcfNg1Ic8IlQkZLipo8ljcaZQu4VtI4Jqbzjc2VTjzGLF6WmsRXAEgA==", - "dependencies": { - "System.Runtime": "4.3.0" - } - }, - "System.Buffers": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "ratu44uTIHgeBeI0dE8DWvmXVBSo4u7ozRZZHOMmK/JPpYyo0dAfgSiHlpiObMQ5lEtEyIXA40sKRYg5J6A8uQ==", - "dependencies": { - "System.Diagnostics.Debug": "4.3.0", - "System.Diagnostics.Tracing": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Threading": "4.3.0" - } - }, - "System.Collections": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Collections.Concurrent": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==", - "dependencies": { - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Diagnostics.Tracing": "4.3.0", - "System.Globalization": "4.3.0", - "System.Reflection": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Threading": "4.3.0", - "System.Threading.Tasks": "4.3.0" - } - }, "System.Collections.Immutable": { "type": "Transitive", "resolved": "8.0.0", @@ -609,28 +397,6 @@ "System.Security.Cryptography.ProtectedData": "4.4.0" } }, - "System.Console": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.IO": "4.3.0", - "System.Runtime": "4.3.0", - "System.Text.Encoding": "4.3.0" - } - }, - "System.Diagnostics.Debug": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, "System.Diagnostics.DiagnosticSource": { "type": "Transitive", "resolved": "6.0.1", @@ -644,60 +410,6 @@ "resolved": "6.0.0", "contentHash": "lcyUiXTsETK2ALsZrX+nWuHSIQeazhqPphLfaRxzdGaG93+0kELqpgEHtwWOlQe7+jSFnKwaCAgL4kjeZCQJnw==" }, - "System.Diagnostics.Tools": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Diagnostics.Tracing": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Globalization": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Globalization.Calendars": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Globalization": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Globalization.Extensions": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "System.Globalization": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.InteropServices": "4.3.0" - } - }, "System.Interactive.Async": { "type": "Transitive", "resolved": "6.0.1", @@ -706,71 +418,6 @@ "System.Linq.Async": "6.0.1" } }, - "System.IO": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading.Tasks": "4.3.0" - } - }, - "System.IO.Compression": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "System.Buffers": "4.3.0", - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.IO": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.Handles": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading": "4.3.0", - "System.Threading.Tasks": "4.3.0", - "runtime.native.System": "4.3.0", - "runtime.native.System.IO.Compression": "4.3.0" - } - }, - "System.IO.Compression.ZipFile": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "G4HwjEsgIwy3JFBduZ9quBkAu+eUwjIdJleuNSgmUojbH6O3mlvEIme+GHx/cLlTAPcrnnL7GqvB9pTlWRfhOg==", - "dependencies": { - "System.Buffers": "4.3.0", - "System.IO": "4.3.0", - "System.IO.Compression": "4.3.0", - "System.IO.FileSystem": "4.3.0", - "System.IO.FileSystem.Primitives": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Text.Encoding": "4.3.0" - } - }, - "System.IO.FileSystem": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.IO": "4.3.0", - "System.IO.FileSystem.Primitives": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Handles": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading.Tasks": "4.3.0" - } - }, "System.IO.FileSystem.AccessControl": { "type": "Transitive", "resolved": "5.0.0", @@ -780,14 +427,6 @@ "System.Security.Principal.Windows": "5.0.0" } }, - "System.IO.FileSystem.Primitives": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", - "dependencies": { - "System.Runtime": "4.3.0" - } - }, "System.IO.Hashing": { "type": "Transitive", "resolved": "6.0.0", @@ -798,18 +437,6 @@ "resolved": "8.0.0", "contentHash": "FHNOatmUq0sqJOkTx+UF/9YK1f180cnW5FVqnQMvYUN0elp6wFzbtPSiqbo1/ru8ICp43JM1i7kKkk6GsNGHlA==" }, - "System.Linq": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", - "dependencies": { - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0" - } - }, "System.Linq.Async": { "type": "Transitive", "resolved": "6.0.1", @@ -818,30 +445,6 @@ "Microsoft.Bcl.AsyncInterfaces": "6.0.0" } }, - "System.Linq.Expressions": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "PGKkrd2khG4CnlyJwxwwaWWiSiWFNBGlgXvJpeO0xCXrZ89ODrQ6tjEWS/kOqZ8GwEOUATtKtzp1eRgmYNfclg==", - "dependencies": { - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Globalization": "4.3.0", - "System.IO": "4.3.0", - "System.Linq": "4.3.0", - "System.ObjectModel": "4.3.0", - "System.Reflection": "4.3.0", - "System.Reflection.Emit": "4.3.0", - "System.Reflection.Emit.ILGeneration": "4.3.0", - "System.Reflection.Emit.Lightweight": "4.3.0", - "System.Reflection.Extensions": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Reflection.TypeExtensions": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Threading": "4.3.0" - } - }, "System.Memory": { "type": "Transitive", "resolved": "4.5.4", @@ -856,613 +459,142 @@ "System.Text.Json": "4.6.0" } }, - "System.Net.Http": { + "System.Numerics.Vectors": { "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Diagnostics.DiagnosticSource": "4.3.0", - "System.Diagnostics.Tracing": "4.3.0", - "System.Globalization": "4.3.0", - "System.Globalization.Extensions": "4.3.0", - "System.IO": "4.3.0", - "System.IO.FileSystem": "4.3.0", - "System.Net.Primitives": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.Handles": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Security.Cryptography.Algorithms": "4.3.0", - "System.Security.Cryptography.Encoding": "4.3.0", - "System.Security.Cryptography.OpenSsl": "4.3.0", - "System.Security.Cryptography.Primitives": "4.3.0", - "System.Security.Cryptography.X509Certificates": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading": "4.3.0", - "System.Threading.Tasks": "4.3.0", - "runtime.native.System": "4.3.0", - "runtime.native.System.Net.Http": "4.3.0", - "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" - } + "resolved": "4.5.0", + "contentHash": "QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ==" }, - "System.Net.Primitives": { + "System.Reflection.Metadata": { "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0", - "System.Runtime.Handles": "4.3.0" - } + "resolved": "1.6.0", + "contentHash": "COC1aiAJjCoA5GBF+QKL2uLqEBew4JsCkQmoHKbN3TlOZKa2fKLz5CpiRQKDz0RsAOEGsVKqOD5bomsXq/4STQ==" + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" }, - "System.Net.Sockets": { + "System.Security.AccessControl": { "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "resolved": "5.0.0", + "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.IO": "4.3.0", - "System.Net.Primitives": "4.3.0", - "System.Runtime": "4.3.0", - "System.Threading.Tasks": "4.3.0" + "Microsoft.NETCore.Platforms": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" } }, - "System.Numerics.Vectors": { + "System.Security.Cryptography.ProtectedData": { "type": "Transitive", - "resolved": "4.5.0", - "contentHash": "QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ==" + "resolved": "4.7.0", + "contentHash": "ehYW0m9ptxpGWvE4zgqongBVWpSDU/JCFD4K7krxkQwSz/sFQjEXCUqpvencjy6DYDbn7Ig09R8GFffu8TtneQ==" }, - "System.ObjectModel": { + "System.Security.Principal.Windows": { "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==", - "dependencies": { - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Threading": "4.3.0" - } + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" }, - "System.Reflection": { + "System.Text.Encodings.Web": { "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "resolved": "8.0.0", + "contentHash": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ==", "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.IO": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0" + "System.Runtime.CompilerServices.Unsafe": "6.0.0" } }, - "System.Reflection.Emit": { + "System.Text.Json": { "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", - "dependencies": { - "System.IO": "4.3.0", - "System.Reflection": "4.3.0", - "System.Reflection.Emit.ILGeneration": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0" - } + "resolved": "4.7.2", + "contentHash": "TcMd95wcrubm9nHvJEQs70rC0H/8omiSGGpU4FQ/ZA1URIqD4pjmFJh2Mfv1yH1eHgJDWTi2hMDXwTET+zOOyg==" }, - "System.Reflection.Emit.ILGeneration": { + "System.Threading.Tasks.Extensions": { "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", - "dependencies": { - "System.Reflection": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0" - } + "resolved": "4.5.4", + "contentHash": "zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==" }, - "System.Reflection.Emit.Lightweight": { + "xunit.abstractions": { "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==", - "dependencies": { - "System.Reflection": "4.3.0", - "System.Reflection.Emit.ILGeneration": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0" - } + "resolved": "2.0.3", + "contentHash": "pot1I4YOxlWjIb5jmwvvQNbTrZ3lJQ+jUGkGjWE3hEFM0l5gOnBWS+H3qsex68s5cO52g+44vpGzhAt+42vwKg==" }, - "System.Reflection.Extensions": { + "xunit.analyzers": { "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Reflection": "4.3.0", - "System.Runtime": "4.3.0" - } + "resolved": "1.10.0", + "contentHash": "Lw8CiDy5NaAWcO6keqD7iZHYUTIuCOcoFrUHw5Sv84ITZ9gFeDybdkVdH0Y2maSlP9fUjtENyiykT44zwFQIHA==" }, - "System.Reflection.Metadata": { + "xunit.assert": { "type": "Transitive", - "resolved": "1.6.0", - "contentHash": "COC1aiAJjCoA5GBF+QKL2uLqEBew4JsCkQmoHKbN3TlOZKa2fKLz5CpiRQKDz0RsAOEGsVKqOD5bomsXq/4STQ==" + "resolved": "2.6.6", + "contentHash": "74Cm9lAZOk5TKCz2MvCBCByKsS23yryOKDIMxH3XRDHXmfGM02jKZWzRA7g4mGB41GnBnv/pcWP3vUYkrCtEcg==" }, - "System.Reflection.Primitives": { + "xunit.core": { "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "resolved": "2.6.6", + "contentHash": "tqi7RfaNBqM7t8zx6QHryuBPzmotsZXKGaWnopQG2Ez5UV7JoWuyoNdT6gLpDIcKdGYey6YTXJdSr9IXDMKwjg==", "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" + "xunit.extensibility.core": "[2.6.6]", + "xunit.extensibility.execution": "[2.6.6]" } }, - "System.Reflection.TypeExtensions": { + "xunit.extensibility.core": { "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "7u6ulLcZbyxB5Gq0nMkQttcdBTx57ibzw+4IOXEfR+sXYQoHvjW5LTLyNr8O22UIMrqYbchJQJnos4eooYzYJA==", + "resolved": "2.6.6", + "contentHash": "ty6VKByzbx4Toj4/VGJLEnlmOawqZiMv0in/tLju+ftA+lbWuAWDERM+E52Jfhj4ZYHrAYVa14KHK5T+dq0XxA==", "dependencies": { - "System.Reflection": "4.3.0", - "System.Runtime": "4.3.0" + "xunit.abstractions": "2.0.3" } }, - "System.Resources.ResourceManager": { + "xunit.extensibility.execution": { "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "resolved": "2.6.6", + "contentHash": "UDjIVGj2TepVKN3n32/qXIdb3U6STwTb9L6YEwoQO2A8OxiJS5QAVv2l1aT6tDwwv/9WBmm8Khh/LyHALipcng==", "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Globalization": "4.3.0", - "System.Reflection": "4.3.0", - "System.Runtime": "4.3.0" + "xunit.extensibility.core": "[2.6.6]" } }, - "System.Runtime": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "imageflow.server": { + "type": "Project", "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0" + "Imageflow.AllPlatforms": "[0.10.2, )", + "Imazen.Common": "[0.1.0--notset, )", + "Imazen.Routing": "[0.1.0--notset, )" } }, - "System.Runtime.CompilerServices.Unsafe": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" - }, - "System.Runtime.Extensions": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "imageflow.server.hybridcache": { + "type": "Project", "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" + "Imazen.Common": "[0.1.0--notset, )", + "Imazen.HybridCache": "[0.1.0--notset, )", + "Microsoft.Extensions.Hosting.Abstractions": "[2.2.0, )" } }, - "System.Runtime.Handles": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "imageflow.server.storage.azureblob": { + "type": "Project", "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" + "Azure.Storage.Blobs": "[12.19.1, )", + "Imazen.Common": "[0.1.0--notset, )", + "Microsoft.Extensions.Azure": "[1.7.1, )" } }, - "System.Runtime.InteropServices": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "imageflow.server.storage.remotereader": { + "type": "Project", "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Reflection": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Handles": "4.3.0" + "Imazen.Common": "[0.1.0--notset, )", + "Microsoft.Extensions.Http": "[5.0.0, )" } }, - "System.Runtime.InteropServices.RuntimeInformation": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "imageflow.server.storage.s3": { + "type": "Project", "dependencies": { - "System.Reflection": "4.3.0", - "System.Reflection.Extensions": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Threading": "4.3.0", - "runtime.native.System": "4.3.0" + "AWSSDK.S3": "[3.7.305.3, )", + "Imazen.Common": "[0.1.0--notset, )", + "Imazen.Routing": "[0.1.0--notset, )" } }, - "System.Runtime.Numerics": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==", + "imazen.abstractions": { + "type": "Project", "dependencies": { - "System.Globalization": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0" - } - }, - "System.Security.AccessControl": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "5.0.0", - "System.Security.Principal.Windows": "5.0.0" - } - }, - "System.Security.Cryptography.Algorithms": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "System.Collections": "4.3.0", - "System.IO": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.Handles": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Runtime.Numerics": "4.3.0", - "System.Security.Cryptography.Encoding": "4.3.0", - "System.Security.Cryptography.Primitives": "4.3.0", - "System.Text.Encoding": "4.3.0", - "runtime.native.System.Security.Cryptography.Apple": "4.3.0", - "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" - } - }, - "System.Security.Cryptography.Cng": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "System.IO": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.Handles": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Security.Cryptography.Algorithms": "4.3.0", - "System.Security.Cryptography.Encoding": "4.3.0", - "System.Security.Cryptography.Primitives": "4.3.0", - "System.Text.Encoding": "4.3.0" - } - }, - "System.Security.Cryptography.Csp": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "System.IO": "4.3.0", - "System.Reflection": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.Handles": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Security.Cryptography.Algorithms": "4.3.0", - "System.Security.Cryptography.Encoding": "4.3.0", - "System.Security.Cryptography.Primitives": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading": "4.3.0" - } - }, - "System.Security.Cryptography.Encoding": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "System.Collections": "4.3.0", - "System.Collections.Concurrent": "4.3.0", - "System.Linq": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.Handles": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Security.Cryptography.Primitives": "4.3.0", - "System.Text.Encoding": "4.3.0", - "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" - } - }, - "System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", - "dependencies": { - "System.Collections": "4.3.0", - "System.IO": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.Handles": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Runtime.Numerics": "4.3.0", - "System.Security.Cryptography.Algorithms": "4.3.0", - "System.Security.Cryptography.Encoding": "4.3.0", - "System.Security.Cryptography.Primitives": "4.3.0", - "System.Text.Encoding": "4.3.0", - "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" - } - }, - "System.Security.Cryptography.Primitives": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==", - "dependencies": { - "System.Diagnostics.Debug": "4.3.0", - "System.Globalization": "4.3.0", - "System.IO": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Threading": "4.3.0", - "System.Threading.Tasks": "4.3.0" - } - }, - "System.Security.Cryptography.ProtectedData": { - "type": "Transitive", - "resolved": "4.7.0", - "contentHash": "ehYW0m9ptxpGWvE4zgqongBVWpSDU/JCFD4K7krxkQwSz/sFQjEXCUqpvencjy6DYDbn7Ig09R8GFffu8TtneQ==" - }, - "System.Security.Cryptography.X509Certificates": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Globalization": "4.3.0", - "System.Globalization.Calendars": "4.3.0", - "System.IO": "4.3.0", - "System.IO.FileSystem": "4.3.0", - "System.IO.FileSystem.Primitives": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.Handles": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Runtime.Numerics": "4.3.0", - "System.Security.Cryptography.Algorithms": "4.3.0", - "System.Security.Cryptography.Cng": "4.3.0", - "System.Security.Cryptography.Csp": "4.3.0", - "System.Security.Cryptography.Encoding": "4.3.0", - "System.Security.Cryptography.OpenSsl": "4.3.0", - "System.Security.Cryptography.Primitives": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading": "4.3.0", - "runtime.native.System": "4.3.0", - "runtime.native.System.Net.Http": "4.3.0", - "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" - } - }, - "System.Security.Principal.Windows": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" - }, - "System.Text.Encoding": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Text.Encoding.Extensions": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0", - "System.Text.Encoding": "4.3.0" - } - }, - "System.Text.Encodings.Web": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } - }, - "System.Text.Json": { - "type": "Transitive", - "resolved": "4.7.2", - "contentHash": "TcMd95wcrubm9nHvJEQs70rC0H/8omiSGGpU4FQ/ZA1URIqD4pjmFJh2Mfv1yH1eHgJDWTi2hMDXwTET+zOOyg==" - }, - "System.Text.RegularExpressions": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==", - "dependencies": { - "System.Runtime": "4.3.0" - } - }, - "System.Threading": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", - "dependencies": { - "System.Runtime": "4.3.0", - "System.Threading.Tasks": "4.3.0" - } - }, - "System.Threading.Tasks": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Threading.Tasks.Extensions": { - "type": "Transitive", - "resolved": "4.5.4", - "contentHash": "zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==" - }, - "System.Threading.Timer": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Xml.ReaderWriter": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==", - "dependencies": { - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Globalization": "4.3.0", - "System.IO": "4.3.0", - "System.IO.FileSystem": "4.3.0", - "System.IO.FileSystem.Primitives": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Text.Encoding.Extensions": "4.3.0", - "System.Text.RegularExpressions": "4.3.0", - "System.Threading.Tasks": "4.3.0", - "System.Threading.Tasks.Extensions": "4.3.0" - } - }, - "System.Xml.XDocument": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "5zJ0XDxAIg8iy+t4aMnQAu0MqVbqyvfoUVl1yDV61xdo3Vth45oA2FoY4pPkxYAH5f8ixpmTqXeEIya95x0aCQ==", - "dependencies": { - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Diagnostics.Tools": "4.3.0", - "System.Globalization": "4.3.0", - "System.IO": "4.3.0", - "System.Reflection": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading": "4.3.0", - "System.Xml.ReaderWriter": "4.3.0" - } - }, - "xunit.abstractions": { - "type": "Transitive", - "resolved": "2.0.3", - "contentHash": "pot1I4YOxlWjIb5jmwvvQNbTrZ3lJQ+jUGkGjWE3hEFM0l5gOnBWS+H3qsex68s5cO52g+44vpGzhAt+42vwKg==" - }, - "xunit.analyzers": { - "type": "Transitive", - "resolved": "0.10.0", - "contentHash": "4/IDFCJfIeg6bix9apmUtIMwvOsiwqdEexeO/R2D4GReIGPLIRODTpId/l4LRSrAJk9lEO3Zx1H0Zx6uohJDNg==" - }, - "xunit.assert": { - "type": "Transitive", - "resolved": "2.4.1", - "contentHash": "O/Oe0BS5RmSsM+LQOb041TzuPo5MdH2Rov+qXGS37X+KFG1Hxz7kopYklM5+1Y+tRGeXrOx5+Xne1RuqLFQoyQ==", - "dependencies": { - "NETStandard.Library": "1.6.1" - } - }, - "xunit.core": { - "type": "Transitive", - "resolved": "2.4.1", - "contentHash": "Zsj5OMU6JasNGERXZy8s72+pcheG6Q15atS5XpZXqAtULuyQiQ6XNnUsp1gyfC6WgqScqMvySiEHmHcOG6Eg0Q==", - "dependencies": { - "xunit.extensibility.core": "[2.4.1]", - "xunit.extensibility.execution": "[2.4.1]" - } - }, - "xunit.extensibility.core": { - "type": "Transitive", - "resolved": "2.4.1", - "contentHash": "yKZKm/8QNZnBnGZFD9SewkllHBiK0DThybQD/G4PiAmQjKtEZyHi6ET70QPU9KtSMJGRYS6Syk7EyR2EVDU4Kg==", - "dependencies": { - "NETStandard.Library": "1.6.1", - "xunit.abstractions": "2.0.3" - } - }, - "xunit.extensibility.execution": { - "type": "Transitive", - "resolved": "2.4.1", - "contentHash": "7e/1jqBpcb7frLkB6XDrHCGXAbKN4Rtdb88epYxCSRQuZDRW8UtTfdTEVpdTl8s4T56e07hOBVd4G0OdCxIY2A==", - "dependencies": { - "NETStandard.Library": "1.6.1", - "xunit.extensibility.core": "[2.4.1]" - } - }, - "imageflow.server": { - "type": "Project", - "dependencies": { - "Imageflow.AllPlatforms": "[0.10.2, )", - "Imazen.Common": "[0.1.0--notset, )", - "Imazen.Routing": "[0.1.0--notset, )" - } - }, - "imageflow.server.hybridcache": { - "type": "Project", - "dependencies": { - "Imazen.Common": "[0.1.0--notset, )", - "Imazen.HybridCache": "[0.1.0--notset, )", - "Microsoft.Extensions.Hosting.Abstractions": "[2.2.0, )" - } - }, - "imageflow.server.storage.azureblob": { - "type": "Project", - "dependencies": { - "Azure.Storage.Blobs": "[12.19.1, )", - "Imazen.Common": "[0.1.0--notset, )", - "Microsoft.Extensions.Azure": "[1.7.1, )" - } - }, - "imageflow.server.storage.remotereader": { - "type": "Project", - "dependencies": { - "Imazen.Common": "[0.1.0--notset, )", - "Microsoft.Extensions.Http": "[5.0.0, )" - } - }, - "imageflow.server.storage.s3": { - "type": "Project", - "dependencies": { - "AWSSDK.S3": "[3.7.305.3, )", - "Imazen.Common": "[0.1.0--notset, )", - "Imazen.Routing": "[0.1.0--notset, )" - } - }, - "imazen.abstractions": { - "type": "Project", - "dependencies": { - "Microsoft.Extensions.Hosting.Abstractions": "[2.2.0, )", - "System.Text.Encodings.Web": "[8.0.0, )" + "Microsoft.Extensions.Hosting.Abstractions": "[2.2.0, )", + "System.Text.Encodings.Web": "[8.0.0, )" } }, "imazen.common": { @@ -1512,6 +644,15 @@ "resolved": "6.0.0", "contentHash": "tW3lsNS+dAEII6YGUX/VMoJjBS1QvsxqJeqLaJXub08y1FSjasFPtQ4UBUsudE9PNrzLjooClMsPtY2cZLdXpQ==" }, + "FluentAssertions": { + "type": "Direct", + "requested": "[6.12.0, )", + "resolved": "6.12.0", + "contentHash": "ZXhHT2YwP9lajrwSKbLlFqsmCCvFJMoRSK9t7sImfnCyd0OB3MhgxdoMcVqxbq1iyxD6mD2fiackWmBb7ayiXQ==", + "dependencies": { + "System.Configuration.ConfigurationManager": "4.4.0" + } + }, "Microsoft.AspNetCore.TestHost": { "type": "Direct", "requested": "[3.1.5, )", @@ -1540,22 +681,37 @@ "Microsoft.TestPlatform.TestHost": "17.4.1" } }, + "Moq": { + "type": "Direct", + "requested": "[4.20.70, )", + "resolved": "4.20.70", + "contentHash": "4rNnAwdpXJBuxqrOCzCyICXHSImOTRktCgCWXWykuF1qwoIsVvEnR7PjbMk/eLOxWvhmj5Kwt+kDV3RGUYcNwg==", + "dependencies": { + "Castle.Core": "5.1.1" + } + }, + "PolySharp": { + "type": "Direct", + "requested": "[1.14.1, )", + "resolved": "1.14.1", + "contentHash": "mOOmFYwad3MIOL14VCjj02LljyF1GNw1wP0YVlxtcPvqdxjGGMNdNJJxHptlry3MOd8b40Flm8RPOM8JOlN2sQ==" + }, "xunit": { "type": "Direct", - "requested": "[2.4.1, )", - "resolved": "2.4.1", - "contentHash": "XNR3Yz9QTtec16O0aKcO6+baVNpXmOnPUxDkCY97J+8krUYxPvXT1szYYEUdKk4sB8GOI2YbAjRIOm8ZnXRfzQ==", + "requested": "[2.6.6, )", + "resolved": "2.6.6", + "contentHash": "MAbOOMtZIKyn2lrAmMlvhX0BhDOX/smyrTB+8WTXnSKkrmTGBS2fm8g1PZtHBPj91Dc5DJA7fY+/81TJ/yUFZw==", "dependencies": { - "xunit.analyzers": "0.10.0", - "xunit.assert": "[2.4.1]", - "xunit.core": "[2.4.1]" + "xunit.analyzers": "1.10.0", + "xunit.assert": "2.6.6", + "xunit.core": "[2.6.6]" } }, "xunit.runner.visualstudio": { "type": "Direct", - "requested": "[2.4.5, )", - "resolved": "2.4.5", - "contentHash": "OwHamvBdUKgqsXfBzWiCW/O98BTx81UKzx2bieIOQI7CZFE5NEQZGi8PBQGIKawDW96xeRffiNf20SjfC0x9hw==" + "requested": "[2.5.6, )", + "resolved": "2.5.6", + "contentHash": "CW6uhMXNaQQNMSG1IWhHkBT+V5eqHqn7MP0zfNMhU9wS/sgKX7FGL3rzoaUgt26wkY3bpf7pDVw3IjXhwfiP4w==" }, "AWSSDK.Core": { "type": "Transitive", @@ -1629,14 +785,6 @@ "resolved": "8.2.2", "contentHash": "+zIp8d3sbtYaRbM6hqDs4Ui/z34j7DcUmleruZlYLE4CVxXq+MO8XJyIs42vzeTYFX+k0Iq1dEbBUnQ4z/Gnrw==" }, - "FluentAssertions": { - "type": "Transitive", - "resolved": "6.12.0", - "contentHash": "ZXhHT2YwP9lajrwSKbLlFqsmCCvFJMoRSK9t7sImfnCyd0OB3MhgxdoMcVqxbq1iyxD6mD2fiackWmBb7ayiXQ==", - "dependencies": { - "System.Configuration.ConfigurationManager": "4.4.0" - } - }, "Imageflow.AllPlatforms": { "type": "Transitive", "resolved": "0.10.2", @@ -1838,11 +986,6 @@ "resolved": "5.0.0", "contentHash": "VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ==" }, - "Microsoft.NETCore.Targets": { - "type": "Transitive", - "resolved": "1.1.0", - "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" - }, "Microsoft.TestPlatform.ObjectModel": { "type": "Transitive", "resolved": "17.4.1", @@ -1861,75 +1004,6 @@ "Newtonsoft.Json": "13.0.1" } }, - "Microsoft.Win32.Primitives": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "Moq": { - "type": "Transitive", - "resolved": "4.20.70", - "contentHash": "4rNnAwdpXJBuxqrOCzCyICXHSImOTRktCgCWXWykuF1qwoIsVvEnR7PjbMk/eLOxWvhmj5Kwt+kDV3RGUYcNwg==", - "dependencies": { - "Castle.Core": "5.1.1" - } - }, - "NETStandard.Library": { - "type": "Transitive", - "resolved": "1.6.1", - "contentHash": "WcSp3+vP+yHNgS8EV5J7pZ9IRpeDuARBPN28by8zqff1wJQXm26PVU8L3/fYLBJVU7BtDyqNVWq2KlCVvSSR4A==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.Win32.Primitives": "4.3.0", - "System.AppContext": "4.3.0", - "System.Collections": "4.3.0", - "System.Collections.Concurrent": "4.3.0", - "System.Console": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Diagnostics.Tools": "4.3.0", - "System.Diagnostics.Tracing": "4.3.0", - "System.Globalization": "4.3.0", - "System.Globalization.Calendars": "4.3.0", - "System.IO": "4.3.0", - "System.IO.Compression": "4.3.0", - "System.IO.Compression.ZipFile": "4.3.0", - "System.IO.FileSystem": "4.3.0", - "System.IO.FileSystem.Primitives": "4.3.0", - "System.Linq": "4.3.0", - "System.Linq.Expressions": "4.3.0", - "System.Net.Http": "4.3.0", - "System.Net.Primitives": "4.3.0", - "System.Net.Sockets": "4.3.0", - "System.ObjectModel": "4.3.0", - "System.Reflection": "4.3.0", - "System.Reflection.Extensions": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.Handles": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Runtime.InteropServices.RuntimeInformation": "4.3.0", - "System.Runtime.Numerics": "4.3.0", - "System.Security.Cryptography.Algorithms": "4.3.0", - "System.Security.Cryptography.Encoding": "4.3.0", - "System.Security.Cryptography.Primitives": "4.3.0", - "System.Security.Cryptography.X509Certificates": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Text.Encoding.Extensions": "4.3.0", - "System.Text.RegularExpressions": "4.3.0", - "System.Threading": "4.3.0", - "System.Threading.Tasks": "4.3.0", - "System.Threading.Timer": "4.3.0", - "System.Xml.ReaderWriter": "4.3.0", - "System.Xml.XDocument": "4.3.0" - } - }, "Newtonsoft.Json": { "type": "Transitive", "resolved": "13.0.3", @@ -1940,160 +1014,6 @@ "resolved": "5.11.0", "contentHash": "eaiXkUjC4NPcquGWzAGMXjuxvLwc6XGKMptSyOGQeT0X70BUZObuybJFZLA0OfTdueLd3US23NBPTBb6iF3V1Q==" }, - "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" - }, - "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" - }, - "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" - }, - "runtime.native.System": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0" - } - }, - "runtime.native.System.IO.Compression": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "INBPonS5QPEgn7naufQFXJEp3zX6L4bwHgJ/ZH78aBTpeNfQMtf7C6VrAFhlq2xxWBveIOWyFzQjJ8XzHMhdOQ==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0" - } - }, - "runtime.native.System.Net.Http": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "ZVuZJqnnegJhd2k/PtAbbIcZ3aZeITq3sj06oKfMBSfphW3HDmk/t4ObvbOk/JA/swGR0LNqMksAh/f7gpTROg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0" - } - }, - "runtime.native.System.Security.Cryptography.Apple": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "DloMk88juo0OuOWr56QG7MNchmafTLYWvABy36izkrLI5VledI0rq28KGs1i9wbpeT9NPQrx/wTf8U2vazqQ3Q==", - "dependencies": { - "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "4.3.0" - } - }, - "runtime.native.System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "NS1U+700m4KFRHR5o4vo9DSlTmlCKu/u7dtE5sUHVIPB+xpXxYQvgBgA6wEIeCz6Yfn0Z52/72WYsToCEPJnrw==", - "dependencies": { - "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", - "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", - "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", - "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", - "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", - "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", - "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", - "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", - "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", - "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" - } - }, - "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" - }, - "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" - }, - "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" - }, - "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" - }, - "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" - }, - "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" - }, - "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" - }, - "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" - }, - "System.AppContext": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "fKC+rmaLfeIzUhagxY17Q9siv/sPrjjKcfNg1Ic8IlQkZLipo8ljcaZQu4VtI4Jqbzjc2VTjzGLF6WmsRXAEgA==", - "dependencies": { - "System.Runtime": "4.3.0" - } - }, - "System.Buffers": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "ratu44uTIHgeBeI0dE8DWvmXVBSo4u7ozRZZHOMmK/JPpYyo0dAfgSiHlpiObMQ5lEtEyIXA40sKRYg5J6A8uQ==", - "dependencies": { - "System.Diagnostics.Debug": "4.3.0", - "System.Diagnostics.Tracing": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Threading": "4.3.0" - } - }, - "System.Collections": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Collections.Concurrent": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==", - "dependencies": { - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Diagnostics.Tracing": "4.3.0", - "System.Globalization": "4.3.0", - "System.Reflection": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Threading": "4.3.0", - "System.Threading.Tasks": "4.3.0" - } - }, "System.Collections.Immutable": { "type": "Transitive", "resolved": "8.0.0", @@ -2107,28 +1027,6 @@ "System.Security.Cryptography.ProtectedData": "4.4.0" } }, - "System.Console": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.IO": "4.3.0", - "System.Runtime": "4.3.0", - "System.Text.Encoding": "4.3.0" - } - }, - "System.Diagnostics.Debug": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, "System.Diagnostics.DiagnosticSource": { "type": "Transitive", "resolved": "6.0.1", @@ -2142,60 +1040,6 @@ "resolved": "6.0.0", "contentHash": "lcyUiXTsETK2ALsZrX+nWuHSIQeazhqPphLfaRxzdGaG93+0kELqpgEHtwWOlQe7+jSFnKwaCAgL4kjeZCQJnw==" }, - "System.Diagnostics.Tools": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Diagnostics.Tracing": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Globalization": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Globalization.Calendars": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Globalization": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Globalization.Extensions": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "System.Globalization": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.InteropServices": "4.3.0" - } - }, "System.Interactive.Async": { "type": "Transitive", "resolved": "6.0.1", @@ -2204,71 +1048,6 @@ "System.Linq.Async": "6.0.1" } }, - "System.IO": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading.Tasks": "4.3.0" - } - }, - "System.IO.Compression": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "System.Buffers": "4.3.0", - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.IO": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.Handles": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading": "4.3.0", - "System.Threading.Tasks": "4.3.0", - "runtime.native.System": "4.3.0", - "runtime.native.System.IO.Compression": "4.3.0" - } - }, - "System.IO.Compression.ZipFile": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "G4HwjEsgIwy3JFBduZ9quBkAu+eUwjIdJleuNSgmUojbH6O3mlvEIme+GHx/cLlTAPcrnnL7GqvB9pTlWRfhOg==", - "dependencies": { - "System.Buffers": "4.3.0", - "System.IO": "4.3.0", - "System.IO.Compression": "4.3.0", - "System.IO.FileSystem": "4.3.0", - "System.IO.FileSystem.Primitives": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Text.Encoding": "4.3.0" - } - }, - "System.IO.FileSystem": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.IO": "4.3.0", - "System.IO.FileSystem.Primitives": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Handles": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading.Tasks": "4.3.0" - } - }, "System.IO.FileSystem.AccessControl": { "type": "Transitive", "resolved": "5.0.0", @@ -2278,14 +1057,6 @@ "System.Security.Principal.Windows": "5.0.0" } }, - "System.IO.FileSystem.Primitives": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", - "dependencies": { - "System.Runtime": "4.3.0" - } - }, "System.IO.Hashing": { "type": "Transitive", "resolved": "6.0.0", @@ -2296,18 +1067,6 @@ "resolved": "8.0.0", "contentHash": "FHNOatmUq0sqJOkTx+UF/9YK1f180cnW5FVqnQMvYUN0elp6wFzbtPSiqbo1/ru8ICp43JM1i7kKkk6GsNGHlA==" }, - "System.Linq": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", - "dependencies": { - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0" - } - }, "System.Linq.Async": { "type": "Transitive", "resolved": "6.0.1", @@ -2316,30 +1075,6 @@ "Microsoft.Bcl.AsyncInterfaces": "6.0.0" } }, - "System.Linq.Expressions": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "PGKkrd2khG4CnlyJwxwwaWWiSiWFNBGlgXvJpeO0xCXrZ89ODrQ6tjEWS/kOqZ8GwEOUATtKtzp1eRgmYNfclg==", - "dependencies": { - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Globalization": "4.3.0", - "System.IO": "4.3.0", - "System.Linq": "4.3.0", - "System.ObjectModel": "4.3.0", - "System.Reflection": "4.3.0", - "System.Reflection.Emit": "4.3.0", - "System.Reflection.Emit.ILGeneration": "4.3.0", - "System.Reflection.Emit.Lightweight": "4.3.0", - "System.Reflection.Extensions": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Reflection.TypeExtensions": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Threading": "4.3.0" - } - }, "System.Memory": { "type": "Transitive", "resolved": "4.5.4", @@ -2354,244 +1089,21 @@ "System.Text.Json": "4.6.0" } }, - "System.Net.Http": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Diagnostics.DiagnosticSource": "4.3.0", - "System.Diagnostics.Tracing": "4.3.0", - "System.Globalization": "4.3.0", - "System.Globalization.Extensions": "4.3.0", - "System.IO": "4.3.0", - "System.IO.FileSystem": "4.3.0", - "System.Net.Primitives": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.Handles": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Security.Cryptography.Algorithms": "4.3.0", - "System.Security.Cryptography.Encoding": "4.3.0", - "System.Security.Cryptography.OpenSsl": "4.3.0", - "System.Security.Cryptography.Primitives": "4.3.0", - "System.Security.Cryptography.X509Certificates": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading": "4.3.0", - "System.Threading.Tasks": "4.3.0", - "runtime.native.System": "4.3.0", - "runtime.native.System.Net.Http": "4.3.0", - "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" - } - }, - "System.Net.Primitives": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0", - "System.Runtime.Handles": "4.3.0" - } - }, - "System.Net.Sockets": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.IO": "4.3.0", - "System.Net.Primitives": "4.3.0", - "System.Runtime": "4.3.0", - "System.Threading.Tasks": "4.3.0" - } - }, "System.Numerics.Vectors": { "type": "Transitive", "resolved": "4.5.0", "contentHash": "QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ==" }, - "System.ObjectModel": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==", - "dependencies": { - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Threading": "4.3.0" - } - }, - "System.Reflection": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.IO": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.Emit": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", - "dependencies": { - "System.IO": "4.3.0", - "System.Reflection": "4.3.0", - "System.Reflection.Emit.ILGeneration": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.Emit.ILGeneration": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", - "dependencies": { - "System.Reflection": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.Emit.Lightweight": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==", - "dependencies": { - "System.Reflection": "4.3.0", - "System.Reflection.Emit.ILGeneration": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.Extensions": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Reflection": "4.3.0", - "System.Runtime": "4.3.0" - } - }, "System.Reflection.Metadata": { "type": "Transitive", "resolved": "1.6.0", "contentHash": "COC1aiAJjCoA5GBF+QKL2uLqEBew4JsCkQmoHKbN3TlOZKa2fKLz5CpiRQKDz0RsAOEGsVKqOD5bomsXq/4STQ==" }, - "System.Reflection.Primitives": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.TypeExtensions": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "7u6ulLcZbyxB5Gq0nMkQttcdBTx57ibzw+4IOXEfR+sXYQoHvjW5LTLyNr8O22UIMrqYbchJQJnos4eooYzYJA==", - "dependencies": { - "System.Reflection": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Resources.ResourceManager": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Globalization": "4.3.0", - "System.Reflection": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Runtime": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0" - } - }, "System.Runtime.CompilerServices.Unsafe": { "type": "Transitive", "resolved": "6.0.0", "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" }, - "System.Runtime.Extensions": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Runtime.Handles": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Runtime.InteropServices": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Reflection": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Handles": "4.3.0" - } - }, - "System.Runtime.InteropServices.RuntimeInformation": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", - "dependencies": { - "System.Reflection": "4.3.0", - "System.Reflection.Extensions": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Threading": "4.3.0", - "runtime.native.System": "4.3.0" - } - }, - "System.Runtime.Numerics": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==", - "dependencies": { - "System.Globalization": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0" - } - }, "System.Security.AccessControl": { "type": "Transitive", "resolved": "5.0.0", @@ -2601,181 +1113,16 @@ "System.Security.Principal.Windows": "5.0.0" } }, - "System.Security.Cryptography.Algorithms": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "System.Collections": "4.3.0", - "System.IO": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.Handles": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Runtime.Numerics": "4.3.0", - "System.Security.Cryptography.Encoding": "4.3.0", - "System.Security.Cryptography.Primitives": "4.3.0", - "System.Text.Encoding": "4.3.0", - "runtime.native.System.Security.Cryptography.Apple": "4.3.0", - "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" - } - }, - "System.Security.Cryptography.Cng": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "System.IO": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.Handles": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Security.Cryptography.Algorithms": "4.3.0", - "System.Security.Cryptography.Encoding": "4.3.0", - "System.Security.Cryptography.Primitives": "4.3.0", - "System.Text.Encoding": "4.3.0" - } - }, - "System.Security.Cryptography.Csp": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "System.IO": "4.3.0", - "System.Reflection": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.Handles": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Security.Cryptography.Algorithms": "4.3.0", - "System.Security.Cryptography.Encoding": "4.3.0", - "System.Security.Cryptography.Primitives": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading": "4.3.0" - } - }, - "System.Security.Cryptography.Encoding": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "System.Collections": "4.3.0", - "System.Collections.Concurrent": "4.3.0", - "System.Linq": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.Handles": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Security.Cryptography.Primitives": "4.3.0", - "System.Text.Encoding": "4.3.0", - "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" - } - }, - "System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", - "dependencies": { - "System.Collections": "4.3.0", - "System.IO": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.Handles": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Runtime.Numerics": "4.3.0", - "System.Security.Cryptography.Algorithms": "4.3.0", - "System.Security.Cryptography.Encoding": "4.3.0", - "System.Security.Cryptography.Primitives": "4.3.0", - "System.Text.Encoding": "4.3.0", - "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" - } - }, - "System.Security.Cryptography.Primitives": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==", - "dependencies": { - "System.Diagnostics.Debug": "4.3.0", - "System.Globalization": "4.3.0", - "System.IO": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Threading": "4.3.0", - "System.Threading.Tasks": "4.3.0" - } - }, "System.Security.Cryptography.ProtectedData": { "type": "Transitive", "resolved": "4.7.0", "contentHash": "ehYW0m9ptxpGWvE4zgqongBVWpSDU/JCFD4K7krxkQwSz/sFQjEXCUqpvencjy6DYDbn7Ig09R8GFffu8TtneQ==" }, - "System.Security.Cryptography.X509Certificates": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Globalization": "4.3.0", - "System.Globalization.Calendars": "4.3.0", - "System.IO": "4.3.0", - "System.IO.FileSystem": "4.3.0", - "System.IO.FileSystem.Primitives": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.Handles": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Runtime.Numerics": "4.3.0", - "System.Security.Cryptography.Algorithms": "4.3.0", - "System.Security.Cryptography.Cng": "4.3.0", - "System.Security.Cryptography.Csp": "4.3.0", - "System.Security.Cryptography.Encoding": "4.3.0", - "System.Security.Cryptography.OpenSsl": "4.3.0", - "System.Security.Cryptography.Primitives": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading": "4.3.0", - "runtime.native.System": "4.3.0", - "runtime.native.System.Net.Http": "4.3.0", - "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" - } - }, "System.Security.Principal.Windows": { "type": "Transitive", "resolved": "5.0.0", "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" }, - "System.Text.Encoding": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Text.Encoding.Extensions": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0", - "System.Text.Encoding": "4.3.0" - } - }, "System.Text.Encodings.Web": { "type": "Transitive", "resolved": "8.0.0", @@ -2786,89 +1133,11 @@ "resolved": "4.7.2", "contentHash": "TcMd95wcrubm9nHvJEQs70rC0H/8omiSGGpU4FQ/ZA1URIqD4pjmFJh2Mfv1yH1eHgJDWTi2hMDXwTET+zOOyg==" }, - "System.Text.RegularExpressions": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==", - "dependencies": { - "System.Runtime": "4.3.0" - } - }, - "System.Threading": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", - "dependencies": { - "System.Runtime": "4.3.0", - "System.Threading.Tasks": "4.3.0" - } - }, - "System.Threading.Tasks": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, "System.Threading.Tasks.Extensions": { "type": "Transitive", "resolved": "4.5.4", "contentHash": "zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==" }, - "System.Threading.Timer": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Xml.ReaderWriter": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==", - "dependencies": { - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Globalization": "4.3.0", - "System.IO": "4.3.0", - "System.IO.FileSystem": "4.3.0", - "System.IO.FileSystem.Primitives": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Text.Encoding.Extensions": "4.3.0", - "System.Text.RegularExpressions": "4.3.0", - "System.Threading.Tasks": "4.3.0", - "System.Threading.Tasks.Extensions": "4.3.0" - } - }, - "System.Xml.XDocument": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "5zJ0XDxAIg8iy+t4aMnQAu0MqVbqyvfoUVl1yDV61xdo3Vth45oA2FoY4pPkxYAH5f8ixpmTqXeEIya95x0aCQ==", - "dependencies": { - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Diagnostics.Tools": "4.3.0", - "System.Globalization": "4.3.0", - "System.IO": "4.3.0", - "System.Reflection": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading": "4.3.0", - "System.Xml.ReaderWriter": "4.3.0" - } - }, "xunit.abstractions": { "type": "Transitive", "resolved": "2.0.3", @@ -2876,42 +1145,37 @@ }, "xunit.analyzers": { "type": "Transitive", - "resolved": "0.10.0", - "contentHash": "4/IDFCJfIeg6bix9apmUtIMwvOsiwqdEexeO/R2D4GReIGPLIRODTpId/l4LRSrAJk9lEO3Zx1H0Zx6uohJDNg==" + "resolved": "1.10.0", + "contentHash": "Lw8CiDy5NaAWcO6keqD7iZHYUTIuCOcoFrUHw5Sv84ITZ9gFeDybdkVdH0Y2maSlP9fUjtENyiykT44zwFQIHA==" }, "xunit.assert": { "type": "Transitive", - "resolved": "2.4.1", - "contentHash": "O/Oe0BS5RmSsM+LQOb041TzuPo5MdH2Rov+qXGS37X+KFG1Hxz7kopYklM5+1Y+tRGeXrOx5+Xne1RuqLFQoyQ==", - "dependencies": { - "NETStandard.Library": "1.6.1" - } + "resolved": "2.6.6", + "contentHash": "74Cm9lAZOk5TKCz2MvCBCByKsS23yryOKDIMxH3XRDHXmfGM02jKZWzRA7g4mGB41GnBnv/pcWP3vUYkrCtEcg==" }, "xunit.core": { "type": "Transitive", - "resolved": "2.4.1", - "contentHash": "Zsj5OMU6JasNGERXZy8s72+pcheG6Q15atS5XpZXqAtULuyQiQ6XNnUsp1gyfC6WgqScqMvySiEHmHcOG6Eg0Q==", + "resolved": "2.6.6", + "contentHash": "tqi7RfaNBqM7t8zx6QHryuBPzmotsZXKGaWnopQG2Ez5UV7JoWuyoNdT6gLpDIcKdGYey6YTXJdSr9IXDMKwjg==", "dependencies": { - "xunit.extensibility.core": "[2.4.1]", - "xunit.extensibility.execution": "[2.4.1]" + "xunit.extensibility.core": "[2.6.6]", + "xunit.extensibility.execution": "[2.6.6]" } }, "xunit.extensibility.core": { "type": "Transitive", - "resolved": "2.4.1", - "contentHash": "yKZKm/8QNZnBnGZFD9SewkllHBiK0DThybQD/G4PiAmQjKtEZyHi6ET70QPU9KtSMJGRYS6Syk7EyR2EVDU4Kg==", + "resolved": "2.6.6", + "contentHash": "ty6VKByzbx4Toj4/VGJLEnlmOawqZiMv0in/tLju+ftA+lbWuAWDERM+E52Jfhj4ZYHrAYVa14KHK5T+dq0XxA==", "dependencies": { - "NETStandard.Library": "1.6.1", "xunit.abstractions": "2.0.3" } }, "xunit.extensibility.execution": { "type": "Transitive", - "resolved": "2.4.1", - "contentHash": "7e/1jqBpcb7frLkB6XDrHCGXAbKN4Rtdb88epYxCSRQuZDRW8UtTfdTEVpdTl8s4T56e07hOBVd4G0OdCxIY2A==", + "resolved": "2.6.6", + "contentHash": "UDjIVGj2TepVKN3n32/qXIdb3U6STwTb9L6YEwoQO2A8OxiJS5QAVv2l1aT6tDwwv/9WBmm8Khh/LyHALipcng==", "dependencies": { - "NETStandard.Library": "1.6.1", - "xunit.extensibility.core": "[2.4.1]" + "xunit.extensibility.core": "[2.6.6]" } }, "imageflow.server": { diff --git a/tests/ImazenShared.Tests/ImazenShared.Tests.csproj b/tests/ImazenShared.Tests/ImazenShared.Tests.csproj index ca6e6cca..0fa4505e 100644 --- a/tests/ImazenShared.Tests/ImazenShared.Tests.csproj +++ b/tests/ImazenShared.Tests/ImazenShared.Tests.csproj @@ -2,6 +2,7 @@ Imazen.Common.Tests + net8.0;net48;net6.0 diff --git a/tests/ImazenShared.Tests/Routing/Serving/ImageServerTests.cs b/tests/ImazenShared.Tests/Routing/Serving/ImageServerTests.cs index df18446a..9c7224b4 100644 --- a/tests/ImazenShared.Tests/Routing/Serving/ImageServerTests.cs +++ b/tests/ImazenShared.Tests/Routing/Serving/ImageServerTests.cs @@ -14,7 +14,7 @@ public class ImageServerTests private readonly IReLogger logger; private readonly IReLogStore logStore; private readonly List logList; - + public ImageServerTests() { licenseChecker = MockLicenseChecker.AlwaysOK(); @@ -33,6 +33,7 @@ internal ImageServer return new ImageServer( licenseChecker, routingEngine, + new NullPerformanceTracker(), imageServerOptions, legacyOptions, loggerFactory diff --git a/tests/ImazenShared.Tests/packages.lock.json b/tests/ImazenShared.Tests/packages.lock.json index ade925ed..c2780c78 100644 --- a/tests/ImazenShared.Tests/packages.lock.json +++ b/tests/ImazenShared.Tests/packages.lock.json @@ -1,336 +1,6 @@ { "version": 1, "dependencies": { - ".NETFramework,Version=v4.8": { - "coverlet.collector": { - "type": "Direct", - "requested": "[6.0.0, )", - "resolved": "6.0.0", - "contentHash": "tW3lsNS+dAEII6YGUX/VMoJjBS1QvsxqJeqLaJXub08y1FSjasFPtQ4UBUsudE9PNrzLjooClMsPtY2cZLdXpQ==" - }, - "FluentAssertions": { - "type": "Direct", - "requested": "[6.12.0, )", - "resolved": "6.12.0", - "contentHash": "ZXhHT2YwP9lajrwSKbLlFqsmCCvFJMoRSK9t7sImfnCyd0OB3MhgxdoMcVqxbq1iyxD6mD2fiackWmBb7ayiXQ==", - "dependencies": { - "System.Threading.Tasks.Extensions": "4.5.0" - } - }, - "Microsoft.Extensions.FileProviders.Embedded": { - "type": "Direct", - "requested": "[2.2.0, )", - "resolved": "2.2.0", - "contentHash": "6e22jnVntG9JLLowjY40UBPLXkKTRlDpFHmo2evN8lwZIpO89ZRGz6JRdqhnVYCaavq5KeFU2W5VKPA5y5farA==", - "dependencies": { - "Microsoft.Extensions.FileProviders.Abstractions": "2.2.0" - } - }, - "Microsoft.NET.Test.Sdk": { - "type": "Direct", - "requested": "[17.4.1, )", - "resolved": "17.4.1", - "contentHash": "kJ5/v2ad+VEg1fL8UH18nD71Eu+Fq6dM4RKBVqlV2MLSEK/AW4LUkqlk7m7G+BrxEDJVwPjxHam17nldxV80Ow==", - "dependencies": { - "Microsoft.CodeCoverage": "17.4.1" - } - }, - "Moq": { - "type": "Direct", - "requested": "[4.20.70, )", - "resolved": "4.20.70", - "contentHash": "4rNnAwdpXJBuxqrOCzCyICXHSImOTRktCgCWXWykuF1qwoIsVvEnR7PjbMk/eLOxWvhmj5Kwt+kDV3RGUYcNwg==", - "dependencies": { - "Castle.Core": "5.1.1", - "System.Threading.Tasks.Extensions": "4.5.4" - } - }, - "PolySharp": { - "type": "Direct", - "requested": "[1.14.1, )", - "resolved": "1.14.1", - "contentHash": "mOOmFYwad3MIOL14VCjj02LljyF1GNw1wP0YVlxtcPvqdxjGGMNdNJJxHptlry3MOd8b40Flm8RPOM8JOlN2sQ==" - }, - "xunit": { - "type": "Direct", - "requested": "[2.6.6, )", - "resolved": "2.6.6", - "contentHash": "MAbOOMtZIKyn2lrAmMlvhX0BhDOX/smyrTB+8WTXnSKkrmTGBS2fm8g1PZtHBPj91Dc5DJA7fY+/81TJ/yUFZw==", - "dependencies": { - "xunit.analyzers": "1.10.0", - "xunit.assert": "2.6.6", - "xunit.core": "[2.6.6]" - } - }, - "xunit.runner.visualstudio": { - "type": "Direct", - "requested": "[2.5.6, )", - "resolved": "2.5.6", - "contentHash": "CW6uhMXNaQQNMSG1IWhHkBT+V5eqHqn7MP0zfNMhU9wS/sgKX7FGL3rzoaUgt26wkY3bpf7pDVw3IjXhwfiP4w==", - "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "17.8.0" - } - }, - "Castle.Core": { - "type": "Transitive", - "resolved": "5.1.1", - "contentHash": "rpYtIczkzGpf+EkZgDr9CClTdemhsrwA/W5hMoPjLkRFnXzH44zDLoovXeKtmxb1ykXK9aJVODSpiJml8CTw2g==" - }, - "CommunityToolkit.HighPerformance": { - "type": "Transitive", - "resolved": "8.2.2", - "contentHash": "+zIp8d3sbtYaRbM6hqDs4Ui/z34j7DcUmleruZlYLE4CVxXq+MO8XJyIs42vzeTYFX+k0Iq1dEbBUnQ4z/Gnrw==", - "dependencies": { - "Microsoft.Bcl.HashCode": "1.1.1", - "System.Memory": "4.5.5", - "System.Runtime.CompilerServices.Unsafe": "6.0.0", - "System.Threading.Tasks.Extensions": "4.5.4" - } - }, - "Imageflow.Net": { - "type": "Transitive", - "resolved": "0.10.2", - "contentHash": "4KtF92PRHCU8Gm3wYEGJd+Uk0YBqXUY2CFe2P3N3P8UiG6vSIQRDKUV9LjgstEsis95/9OE4ItfJTpMessJIRQ==", - "dependencies": { - "Microsoft.CSharp": "4.7.0", - "Microsoft.IO.RecyclableMemoryStream": "[1.2.2, 3.0.0)", - "Newtonsoft.Json": "[13.0.3, 14.0.0)" - } - }, - "Microsoft.Bcl.AsyncInterfaces": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "W8DPQjkMScOMTtJbPwmPyj9c3zYSFGawDW3jwlBOOsnY+EzZFLgNQ/UMkK35JmkNOVPdCyPr2Tw7Vv9N+KA3ZQ==", - "dependencies": { - "System.Threading.Tasks.Extensions": "4.5.4" - } - }, - "Microsoft.Bcl.HashCode": { - "type": "Transitive", - "resolved": "1.1.1", - "contentHash": "MalY0Y/uM/LjXtHfX/26l2VtN4LDNZ2OE3aumNOHDLsT4fNYy2hiHXI4CXCqKpNUNm7iJ2brrc4J89UdaL56FA==" - }, - "Microsoft.CodeCoverage": { - "type": "Transitive", - "resolved": "17.4.1", - "contentHash": "T21KxaiFawbrrjm0uXjxAStXaBm5P9H6Nnf8BUtBTvIpd8q57lrChVBCY2dnazmSu9/kuX4z5+kAOT78Dod7vA==" - }, - "Microsoft.CSharp": { - "type": "Transitive", - "resolved": "4.7.0", - "contentHash": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==" - }, - "Microsoft.Extensions.Configuration.Abstractions": { - "type": "Transitive", - "resolved": "2.2.0", - "contentHash": "65MrmXCziWaQFrI0UHkQbesrX5wTwf9XPjY5yFm/VkgJKFJ5gqvXRoXjIZcf2wLi5ZlwGz/oMYfyURVCWbM5iw==", - "dependencies": { - "Microsoft.Extensions.Primitives": "2.2.0" - } - }, - "Microsoft.Extensions.DependencyInjection.Abstractions": { - "type": "Transitive", - "resolved": "2.2.0", - "contentHash": "f9hstgjVmr6rmrfGSpfsVOl2irKAgr1QjrSi3FgnS7kulxband50f2brRLwySAQTADPZeTdow0mpSMcoAdadCw==" - }, - "Microsoft.Extensions.FileProviders.Abstractions": { - "type": "Transitive", - "resolved": "2.2.0", - "contentHash": "EcnaSsPTqx2MGnHrmWOD0ugbuuqVT8iICqSqPzi45V5/MA1LjUNb0kwgcxBGqizV1R+WeBK7/Gw25Jzkyk9bIw==", - "dependencies": { - "Microsoft.Extensions.Primitives": "2.2.0" - } - }, - "Microsoft.Extensions.Hosting.Abstractions": { - "type": "Transitive", - "resolved": "2.2.0", - "contentHash": "+k4AEn68HOJat5gj1TWa6X28WlirNQO9sPIIeQbia+91n03esEtMSSoekSTpMjUzjqtJWQN3McVx0GvSPFHF/Q==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "2.2.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0", - "Microsoft.Extensions.FileProviders.Abstractions": "2.2.0", - "Microsoft.Extensions.Logging.Abstractions": "2.2.0" - } - }, - "Microsoft.Extensions.Logging.Abstractions": { - "type": "Transitive", - "resolved": "2.2.0", - "contentHash": "B2WqEox8o+4KUOpL7rZPyh6qYjik8tHi2tN8Z9jZkHzED8ElYgZa/h6K+xliB435SqUcWT290Fr2aa8BtZjn8A==" - }, - "Microsoft.Extensions.Primitives": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==", - "dependencies": { - "System.Memory": "4.5.5", - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } - }, - "Microsoft.IO.RecyclableMemoryStream": { - "type": "Transitive", - "resolved": "1.2.2", - "contentHash": "LA4RBTStohA0hAAs6oKchmIC5M5Mjd5MwfB7vbbl+312N5kXj8abTGOgwZy6ASJYLCiqiiK5kHS0hDGEgfkB8g==" - }, - "Microsoft.TestPlatform.ObjectModel": { - "type": "Transitive", - "resolved": "17.8.0", - "contentHash": "AYy6vlpGMfz5kOFq99L93RGbqftW/8eQTqjT9iGXW6s9MRP3UdtY8idJ8rJcjeSja8A18IhIro5YnH3uv1nz4g==", - "dependencies": { - "NuGet.Frameworks": "6.5.0", - "System.Reflection.Metadata": "1.6.0" - } - }, - "Newtonsoft.Json": { - "type": "Transitive", - "resolved": "13.0.3", - "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==" - }, - "NuGet.Frameworks": { - "type": "Transitive", - "resolved": "6.5.0", - "contentHash": "QWINE2x3MbTODsWT1Gh71GaGb5icBz4chS8VYvTgsBnsi8esgN6wtHhydd7fvToWECYGq7T4cgBBDiKD/363fg==" - }, - "System.Buffers": { - "type": "Transitive", - "resolved": "4.5.1", - "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" - }, - "System.Collections.Immutable": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "AurL6Y5BA1WotzlEvVaIDpqzpIPvYnnldxru8oXJU2yFxFUy3+pNXjXd1ymO+RA0rq0+590Q8gaz2l3Sr7fmqg==", - "dependencies": { - "System.Memory": "4.5.5", - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } - }, - "System.IO.Pipelines": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "FHNOatmUq0sqJOkTx+UF/9YK1f180cnW5FVqnQMvYUN0elp6wFzbtPSiqbo1/ru8ICp43JM1i7kKkk6GsNGHlA==", - "dependencies": { - "System.Buffers": "4.5.1", - "System.Memory": "4.5.5", - "System.Threading.Tasks.Extensions": "4.5.4" - } - }, - "System.Memory": { - "type": "Transitive", - "resolved": "4.5.5", - "contentHash": "XIWiDvKPXaTveaB7HVganDlOCRoj03l+jrwNvcge/t8vhGYKvqV+dMv6G4SAX2NoNmN0wZfVPTAlFwZcZvVOUw==", - "dependencies": { - "System.Buffers": "4.5.1", - "System.Numerics.Vectors": "4.5.0", - "System.Runtime.CompilerServices.Unsafe": "4.5.3" - } - }, - "System.Numerics.Vectors": { - "type": "Transitive", - "resolved": "4.5.0", - "contentHash": "QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ==" - }, - "System.Reflection.Metadata": { - "type": "Transitive", - "resolved": "1.6.0", - "contentHash": "COC1aiAJjCoA5GBF+QKL2uLqEBew4JsCkQmoHKbN3TlOZKa2fKLz5CpiRQKDz0RsAOEGsVKqOD5bomsXq/4STQ==", - "dependencies": { - "System.Collections.Immutable": "1.5.0" - } - }, - "System.Runtime.CompilerServices.Unsafe": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" - }, - "System.Text.Encodings.Web": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ==", - "dependencies": { - "System.Buffers": "4.5.1", - "System.Memory": "4.5.5", - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } - }, - "System.Threading.Tasks.Extensions": { - "type": "Transitive", - "resolved": "4.5.4", - "contentHash": "zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "4.5.3" - } - }, - "xunit.abstractions": { - "type": "Transitive", - "resolved": "2.0.3", - "contentHash": "pot1I4YOxlWjIb5jmwvvQNbTrZ3lJQ+jUGkGjWE3hEFM0l5gOnBWS+H3qsex68s5cO52g+44vpGzhAt+42vwKg==" - }, - "xunit.analyzers": { - "type": "Transitive", - "resolved": "1.10.0", - "contentHash": "Lw8CiDy5NaAWcO6keqD7iZHYUTIuCOcoFrUHw5Sv84ITZ9gFeDybdkVdH0Y2maSlP9fUjtENyiykT44zwFQIHA==" - }, - "xunit.assert": { - "type": "Transitive", - "resolved": "2.6.6", - "contentHash": "74Cm9lAZOk5TKCz2MvCBCByKsS23yryOKDIMxH3XRDHXmfGM02jKZWzRA7g4mGB41GnBnv/pcWP3vUYkrCtEcg==" - }, - "xunit.core": { - "type": "Transitive", - "resolved": "2.6.6", - "contentHash": "tqi7RfaNBqM7t8zx6QHryuBPzmotsZXKGaWnopQG2Ez5UV7JoWuyoNdT6gLpDIcKdGYey6YTXJdSr9IXDMKwjg==", - "dependencies": { - "xunit.extensibility.core": "[2.6.6]", - "xunit.extensibility.execution": "[2.6.6]" - } - }, - "xunit.extensibility.core": { - "type": "Transitive", - "resolved": "2.6.6", - "contentHash": "ty6VKByzbx4Toj4/VGJLEnlmOawqZiMv0in/tLju+ftA+lbWuAWDERM+E52Jfhj4ZYHrAYVa14KHK5T+dq0XxA==", - "dependencies": { - "xunit.abstractions": "2.0.3" - } - }, - "xunit.extensibility.execution": { - "type": "Transitive", - "resolved": "2.6.6", - "contentHash": "UDjIVGj2TepVKN3n32/qXIdb3U6STwTb9L6YEwoQO2A8OxiJS5QAVv2l1aT6tDwwv/9WBmm8Khh/LyHALipcng==", - "dependencies": { - "xunit.extensibility.core": "[2.6.6]" - } - }, - "imazen.abstractions": { - "type": "Project", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "[5.0.0, )", - "Microsoft.Extensions.Hosting.Abstractions": "[2.2.0, )", - "System.Buffers": "[4.5.1, )", - "System.Memory": "[4.5.5, )", - "System.Text.Encodings.Web": "[8.0.0, )", - "System.Threading.Tasks.Extensions": "[4.5.4, )" - } - }, - "imazen.common": { - "type": "Project", - "dependencies": { - "Imazen.Abstractions": "[0.1.0--notset, )" - } - }, - "imazen.routing": { - "type": "Project", - "dependencies": { - "CommunityToolkit.HighPerformance": "[8.2.2, )", - "Imageflow.Net": "[0.10.2, )", - "Imazen.Abstractions": "[0.1.0--notset, )", - "Imazen.Common": "[0.1.0--notset, )", - "Microsoft.Extensions.Primitives": "[8.0.0, )", - "System.Collections.Immutable": "[8.0.0, )", - "System.IO.Pipelines": "[8.0.0, )", - "System.Threading.Tasks.Extensions": "[4.5.4, )" - } - } - }, "net6.0": { "coverlet.collector": { "type": "Direct", diff --git a/tests/TestDefaults.targets b/tests/TestDefaults.targets index 000700b8..d94d291f 100644 --- a/tests/TestDefaults.targets +++ b/tests/TestDefaults.targets @@ -2,7 +2,7 @@ enable false - net8.0;net48;net6.0 + net8.0;net6.0 latest enable