From 3f7122d30a6c9d23dee336c7d74b27565986d1ec Mon Sep 17 00:00:00 2001 From: TQ Hirsch Date: Wed, 14 Jan 2026 22:11:11 +0100 Subject: [PATCH] Got at least one data fetching method working; turns out, we can't use a patched LogicStack to get the data --- .idea/.idea.RemoteControl/.idea/.gitignore | 15 + .idea/.idea.RemoteControl/.idea/encodings.xml | 4 + .../.idea.RemoteControl/.idea/indexLayout.xml | 8 + .idea/.idea.RemoteControl/.idea/vcs.xml | 7 + About/About.xml | 11 + About/Preview.png | Bin 0 -> 1398766 bytes About/Thumb.png | Bin 0 -> 715266 bytes BepInEx.cs | 36 - ExamplePatchMod.csproj | 66 -- Patches/ExamplePatchClass.cs | 12 - Patches/Tick.cs | 69 ++ Patches/WorldManagerStop.cs | 14 + Properties/AssemblyInfo.cs | 4 +- README.md | 4 +- RemoteControl.csproj | 410 +++++++++++ ExamplePatchMod.sln => RemoteControl.sln | 2 +- Scripts/Remotecontrol.cs | 246 +++++++ Scripts/SubscriptionManager.cs | 390 ++++++++++ Scripts/SubscriptionModule.cs | 74 ++ Utils/Extensions.cs | 29 + Vendor/EmbedIO-3.5.2/Actions/ActionModule.cs | 54 ++ .../EmbedIO-3.5.2/Actions/RedirectModule.cs | 99 +++ Vendor/EmbedIO-3.5.2/Authentication/Auth.cs | 31 + .../BasicAuthenticationModule.cs | 46 ++ .../BasicAuthenticationModuleBase.cs | 103 +++ .../BasicAuthenticationModuleExtensions.cs | 34 + Vendor/EmbedIO-3.5.2/CompressionMethod.cs | 29 + .../EmbedIO-3.5.2/CompressionMethodNames.cs | 27 + Vendor/EmbedIO-3.5.2/Cors/CorsModule.cs | 130 ++++ .../EmbedIOInternalErrorException.cs | 64 ++ Vendor/EmbedIO-3.5.2/ExceptionHandler.cs | 165 +++++ .../EmbedIO-3.5.2/ExceptionHandlerCallback.cs | 22 + Vendor/EmbedIO-3.5.2/Files/DirectoryLister.cs | 20 + .../EmbedIO-3.5.2/Files/FileCache.Section.cs | 185 +++++ Vendor/EmbedIO-3.5.2/Files/FileCache.cs | 178 +++++ Vendor/EmbedIO-3.5.2/Files/FileModule.cs | 635 +++++++++++++++++ .../Files/FileModuleExtensions.cs | 282 ++++++++ .../EmbedIO-3.5.2/Files/FileRequestHandler.cs | 53 ++ .../Files/FileRequestHandlerCallback.cs | 13 + .../EmbedIO-3.5.2/Files/FileSystemProvider.cs | 202 ++++++ .../EmbedIO-3.5.2/Files/IDirectoryLister.cs | 35 + Vendor/EmbedIO-3.5.2/Files/IFileProvider.cs | 61 ++ .../Files/Internal/Base64Utility.cs | 12 + .../EmbedIO-3.5.2/Files/Internal/EntityTag.cs | 28 + .../Files/Internal/FileCacheItem.cs | 164 +++++ .../Files/Internal/HtmlDirectoryLister.cs | 73 ++ .../Internal/MappedResourceInfoExtensions.cs | 8 + .../EmbedIO-3.5.2/Files/MappedResourceInfo.cs | 80 +++ .../Files/ResourceFileProvider.cs | 94 +++ Vendor/EmbedIO-3.5.2/Files/ZipFileProvider.cs | 110 +++ .../HttpContextExtensions-Items.cs | 47 ++ .../HttpContextExtensions-Redirect.cs | 33 + .../HttpContextExtensions-RequestStream.cs | 61 ++ .../HttpContextExtensions-Requests.cs | 175 +++++ .../HttpContextExtensions-ResponseStream.cs | 68 ++ .../HttpContextExtensions-Responses.cs | 124 ++++ Vendor/EmbedIO-3.5.2/HttpContextExtensions.cs | 30 + .../EmbedIO-3.5.2/HttpException-Shortcuts.cs | 158 +++++ Vendor/EmbedIO-3.5.2/HttpException.cs | 105 +++ Vendor/EmbedIO-3.5.2/HttpExceptionHandler.cs | 153 ++++ .../HttpExceptionHandlerCallback.cs | 21 + Vendor/EmbedIO-3.5.2/HttpHeaderNames.cs | 449 ++++++++++++ Vendor/EmbedIO-3.5.2/HttpListenerMode.cs | 20 + .../HttpNotAcceptableException.cs | 55 ++ .../HttpRangeNotSatisfiableException.cs | 50 ++ Vendor/EmbedIO-3.5.2/HttpRedirectException.cs | 54 ++ Vendor/EmbedIO-3.5.2/HttpRequestExtensions.cs | 262 +++++++ .../EmbedIO-3.5.2/HttpResponseExtensions.cs | 43 ++ Vendor/EmbedIO-3.5.2/HttpStatusDescription.cs | 146 ++++ Vendor/EmbedIO-3.5.2/HttpVerbs.cs | 48 ++ Vendor/EmbedIO-3.5.2/ICookieCollection.cs | 49 ++ Vendor/EmbedIO-3.5.2/IHttpContext.cs | 128 ++++ Vendor/EmbedIO-3.5.2/IHttpContextHandler.cs | 20 + Vendor/EmbedIO-3.5.2/IHttpContextImpl.cs | 88 +++ Vendor/EmbedIO-3.5.2/IHttpException.cs | 58 ++ Vendor/EmbedIO-3.5.2/IHttpListener.cs | 72 ++ Vendor/EmbedIO-3.5.2/IHttpMessage.cs | 26 + Vendor/EmbedIO-3.5.2/IHttpRequest.cs | 115 +++ Vendor/EmbedIO-3.5.2/IHttpResponse.cs | 69 ++ Vendor/EmbedIO-3.5.2/IMimeTypeCustomizer.cs | 45 ++ Vendor/EmbedIO-3.5.2/IMimeTypeProvider.cs | 31 + Vendor/EmbedIO-3.5.2/IWebModule.cs | 81 +++ Vendor/EmbedIO-3.5.2/IWebModuleContainer.cs | 19 + Vendor/EmbedIO-3.5.2/IWebServer.cs | 68 ++ .../Internal/BufferingResponseStream.cs | 87 +++ .../Internal/CompressionStream.cs | 121 ++++ .../Internal/CompressionUtility.cs | 82 +++ .../Internal/DummyWebModuleContainer.cs | 27 + .../Internal/LockableNameValueCollection.cs | 9 + .../Internal/MimeTypeCustomizer.cs | 63 ++ .../RequestHandlerPassThroughException.cs | 15 + Vendor/EmbedIO-3.5.2/Internal/TimeKeeper.cs | 27 + Vendor/EmbedIO-3.5.2/Internal/UriUtility.cs | 47 ++ .../Internal/WebModuleCollection.cs | 46 ++ Vendor/EmbedIO-3.5.2/MimeType.Associations.cs | 648 +++++++++++++++++ Vendor/EmbedIO-3.5.2/MimeType.cs | 174 +++++ .../MimeTypeCustomizerExtensions.cs | 99 +++ Vendor/EmbedIO-3.5.2/ModuleGroup.cs | 111 +++ Vendor/EmbedIO-3.5.2/Net/CookieList.cs | 243 +++++++ Vendor/EmbedIO-3.5.2/Net/EndPointManager.cs | 141 ++++ Vendor/EmbedIO-3.5.2/Net/HttpListener.cs | 161 +++++ .../Net/Internal/EndPointListener.cs | 429 +++++++++++ .../Net/Internal/HeaderUtility.cs | 23 + .../Net/Internal/HttpConnection.InputState.cs | 11 + .../Net/Internal/HttpConnection.LineState.cs | 12 + .../Net/Internal/HttpConnection.cs | 416 +++++++++++ .../Net/Internal/HttpListenerContext.cs | 129 ++++ .../Internal/HttpListenerPrefixCollection.cs | 30 + .../Net/Internal/HttpListenerRequest.cs | 497 +++++++++++++ .../Net/Internal/HttpListenerResponse.cs | 411 +++++++++++ .../Internal/HttpListenerResponseHelper.cs | 55 ++ .../Net/Internal/ListenerPrefix.cs | 35 + .../EmbedIO-3.5.2/Net/Internal/ListenerUri.cs | 91 +++ .../Net/Internal/NetExtensions.cs | 44 ++ .../Net/Internal/RequestStream.cs | 143 ++++ .../Net/Internal/ResponseStream.cs | 190 +++++ .../Net/Internal/StringExtensions.cs | 77 ++ .../Net/Internal/SystemCookieCollection.cs | 56 ++ .../Net/Internal/SystemHttpContext.cs | 125 ++++ .../Net/Internal/SystemHttpListener.cs | 71 ++ .../Net/Internal/SystemHttpRequest.cs | 121 ++++ .../Net/Internal/SystemHttpResponse.cs | 97 +++ .../Internal/WebSocketHandshakeResponse.cs | 53 ++ Vendor/EmbedIO-3.5.2/RequestDeserializer.cs | 64 ++ .../RequestDeserializerCallback`1.cs | 13 + Vendor/EmbedIO-3.5.2/RequestHandler.cs | 61 ++ .../EmbedIO-3.5.2/RequestHandlerCallback.cs | 11 + Vendor/EmbedIO-3.5.2/ResponseSerializer.cs | 181 +++++ .../ResponseSerializerCallback.cs | 12 + .../Routing/BaseRouteAttribute.cs | 31 + Vendor/EmbedIO-3.5.2/Routing/Route.cs | 310 ++++++++ .../EmbedIO-3.5.2/Routing/RouteAttribute.cs | 54 ++ .../Routing/RouteHandlerCallback.cs | 13 + Vendor/EmbedIO-3.5.2/Routing/RouteMatch.cs | 199 ++++++ Vendor/EmbedIO-3.5.2/Routing/RouteMatcher.cs | 183 +++++ .../Routing/RouteResolutionResult.cs | 35 + .../Routing/RouteResolverBase`1.cs | 166 +++++ .../Routing/RouteResolverCollectionBase`2.cs | 150 ++++ .../Routing/RouteVerbResolver.cs | 30 + .../Routing/RouteVerbResolverCollection.cs | 140 ++++ Vendor/EmbedIO-3.5.2/Routing/RoutingModule.cs | 62 ++ .../Routing/RoutingModuleBase.cs | 317 +++++++++ ...sions-AddHandlerFromBaseOrTerminalRoute.cs | 429 +++++++++++ ...leExtensions-AddHandlerFromRouteMatcher.cs | 357 ++++++++++ ...eExtensions-AddHandlerFromTerminalRoute.cs | 375 ++++++++++ .../Routing/RoutingModuleExtensions.cs | 26 + .../Routing/SyncRouteHandlerCallback.cs | 10 + Vendor/EmbedIO-3.5.2/Security/BanInfo.cs | 25 + .../Security/IIPBanningCriterion.cs | 30 + .../Security/IPBanningConfiguration.cs | 188 +++++ .../EmbedIO-3.5.2/Security/IPBanningModule.cs | 182 +++++ .../Security/IPBanningModuleExtensions.cs | 74 ++ .../Security/IPBanningRegexCriterion.cs | 197 ++++++ .../Security/IPBanningRequestsCriterion.cs | 93 +++ .../Security/Internal/IPBanningExecutor.cs | 31 + Vendor/EmbedIO-3.5.2/Sessions/ISession.cs | 112 +++ .../EmbedIO-3.5.2/Sessions/ISessionManager.cs | 46 ++ .../EmbedIO-3.5.2/Sessions/ISessionProxy.cs | 33 + .../Sessions/Internal/DummySessionProxy.cs | 65 ++ .../LocalSessionManager.SessionImpl.cs | 150 ++++ .../Sessions/LocalSessionManager.cs | 303 ++++++++ Vendor/EmbedIO-3.5.2/Sessions/Session.cs | 35 + .../Sessions/SessionExtensions.cs | 60 ++ Vendor/EmbedIO-3.5.2/Sessions/SessionProxy.cs | 167 +++++ .../ComponentCollectionExtensions.cs | 20 + .../Utilities/ComponentCollection`1.cs | 76 ++ .../DisposableComponentCollection`1.cs | 49 ++ Vendor/EmbedIO-3.5.2/Utilities/HttpDate.cs | 78 ++ .../Utilities/IComponentCollection`1.cs | 54 ++ Vendor/EmbedIO-3.5.2/Utilities/IPParser.cs | 209 ++++++ .../Utilities/MimeTypeProviderStack.cs | 56 ++ .../NameValueCollectionExtensions.cs | 110 +++ Vendor/EmbedIO-3.5.2/Utilities/QValueList.cs | 279 ++++++++ .../Utilities/QValueListExtensions.cs | 72 ++ .../Utilities/StringExtensions.cs | 55 ++ .../Utilities/UniqueIdGenerator.cs | 16 + .../Utilities/UrlEncodedDataParser.cs | 127 ++++ Vendor/EmbedIO-3.5.2/Utilities/UrlPath.cs | 315 +++++++++ .../Utilities/Validate-MimeType.cs | 32 + .../EmbedIO-3.5.2/Utilities/Validate-Paths.cs | 95 +++ .../Utilities/Validate-Rfc2616.cs | 55 ++ .../EmbedIO-3.5.2/Utilities/Validate-Route.cs | 33 + Vendor/EmbedIO-3.5.2/Utilities/Validate.cs | 125 ++++ .../EmbedIO-3.5.2/WebApi/FormDataAttribute.cs | 23 + .../WebApi/FormFieldAttribute.cs | 172 +++++ .../WebApi/IRequestDataAttribute`1.cs | 25 + .../WebApi/IRequestDataAttribute`2.cs | 25 + .../EmbedIO-3.5.2/WebApi/JsonDataAttribute.cs | 40 ++ .../WebApi/QueryDataAttribute.cs | 22 + .../WebApi/QueryFieldAttribute.cs | 169 +++++ .../EmbedIO-3.5.2/WebApi/WebApiController.cs | 73 ++ Vendor/EmbedIO-3.5.2/WebApi/WebApiModule.cs | 94 +++ .../EmbedIO-3.5.2/WebApi/WebApiModuleBase.cs | 600 ++++++++++++++++ .../WebApi/WebApiModuleExtensions.cs | 82 +++ Vendor/EmbedIO-3.5.2/WebModuleBase.cs | 153 ++++ Vendor/EmbedIO-3.5.2/WebModuleContainer.cs | 18 + .../WebModuleContainerExtensions-Actions.cs | 311 ++++++++ .../WebModuleContainerExtensions-Cors.cs | 53 ++ .../WebModuleContainerExtensions-Files.cs | 275 ++++++++ .../WebModuleContainerExtensions-Routing.cs | 51 ++ .../WebModuleContainerExtensions-Security.cs | 43 ++ .../WebModuleContainerExtensions-WebApi.cs | 126 ++++ .../WebModuleContainerExtensions.cs | 84 +++ .../WebModuleExtensions-ExceptionHandlers.cs | 45 ++ Vendor/EmbedIO-3.5.2/WebModuleExtensions.cs | 9 + Vendor/EmbedIO-3.5.2/WebServer-Constants.cs | 49 ++ Vendor/EmbedIO-3.5.2/WebServer.cs | 191 +++++ Vendor/EmbedIO-3.5.2/WebServerBase`1.cs | 349 +++++++++ .../WebServerExtensions-ExceptionHandliers.cs | 47 ++ .../WebServerExtensions-SessionManager.cs | 43 ++ Vendor/EmbedIO-3.5.2/WebServerExtensions.cs | 30 + Vendor/EmbedIO-3.5.2/WebServerOptions.cs | 330 +++++++++ Vendor/EmbedIO-3.5.2/WebServerOptionsBase.cs | 35 + .../WebServerOptionsBaseExtensions.cs | 27 + .../WebServerOptionsExtensions.cs | 294 ++++++++ Vendor/EmbedIO-3.5.2/WebServerState.cs | 36 + .../WebServerStateChangedEventArgs.cs | 31 + .../WebServerStateChangedEventHandler.cs | 9 + .../WebSockets/CloseStatusCode.cs | 97 +++ Vendor/EmbedIO-3.5.2/WebSockets/IWebSocket.cs | 54 ++ .../WebSockets/IWebSocketContext.cs | 87 +++ .../WebSockets/IWebSocketReceiveResult.cs | 32 + .../EmbedIO-3.5.2/WebSockets/Internal/Fin.cs | 22 + .../WebSockets/Internal/FragmentBuffer.cs | 29 + .../EmbedIO-3.5.2/WebSockets/Internal/Mask.cs | 22 + .../WebSockets/Internal/MessageEventArgs.cs | 114 +++ .../WebSockets/Internal/PayloadData.cs | 74 ++ .../EmbedIO-3.5.2/WebSockets/Internal/Rsv.cs | 22 + .../WebSockets/Internal/StreamExtensions.cs | 66 ++ .../WebSockets/Internal/SystemWebSocket.cs | 66 ++ .../Internal/SystemWebSocketReceiveResult.cs | 29 + .../WebSockets/Internal/WebSocket.cs | 561 +++++++++++++++ .../WebSockets/Internal/WebSocketContext.cs | 100 +++ .../WebSockets/Internal/WebSocketFrame.cs | 239 +++++++ .../Internal/WebSocketFrameStream.cs | 148 ++++ .../Internal/WebSocketReceiveResult.cs | 29 + .../WebSockets/Internal/WebSocketStream.cs | 91 +++ Vendor/EmbedIO-3.5.2/WebSockets/Opcode.cs | 43 ++ .../WebSockets/WebSocketException.cs | 51 ++ .../WebSockets/WebSocketModule.cs | 640 +++++++++++++++++ .../Collections/CollectionCacheRepository.cs | 51 ++ Vendor/Swan.Lite-3.1.0/CompositeHashCode.cs | 100 +++ .../Configuration/ConfiguredObject.cs | 77 ++ .../Configuration/SettingsProvider.cs | 107 +++ Vendor/Swan.Lite-3.1.0/Cryptography/Hasher.cs | 124 ++++ Vendor/Swan.Lite-3.1.0/DateTimeSpan.cs | 174 +++++ Vendor/Swan.Lite-3.1.0/Definitions.Types.cs | 138 ++++ Vendor/Swan.Lite-3.1.0/Definitions.cs | 39 + .../Swan.Lite-3.1.0/Diagnostics/Benchmark.cs | 121 ++++ .../Diagnostics/BenchmarkUnit.cs | 50 ++ .../Diagnostics/HighResolutionTimer.cs | 32 + Vendor/Swan.Lite-3.1.0/EnumHelper.cs | 171 +++++ Vendor/Swan.Lite-3.1.0/Enums.cs | 44 ++ .../Swan.Lite-3.1.0/Extensions.ByteArrays.cs | 511 ++++++++++++++ Vendor/Swan.Lite-3.1.0/Extensions.Dates.cs | 234 ++++++ .../Extensions.Dictionaries.cs | 86 +++ .../Swan.Lite-3.1.0/Extensions.Enumerable.cs | 43 ++ .../Swan.Lite-3.1.0/Extensions.Exceptions.cs | 66 ++ .../Swan.Lite-3.1.0/Extensions.Functional.cs | 179 +++++ .../Swan.Lite-3.1.0/Extensions.IEnumerable.cs | 25 + .../Extensions.IPropertyProxy.cs | 175 +++++ .../Swan.Lite-3.1.0/Extensions.Reflection.cs | 335 +++++++++ Vendor/Swan.Lite-3.1.0/Extensions.Strings.cs | 400 +++++++++++ Vendor/Swan.Lite-3.1.0/Extensions.Tasks.cs | 85 +++ .../Swan.Lite-3.1.0/Extensions.ValueTypes.cs | 165 +++++ Vendor/Swan.Lite-3.1.0/Extensions.cs | 279 ++++++++ .../Swan.Lite-3.1.0/Formatters/CsvReader.cs | 647 +++++++++++++++++ .../Swan.Lite-3.1.0/Formatters/CsvWriter.cs | 460 ++++++++++++ .../Formatters/HumanizeJson.cs | 147 ++++ .../Formatters/Json.Converter.cs | 353 ++++++++++ .../Formatters/Json.Deserializer.cs | 348 +++++++++ .../Formatters/Json.Serializer.cs | 370 ++++++++++ .../Formatters/Json.SerializerOptions.cs | 152 ++++ Vendor/Swan.Lite-3.1.0/Formatters/Json.cs | 373 ++++++++++ .../Formatters/JsonPropertyAttribute.cs | 39 + .../Formatters/JsonSerializerCase.cs | 23 + Vendor/Swan.Lite-3.1.0/FromString.cs | 347 +++++++++ .../Swan.Lite-3.1.0/InternalErrorException.cs | 46 ++ .../Swan.Lite-3.1.0/Logging/ConsoleLogger.cs | 145 ++++ Vendor/Swan.Lite-3.1.0/Logging/DebugLogger.cs | 51 ++ Vendor/Swan.Lite-3.1.0/Logging/FileLogger.cs | 131 ++++ Vendor/Swan.Lite-3.1.0/Logging/ILogger.cs | 24 + Vendor/Swan.Lite-3.1.0/Logging/LogLevel.cs | 43 ++ .../Logging/LogMessageReceivedEventArgs.cs | 131 ++++ Vendor/Swan.Lite-3.1.0/Logging/Logger.cs | 664 ++++++++++++++++++ Vendor/Swan.Lite-3.1.0/Logging/TextLogger.cs | 79 +++ .../Mappers/CopyableAttribute.cs | 13 + Vendor/Swan.Lite-3.1.0/Mappers/IObjectMap.cs | 27 + Vendor/Swan.Lite-3.1.0/Mappers/ObjectMap.cs | 120 ++++ .../ObjectMapper.PropertyInfoComparer.cs | 24 + .../Swan.Lite-3.1.0/Mappers/ObjectMapper.cs | 374 ++++++++++ Vendor/Swan.Lite-3.1.0/Net/IPAddressRange.cs | 552 +++++++++++++++ .../Net/IPAddressRangeExtensions.cs | 51 ++ .../Swan.Lite-3.1.0/Net/IPAddressUtility.cs | 43 ++ .../Net/Internal/IPAddressValue.cs | 139 ++++ Vendor/Swan.Lite-3.1.0/ObjectComparer.cs | 188 +++++ Vendor/Swan.Lite-3.1.0/Paginator.cs | 99 +++ .../Parsers/ArgumentOptionAttribute.cs | 101 +++ .../Parsers/ArgumentParse.Validator.cs | 180 +++++ .../Parsers/ArgumentParser.TypeResolver.cs | 63 ++ .../Swan.Lite-3.1.0/Parsers/ArgumentParser.cs | 253 +++++++ .../Parsers/ArgumentParserSettings.cs | 53 ++ .../Parsers/ExpressionParser.cs | 117 +++ Vendor/Swan.Lite-3.1.0/Parsers/Operator.cs | 32 + Vendor/Swan.Lite-3.1.0/Parsers/Token.cs | 35 + Vendor/Swan.Lite-3.1.0/Parsers/TokenType.cs | 48 ++ Vendor/Swan.Lite-3.1.0/Parsers/Tokenizer.cs | 361 ++++++++++ .../Parsers/VerbOptionAttribute.cs | 40 ++ .../Reflection/AttributeCache.cs | 188 +++++ .../Reflection/ConstructorTypeCache.cs | 50 ++ .../Reflection/ExtendedTypeInfo.cs | 267 +++++++ .../Reflection/IPropertyProxy.cs | 45 ++ .../Reflection/MethodInfoCache.cs | 117 +++ .../Reflection/PropertyInfoProxy.cs | 79 +++ .../Reflection/PropertyTypeCache.cs | 74 ++ .../Swan.Lite-3.1.0/Reflection/TypeCache.cs | 78 ++ Vendor/Swan.Lite-3.1.0/SelfCheck.cs | 62 ++ Vendor/Swan.Lite-3.1.0/SingletonBase.cs | 61 ++ .../StringConversionException.cs | 76 ++ .../StructEndiannessAttribute.cs | 30 + Vendor/Swan.Lite-3.1.0/SwanRuntime.cs | 237 +++++++ Vendor/Swan.Lite-3.1.0/Terminal.Graphics.cs | 37 + .../Swan.Lite-3.1.0/Terminal.Interaction.cs | 260 +++++++ Vendor/Swan.Lite-3.1.0/Terminal.Output.cs | 97 +++ Vendor/Swan.Lite-3.1.0/Terminal.Settings.cs | 49 ++ Vendor/Swan.Lite-3.1.0/Terminal.cs | 339 +++++++++ .../Swan.Lite-3.1.0/TerminalWriters.Enums.cs | 31 + .../Threading/AtomicBoolean.cs | 24 + .../Threading/AtomicDateTime.cs | 26 + .../Swan.Lite-3.1.0/Threading/AtomicDouble.cs | 28 + .../Swan.Lite-3.1.0/Threading/AtomicEnum.cs | 43 ++ .../Threading/AtomicInteger.cs | 28 + .../Swan.Lite-3.1.0/Threading/AtomicLong.cs | 24 + .../Threading/AtomicTimeSpan.cs | 26 + .../Threading/AtomicTypeBase.cs | 243 +++++++ .../Threading/CancellationTokenOwner.cs | 68 ++ .../Threading/ExclusiveTimer.cs | 232 ++++++ .../Swan.Lite-3.1.0/Threading/ISyncLocker.cs | 24 + .../Swan.Lite-3.1.0/Threading/IWaitEvent.cs | 57 ++ Vendor/Swan.Lite-3.1.0/Threading/IWorker.cs | 69 ++ .../Threading/IWorkerDelayProvider.cs | 21 + .../Swan.Lite-3.1.0/Threading/PeriodicTask.cs | 101 +++ .../Swan.Lite-3.1.0/Threading/RunnerBase.cs | 187 +++++ .../Threading/SyncLockerFactory.cs | 185 +++++ .../Threading/WaitEventFactory.cs | 204 ++++++ .../Swan.Lite-3.1.0/Threading/WorkerState.cs | 33 + .../Swan.Lite-3.1.0/Validators/IValidator.cs | 21 + .../Validators/ObjectValidationResult.cs | 58 ++ .../Validators/ObjectValidator.cs | 173 +++++ .../Swan.Lite-3.1.0/Validators/Validators.cs | 132 ++++ 350 files changed, 41444 insertions(+), 119 deletions(-) create mode 100644 .idea/.idea.RemoteControl/.idea/.gitignore create mode 100644 .idea/.idea.RemoteControl/.idea/encodings.xml create mode 100644 .idea/.idea.RemoteControl/.idea/indexLayout.xml create mode 100644 .idea/.idea.RemoteControl/.idea/vcs.xml create mode 100644 About/About.xml create mode 100644 About/Preview.png create mode 100644 About/Thumb.png delete mode 100644 BepInEx.cs delete mode 100644 ExamplePatchMod.csproj delete mode 100644 Patches/ExamplePatchClass.cs create mode 100644 Patches/Tick.cs create mode 100644 Patches/WorldManagerStop.cs create mode 100644 RemoteControl.csproj rename ExamplePatchMod.sln => RemoteControl.sln (87%) create mode 100644 Scripts/Remotecontrol.cs create mode 100644 Scripts/SubscriptionManager.cs create mode 100644 Scripts/SubscriptionModule.cs create mode 100644 Utils/Extensions.cs create mode 100644 Vendor/EmbedIO-3.5.2/Actions/ActionModule.cs create mode 100644 Vendor/EmbedIO-3.5.2/Actions/RedirectModule.cs create mode 100644 Vendor/EmbedIO-3.5.2/Authentication/Auth.cs create mode 100644 Vendor/EmbedIO-3.5.2/Authentication/BasicAuthenticationModule.cs create mode 100644 Vendor/EmbedIO-3.5.2/Authentication/BasicAuthenticationModuleBase.cs create mode 100644 Vendor/EmbedIO-3.5.2/Authentication/BasicAuthenticationModuleExtensions.cs create mode 100644 Vendor/EmbedIO-3.5.2/CompressionMethod.cs create mode 100644 Vendor/EmbedIO-3.5.2/CompressionMethodNames.cs create mode 100644 Vendor/EmbedIO-3.5.2/Cors/CorsModule.cs create mode 100644 Vendor/EmbedIO-3.5.2/EmbedIOInternalErrorException.cs create mode 100644 Vendor/EmbedIO-3.5.2/ExceptionHandler.cs create mode 100644 Vendor/EmbedIO-3.5.2/ExceptionHandlerCallback.cs create mode 100644 Vendor/EmbedIO-3.5.2/Files/DirectoryLister.cs create mode 100644 Vendor/EmbedIO-3.5.2/Files/FileCache.Section.cs create mode 100644 Vendor/EmbedIO-3.5.2/Files/FileCache.cs create mode 100644 Vendor/EmbedIO-3.5.2/Files/FileModule.cs create mode 100644 Vendor/EmbedIO-3.5.2/Files/FileModuleExtensions.cs create mode 100644 Vendor/EmbedIO-3.5.2/Files/FileRequestHandler.cs create mode 100644 Vendor/EmbedIO-3.5.2/Files/FileRequestHandlerCallback.cs create mode 100644 Vendor/EmbedIO-3.5.2/Files/FileSystemProvider.cs create mode 100644 Vendor/EmbedIO-3.5.2/Files/IDirectoryLister.cs create mode 100644 Vendor/EmbedIO-3.5.2/Files/IFileProvider.cs create mode 100644 Vendor/EmbedIO-3.5.2/Files/Internal/Base64Utility.cs create mode 100644 Vendor/EmbedIO-3.5.2/Files/Internal/EntityTag.cs create mode 100644 Vendor/EmbedIO-3.5.2/Files/Internal/FileCacheItem.cs create mode 100644 Vendor/EmbedIO-3.5.2/Files/Internal/HtmlDirectoryLister.cs create mode 100644 Vendor/EmbedIO-3.5.2/Files/Internal/MappedResourceInfoExtensions.cs create mode 100644 Vendor/EmbedIO-3.5.2/Files/MappedResourceInfo.cs create mode 100644 Vendor/EmbedIO-3.5.2/Files/ResourceFileProvider.cs create mode 100644 Vendor/EmbedIO-3.5.2/Files/ZipFileProvider.cs create mode 100644 Vendor/EmbedIO-3.5.2/HttpContextExtensions-Items.cs create mode 100644 Vendor/EmbedIO-3.5.2/HttpContextExtensions-Redirect.cs create mode 100644 Vendor/EmbedIO-3.5.2/HttpContextExtensions-RequestStream.cs create mode 100644 Vendor/EmbedIO-3.5.2/HttpContextExtensions-Requests.cs create mode 100644 Vendor/EmbedIO-3.5.2/HttpContextExtensions-ResponseStream.cs create mode 100644 Vendor/EmbedIO-3.5.2/HttpContextExtensions-Responses.cs create mode 100644 Vendor/EmbedIO-3.5.2/HttpContextExtensions.cs create mode 100644 Vendor/EmbedIO-3.5.2/HttpException-Shortcuts.cs create mode 100644 Vendor/EmbedIO-3.5.2/HttpException.cs create mode 100644 Vendor/EmbedIO-3.5.2/HttpExceptionHandler.cs create mode 100644 Vendor/EmbedIO-3.5.2/HttpExceptionHandlerCallback.cs create mode 100644 Vendor/EmbedIO-3.5.2/HttpHeaderNames.cs create mode 100644 Vendor/EmbedIO-3.5.2/HttpListenerMode.cs create mode 100644 Vendor/EmbedIO-3.5.2/HttpNotAcceptableException.cs create mode 100644 Vendor/EmbedIO-3.5.2/HttpRangeNotSatisfiableException.cs create mode 100644 Vendor/EmbedIO-3.5.2/HttpRedirectException.cs create mode 100644 Vendor/EmbedIO-3.5.2/HttpRequestExtensions.cs create mode 100644 Vendor/EmbedIO-3.5.2/HttpResponseExtensions.cs create mode 100644 Vendor/EmbedIO-3.5.2/HttpStatusDescription.cs create mode 100644 Vendor/EmbedIO-3.5.2/HttpVerbs.cs create mode 100644 Vendor/EmbedIO-3.5.2/ICookieCollection.cs create mode 100644 Vendor/EmbedIO-3.5.2/IHttpContext.cs create mode 100644 Vendor/EmbedIO-3.5.2/IHttpContextHandler.cs create mode 100644 Vendor/EmbedIO-3.5.2/IHttpContextImpl.cs create mode 100644 Vendor/EmbedIO-3.5.2/IHttpException.cs create mode 100644 Vendor/EmbedIO-3.5.2/IHttpListener.cs create mode 100644 Vendor/EmbedIO-3.5.2/IHttpMessage.cs create mode 100644 Vendor/EmbedIO-3.5.2/IHttpRequest.cs create mode 100644 Vendor/EmbedIO-3.5.2/IHttpResponse.cs create mode 100644 Vendor/EmbedIO-3.5.2/IMimeTypeCustomizer.cs create mode 100644 Vendor/EmbedIO-3.5.2/IMimeTypeProvider.cs create mode 100644 Vendor/EmbedIO-3.5.2/IWebModule.cs create mode 100644 Vendor/EmbedIO-3.5.2/IWebModuleContainer.cs create mode 100644 Vendor/EmbedIO-3.5.2/IWebServer.cs create mode 100644 Vendor/EmbedIO-3.5.2/Internal/BufferingResponseStream.cs create mode 100644 Vendor/EmbedIO-3.5.2/Internal/CompressionStream.cs create mode 100644 Vendor/EmbedIO-3.5.2/Internal/CompressionUtility.cs create mode 100644 Vendor/EmbedIO-3.5.2/Internal/DummyWebModuleContainer.cs create mode 100644 Vendor/EmbedIO-3.5.2/Internal/LockableNameValueCollection.cs create mode 100644 Vendor/EmbedIO-3.5.2/Internal/MimeTypeCustomizer.cs create mode 100644 Vendor/EmbedIO-3.5.2/Internal/RequestHandlerPassThroughException.cs create mode 100644 Vendor/EmbedIO-3.5.2/Internal/TimeKeeper.cs create mode 100644 Vendor/EmbedIO-3.5.2/Internal/UriUtility.cs create mode 100644 Vendor/EmbedIO-3.5.2/Internal/WebModuleCollection.cs create mode 100644 Vendor/EmbedIO-3.5.2/MimeType.Associations.cs create mode 100644 Vendor/EmbedIO-3.5.2/MimeType.cs create mode 100644 Vendor/EmbedIO-3.5.2/MimeTypeCustomizerExtensions.cs create mode 100644 Vendor/EmbedIO-3.5.2/ModuleGroup.cs create mode 100644 Vendor/EmbedIO-3.5.2/Net/CookieList.cs create mode 100644 Vendor/EmbedIO-3.5.2/Net/EndPointManager.cs create mode 100644 Vendor/EmbedIO-3.5.2/Net/HttpListener.cs create mode 100644 Vendor/EmbedIO-3.5.2/Net/Internal/EndPointListener.cs create mode 100644 Vendor/EmbedIO-3.5.2/Net/Internal/HeaderUtility.cs create mode 100644 Vendor/EmbedIO-3.5.2/Net/Internal/HttpConnection.InputState.cs create mode 100644 Vendor/EmbedIO-3.5.2/Net/Internal/HttpConnection.LineState.cs create mode 100644 Vendor/EmbedIO-3.5.2/Net/Internal/HttpConnection.cs create mode 100644 Vendor/EmbedIO-3.5.2/Net/Internal/HttpListenerContext.cs create mode 100644 Vendor/EmbedIO-3.5.2/Net/Internal/HttpListenerPrefixCollection.cs create mode 100644 Vendor/EmbedIO-3.5.2/Net/Internal/HttpListenerRequest.cs create mode 100644 Vendor/EmbedIO-3.5.2/Net/Internal/HttpListenerResponse.cs create mode 100644 Vendor/EmbedIO-3.5.2/Net/Internal/HttpListenerResponseHelper.cs create mode 100644 Vendor/EmbedIO-3.5.2/Net/Internal/ListenerPrefix.cs create mode 100644 Vendor/EmbedIO-3.5.2/Net/Internal/ListenerUri.cs create mode 100644 Vendor/EmbedIO-3.5.2/Net/Internal/NetExtensions.cs create mode 100644 Vendor/EmbedIO-3.5.2/Net/Internal/RequestStream.cs create mode 100644 Vendor/EmbedIO-3.5.2/Net/Internal/ResponseStream.cs create mode 100644 Vendor/EmbedIO-3.5.2/Net/Internal/StringExtensions.cs create mode 100644 Vendor/EmbedIO-3.5.2/Net/Internal/SystemCookieCollection.cs create mode 100644 Vendor/EmbedIO-3.5.2/Net/Internal/SystemHttpContext.cs create mode 100644 Vendor/EmbedIO-3.5.2/Net/Internal/SystemHttpListener.cs create mode 100644 Vendor/EmbedIO-3.5.2/Net/Internal/SystemHttpRequest.cs create mode 100644 Vendor/EmbedIO-3.5.2/Net/Internal/SystemHttpResponse.cs create mode 100644 Vendor/EmbedIO-3.5.2/Net/Internal/WebSocketHandshakeResponse.cs create mode 100644 Vendor/EmbedIO-3.5.2/RequestDeserializer.cs create mode 100644 Vendor/EmbedIO-3.5.2/RequestDeserializerCallback`1.cs create mode 100644 Vendor/EmbedIO-3.5.2/RequestHandler.cs create mode 100644 Vendor/EmbedIO-3.5.2/RequestHandlerCallback.cs create mode 100644 Vendor/EmbedIO-3.5.2/ResponseSerializer.cs create mode 100644 Vendor/EmbedIO-3.5.2/ResponseSerializerCallback.cs create mode 100644 Vendor/EmbedIO-3.5.2/Routing/BaseRouteAttribute.cs create mode 100644 Vendor/EmbedIO-3.5.2/Routing/Route.cs create mode 100644 Vendor/EmbedIO-3.5.2/Routing/RouteAttribute.cs create mode 100644 Vendor/EmbedIO-3.5.2/Routing/RouteHandlerCallback.cs create mode 100644 Vendor/EmbedIO-3.5.2/Routing/RouteMatch.cs create mode 100644 Vendor/EmbedIO-3.5.2/Routing/RouteMatcher.cs create mode 100644 Vendor/EmbedIO-3.5.2/Routing/RouteResolutionResult.cs create mode 100644 Vendor/EmbedIO-3.5.2/Routing/RouteResolverBase`1.cs create mode 100644 Vendor/EmbedIO-3.5.2/Routing/RouteResolverCollectionBase`2.cs create mode 100644 Vendor/EmbedIO-3.5.2/Routing/RouteVerbResolver.cs create mode 100644 Vendor/EmbedIO-3.5.2/Routing/RouteVerbResolverCollection.cs create mode 100644 Vendor/EmbedIO-3.5.2/Routing/RoutingModule.cs create mode 100644 Vendor/EmbedIO-3.5.2/Routing/RoutingModuleBase.cs create mode 100644 Vendor/EmbedIO-3.5.2/Routing/RoutingModuleExtensions-AddHandlerFromBaseOrTerminalRoute.cs create mode 100644 Vendor/EmbedIO-3.5.2/Routing/RoutingModuleExtensions-AddHandlerFromRouteMatcher.cs create mode 100644 Vendor/EmbedIO-3.5.2/Routing/RoutingModuleExtensions-AddHandlerFromTerminalRoute.cs create mode 100644 Vendor/EmbedIO-3.5.2/Routing/RoutingModuleExtensions.cs create mode 100644 Vendor/EmbedIO-3.5.2/Routing/SyncRouteHandlerCallback.cs create mode 100644 Vendor/EmbedIO-3.5.2/Security/BanInfo.cs create mode 100644 Vendor/EmbedIO-3.5.2/Security/IIPBanningCriterion.cs create mode 100644 Vendor/EmbedIO-3.5.2/Security/IPBanningConfiguration.cs create mode 100644 Vendor/EmbedIO-3.5.2/Security/IPBanningModule.cs create mode 100644 Vendor/EmbedIO-3.5.2/Security/IPBanningModuleExtensions.cs create mode 100644 Vendor/EmbedIO-3.5.2/Security/IPBanningRegexCriterion.cs create mode 100644 Vendor/EmbedIO-3.5.2/Security/IPBanningRequestsCriterion.cs create mode 100644 Vendor/EmbedIO-3.5.2/Security/Internal/IPBanningExecutor.cs create mode 100644 Vendor/EmbedIO-3.5.2/Sessions/ISession.cs create mode 100644 Vendor/EmbedIO-3.5.2/Sessions/ISessionManager.cs create mode 100644 Vendor/EmbedIO-3.5.2/Sessions/ISessionProxy.cs create mode 100644 Vendor/EmbedIO-3.5.2/Sessions/Internal/DummySessionProxy.cs create mode 100644 Vendor/EmbedIO-3.5.2/Sessions/LocalSessionManager.SessionImpl.cs create mode 100644 Vendor/EmbedIO-3.5.2/Sessions/LocalSessionManager.cs create mode 100644 Vendor/EmbedIO-3.5.2/Sessions/Session.cs create mode 100644 Vendor/EmbedIO-3.5.2/Sessions/SessionExtensions.cs create mode 100644 Vendor/EmbedIO-3.5.2/Sessions/SessionProxy.cs create mode 100644 Vendor/EmbedIO-3.5.2/Utilities/ComponentCollectionExtensions.cs create mode 100644 Vendor/EmbedIO-3.5.2/Utilities/ComponentCollection`1.cs create mode 100644 Vendor/EmbedIO-3.5.2/Utilities/DisposableComponentCollection`1.cs create mode 100644 Vendor/EmbedIO-3.5.2/Utilities/HttpDate.cs create mode 100644 Vendor/EmbedIO-3.5.2/Utilities/IComponentCollection`1.cs create mode 100644 Vendor/EmbedIO-3.5.2/Utilities/IPParser.cs create mode 100644 Vendor/EmbedIO-3.5.2/Utilities/MimeTypeProviderStack.cs create mode 100644 Vendor/EmbedIO-3.5.2/Utilities/NameValueCollectionExtensions.cs create mode 100644 Vendor/EmbedIO-3.5.2/Utilities/QValueList.cs create mode 100644 Vendor/EmbedIO-3.5.2/Utilities/QValueListExtensions.cs create mode 100644 Vendor/EmbedIO-3.5.2/Utilities/StringExtensions.cs create mode 100644 Vendor/EmbedIO-3.5.2/Utilities/UniqueIdGenerator.cs create mode 100644 Vendor/EmbedIO-3.5.2/Utilities/UrlEncodedDataParser.cs create mode 100644 Vendor/EmbedIO-3.5.2/Utilities/UrlPath.cs create mode 100644 Vendor/EmbedIO-3.5.2/Utilities/Validate-MimeType.cs create mode 100644 Vendor/EmbedIO-3.5.2/Utilities/Validate-Paths.cs create mode 100644 Vendor/EmbedIO-3.5.2/Utilities/Validate-Rfc2616.cs create mode 100644 Vendor/EmbedIO-3.5.2/Utilities/Validate-Route.cs create mode 100644 Vendor/EmbedIO-3.5.2/Utilities/Validate.cs create mode 100644 Vendor/EmbedIO-3.5.2/WebApi/FormDataAttribute.cs create mode 100644 Vendor/EmbedIO-3.5.2/WebApi/FormFieldAttribute.cs create mode 100644 Vendor/EmbedIO-3.5.2/WebApi/IRequestDataAttribute`1.cs create mode 100644 Vendor/EmbedIO-3.5.2/WebApi/IRequestDataAttribute`2.cs create mode 100644 Vendor/EmbedIO-3.5.2/WebApi/JsonDataAttribute.cs create mode 100644 Vendor/EmbedIO-3.5.2/WebApi/QueryDataAttribute.cs create mode 100644 Vendor/EmbedIO-3.5.2/WebApi/QueryFieldAttribute.cs create mode 100644 Vendor/EmbedIO-3.5.2/WebApi/WebApiController.cs create mode 100644 Vendor/EmbedIO-3.5.2/WebApi/WebApiModule.cs create mode 100644 Vendor/EmbedIO-3.5.2/WebApi/WebApiModuleBase.cs create mode 100644 Vendor/EmbedIO-3.5.2/WebApi/WebApiModuleExtensions.cs create mode 100644 Vendor/EmbedIO-3.5.2/WebModuleBase.cs create mode 100644 Vendor/EmbedIO-3.5.2/WebModuleContainer.cs create mode 100644 Vendor/EmbedIO-3.5.2/WebModuleContainerExtensions-Actions.cs create mode 100644 Vendor/EmbedIO-3.5.2/WebModuleContainerExtensions-Cors.cs create mode 100644 Vendor/EmbedIO-3.5.2/WebModuleContainerExtensions-Files.cs create mode 100644 Vendor/EmbedIO-3.5.2/WebModuleContainerExtensions-Routing.cs create mode 100644 Vendor/EmbedIO-3.5.2/WebModuleContainerExtensions-Security.cs create mode 100644 Vendor/EmbedIO-3.5.2/WebModuleContainerExtensions-WebApi.cs create mode 100644 Vendor/EmbedIO-3.5.2/WebModuleContainerExtensions.cs create mode 100644 Vendor/EmbedIO-3.5.2/WebModuleExtensions-ExceptionHandlers.cs create mode 100644 Vendor/EmbedIO-3.5.2/WebModuleExtensions.cs create mode 100644 Vendor/EmbedIO-3.5.2/WebServer-Constants.cs create mode 100644 Vendor/EmbedIO-3.5.2/WebServer.cs create mode 100644 Vendor/EmbedIO-3.5.2/WebServerBase`1.cs create mode 100644 Vendor/EmbedIO-3.5.2/WebServerExtensions-ExceptionHandliers.cs create mode 100644 Vendor/EmbedIO-3.5.2/WebServerExtensions-SessionManager.cs create mode 100644 Vendor/EmbedIO-3.5.2/WebServerExtensions.cs create mode 100644 Vendor/EmbedIO-3.5.2/WebServerOptions.cs create mode 100644 Vendor/EmbedIO-3.5.2/WebServerOptionsBase.cs create mode 100644 Vendor/EmbedIO-3.5.2/WebServerOptionsBaseExtensions.cs create mode 100644 Vendor/EmbedIO-3.5.2/WebServerOptionsExtensions.cs create mode 100644 Vendor/EmbedIO-3.5.2/WebServerState.cs create mode 100644 Vendor/EmbedIO-3.5.2/WebServerStateChangedEventArgs.cs create mode 100644 Vendor/EmbedIO-3.5.2/WebServerStateChangedEventHandler.cs create mode 100644 Vendor/EmbedIO-3.5.2/WebSockets/CloseStatusCode.cs create mode 100644 Vendor/EmbedIO-3.5.2/WebSockets/IWebSocket.cs create mode 100644 Vendor/EmbedIO-3.5.2/WebSockets/IWebSocketContext.cs create mode 100644 Vendor/EmbedIO-3.5.2/WebSockets/IWebSocketReceiveResult.cs create mode 100644 Vendor/EmbedIO-3.5.2/WebSockets/Internal/Fin.cs create mode 100644 Vendor/EmbedIO-3.5.2/WebSockets/Internal/FragmentBuffer.cs create mode 100644 Vendor/EmbedIO-3.5.2/WebSockets/Internal/Mask.cs create mode 100644 Vendor/EmbedIO-3.5.2/WebSockets/Internal/MessageEventArgs.cs create mode 100644 Vendor/EmbedIO-3.5.2/WebSockets/Internal/PayloadData.cs create mode 100644 Vendor/EmbedIO-3.5.2/WebSockets/Internal/Rsv.cs create mode 100644 Vendor/EmbedIO-3.5.2/WebSockets/Internal/StreamExtensions.cs create mode 100644 Vendor/EmbedIO-3.5.2/WebSockets/Internal/SystemWebSocket.cs create mode 100644 Vendor/EmbedIO-3.5.2/WebSockets/Internal/SystemWebSocketReceiveResult.cs create mode 100644 Vendor/EmbedIO-3.5.2/WebSockets/Internal/WebSocket.cs create mode 100644 Vendor/EmbedIO-3.5.2/WebSockets/Internal/WebSocketContext.cs create mode 100644 Vendor/EmbedIO-3.5.2/WebSockets/Internal/WebSocketFrame.cs create mode 100644 Vendor/EmbedIO-3.5.2/WebSockets/Internal/WebSocketFrameStream.cs create mode 100644 Vendor/EmbedIO-3.5.2/WebSockets/Internal/WebSocketReceiveResult.cs create mode 100644 Vendor/EmbedIO-3.5.2/WebSockets/Internal/WebSocketStream.cs create mode 100644 Vendor/EmbedIO-3.5.2/WebSockets/Opcode.cs create mode 100644 Vendor/EmbedIO-3.5.2/WebSockets/WebSocketException.cs create mode 100644 Vendor/EmbedIO-3.5.2/WebSockets/WebSocketModule.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Collections/CollectionCacheRepository.cs create mode 100644 Vendor/Swan.Lite-3.1.0/CompositeHashCode.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Configuration/ConfiguredObject.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Configuration/SettingsProvider.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Cryptography/Hasher.cs create mode 100644 Vendor/Swan.Lite-3.1.0/DateTimeSpan.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Definitions.Types.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Definitions.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Diagnostics/Benchmark.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Diagnostics/BenchmarkUnit.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Diagnostics/HighResolutionTimer.cs create mode 100644 Vendor/Swan.Lite-3.1.0/EnumHelper.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Enums.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Extensions.ByteArrays.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Extensions.Dates.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Extensions.Dictionaries.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Extensions.Enumerable.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Extensions.Exceptions.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Extensions.Functional.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Extensions.IEnumerable.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Extensions.IPropertyProxy.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Extensions.Reflection.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Extensions.Strings.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Extensions.Tasks.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Extensions.ValueTypes.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Extensions.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Formatters/CsvReader.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Formatters/CsvWriter.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Formatters/HumanizeJson.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Formatters/Json.Converter.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Formatters/Json.Deserializer.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Formatters/Json.Serializer.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Formatters/Json.SerializerOptions.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Formatters/Json.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Formatters/JsonPropertyAttribute.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Formatters/JsonSerializerCase.cs create mode 100644 Vendor/Swan.Lite-3.1.0/FromString.cs create mode 100644 Vendor/Swan.Lite-3.1.0/InternalErrorException.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Logging/ConsoleLogger.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Logging/DebugLogger.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Logging/FileLogger.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Logging/ILogger.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Logging/LogLevel.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Logging/LogMessageReceivedEventArgs.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Logging/Logger.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Logging/TextLogger.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Mappers/CopyableAttribute.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Mappers/IObjectMap.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Mappers/ObjectMap.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Mappers/ObjectMapper.PropertyInfoComparer.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Mappers/ObjectMapper.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Net/IPAddressRange.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Net/IPAddressRangeExtensions.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Net/IPAddressUtility.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Net/Internal/IPAddressValue.cs create mode 100644 Vendor/Swan.Lite-3.1.0/ObjectComparer.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Paginator.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Parsers/ArgumentOptionAttribute.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Parsers/ArgumentParse.Validator.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Parsers/ArgumentParser.TypeResolver.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Parsers/ArgumentParser.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Parsers/ArgumentParserSettings.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Parsers/ExpressionParser.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Parsers/Operator.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Parsers/Token.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Parsers/TokenType.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Parsers/Tokenizer.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Parsers/VerbOptionAttribute.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Reflection/AttributeCache.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Reflection/ConstructorTypeCache.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Reflection/ExtendedTypeInfo.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Reflection/IPropertyProxy.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Reflection/MethodInfoCache.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Reflection/PropertyInfoProxy.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Reflection/PropertyTypeCache.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Reflection/TypeCache.cs create mode 100644 Vendor/Swan.Lite-3.1.0/SelfCheck.cs create mode 100644 Vendor/Swan.Lite-3.1.0/SingletonBase.cs create mode 100644 Vendor/Swan.Lite-3.1.0/StringConversionException.cs create mode 100644 Vendor/Swan.Lite-3.1.0/StructEndiannessAttribute.cs create mode 100644 Vendor/Swan.Lite-3.1.0/SwanRuntime.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Terminal.Graphics.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Terminal.Interaction.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Terminal.Output.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Terminal.Settings.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Terminal.cs create mode 100644 Vendor/Swan.Lite-3.1.0/TerminalWriters.Enums.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Threading/AtomicBoolean.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Threading/AtomicDateTime.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Threading/AtomicDouble.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Threading/AtomicEnum.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Threading/AtomicInteger.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Threading/AtomicLong.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Threading/AtomicTimeSpan.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Threading/AtomicTypeBase.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Threading/CancellationTokenOwner.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Threading/ExclusiveTimer.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Threading/ISyncLocker.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Threading/IWaitEvent.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Threading/IWorker.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Threading/IWorkerDelayProvider.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Threading/PeriodicTask.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Threading/RunnerBase.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Threading/SyncLockerFactory.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Threading/WaitEventFactory.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Threading/WorkerState.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Validators/IValidator.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Validators/ObjectValidationResult.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Validators/ObjectValidator.cs create mode 100644 Vendor/Swan.Lite-3.1.0/Validators/Validators.cs diff --git a/.idea/.idea.RemoteControl/.idea/.gitignore b/.idea/.idea.RemoteControl/.idea/.gitignore new file mode 100644 index 0000000..ba2b321 --- /dev/null +++ b/.idea/.idea.RemoteControl/.idea/.gitignore @@ -0,0 +1,15 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Rider ignored files +/modules.xml +/contentModel.xml +/projectSettingsUpdater.xml +/.idea.RemoteControl.iml +# Ignored default folder with query files +/queries/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/.idea.RemoteControl/.idea/encodings.xml b/.idea/.idea.RemoteControl/.idea/encodings.xml new file mode 100644 index 0000000..df87cf9 --- /dev/null +++ b/.idea/.idea.RemoteControl/.idea/encodings.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/.idea.RemoteControl/.idea/indexLayout.xml b/.idea/.idea.RemoteControl/.idea/indexLayout.xml new file mode 100644 index 0000000..7b08163 --- /dev/null +++ b/.idea/.idea.RemoteControl/.idea/indexLayout.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/.idea.RemoteControl/.idea/vcs.xml b/.idea/.idea.RemoteControl/.idea/vcs.xml new file mode 100644 index 0000000..8306744 --- /dev/null +++ b/.idea/.idea.RemoteControl/.idea/vcs.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/About/About.xml b/About/About.xml new file mode 100644 index 0000000..117fcc0 --- /dev/null +++ b/About/About.xml @@ -0,0 +1,11 @@ + + + RemoteControl + TheQuux + 1.0 + Provides an API for controlling + 0 + + LaunchPad + + diff --git a/About/Preview.png b/About/Preview.png new file mode 100644 index 0000000000000000000000000000000000000000..a74ec24f9375c9697de1542a6e95628830f82548 GIT binary patch literal 1398766 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%0A;sVW9Ue;|*JM`Hiu}Xt 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

Mvj6pwDQcte*d;R+L;S;&s1lYg! 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 z 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

=weJJCazdjGWcJL#=YR>?uE*ncZteAH8>&m*pc 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

#DZSFF&xA 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

keFg3qc*aKsXK?Ch6%(R5(&VSW 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

GG_$wg9i6 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

7Uw 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Ǯ_11@GCm2m1^?mM)-3SCN1Q(x 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%0Dnd?S(Y^5W&t7##bDg3fgXBtEJ5IMrK?QP9kJ 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ΠhG~yGq+7j%CCFdio!B8~l{!TnH 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

@LWKCQGUK-ntbnHlAK&bfY9 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 z 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

m|kcPx_t4YT2jD(h7KQi@A9BD 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%0D?a=r}|R`JJ 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

3#7))q-HIAZtDEjK*2D} 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 z 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 - - - - Debug - AnyCPU - {81D8C460-4627-489B-8D5E-A0640866290F} - Library - Properties - ExamplePatchMod - ExamplePatchMod - 9.0 - v4.7.2 - 512 - true - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - D:\SteamLibrary\steamapps\common\Stationeers\BepInEx\core\0Harmony.dll - - - D:\SteamLibrary\steamapps\common\Stationeers\rocketstation_Data\Managed\Assembly-CSharp.dll - - - D:\SteamLibrary\steamapps\common\Stationeers\BepInEx\core\BepInEx.dll - - - - - - - - - - - D:\SteamLibrary\steamapps\common\Stationeers\rocketstation_Data\Managed\UnityEngine.dll - - - D:\SteamLibrary\steamapps\common\Stationeers\rocketstation_Data\Managed\UnityEngine.CoreModule.dll - - - - - - - - - - \ No newline at end of file diff --git a/Patches/ExamplePatchClass.cs b/Patches/ExamplePatchClass.cs deleted file mode 100644 index 9f96802..0000000 --- a/Patches/ExamplePatchClass.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace ExamplePatchMod.Patches -{ - internal class ExamplePatchClass - { - } -} diff --git a/Patches/Tick.cs b/Patches/Tick.cs new file mode 100644 index 0000000..2cca631 --- /dev/null +++ b/Patches/Tick.cs @@ -0,0 +1,69 @@ +using System; +using System.Diagnostics.CodeAnalysis; +using Assets.Scripts; +using Assets.Scripts.Objects.Electrical; +using HarmonyLib; +using JetBrains.Annotations; + +namespace RemoteControl.Patches +{ + [HarmonyPatch(typeof(LogicStack), nameof(LogicStack.LogicStackTick))] + [SuppressMessage("ReSharper", "InconsistentNaming")] + // ReSharper disable once InconsistentNaming + public class LogicStack_LogicStackTick + { + private struct State + { + internal object LockObj; + internal bool Taken; + } + + [UsedImplicitly] + private static void Prefix(out State __state) + { + __state = new State + { + LockObj = SubscriptionManager.Lock, + Taken = false + }; + if (!GameManager.RunSimulation) return; + // System.Threading.Monitor.Enter(__state.LockObj, ref __state.Taken); + try + { + RemoteControl.Log("logic stack tick: start prefix"); + SubscriptionManager.ApplyUpdates(); + RemoteControl.Log("logic stack tick: end prefix"); + } + catch (Exception e) + { + RemoteControl.Log($"prefix: Exception {e}:\n {e.StackTrace}"); + } + } + + [UsedImplicitly] + private static void Postfix(State __state) + { + try + { + if (!GameManager.RunSimulation) return; + SubscriptionManager.RescanNetworks(); + } + catch (Exception e) + { + RemoteControl.Log("logic stack tick: start postfix"); + RemoteControl.Log($"postfix: Exception {e}: \n{e.StackTrace}"); + RemoteControl.Log("logic stack tick: end postfix"); + } + finally + { + // if (__state.Taken) + // { + // System.Threading.Monitor.Exit(__state.LockObj); + // } + } + + } + } + + +} \ No newline at end of file diff --git a/Patches/WorldManagerStop.cs b/Patches/WorldManagerStop.cs new file mode 100644 index 0000000..0578abc --- /dev/null +++ b/Patches/WorldManagerStop.cs @@ -0,0 +1,14 @@ +using Assets.Scripts; +using HarmonyLib; + +namespace Remotecontrol.Patches +{ + [HarmonyPatch(typeof(WorldManager), nameof(WorldManager.StartWorld))] + public class WorldManagerStartWorld + { + static void Prefix(WorldManager __instance) + { + + } + } +} \ No newline at end of file diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs index e6c2917..c0b7746 100644 --- a/Properties/AssemblyInfo.cs +++ b/Properties/AssemblyInfo.cs @@ -5,11 +5,11 @@ using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. -[assembly: AssemblyTitle("ExamplePatchMod")] +[assembly: AssemblyTitle("RemoteControl")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("ExamplePatchMod")] +[assembly: AssemblyProduct("RemoteControl")] [assembly: AssemblyCopyright("Copyright © 2025")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] diff --git a/README.md b/README.md index 06bf1cf..2c52f6e 100644 --- a/README.md +++ b/README.md @@ -15,9 +15,9 @@ Follow these steps to prepare your Stationeers mod project: 4. **Update Project References** - In the **Solution Explorer**, press `CTRL + A` to select all files. - Press `CTRL + F` to open the **Find and Replace** window. - - Find all instances of `ExamplePatchMod` and replace them with your mod name, e.g., `MyStationeersMod`. + - Find all instances of `RemoteControl` and replace them with your mod name, e.g., `MyStationeersMod`. - Click **Replace All**. 5. **Update Project Properties** - On the top menu, go to **Project → [YourModName] Properties**. - - Change both the **Assembly Name** and **Default Namespace** from `ExamplePatchMod` to your mod name. + - Change both the **Assembly Name** and **Default Namespace** from `RemoteControl` to your mod name. diff --git a/RemoteControl.csproj b/RemoteControl.csproj new file mode 100644 index 0000000..3f58104 --- /dev/null +++ b/RemoteControl.csproj @@ -0,0 +1,410 @@ + + + + + Debug + AnyCPU + {81D8C460-4627-489B-8D5E-A0640866290F} + Library + Properties + RemoteControl + RemoteControl + 9.0 + v4.8.1 + 512 + true + enable + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + C:\Program Files (x86)\Steam\steamapps\common\Stationeers\BepInEx\core\0Harmony.dll + + + C:\Program Files (x86)\Steam\steamapps\common\Stationeers\rocketstation_Data\Managed\Assembly-CSharp.dll + + + C:\Program Files (x86)\Steam\steamapps\common\Stationeers\BepInEx\core\BepInEx.dll + + + + + + + + + + + + + + C:\Program Files (x86)\Steam\steamapps\common\Stationeers\rocketstation_Data\Managed\UniTask.dll + + + C:\Program Files (x86)\Steam\steamapps\common\Stationeers\rocketstation_Data\Managed\UnityEngine.dll + + + C:\Program Files (x86)\Steam\steamapps\common\Stationeers\rocketstation_Data\Managed\UnityEngine.CoreModule.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ExamplePatchMod.sln b/RemoteControl.sln similarity index 87% rename from ExamplePatchMod.sln rename to RemoteControl.sln index c263c3c..d602b0e 100644 --- a/ExamplePatchMod.sln +++ b/RemoteControl.sln @@ -3,7 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.14.36511.14 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExamplePatchMod", "ExamplePatchMod.csproj", "{81D8C460-4627-489B-8D5E-A0640866290F}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RemoteControl", "RemoteControl.csproj", "{81D8C460-4627-489B-8D5E-A0640866290F}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/Scripts/Remotecontrol.cs b/Scripts/Remotecontrol.cs new file mode 100644 index 0000000..3da3b87 --- /dev/null +++ b/Scripts/Remotecontrol.cs @@ -0,0 +1,246 @@ +using System; +using UnityEngine; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Assets.Scripts; +using Assets.Scripts.Networks; +using Assets.Scripts.Objects.Electrical; +using Assets.Scripts.Objects.Motherboards; +using BepInEx; +using BepInEx.Configuration; +using Cysharp.Threading.Tasks; +using HarmonyLib; +using EmbedIO; +using EmbedIO.Routing; +using EmbedIO.WebApi; +using RemoteControl.Message; +using RemoteControl.Utils; +using Swan; +using GameDevice = Assets.Scripts.Objects.Pipes.Device; + + +namespace RemoteControl +{ + [BepInPlugin(pluginGuid, pluginName, pluginVersion)] + [SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] + public class RemoteControl : BepInEx.BaseUnityPlugin + { + // ReSharper disable once MemberCanBePrivate.Global + + // ReSharper disable once MemberCanBePrivate.Global + public static ConfigEntry Port; + + // ReSharper disable once MemberCanBePrivate.Global + public static ConfigEntry ListenOnAllInterfaces; + + private readonly Harmony _harmony = new Harmony(pluginGuid); + + public WebServer WebServer { get; private set; } + + + private CancellationTokenSource _modLifecycle = new(); + + public const string pluginGuid = "com.thequux.stationeers.RemoteControl"; + public const string pluginName = "RemoteControl"; + public const string pluginVersion = "1.0"; + + public static void Log(string line) + { + Debug.Log("[" + pluginName + "]: " + line); + } + + private void StartRC() + { + if (!_modLifecycle.IsCancellationRequested) + { + _modLifecycle.Cancel(); + } + + _modLifecycle = new CancellationTokenSource(); + + Port = Config.Bind(new ConfigDefinition("Server", "Port"), 39125, + new ConfigDescription("The port to listen on")); + ListenOnAllInterfaces = Config.Bind( + new ConfigDefinition("Server", "ListenOnAllInterfaces"), + false, + new ConfigDescription("If set, listen on all interfaces. Otherwise, listen only on localhost")); + + + var subscriptionModule = new SubscriptionModule("/subscribe"); + WebServer = new WebServer(o => + o.WithUrlPrefix($"http://{(ListenOnAllInterfaces.Value ? "0.0.0.0" : "localhost")}:{Port.Value}/") + .WithEmbedIOHttpListener() + ) + .WithWebApi("/api/v1", m => m.WithController()) + .WithModule(subscriptionModule); + WebServer.Start(_modLifecycle.Token); + + _harmony.PatchAll(); + foreach (var patchedMethod in _harmony.GetPatchedMethods()) + { + Log($"Patched {patchedMethod.FullDescription()}"); + } + Log($"Patched {_harmony.GetPatchedMethods().Count()} methods total"); + + + } + + public void OnLoaded(List prefabs) + { + // Start(); +#if DEVELOPMENT_BUILD + Debug.Log($"Loaded {prefabs.Count} prefabs"); +#endif + } + + public void OnUnloaded(List prefabs) + { + // Stop(); + } + + public void StopRC() + { + _modLifecycle.Cancel(); + _harmony.UnpatchSelf(); + } + + public void Awake() + { + Log("Starting RemoteControl"); + StartRC(); + } + + private void OnDestroy() + { + Log("Tearing down RemoteControl"); + StopRC(); + } + } + + internal class ApiController : WebApiController + { + private static readonly Dictionary LtByName = EnumCollections.LogicTypes.AsLookupDict(true); + private static readonly Dictionary StByName = EnumCollections.LogicSlotTypes.AsLookupDict(true); + + private static Device GetDeviceJson(GameDevice device) => + new() + { + ReferenceId = device.ReferenceId, + Name = device.DisplayName, + NameHash = device.GetNameHash(), + PrefabHash = device.PrefabHash, + PrefabName = device.PrefabName, + LogicValues = EnumCollections.LogicTypes.Values.Where(ty => device.CanLogicRead(ty)) + .ToDictionary(ty => ty, ty => device.GetLogicValue(ty)), + Slots = Enumerable.Range(0, device.TotalSlots) + .Select(slot => EnumCollections.LogicSlotTypes.Values.Where(sty => device.CanLogicRead(sty, slot)) + .ToDictionary(ty => ty, sty=> device.GetLogicValue(sty, slot))) + .ToList() + }; + + private static Device? GetDeviceJson(long referenceId) + { + var dev = Referencable.Find(referenceId); + return dev == null ? null : GetDeviceJson(dev); + } + + [Route(HttpVerbs.Get, "/networks")] + public Task> ListNetworks() => Task.FromResult(SubscriptionManager.GetProbes()); + + [Route(HttpVerbs.Get, "/networks/{networkId}")] + public Task> ListDevices(string networkId) + { + // lock (SubscriptionManager.Lock) + using (new LogTimer("ListDevices")) + { + var networks = new HashSet(); + GameDevice.AllDevices.ForEach(dev => + { + if (dev is CableAnalyser analyser) + { + Debug.Log($"Found CA {analyser.DisplayName}: {analyser.ReferenceId}"); + networks.Add(analyser.CableNetwork); + + } + }); + + var devices = new Dictionary(); + foreach (var network in networks) + { + foreach (var device in network.DeviceList) + { + RemoteControl.Log($"Found {device.PrefabName}: {device.DisplayName}({device.ReferenceId})"); + if (devices.ContainsKey(device.ReferenceId)) continue; + devices.Add(device.ReferenceId, GetDeviceJson(device)); + } + } + return Task.FromResult>(devices); + } + } + + [Route(HttpVerbs.Post, "/networks/{networkId}/device/{deviceId}/logic/{varId}")] + public async Task SetLogic(string networkId, long deviceId, string varId) + { + LogicType ltype; + if (!LtByName.TryGetValue(varId.ToLowerInvariant(), out ltype)) + { + throw HttpException.NotFound(); + } + + var value = await HttpContext.GetRequestDataAsync(); + + SubscriptionManager.SetLogic(networkId, deviceId, ltype, value); + } + + [Route(HttpVerbs.Post, "/networks/{networkId}/device/{deviceId}/slot/{slotId}/{varId}")] + public async Task SetSlot(string networkId, long deviceId, int slotId, string varId) + { + LogicSlotType ltype; + if (!StByName.TryGetValue(varId.ToLowerInvariant(), out ltype)) + { + throw HttpException.NotFound(); + } + + var value = await HttpContext.GetRequestDataAsync(); + SubscriptionManager.SetSlot(networkId, deviceId, slotId, ltype, value); + } + + [Route(HttpVerbs.Patch, "/networks/{networkId}/device/{deviceId}")] + public async Task PatchDevice(string networkId, long deviceId) + { + var values = await HttpContext.GetRequestDataAsync>(); + if (values.Keys.Any(key => !LtByName.ContainsKey(key.ToLowerInvariant()))) + { + throw HttpException.BadRequest(); + } + + foreach (var keyValuePair in values) + { + SubscriptionManager.SetLogic(networkId, deviceId, LtByName[keyValuePair.Key.ToLowerInvariant()], keyValuePair.Value); + } + } + + [Route(HttpVerbs.Get, "/networks/{networkId}/device/{deviceId}/code")] + public async UniTask GetCode(string networkId, long deviceId) + { + await UniTask.SwitchToMainThread(HttpContext.CancellationToken); + + string source; + // lock (SubscriptionManager.Lock) + { + var device = SubscriptionManager.GetDevice(networkId, deviceId) ?? throw HttpException.NotFound(); + if (device is not ICircuitHolder) + { + throw HttpException.NotFound(); + } + + source = ((ICircuitHolder)device).GetSourceCode(); + } + + return source; + } + } +} \ No newline at end of file diff --git a/Scripts/SubscriptionManager.cs b/Scripts/SubscriptionManager.cs new file mode 100644 index 0000000..47489c4 --- /dev/null +++ b/Scripts/SubscriptionManager.cs @@ -0,0 +1,390 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Assets.Scripts; +using Assets.Scripts.Networks; +using Assets.Scripts.Objects.Electrical; +using Assets.Scripts.Objects.Motherboards; +using Assets.Scripts.Util; +using JetBrains.Annotations; +using RemoteControl.Message; +using Swan; +using UnityEngine; +using GameDevice = Assets.Scripts.Objects.Pipes.Device; +// ReSharper disable ClassNeverInstantiated.Global +// ReSharper disable MemberCanBePrivate.Global +namespace RemoteControl +{ + public class DataNetwork + { + public long ReferenceId { get; private set; } + internal readonly List Probes = new (); + internal CableNetwork Network { get; private set; } + + private readonly HashSet _knownIds = new(); + + + internal readonly Dictionary DeviceCache = new(); + + public DataNetwork(CableNetwork network) + { + + ReferenceId = network.ReferenceId; + Network = network; + } + + internal void RescanNetworkComposition() + { + _knownIds.Clear(); + _knownIds.UnionWith(Network.DataDeviceList.Select(device => device.ReferenceId)); + DeviceCache.Keys.Except(_knownIds).ToList().ForEach(device => DeviceCache.Remove(device)); + + _knownIds.Except(DeviceCache.Keys).ToList().ForEach(device => + { + var newDev = new Device(); + var dev = Referencable.Find(device); + if (dev == null) return; + newDev.ReferenceId = device; + newDev.PrefabHash = dev.PrefabHash; + newDev.PrefabName = dev.PrefabName; + DeviceCache.Add(device, newDev); + }); + UpdateAllDevices(); + } + + private void UpdateAllDevices() + { + foreach (var kvp in DeviceCache) + { + var device = kvp.Value; + var gameObj = Referencable.Find(kvp.Key); + if (gameObj == null) continue; + device.LogicValues.Clear(); + foreach (var type in EnumCollections.LogicTypes.Values) + { + if (gameObj.CanLogicRead(type)) + { + device.LogicValues[type] = gameObj.GetLogicValue(type); + } + } + + var slotCount = gameObj.TotalSlots; + while (device.Slots.Count > slotCount) + { + device.Slots.RemoveAt(device.Slots.Count - 1); + } + for (int slotIndex = 0; slotIndex < slotCount; slotIndex++) + { + if (device.Slots.Count <= slotIndex) + { + device.Slots.Add(new Dictionary()); + } + + foreach (var type in EnumCollections.LogicSlotTypes.Values) + { + if (gameObj.CanLogicRead(type, slotIndex)) + { + device.Slots[slotIndex][type] = gameObj.GetLogicValue(type, slotIndex); + } + } + } + } + } + + + public DataNetwork Reset(CableNetwork cnet) + { + ReferenceId = cnet.ReferenceId; + Network = cnet; + Probes.Clear(); + DeviceCache.Clear(); + _knownIds.Clear(); + return this; + } + } + + public readonly struct LogicUpdate : IEquatable + { + public readonly long TargetReferenceId; + public readonly LogicType LogicType; + + public LogicUpdate(long targetReferenceId, LogicType logicType) + { + TargetReferenceId = targetReferenceId; + LogicType = logicType; + } + + public bool Equals(LogicUpdate other) + { + return TargetReferenceId == other.TargetReferenceId && LogicType == other.LogicType; + } + + public override bool Equals(object obj) + { + return obj is LogicUpdate other && Equals(other); + } + + public override int GetHashCode() + { + return CompositeHashCode.Using(TargetReferenceId, LogicType); + } + } + + public readonly struct SlotUpdate : IEquatable + { + public readonly long ReferenceId; + public readonly int Slot; + public readonly LogicSlotType Type; + + public SlotUpdate(long referenceID, int slot, LogicSlotType type) + { + ReferenceId = referenceID; + Slot = slot; + Type = type; + } + + public bool Equals(SlotUpdate other) + { + return ReferenceId == other.ReferenceId && Slot == other.Slot && Type == other.Type; + } + + public override bool Equals(object obj) + { + return obj is SlotUpdate other && Equals(other); + } + + public override int GetHashCode() + { + return CompositeHashCode.Using(ReferenceId, Slot, Type); + } + } + + public static class SubscriptionManager + { + public static readonly object Lock = new(); + + private static readonly Dictionary DataNetworks = new(); + // private Dictionary> _probesByName = new(); + // private Dictionary _probesById = new(); + private static readonly Dictionary PendingUpdates = new(); + private static readonly Dictionary PendingSlotUpdates = new(); + + [CanBeNull] + public static Device FindCachedDevice(string probeName, long referenceID) + { + foreach (var analyzer in GetDataNetwork(probeName)) + { + if (analyzer.DeviceCache.TryGetValue(referenceID, out var device)) + { + return device; + } + } + + return null; + } + + // Can be called from any thread + public static bool SetLogic(string probeName, long referenceID, LogicType type, double value) + { + // lock (Lock) + { + var dev = FindCachedDevice(probeName, referenceID); + if (dev == null) + { + return false; + } + + dev.LogicValues[type] = value; + PendingUpdates[new LogicUpdate(referenceID, type)] = value; + } + + return true; + } + + // Can be called from any thread + public static bool SetSlot(string probeName, long referenceID, int slot, LogicSlotType type, double value) + { + // lock (Lock) + { + + var dev = FindCachedDevice(probeName, referenceID); + if (dev != null && dev.Slots.Count > slot && dev.Slots[slot].ContainsKey(type)) + { + dev.Slots[slot][type] = value; + PendingSlotUpdates[new SlotUpdate(referenceID, slot, type)] = value; + return true; + } + else + { + return false; + } + } + + } + + public static DataNetwork GetDataNetwork(CableNetwork network) + { + if (DataNetworks.TryGetValue(network.ReferenceId, out var dataNetwork)) + { + return dataNetwork; + } + else + { + var ret = new DataNetwork(network); + DataNetworks.Add(network.ReferenceId, ret); + return ret; + } + } + + public static IEnumerable GetDataNetwork(string probeName) + { + // lock (Lock) + { + List networks = new(); + GameDevice.AllDevices.ForEach(dev => + { + if (dev is CableAnalyser analyzer) + { + networks.Add(GetDataNetwork(analyzer.CableNetwork)); + } + }); + return networks; + } + } + + + public static GameDevice GetDevice(long referenceID) + { + var device = Referencable.Find(referenceID); + if (!DataNetworks.Values.Any((item) => item.Network.DataDeviceList.Contains(device))) + return null; + return device; + + } + + public static GameDevice GetDevice(string probeName, long referenceID) + { + var device = Referencable.Find(referenceID); + if (GetDataNetwork(probeName).Any(network => network.DeviceCache.ContainsKey(referenceID))) + { + return device; + } + return null; + } + + ///

+ /// Called from Unity thread pool before the logic tick + /// + /// + public static void ApplyUpdates() + { + lock (Lock) + { + foreach (var update in PendingUpdates) + { + var device = GetDevice(update.Key.TargetReferenceId); + + if (!device.CanLogicWrite(update.Key.LogicType)) + { + device.SetLogicValue(update.Key.LogicType, update.Value); + } + } + + foreach (var update in PendingSlotUpdates) + { + var device = Referencable.Find(update.Key.ReferenceId); + if (!DataNetworks.Values.Any((item) => item.Network.DataDeviceList.Contains(device))) + continue; + + if (!device.CanLogicWrite(update.Key.Type, update.Key.Slot)) + { + device.SetLogicValue(update.Key.Type, update.Key.Slot, update.Value); + } + } + + PendingUpdates.Clear(); + PendingSlotUpdates.Clear(); + } + } + + public static void RescanNetworks() + { + using (new LogTimer("RescanNetworks")) + { + HashSet scannedAnalyzers = new(); + HashSet scannedNetworks = new(); + + scannedNetworks.Clear(); + GameDevice.AllDevices.ForEach(dev => + { + if (dev is CableAnalyser analyser) + { + scannedAnalyzers.Add(analyser); + scannedNetworks.Add(analyser.CableNetwork); + } + }); + + var removed = + new List(DataNetworks.Values.Where(dataNetwork => + !scannedNetworks.Contains(dataNetwork.Network))); + foreach (var dataNet in removed) + { + DataNetworks.Remove(dataNet.ReferenceId); + } + + foreach (var dataNet in DataNetworks.Values) + { + dataNet.Probes.Clear(); + } + + foreach (var analyzer in scannedAnalyzers) + { + if (DataNetworks.ContainsKey(analyzer.ReferenceId)) continue; + + var dataNet = removed.Pop()?.Reset(analyzer.CableNetwork) ?? new DataNetwork(analyzer.CableNetwork); + dataNet.Probes.Add(analyzer); + } + + + // TODO: when we have our own device for tagging a network, make this triggered by on the DataNetworkChange method + foreach (var dataNet in DataNetworks.Values) + { + dataNet.RescanNetworkComposition(); + } + } + } + + public static IList GetProbes() + { + List probes = new(); + GameDevice.AllDevices.ForEach(dev => + { + if (dev is CableAnalyser) + { + probes.Add(dev.DisplayName); + } + }); + return probes; + } + + } + + public class LogTimer : IDisposable + { + private readonly DateTime _startTime = DateTime.Now; + private string _action; + + public LogTimer(string action) + { + RemoteControl.Log($"Beginning {action}"); + _action = action; + } + + public void Dispose() + { + var endTime = DateTime.Now; + var elapsed = endTime - _startTime; + Debug.Log($"Time taken for {_action}: " + elapsed); + } + } +} \ No newline at end of file diff --git a/Scripts/SubscriptionModule.cs b/Scripts/SubscriptionModule.cs new file mode 100644 index 0000000..351693d --- /dev/null +++ b/Scripts/SubscriptionModule.cs @@ -0,0 +1,74 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using Assets.Scripts.Objects.Motherboards; +using EmbedIO.WebSockets; +using Swan; + +namespace RemoteControl +{ + internal class SubscriptionModule: WebSocketModule + { + private HashSet _jsonSubscribers = new(); + public void SendUpdate(Message.Update update) + { + if (_jsonSubscribers.Count > 0) + { + var encoded = System.Text.Encoding.UTF8.GetBytes(update.ToJson()); + foreach (var webSocketContext in _jsonSubscribers) + { + _ = SendAsync(webSocketContext, encoded); + } + } + + } + + public SubscriptionModule(string urlPath, bool enableConnectionWatchdog = true) : base(urlPath, enableConnectionWatchdog) + { + AddProtocols("json"); + } + + protected override Task OnMessageReceivedAsync(IWebSocketContext context, byte[] buffer, IWebSocketReceiveResult result) + { + return Task.CompletedTask; + } + + protected override Task OnClientConnectedAsync(IWebSocketContext context) + { + _jsonSubscribers.Add(context); + return base.OnClientConnectedAsync(context); + } + + protected override Task OnClientDisconnectedAsync(IWebSocketContext context) + { + _jsonSubscribers.Remove(context); + return base.OnClientDisconnectedAsync(context); + } + } + + namespace Message + { + public class Update + { + public List Networks { get; set; } = new(); + } + + public class Network + { + public long ReferenceId { get; set; } + public List Probes { get; set; } = new(); + + public List Devices { get; set; } = new(); + } + + public class Device + { + public long ReferenceId { get; set; } + public long NameHash{ get; set; } + public string Name{ get; set; } + public long PrefabHash{ get; set; } + public string PrefabName{ get; set; } + public Dictionary LogicValues { get; set; } = new(); + public List> Slots { get; set; }= new(); + } + } +} \ No newline at end of file diff --git a/Utils/Extensions.cs b/Utils/Extensions.cs new file mode 100644 index 0000000..95f0305 --- /dev/null +++ b/Utils/Extensions.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using Assets.Scripts; +using Swan; + +namespace RemoteControl.Utils +{ + internal static class Extensions + { + internal static Dictionary AsLookupDict(this EnumCollection collection, bool lowercase) + where TEnum : Enum, IConvertible, new() + where TValue : IConvertible, IEquatable + { + var result = new Dictionary(); + for (var i = 0; i < collection.Length; i++) + { + var name = collection.Names[i]; + if (lowercase) + { + name = name.ToLowerInvariant(); + } + var value = collection.Values[i]; + result.Add(name, value); + result.Add(collection.ValuesAsInts[i].ToStringInvariant(), value); + } + return result; + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Actions/ActionModule.cs b/Vendor/EmbedIO-3.5.2/Actions/ActionModule.cs new file mode 100644 index 0000000..8089d51 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Actions/ActionModule.cs @@ -0,0 +1,54 @@ +using System; +using System.Threading.Tasks; +using EmbedIO.Utilities; + +namespace EmbedIO.Actions +{ + /// + /// A module that passes requests to a callback. + /// + /// + public class ActionModule : WebModuleBase + { + private readonly HttpVerbs _verb; + + private readonly RequestHandlerCallback _handler; + + /// + /// Initializes a new instance of the class. + /// + /// The base route. + /// The HTTP verb that will be served by this module. + /// The callback used to handle requests. + /// is . + /// + public ActionModule(string baseRoute, HttpVerbs verb, RequestHandlerCallback handler) + : base(baseRoute) + { + _verb = verb; + _handler = Validate.NotNull(nameof(handler), handler); + } + + /// + /// Initializes a new instance of the class. + /// + /// The handler. + public ActionModule(RequestHandlerCallback handler) + : this("/", HttpVerbs.Any, handler) + { + } + + /// + public override bool IsFinalHandler => false; + + /// + protected override async Task OnRequestAsync(IHttpContext context) + { + if (_verb != HttpVerbs.Any && context.Request.HttpVerb != _verb) + return; + + await _handler(context).ConfigureAwait(false); + context.SetHandled(); + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Actions/RedirectModule.cs b/Vendor/EmbedIO-3.5.2/Actions/RedirectModule.cs new file mode 100644 index 0000000..5b2913f --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Actions/RedirectModule.cs @@ -0,0 +1,99 @@ +using System; +using System.Net; +using System.Threading.Tasks; +using EmbedIO.Utilities; + +namespace EmbedIO.Actions +{ + /// + /// A module that redirects requests. + /// + /// + public class RedirectModule : WebModuleBase + { + private readonly Func? _shouldRedirect; + + /// + /// Initializes a new instance of the class + /// that will redirect all served requests. + /// + /// The base route. + /// The redirect URL. + /// The response status code; default is 302 - Found. + /// is . + /// + /// is not a valid URL. + /// - or - + /// is not a redirection (3xx) status code. + /// + /// + public RedirectModule(string baseRoute, string redirectUrl, HttpStatusCode statusCode = HttpStatusCode.Found) + : this(baseRoute, redirectUrl, null, statusCode, false) + { + } + + /// + /// Initializes a new instance of the class + /// that will redirect all requests for which the callback + /// returns . + /// + /// The base route. + /// The redirect URL. + /// A callback function that returns + /// if a request must be redirected. + /// The response status code; default is 302 - Found. + /// + /// is . + /// - or - + /// is . + /// + /// + /// is not a valid URL. + /// - or - + /// is not a redirection (3xx) status code. + /// + /// + public RedirectModule(string baseRoute, string redirectUrl, Func? shouldRedirect, HttpStatusCode statusCode = HttpStatusCode.Found) + : this(baseRoute, redirectUrl, shouldRedirect, statusCode, true) + { + } + + private RedirectModule(string baseRoute, string redirectUrl, Func? shouldRedirect, HttpStatusCode statusCode, bool useCallback) + : base(baseRoute) + { + RedirectUrl = Validate.Url(nameof(redirectUrl), redirectUrl); + + var status = (int)statusCode; + if (status < 300 || status > 399) + throw new ArgumentException("Status code does not imply a redirection.", nameof(statusCode)); + + StatusCode = statusCode; + _shouldRedirect = useCallback ? Validate.NotNull(nameof(shouldRedirect), shouldRedirect) : null; + } + + /// + public override bool IsFinalHandler => false; + + /// + /// Gets the redirect URL. + /// + public string RedirectUrl { get; } + + /// + /// Gets the response status code. + /// + public HttpStatusCode StatusCode { get; } + + /// + protected override Task OnRequestAsync(IHttpContext context) + { + if (_shouldRedirect?.Invoke(context) ?? true) + { + context.Redirect(RedirectUrl, (int)StatusCode); + context.SetHandled(); + } + + return Task.CompletedTask; + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Authentication/Auth.cs b/Vendor/EmbedIO-3.5.2/Authentication/Auth.cs new file mode 100644 index 0000000..25b3a08 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Authentication/Auth.cs @@ -0,0 +1,31 @@ +using System.Security.Principal; + +namespace EmbedIO.Authentication +{ + /// + /// Provides useful authentication-related constants. + /// + public static class Auth + { + /// + /// Gets an interface representing + /// no user. To be used instead of + /// to initialize or set properties of type . + /// + public static IPrincipal NoUser { get; } = new GenericPrincipal( + new GenericIdentity(string.Empty, string.Empty), + null); + + /// + /// Creates and returns an interface + /// representing an unauthenticated user, with the given + /// authentication type. + /// + /// The type of authentication used to identify the user. + /// An interface. + public static IPrincipal CreateUnauthenticatedPrincipal(string authenticationType) + => new GenericPrincipal( + new GenericIdentity(string.Empty, authenticationType), + null); + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Authentication/BasicAuthenticationModule.cs b/Vendor/EmbedIO-3.5.2/Authentication/BasicAuthenticationModule.cs new file mode 100644 index 0000000..e76e34f --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Authentication/BasicAuthenticationModule.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Concurrent; +using System.Threading; +using System.Threading.Tasks; + +namespace EmbedIO.Authentication +{ + /// + /// Simple HTTP basic authentication module that stores credentials + /// in a . + /// + public class BasicAuthenticationModule : BasicAuthenticationModuleBase + { + /// + /// Initializes a new instance of the class. + /// + /// The base route. + /// The authentication realm. + /// + /// If is or the empty string, + /// the Realm property will be set equal to + /// BaseRoute. + /// + public BasicAuthenticationModule(string baseRoute, string? realm = null) + : base(baseRoute, realm) + { + } + + /// + /// Gets a dictionary of valid user names and passwords. + /// + /// + /// The accounts. + /// + public ConcurrentDictionary Accounts { get; } = new ConcurrentDictionary(StringComparer.InvariantCulture); + + /// + protected override Task VerifyCredentialsAsync(string path, string userName, string password, CancellationToken cancellationToken) + => Task.FromResult(VerifyCredentialsInternal(userName, password)); + + private bool VerifyCredentialsInternal(string userName, string password) + => userName != null + && Accounts.TryGetValue(userName, out var storedPassword) + && string.Equals(password, storedPassword, StringComparison.Ordinal); + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Authentication/BasicAuthenticationModuleBase.cs b/Vendor/EmbedIO-3.5.2/Authentication/BasicAuthenticationModuleBase.cs new file mode 100644 index 0000000..e618c9a --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Authentication/BasicAuthenticationModuleBase.cs @@ -0,0 +1,103 @@ +using System; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace EmbedIO.Authentication +{ + /// + /// Implements HTTP basic authentication. + /// + public abstract class BasicAuthenticationModuleBase : WebModuleBase + { + private readonly string _wwwAuthenticateHeaderValue; + + /// + /// Initializes a new instance of the class. + /// + /// The base URL path. + /// The authentication realm. + /// + /// If is or the empty string, + /// the property will be set equal to + /// BaseRoute. + /// + protected BasicAuthenticationModuleBase(string baseRoute, string? realm) + : base(baseRoute) + { + Realm = string.IsNullOrEmpty(realm) ? BaseRoute : realm; + + _wwwAuthenticateHeaderValue = $"Basic realm=\"{Realm}\" charset=UTF-8"; + } + + /// + public sealed override bool IsFinalHandler => false; + + /// + /// Gets the authentication realm. + /// + public string Realm { get; } + + /// + protected sealed override async Task OnRequestAsync(IHttpContext context) + { + async Task IsAuthenticatedAsync() + { + try + { + var (userName, password) = GetCredentials(context.Request); + return await VerifyCredentialsAsync(context.RequestedPath, userName, password, context.CancellationToken) + .ConfigureAwait(false); + } + catch (FormatException) + { + // Credentials were not formatted correctly. + return false; + } + } + + context.Response.Headers.Set(HttpHeaderNames.WWWAuthenticate, _wwwAuthenticateHeaderValue); + + if (!await IsAuthenticatedAsync().ConfigureAwait(false)) + throw HttpException.Unauthorized(); + } + + /// + /// Verifies the credentials given in the Authentication request header. + /// + /// The URL path requested by the client. Note that this is relative + /// to the module's BaseRoute. + /// The user name, or if none has been given. + /// The password, or if none has been given. + /// A use to cancel the operation. + /// A whose result will be if the given credentials + /// are valid, if they are not. + protected abstract Task VerifyCredentialsAsync(string path, string userName, string password, CancellationToken cancellationToken); + + private static (string UserName, string Password) GetCredentials(IHttpRequest request) + { + var authHeader = request.Headers[HttpHeaderNames.Authorization]; + + if (authHeader == null) + return default; + + if (!authHeader.StartsWith("basic ", StringComparison.OrdinalIgnoreCase)) + return default; + + string credentials; + try + { + credentials = WebServer.DefaultEncoding.GetString(Convert.FromBase64String(authHeader.Substring(6).Trim())); + } + catch (FormatException) + { + return default; + } + + var separatorPos = credentials.IndexOf(':'); + return separatorPos < 0 + ? (credentials, string.Empty) + : (credentials.Substring(0, separatorPos), credentials.Substring(separatorPos + 1)); + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Authentication/BasicAuthenticationModuleExtensions.cs b/Vendor/EmbedIO-3.5.2/Authentication/BasicAuthenticationModuleExtensions.cs new file mode 100644 index 0000000..448ecec --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Authentication/BasicAuthenticationModuleExtensions.cs @@ -0,0 +1,34 @@ +using System; + +namespace EmbedIO.Authentication +{ + /// + /// Provides extension methods for . + /// + public static class BasicAuthenticationModuleExtensions + { + /// + /// Adds a username and password to the Accounts dictionary. + /// + /// The on which this method is called. + /// The user name. + /// The password. + /// , with the user name and password added. + /// is . + /// is . + /// + /// The Accounts dictionary already contains + /// the maximum number of elements (MaxValue). + /// + /// + /// If a account already exists, + /// its password is replaced with . + /// + public static BasicAuthenticationModule WithAccount(this BasicAuthenticationModule @this, string userName, string password) + { + @this.Accounts.AddOrUpdate(userName, password, (_, __) => password); + + return @this; + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/CompressionMethod.cs b/Vendor/EmbedIO-3.5.2/CompressionMethod.cs new file mode 100644 index 0000000..82f21cf --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/CompressionMethod.cs @@ -0,0 +1,29 @@ +namespace EmbedIO +{ + /// + /// Specifies the compression method used to compress a message on + /// the WebSocket connection. + /// + /// + /// The compression methods that can be used are defined in + /// + /// Compression Extensions for WebSocket. + /// + public enum CompressionMethod : byte + { + /// + /// Specifies no compression. + /// + None, + + /// + /// Specifies "Deflate" compression. + /// + Deflate, + + /// + /// Specifies GZip compression. + /// + Gzip, + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/CompressionMethodNames.cs b/Vendor/EmbedIO-3.5.2/CompressionMethodNames.cs new file mode 100644 index 0000000..3511b96 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/CompressionMethodNames.cs @@ -0,0 +1,27 @@ +namespace EmbedIO +{ + /// + /// Exposes constants for possible values of the Content-Encoding HTTP header. + /// + /// + public static class CompressionMethodNames + { + /// + /// Specifies no compression. + /// + /// + public const string None = "identity"; + + /// + /// Specifies the "Deflate" compression method. + /// + /// + public const string Deflate = "deflate"; + + /// + /// Specifies the GZip compression method. + /// + /// + public const string Gzip = "gzip"; + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Cors/CorsModule.cs b/Vendor/EmbedIO-3.5.2/Cors/CorsModule.cs new file mode 100644 index 0000000..ee9bafd --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Cors/CorsModule.cs @@ -0,0 +1,130 @@ +using System; +using System.Linq; +using System.Threading.Tasks; +using EmbedIO.Utilities; + +namespace EmbedIO.Cors +{ + /// + /// Cross-origin resource sharing (CORS) control Module. + /// CORS is a mechanism that allows restricted resources (e.g. fonts) + /// on a web page to be requested from another domain outside the domain from which the resource originated. + /// + public class CorsModule : WebModuleBase + { + /// + /// A string meaning "All" in CORS headers. + /// + public const string All = "*"; + + private readonly string _origins; + private readonly string _headers; + private readonly string _methods; + private readonly string[] _validOrigins; + private readonly string[] _validMethods; + + /// + /// Initializes a new instance of the class. + /// + /// The base route. + /// The valid origins. The default is (*). + /// The valid headers. The default is (*). + /// The valid methods. The default is (*). + /// + /// origins + /// or + /// headers + /// or + /// methods + /// + public CorsModule( + string baseRoute, + string origins = All, + string headers = All, + string methods = All) + : base(baseRoute) + { + _origins = origins ?? throw new ArgumentNullException(nameof(origins)); + _headers = headers ?? throw new ArgumentNullException(nameof(headers)); + _methods = methods ?? throw new ArgumentNullException(nameof(methods)); + + _validOrigins = + origins.ToLowerInvariant() + .SplitByComma(StringSplitOptions.RemoveEmptyEntries) + .Select(x => x.Trim()) + .ToArray(); + _validMethods = + methods.ToLowerInvariant() + .SplitByComma(StringSplitOptions.RemoveEmptyEntries) + .Select(x => x.Trim()) + .ToArray(); + } + + /// + public override bool IsFinalHandler => false; + + /// + protected override Task OnRequestAsync(IHttpContext context) + { + var isOptions = context.Request.HttpVerb == HttpVerbs.Options; + + // If we allow all we don't need to filter + if (_origins == All && _headers == All && _methods == All) + { + context.Response.Headers.Set(HttpHeaderNames.AccessControlAllowOrigin, All); + + if (isOptions) + { + ValidateHttpOptions(context); + context.SetHandled(); + } + + return Task.CompletedTask; + } + + var currentOrigin = context.Request.Headers[HttpHeaderNames.Origin]; + + if (string.IsNullOrWhiteSpace(currentOrigin) && context.Request.IsLocal) + return Task.CompletedTask; + + if (_origins == All) + return Task.CompletedTask; + + if (_validOrigins.Contains(currentOrigin)) + { + context.Response.Headers.Set(HttpHeaderNames.AccessControlAllowOrigin, currentOrigin); + + if (isOptions) + { + ValidateHttpOptions(context); + context.SetHandled(); + } + } + + return Task.CompletedTask; + } + + private void ValidateHttpOptions(IHttpContext context) + { + var requestHeadersHeader = context.Request.Headers[HttpHeaderNames.AccessControlRequestHeaders]; + if (!string.IsNullOrWhiteSpace(requestHeadersHeader)) + { + // TODO: Remove unwanted headers from request + context.Response.Headers.Set(HttpHeaderNames.AccessControlAllowHeaders, requestHeadersHeader); + } + + var requestMethodHeader = context.Request.Headers[HttpHeaderNames.AccessControlRequestMethod]; + if (string.IsNullOrWhiteSpace(requestMethodHeader)) + return; + + var currentMethods = requestMethodHeader.ToLowerInvariant() + .SplitByComma(StringSplitOptions.RemoveEmptyEntries) + .Select(x => x.Trim()); + + if (_methods != All && !currentMethods.Any(_validMethods.Contains)) + throw HttpException.BadRequest(); + + context.Response.Headers.Set(HttpHeaderNames.AccessControlAllowMethods, requestMethodHeader); + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/EmbedIOInternalErrorException.cs b/Vendor/EmbedIO-3.5.2/EmbedIOInternalErrorException.cs new file mode 100644 index 0000000..4d800b8 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/EmbedIOInternalErrorException.cs @@ -0,0 +1,64 @@ +using System; +using System.Runtime.Serialization; + +/* + * NOTE TO CONTRIBUTORS: + * + * Never use this exception directly. + * Use the methods in EmbedIO.Internal.SelfCheck instead. + */ + +namespace EmbedIO +{ +#pragma warning disable SA1642 // Constructor summary documentation should begin with standard text + /// + /// The exception that is thrown by EmbedIO's internal diagnostic checks to signal a condition + /// most probably caused by an error in EmbedIO. + /// This API supports the EmbedIO infrastructure and is not intended to be used directly from your code. + /// + [Serializable] + public class EmbedIOInternalErrorException : Exception + { + /// + /// Initializes a new instance of the class. + /// This API supports the EmbedIO infrastructure and is not intended to be used directly from your code. + /// + public EmbedIOInternalErrorException() + { + } + + /// + /// Initializes a new instance of the class. + /// This API supports the EmbedIO infrastructure and is not intended to be used directly from your code. + /// + /// The message that describes the error. + public EmbedIOInternalErrorException(string message) + : base(message) + { + } + + /// + /// Initializes a new instance of the class. + /// This API supports the EmbedIO infrastructure and is not intended to be used directly from your code. + /// + /// The error message that explains the reason for the exception. + /// The exception that is the cause of the current exception, + /// or if no inner exception is specified. + public EmbedIOInternalErrorException(string message, Exception? innerException) + : base(message, innerException) + { + } + + /// + /// Initializes a new instance of the class. + /// This API supports the EmbedIO infrastructure and is not intended to be used directly from your code. + /// + /// The that holds the serialized object data about the exception being thrown. + /// The that contains contextual information about the source or destination. + protected EmbedIOInternalErrorException(SerializationInfo info, StreamingContext context) + : base(info, context) + { + } + } +#pragma warning restore SA1642 +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/ExceptionHandler.cs b/Vendor/EmbedIO-3.5.2/ExceptionHandler.cs new file mode 100644 index 0000000..6355889 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/ExceptionHandler.cs @@ -0,0 +1,165 @@ +using System; +using System.Net; +using System.Runtime.ExceptionServices; +using System.Threading.Tasks; +using System.Web; +using System.Web.Util; +using Swan.Logging; + +namespace EmbedIO +{ + /// + /// Provides standard handlers for unhandled exceptions at both module and server level. + /// + /// + /// + public static class ExceptionHandler + { + /// + /// The name of the response header used by the + /// handler to transmit the type of the exception to the client. + /// + public const string ExceptionTypeHeaderName = "X-Exception-Type"; + + /// + /// The name of the response header used by the + /// handler to transmit the message of the exception to the client. + /// + public const string ExceptionMessageHeaderName = "X-Exception-Message"; + + /// + /// Gets or sets the contact information to include in exception responses. + /// + public static string? ContactInformation { get; set; } + + /// + /// Gets or sets a value indicating whether to include stack traces + /// in exception responses. + /// + public static bool IncludeStackTraces { get; set; } + + /// + /// Gets the default handler used by . + /// This is the same as . + /// + public static ExceptionHandlerCallback Default { get; } = HtmlResponse; + + /// + /// Sends an empty 500 Internal Server Error response. + /// + /// An interface representing the context of the request. + /// The unhandled exception. + /// A representing the ongoing operation. +#pragma warning disable CA1801 // Unused parameter + public static Task EmptyResponse(IHttpContext context, Exception exception) +#pragma warning restore CA1801 + { + context.Response.SetEmptyResponse((int)HttpStatusCode.InternalServerError); + return Task.CompletedTask; + } + + /// + /// Sends an empty 500 Internal Server Error response, + /// with the following additional headers: + /// + /// + /// Header + /// Value + /// + /// + /// X-Exception-Type + /// The name (without namespace) of the type of exception that was thrown. + /// + /// + /// X-Exception-Message + /// The Message property of the exception. + /// + /// + /// The aforementioned header names are available as the and + /// properties, respectively. + /// + /// An interface representing the context of the request. + /// The unhandled exception. + /// A representing the ongoing operation. + public static Task EmptyResponseWithHeaders(IHttpContext context, Exception exception) + { + context.Response.SetEmptyResponse((int)HttpStatusCode.InternalServerError); + context.Response.Headers[ExceptionTypeHeaderName] = Uri.EscapeDataString(exception.GetType().Name); + context.Response.Headers[ExceptionMessageHeaderName] = Uri.EscapeDataString(exception.Message); + return Task.CompletedTask; + } + + /// + /// Sends a 500 Internal Server Error response with a HTML payload + /// briefly describing the error, including contact information and/or a stack trace + /// if specified via the and + /// properties, respectively. + /// + /// An interface representing the context of the request. + /// The unhandled exception. + /// A representing the ongoing operation. + public static Task HtmlResponse(IHttpContext context, Exception exception) + => context.SendStandardHtmlAsync( + (int)HttpStatusCode.InternalServerError, + text => + { + text.Write("

The server has encountered an error and was not able to process your request.

"); + text.Write("

Please contact the server administrator"); + + if (!string.IsNullOrEmpty(ContactInformation)) + text.Write(" ({0})", WebUtility.HtmlEncode(ContactInformation)); + + text.Write(", informing them of the time this error occurred and the action(s) you performed that resulted in this error.

"); + text.Write("

The following information may help them in finding out what happened and restoring full functionality.

"); + text.Write( + "

Exception type: {0}

Message: {1}", + WebUtility.HtmlEncode(exception.GetType().FullName ?? ""), + WebUtility.HtmlEncode(exception.Message)); + + if (IncludeStackTraces) + { + text.Write( + "

Stack trace:


{0}
", + WebUtility.HtmlEncode(exception.StackTrace)); + } + }); + + internal static async Task Handle(string logSource, IHttpContext context, Exception exception, ExceptionHandlerCallback? handler, HttpExceptionHandlerCallback? httpHandler) + { + if (handler == null) + { + ExceptionDispatchInfo.Capture(exception).Throw(); + return; + } + + exception.Log(logSource, $"[{context.Id}] Unhandled exception."); + + try + { + context.Response.SetEmptyResponse((int)HttpStatusCode.InternalServerError); + context.Response.DisableCaching(); + await handler(context, exception) + .ConfigureAwait(false); + } + catch (OperationCanceledException) when (context.CancellationToken.IsCancellationRequested) + { + throw; + } + catch (HttpListenerException) + { + throw; + } + catch (Exception httpException) when (httpException is IHttpException httpException1) + { + if (httpHandler == null) + throw; + + await httpHandler(context, httpException1).ConfigureAwait(false); + } + catch (Exception exception2) + { + exception2.Log(logSource, $"[{context.Id}] Unhandled exception while handling exception."); + } + } + } +} diff --git a/Vendor/EmbedIO-3.5.2/ExceptionHandlerCallback.cs b/Vendor/EmbedIO-3.5.2/ExceptionHandlerCallback.cs new file mode 100644 index 0000000..406dda2 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/ExceptionHandlerCallback.cs @@ -0,0 +1,22 @@ +using System; +using System.Net; +using System.Threading.Tasks; + +namespace EmbedIO +{ + /// + /// A callback used to provide information about an unhandled exception occurred while processing a request. + /// + /// An interface representing the context of the request. + /// The unhandled exception. + /// A representing the ongoing operation. + /// + /// When this delegate is called, the response's status code has already been set to + /// . + /// Any exception thrown by a handler (even a HTTP exception) will go unhandled: the web server + /// will not crash, but processing of the request will be aborted, and the response will be flushed as-is. + /// In other words, it is not a good ides to throw HttpException.NotFound() (or similar) + /// from a handler. + /// + public delegate Task ExceptionHandlerCallback(IHttpContext context, Exception exception); +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Files/DirectoryLister.cs b/Vendor/EmbedIO-3.5.2/Files/DirectoryLister.cs new file mode 100644 index 0000000..d99ee89 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Files/DirectoryLister.cs @@ -0,0 +1,20 @@ +using EmbedIO.Files.Internal; + +namespace EmbedIO.Files +{ + /// + /// Provides standard directory listers for . + /// + /// + public static class DirectoryLister + { + /// + /// Gets an interface + /// that produces a HTML listing of a directory. + /// The output of the returned directory lister + /// is the same as a directory listing obtained + /// by EmbedIO version 2. + /// + public static IDirectoryLister Html => HtmlDirectoryLister.Instance; + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Files/FileCache.Section.cs b/Vendor/EmbedIO-3.5.2/Files/FileCache.Section.cs new file mode 100644 index 0000000..e133f14 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Files/FileCache.Section.cs @@ -0,0 +1,185 @@ +using System; +using System.Collections.Generic; +using EmbedIO.Files.Internal; + +namespace EmbedIO.Files +{ + public sealed partial class FileCache + { + internal class Section + { + private readonly object _syncRoot = new object(); + private readonly Dictionary _items = new Dictionary(StringComparer.Ordinal); + private long _totalSize; + private string? _oldestKey; + private string? _newestKey; + + public void Clear() + { + lock (_syncRoot) + { + ClearCore(); + } + } + + public void Add(string path, FileCacheItem item) + { + lock (_syncRoot) + { + AddItemCore(path, item); + } + } + + public void Remove(string path) + { + lock (_syncRoot) + { + RemoveItemCore(path); + } + } + + public bool TryGet(string path, out FileCacheItem item) + { + lock (_syncRoot) + { + if (!_items.TryGetValue(path, out item)) + return false; + + RefreshItemCore(path, item); + return true; + } + } + + internal long GetLeastRecentUseTime() + { + lock (_syncRoot) + { + return _oldestKey == null ? long.MaxValue : _items[_oldestKey].LastUsedAt; + } + } + + // Removes least recently used item. + // Returns size of removed item. + internal long RemoveLeastRecentItem() + { + lock (_syncRoot) + { + return RemoveLeastRecentItemCore(); + } + } + + internal long GetTotalSize() + { + lock (_syncRoot) + { + return _totalSize; + } + } + + internal void UpdateTotalSize(long delta) + { + lock (_syncRoot) + { + _totalSize += delta; + } + } + + private void ClearCore() + { + _items.Clear(); + _totalSize = 0; + _oldestKey = null; + _newestKey = null; + } + + // Adds an item as most recently used. + private void AddItemCore(string path, FileCacheItem item) + { + item.PreviousKey = _newestKey; + item.NextKey = null; + item.LastUsedAt = TimeBase.ElapsedTicks; + + if (_newestKey != null) + _items[_newestKey].NextKey = path; + + _newestKey = path; + + _items[path] = item; + _totalSize += item.SizeInCache; + } + + // Removes an item. + private void RemoveItemCore(string path) + { + if (!_items.TryGetValue(path, out var item)) + return; + + if (_oldestKey == path) + _oldestKey = item.NextKey; + + if (_newestKey == path) + _newestKey = item.PreviousKey; + + if (item.PreviousKey != null) + _items[item.PreviousKey].NextKey = item.NextKey; + + if (item.NextKey != null) + _items[item.NextKey].PreviousKey = item.PreviousKey; + + item.PreviousKey = null; + item.NextKey = null; + + _items.Remove(path); + _totalSize -= item.SizeInCache; + } + + // Removes the least recently used item. + // returns size of removed item. + private long RemoveLeastRecentItemCore() + { + var path = _oldestKey; + if (path == null) + return 0; + + var item = _items[path]; + + if ((_oldestKey = item.NextKey) != null) + _items[_oldestKey].PreviousKey = null; + + if (_newestKey == path) + _newestKey = null; + + item.PreviousKey = null; + item.NextKey = null; + + _items.Remove(path); + _totalSize -= item.SizeInCache; + return item.SizeInCache; + } + + // Moves an item to most recently used. + private void RefreshItemCore(string path, FileCacheItem item) + { + item.LastUsedAt = TimeBase.ElapsedTicks; + + if (_newestKey == path) + return; + + if (_oldestKey == path) + _oldestKey = item.NextKey; + + if (item.PreviousKey != null) + _items[item.PreviousKey].NextKey = item.NextKey; + + if (item.NextKey != null) + _items[item.NextKey].PreviousKey = item.PreviousKey; + + item.PreviousKey = _newestKey; + item.NextKey = null; + + _items[_newestKey!].NextKey = path; + _newestKey = path; + } + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Files/FileCache.cs b/Vendor/EmbedIO-3.5.2/Files/FileCache.cs new file mode 100644 index 0000000..accf545 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Files/FileCache.cs @@ -0,0 +1,178 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using EmbedIO.Internal; +using Swan.Threading; +using Swan.Logging; + +namespace EmbedIO.Files +{ +#pragma warning disable CA1001 // Type owns disposable field '_cleaner' but is not disposable - _cleaner has its own dispose semantics. + /// + /// A cache where one or more instances of can store hashes and file contents. + /// + public sealed partial class FileCache +#pragma warning restore CA1001 + { + /// + /// The default value for the property. + /// + public const int DefaultMaxSizeKb = 10240; + + /// + /// The default value for the property. + /// + public const int DefaultMaxFileSizeKb = 200; + + private static readonly Stopwatch TimeBase = Stopwatch.StartNew(); + + private static readonly object DefaultSyncRoot = new object(); + private static FileCache? _defaultInstance; + + private readonly ConcurrentDictionary _sections = new ConcurrentDictionary(StringComparer.Ordinal); + private int _sectionCount; // Because ConcurrentDictionary<,>.Count is locking. + private int _maxSizeKb = DefaultMaxSizeKb; + private int _maxFileSizeKb = DefaultMaxFileSizeKb; + private PeriodicTask? _cleaner; + + /// + /// Gets the default instance used by . + /// + public static FileCache Default + { + get + { + if (_defaultInstance != null) + return _defaultInstance; + + lock (DefaultSyncRoot) + { + if (_defaultInstance == null) + _defaultInstance = new FileCache(); + } + + return _defaultInstance; + } + } + + /// + /// Gets or sets the maximum total size of cached data in kilobytes (1 kilobyte = 1024 bytes). + /// The default value for this property is stored in the constant field. + /// Setting this property to a value less lower han 1 has the same effect as setting it to 1. + /// + public int MaxSizeKb + { + get => _maxSizeKb; + set => _maxSizeKb = Math.Max(value, 1); + } + + /// + /// Gets or sets the maximum size of a single cached file in kilobytes (1 kilobyte = 1024 bytes). + /// A single file's contents may be present in a cache more than once, if the file + /// is requested with different Accept-Encoding request headers. This property acts as a threshold + /// for the uncompressed size of a file. + /// The default value for this property is stored in the constant field. + /// Setting this property to a value lower than 0 has the same effect as setting it to 0, in fact + /// completely disabling the caching of file contents for this cache. + /// This property cannot be set to a value higher than 2097151; in other words, it is not possible + /// to cache files bigger than two Gigabytes (1 Gigabyte = 1048576 kilobytes) minus 1 kilobyte. + /// + public int MaxFileSizeKb + { + get => _maxFileSizeKb; + set => _maxFileSizeKb = Math.Min(Math.Max(value, 0), 2097151); + } + + // Cast as IDictionary because we WANT an exception to be thrown if the name exists. + // It would mean that something is very, very wrong. + internal Section AddSection(string name) + { + var section = new Section(); + (_sections as IDictionary).Add(name, section); + + if (Interlocked.Increment(ref _sectionCount) == 1) + _cleaner = new PeriodicTask(TimeSpan.FromMinutes(1), CheckMaxSize); + + return section; + } + + internal void RemoveSection(string name) + { + _sections.TryRemove(name, out _); + + if (Interlocked.Decrement(ref _sectionCount) == 0) + { + _cleaner?.Dispose(); + _cleaner = null; + } + } + + private async Task CheckMaxSize(CancellationToken cancellationToken) + { + var timeKeeper = new TimeKeeper(); + var maxSizeKb = _maxSizeKb; + var initialSizeKb = ComputeTotalSize() / 1024L; + + if (initialSizeKb <= maxSizeKb) + { + $"Total size = {initialSizeKb}/{_maxSizeKb}kb, not purging.".Debug(nameof(FileCache)); + return; + } + + $"Total size = {initialSizeKb}/{_maxSizeKb}kb, purging...".Debug(nameof(FileCache)); + + var removedCount = 0; + var removedSize = 0L; + var totalSizeKb = initialSizeKb; + var threshold = 973L * maxSizeKb / 1024L; // About 95% of maximum allowed size + while (totalSizeKb > threshold) + { + if (cancellationToken.IsCancellationRequested) + return; + + var section = GetSectionWithLeastRecentItem(); + if (section == null) + return; + + removedSize += section.RemoveLeastRecentItem(); + removedCount++; + + await Task.Yield(); + + totalSizeKb = ComputeTotalSize() / 1024L; + } + + $"Purge completed in {timeKeeper.ElapsedTime}ms: removed {removedCount} items ({removedSize / 1024L}kb). Total size is now {totalSizeKb}kb." + .Debug(nameof(FileCache)); + } + + // Enumerate key / value pairs because the Keys and Values property + // of ConcurrentDictionary<,> have snapshot semantics, + // while GetEnumerator enumerates without locking. + private long ComputeTotalSize() + => _sections.Sum(pair => pair.Value.GetTotalSize()); + + private Section? GetSectionWithLeastRecentItem() + { + Section? result = null; + var earliestTime = long.MaxValue; + foreach (var pair in _sections) + { + var section = pair.Value; + var time = section.GetLeastRecentUseTime(); + + if (time < earliestTime) + { + result = section; + earliestTime = time; + } + } + + return result; + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Files/FileModule.cs b/Vendor/EmbedIO-3.5.2/Files/FileModule.cs new file mode 100644 index 0000000..5dccd56 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Files/FileModule.cs @@ -0,0 +1,635 @@ +using System; +using System.Collections.Concurrent; +using System.IO; +using System.Net; +using System.Threading; +using System.Threading.Tasks; +using EmbedIO.Files.Internal; +using EmbedIO.Internal; +using EmbedIO.Utilities; + +namespace EmbedIO.Files +{ + /// + /// A module serving files and directory listings from an . + /// + /// + public class FileModule : WebModuleBase, IDisposable, IMimeTypeCustomizer + { + /// + /// Default value for . + /// + public const string DefaultDocumentName = "index.html"; + + private readonly string _cacheSectionName = UniqueIdGenerator.GetNext(); + private readonly MimeTypeCustomizer _mimeTypeCustomizer = new MimeTypeCustomizer(); + private readonly ConcurrentDictionary? _mappingCache; + + private FileCache _cache = FileCache.Default; + private bool _contentCaching = true; + private string? _defaultDocument = DefaultDocumentName; + private string? _defaultExtension; + private IDirectoryLister? _directoryLister; + private FileRequestHandlerCallback _onMappingFailed = FileRequestHandler.ThrowNotFound; + private FileRequestHandlerCallback _onDirectoryNotListable = FileRequestHandler.ThrowUnauthorized; + private FileRequestHandlerCallback _onMethodNotAllowed = FileRequestHandler.ThrowMethodNotAllowed; + + private FileCache.Section? _cacheSection; + + /// + /// Initializes a new instance of the class, + /// using the specified cache. + /// + /// The base route. + /// An interface that provides access + /// to actual files and directories. + /// is . + public FileModule(string baseRoute, IFileProvider provider) + : base(baseRoute) + { + Provider = Validate.NotNull(nameof(provider), provider); + _mappingCache = Provider.IsImmutable + ? new ConcurrentDictionary() + : null; + } + + /// + /// Finalizes an instance of the class. + /// + ~FileModule() + { + Dispose(false); + } + + /// + public override bool IsFinalHandler => true; + + /// + /// Gets the interface that provides access + /// to actual files and directories served by this module. + /// + public IFileProvider Provider { get; } + + /// + /// Gets or sets the used by this module to store hashes and, + /// optionally, file contents and rendered directory listings. + /// + /// The module's configuration is locked. + /// This property is being set to . + public FileCache Cache + { + get => _cache; + set + { + EnsureConfigurationNotLocked(); + _cache = Validate.NotNull(nameof(value), value); + } + } + + /// + /// Gets or sets a value indicating whether this module caches the contents of files + /// and directory listings. + /// Note that the actual representations of files are stored in ; + /// thus, for example, if a file is always requested with an Accept-Encoding of gzip, + /// only the gzipped contents of the file will be cached. + /// + /// The module's configuration is locked. + public bool ContentCaching + { + get => _contentCaching; + set + { + EnsureConfigurationNotLocked(); + _contentCaching = value; + } + } + + /// + /// Gets or sets the name of the default document served, if it exists, instead of a directory listing + /// when the path of a requested URL maps to a directory. + /// The default value for this property is the constant. + /// + /// The module's configuration is locked. + public string? DefaultDocument + { + get => _defaultDocument; + set + { + EnsureConfigurationNotLocked(); + _defaultDocument = string.IsNullOrEmpty(value) ? null : value; + } + } + + /// + /// Gets or sets the default extension appended to requested URL paths that do not map + /// to any file or directory. Defaults to . + /// + /// The module's configuration is locked. + /// This property is being set to a non-, + /// non-empty string that does not start with a period (.). + public string? DefaultExtension + { + get => _defaultExtension; + set + { + EnsureConfigurationNotLocked(); + + if (string.IsNullOrEmpty(value)) + { + _defaultExtension = null; + } + else if (value![0] != '.') + { + throw new ArgumentException("Default extension does not start with a period.", nameof(value)); + } + else + { + _defaultExtension = value; + } + } + } + + /// + /// Gets or sets the interface used to generate + /// directory listing in this module. + /// A value of (the default) disables the generation + /// of directory listings. + /// + /// The module's configuration is locked. + public IDirectoryLister? DirectoryLister + { + get => _directoryLister; + set + { + EnsureConfigurationNotLocked(); + _directoryLister = value; + } + } + + /// + /// Gets or sets a that is called whenever + /// the requested URL path could not be mapped to any file or directory. + /// The default is . + /// + /// The module's configuration is locked. + /// This property is being set to . + /// + public FileRequestHandlerCallback OnMappingFailed + { + get => _onMappingFailed; + set + { + EnsureConfigurationNotLocked(); + _onMappingFailed = Validate.NotNull(nameof(value), value); + } + } + + /// + /// Gets or sets a that is called whenever + /// the requested URL path has been mapped to a directory, but directory listing has been + /// disabled by setting to . + /// The default is . + /// + /// The module's configuration is locked. + /// This property is being set to . + /// + public FileRequestHandlerCallback OnDirectoryNotListable + { + get => _onDirectoryNotListable; + set + { + EnsureConfigurationNotLocked(); + _onDirectoryNotListable = Validate.NotNull(nameof(value), value); + } + } + + /// + /// Gets or sets a that is called whenever + /// the requested URL path has been mapped to a file or directory, but the request's + /// HTTP method is neither GET nor HEAD. + /// The default is . + /// + /// The module's configuration is locked. + /// This property is being set to . + /// + public FileRequestHandlerCallback OnMethodNotAllowed + { + get => _onMethodNotAllowed; + set + { + EnsureConfigurationNotLocked(); + _onMethodNotAllowed = Validate.NotNull(nameof(value), value); + } + } + + /// + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + string IMimeTypeProvider.GetMimeType(string extension) + => _mimeTypeCustomizer.GetMimeType(extension); + + bool IMimeTypeProvider.TryDetermineCompression(string mimeType, out bool preferCompression) + => _mimeTypeCustomizer.TryDetermineCompression(mimeType, out preferCompression); + + /// + public void AddCustomMimeType(string extension, string mimeType) + => _mimeTypeCustomizer.AddCustomMimeType(extension, mimeType); + + /// + public void PreferCompression(string mimeType, bool preferCompression) + => _mimeTypeCustomizer.PreferCompression(mimeType, preferCompression); + + /// + /// Clears the part of used by this module. + /// + public void ClearCache() + { + _mappingCache?.Clear(); + _cacheSection?.Clear(); + } + + /// + /// Releases unmanaged and - optionally - managed resources. + /// + /// to release both managed and unmanaged resources; + /// to release only unmanaged resources. + protected virtual void Dispose(bool disposing) + { + if (!disposing) + return; + + if (_cacheSection != null) + Provider.ResourceChanged -= _cacheSection.Remove; + + if (Provider is IDisposable disposableProvider) + disposableProvider.Dispose(); + + if (_cacheSection != null) + Cache.RemoveSection(_cacheSectionName); + } + + /// + protected override void OnBeforeLockConfiguration() + { + base.OnBeforeLockConfiguration(); + + _mimeTypeCustomizer.Lock(); + } + + /// + protected override void OnStart(CancellationToken cancellationToken) + { + base.OnStart(cancellationToken); + + _cacheSection = Cache.AddSection(_cacheSectionName); + Provider.ResourceChanged += _cacheSection.Remove; + Provider.Start(cancellationToken); + } + + /// + protected override async Task OnRequestAsync(IHttpContext context) + { + MappedResourceInfo? info; + + var path = context.RequestedPath; + + // Map the URL path to a mapped resource. + // DefaultDocument and DefaultExtension are handled here. + // Use the mapping cache if it exists. + if (_mappingCache == null) + { + info = MapUrlPath(path, context); + } + else if (!_mappingCache.TryGetValue(path, out info)) + { + info = MapUrlPath(path, context); + if (info != null) + _ = _mappingCache.AddOrUpdate(path, info, (_, __) => info); + } + + if (info == null) + { + // If mapping failed, send a "404 Not Found" response, or whatever OnMappingFailed chooses to do. + // For example, it may return a default resource (think a folder of images and an imageNotFound.jpg), + // or redirect the request. + await OnMappingFailed(context, null).ConfigureAwait(false); + } + else if (!IsHttpMethodAllowed(context.Request, out var sendResponseBody)) + { + // If there is a mapped resource, check that the HTTP method is either GET or HEAD. + // Otherwise, send a "405 Method Not Allowed" response, or whatever OnMethodNotAllowed chooses to do. + await OnMethodNotAllowed(context, info).ConfigureAwait(false); + } + else if (info.IsDirectory && DirectoryLister == null) + { + // If a directory listing was requested, but there is no DirectoryLister, + // send a "403 Unauthorized" response, or whatever OnDirectoryNotListable chooses to do. + // For example, one could prefer to send "404 Not Found" instead. + await OnDirectoryNotListable(context, info).ConfigureAwait(false); + } + else + { + await HandleResource(context, info, sendResponseBody).ConfigureAwait(false); + } + } + + // Tells whether a request's HTTP method is suitable for processing by FileModule + // and, if so, whether a response body must be sent. + private static bool IsHttpMethodAllowed(IHttpRequest request, out bool sendResponseBody) + { + switch (request.HttpVerb) + { + case HttpVerbs.Head: + sendResponseBody = false; + return true; + case HttpVerbs.Get: + sendResponseBody = true; + return true; + default: + sendResponseBody = default; + return false; + } + } + + // Prepares response headers for a "200 OK" or "304 Not Modified" response. + // RFC7232, Section 4.1 + private static void PreparePositiveResponse(IHttpResponse response, MappedResourceInfo info, string contentType, string entityTag, Action setCompression) + { + setCompression(response); + response.ContentType = contentType; + response.Headers.Set(HttpHeaderNames.ETag, entityTag); + response.Headers.Set(HttpHeaderNames.LastModified, HttpDate.Format(info.LastModifiedUtc)); + response.Headers.Set(HttpHeaderNames.CacheControl, "max-age=0, must-revalidate"); + response.Headers.Set(HttpHeaderNames.AcceptRanges, "bytes"); + } + + // Attempts to map a module-relative URL path to a mapped resource, + // handling DefaultDocument and DefaultExtension. + // Returns null if not found. + // Directories mus be returned regardless of directory listing being enabled. + private MappedResourceInfo? MapUrlPath(string urlPath, IMimeTypeProvider mimeTypeProvider) + { + var result = Provider.MapUrlPath(urlPath, mimeTypeProvider); + + // If urlPath maps to a file, no further searching is needed. + if (result?.IsFile ?? false) + return result; + + // Look for a default document. + // Don't append an additional slash if the URL path is "/". + // The default document, if found, must be a file, not a directory. + if (DefaultDocument != null) + { + var defaultDocumentPath = urlPath + (urlPath.Length > 1 ? "/" : string.Empty) + DefaultDocument; + var defaultDocumentResult = Provider.MapUrlPath(defaultDocumentPath, mimeTypeProvider); + if (defaultDocumentResult?.IsFile ?? false) + return defaultDocumentResult; + } + + // Try to apply default extension (but not if the URL path is "/", + // i.e. the only normalized, non-base URL path that ends in a slash). + // When the default extension is applied, the result must be a file. + if (DefaultExtension != null && urlPath.Length > 1) + { + var defaultExtensionResult = Provider.MapUrlPath(urlPath + DefaultExtension, mimeTypeProvider); + if (defaultExtensionResult?.IsFile ?? false) + return defaultExtensionResult; + } + + return result; + } + + private async Task HandleResource(IHttpContext context, MappedResourceInfo info, bool sendResponseBody) + { + // Try to extract resource information from cache. + var cachingThreshold = 1024L * Cache.MaxFileSizeKb; + if (!_cacheSection!.TryGet(info.Path, out var cacheItem)) + { + // Resource information not yet cached + cacheItem = new FileCacheItem(_cacheSection, info.LastModifiedUtc, info.Length); + _cacheSection.Add(info.Path, cacheItem); + } + else if (!Provider.IsImmutable) + { + // Check whether the resource has changed. + // If so, discard the cache item and create a new one. + if (cacheItem.LastModifiedUtc != info.LastModifiedUtc || cacheItem.Length != info.Length) + { + _cacheSection.Remove(info.Path); + cacheItem = new FileCacheItem(_cacheSection, info.LastModifiedUtc, info.Length); + _cacheSection.Add(info.Path, cacheItem); + } + } + + /* + * Now we have a cacheItem for the resource. + * It may have been just created, or it may or may not have a cached content, + * depending upon the value of the ContentCaching property, + * the size of the resource, and the value of the + * MaxFileSizeKb of our Cache. + */ + + // If the content type is not a valid MIME type, assume the default. + var contentType = info.ContentType ?? DirectoryLister?.ContentType ?? MimeType.Default; + var mimeType = MimeType.StripParameters(contentType); + if (!MimeType.IsMimeType(mimeType, false)) + contentType = mimeType = MimeType.Default; + + // Next we're going to apply proactive negotiation + // to determine whether we agree with the client upon the compression + // (or lack of it) to use for the resource. + // + // The combination of partial responses and entity compression + // is not really standardized and could lead to a world of pain. + // Thus, if there is a Range header in the request, try to negotiate for no compression. + // Later, if there is compression anyway, we will ignore the Range header. + if (!context.TryDetermineCompression(mimeType, out var preferCompression)) + preferCompression = true; + preferCompression &= context.Request.Headers.Get(HttpHeaderNames.Range) == null; + if (!context.Request.TryNegotiateContentEncoding(preferCompression, out var compressionMethod, out var setCompressionInResponse)) + { + // If negotiation failed, the returned callback will do the right thing. + setCompressionInResponse(context.Response); + return; + } + + var entityTag = info.GetEntityTag(compressionMethod); + + // Send a "304 Not Modified" response if applicable. + // + // RFC7232, Section 3.3: "A recipient MUST ignore If-Modified-Since + // if the request contains an If-None-Match header field." + if (context.Request.CheckIfNoneMatch(entityTag, out var ifNoneMatchExists) + || (!ifNoneMatchExists && context.Request.CheckIfModifiedSince(info.LastModifiedUtc, out _))) + { + context.Response.StatusCode = (int)HttpStatusCode.NotModified; + PreparePositiveResponse(context.Response, info, contentType, entityTag, setCompressionInResponse); + return; + } + + /* + * At this point we know the response is "200 OK", + * unless the request is a range request. + * + * RFC7233, Section 3.1: "The Range header field is evaluated after evaluating the precondition + * header fields defined in RFC7232, and only if the result in absence + * of the Range header field would be a 200 (OK) response. In other + * words, Range is ignored when a conditional GET would result in a 304 + * (Not Modified) response." + */ + + // Before evaluating ranges, we must know the content length. + // This is easy for files, as it is stored in info.Length. + // Directories always have info.Length == 0; therefore, + // unless the directory listing is cached, we must generate it now + // (and cache it while we're there, if applicable). + var content = cacheItem.GetContent(compressionMethod); + if (info.IsDirectory && content == null) + { + long uncompressedLength; + (content, uncompressedLength) = await GenerateDirectoryListingAsync(context, info, compressionMethod) + .ConfigureAwait(false); + if (ContentCaching && uncompressedLength <= cachingThreshold) + _ = cacheItem.SetContent(compressionMethod, content); + } + + var contentLength = content?.Length ?? info.Length; + + // Ignore range request is compression is enabled + // (or should I say forced, since negotiation has tried not to use it). + var partialStart = 0L; + var partialUpperBound = contentLength - 1; + var isPartial = compressionMethod == CompressionMethod.None + && context.Request.IsRangeRequest(contentLength, entityTag, info.LastModifiedUtc, out partialStart, out partialUpperBound); + var responseContentLength = contentLength; + + if (isPartial) + { + // Prepare a "206 Partial Content" response. + responseContentLength = partialUpperBound - partialStart + 1; + context.Response.StatusCode = (int)HttpStatusCode.PartialContent; + PreparePositiveResponse(context.Response, info, contentType, entityTag, setCompressionInResponse); + context.Response.Headers.Set(HttpHeaderNames.ContentRange, $"bytes {partialStart}-{partialUpperBound}/{contentLength}"); + } + else + { + // Prepare a "200 OK" response. + PreparePositiveResponse(context.Response, info, contentType, entityTag, setCompressionInResponse); + } + + // If it's a HEAD request, we're done. + if (!sendResponseBody) + return; + + // If content must be sent AND cached, first read it and store it. + // If the requested resource is a directory, we have already listed it by now, + // so it must be a file for content to be null. + if (content == null && ContentCaching && contentLength <= cachingThreshold) + { + using (var memoryStream = new MemoryStream()) + { + using (var compressor = new CompressionStream(memoryStream, compressionMethod)) + { + using var source = Provider.OpenFile(info.Path); + await source.CopyToAsync(compressor, WebServer.StreamCopyBufferSize, context.CancellationToken) + .ConfigureAwait(false); + } + + content = memoryStream.ToArray(); + responseContentLength = content.Length; + } + + _ = cacheItem.SetContent(compressionMethod, content); + } + + // Transfer cached content if present. + if (content != null) + { + context.Response.ContentLength64 = responseContentLength; + var offset = isPartial ? (int) partialStart : 0; + await context.Response.OutputStream.WriteAsync(content, offset, (int)responseContentLength, context.CancellationToken) + .ConfigureAwait(false); + + return; + } + + // Read and transfer content without caching. + using (var source = Provider.OpenFile(info.Path)) + { + context.Response.SendChunked = true; + + if (isPartial) + { + var buffer = new byte[WebServer.StreamCopyBufferSize]; + if (source.CanSeek) + { + source.Position = partialStart; + } + else + { + var skipLength = (int)partialStart; + while (skipLength > 0) + { + var read = await source.ReadAsync(buffer, 0, Math.Min(skipLength, buffer.Length), context.CancellationToken) + .ConfigureAwait(false); + + skipLength -= read; + } + } + + var transferSize = responseContentLength; + while (transferSize >= WebServer.StreamCopyBufferSize) + { + var read = await source.ReadAsync(buffer, 0, WebServer.StreamCopyBufferSize, context.CancellationToken) + .ConfigureAwait(false); + + await context.Response.OutputStream.WriteAsync(buffer, 0, read, context.CancellationToken) + .ConfigureAwait(false); + + transferSize -= read; + } + + if (transferSize > 0) + { + var read = await source.ReadAsync(buffer, 0, (int)transferSize, context.CancellationToken) + .ConfigureAwait(false); + + await context.Response.OutputStream.WriteAsync(buffer, 0, read, context.CancellationToken) + .ConfigureAwait(false); + } + } + else + { + using var compressor = new CompressionStream(context.Response.OutputStream, compressionMethod); + await source.CopyToAsync(compressor, WebServer.StreamCopyBufferSize, context.CancellationToken) + .ConfigureAwait(false); + } + } + } + + // Uses DirectoryLister to generate a directory listing asynchronously. + // Returns a tuple of the generated content and its *uncompressed* length + // (useful to decide whether it can be cached). + private async Task<(byte[], long)> GenerateDirectoryListingAsync( + IHttpContext context, + MappedResourceInfo info, + CompressionMethod compressionMethod) + { + using var memoryStream = new MemoryStream(); + using var stream = new CompressionStream(memoryStream, compressionMethod); + + await DirectoryLister!.ListDirectoryAsync( + info, + context.Request.Url.AbsolutePath, + Provider.GetDirectoryEntries(info.Path, context), + stream, + context.CancellationToken).ConfigureAwait(false); + + return (memoryStream.ToArray(), stream.UncompressedLength); + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Files/FileModuleExtensions.cs b/Vendor/EmbedIO-3.5.2/Files/FileModuleExtensions.cs new file mode 100644 index 0000000..b315747 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Files/FileModuleExtensions.cs @@ -0,0 +1,282 @@ +using System; + +namespace EmbedIO.Files +{ + /// + /// Provides extension methods for and derived classes. + /// + public static class FileModuleExtensions + { + /// + /// Sets the used by a module to store hashes and, + /// optionally, file contents and rendered directory listings. + /// + /// The type of the module on which this method is called. + /// The module on which this method is called. + /// An instance of . + /// with its Cache property + /// set to . + /// is . + /// The configuration of is locked. + /// is . + /// + public static TModule WithCache(this TModule @this, FileCache value) + where TModule : FileModule + { + @this.Cache = value; + return @this; + } + + /// + /// Sets a value indicating whether a module caches the contents of files + /// and directory listings. + /// + /// The type of the module on which this method is called. + /// The module on which this method is called. + /// to enable caching of contents; + /// to disable it. + /// with its ContentCaching property + /// set to . + /// is . + /// The configuration of is locked. + /// + public static TModule WithContentCaching(this TModule @this, bool value) + where TModule : FileModule + { + @this.ContentCaching = value; + return @this; + } + + /// + /// Enables caching of file contents and directory listings on a module. + /// + /// The type of the module on which this method is called. + /// The module on which this method is called. + /// with its ContentCaching property + /// set to . + /// is . + /// The configuration of is locked. + /// + public static TModule WithContentCaching(this TModule @this) + where TModule : FileModule + { + @this.ContentCaching = true; + return @this; + } + + /// + /// Enables caching of file contents and directory listings on a module. + /// + /// The type of the module on which this method is called. + /// The module on which this method is called. + /// sets the maximum size of a single cached file in kilobytes + /// sets the maximum total size of cached data in kilobytes + /// with its ContentCaching property + /// set to . + /// is . + /// The configuration of is locked. + /// + public static TModule WithContentCaching(this TModule @this, int maxFileSizeKb, int maxSizeKb) + where TModule : FileModule + { + @this.ContentCaching = true; + @this.Cache.MaxFileSizeKb = maxFileSizeKb; + @this.Cache.MaxSizeKb = maxSizeKb; + return @this; + } + + /// + /// Disables caching of file contents and directory listings on a module. + /// + /// The type of the module on which this method is called. + /// The module on which this method is called. + /// with its ContentCaching property + /// set to . + /// is . + /// The configuration of is locked. + /// + public static TModule WithoutContentCaching(this TModule @this) + where TModule : FileModule + { + @this.ContentCaching = false; + return @this; + } + + /// + /// Sets the name of the default document served, if it exists, instead of a directory listing + /// when the path of a requested URL maps to a directory. + /// + /// The type of the module on which this method is called. + /// The module on which this method is called. + /// The name of the default document. + /// with its DefaultDocument property + /// set to . + /// is . + /// The configuration of is locked. + /// + public static TModule WithDefaultDocument(this TModule @this, string value) + where TModule : FileModule + { + @this.DefaultDocument = value; + return @this; + } + + /// + /// Sets the name of the default document to . + /// + /// The type of the module on which this method is called. + /// The module on which this method is called. + /// with its DefaultDocument property + /// set to . + /// is . + /// The configuration of is locked. + /// + public static TModule WithoutDefaultDocument(this TModule @this) + where TModule : FileModule + { + @this.DefaultDocument = null; + return @this; + } + + /// + /// Sets the default extension appended to requested URL paths that do not map + /// to any file or directory. + /// + /// The type of the module on which this method is called. + /// The module on which this method is called. + /// The default extension. + /// with its DefaultExtension property + /// set to . + /// is . + /// The configuration of is locked. + /// is a non-, + /// non-empty string that does not start with a period (.). + /// + public static TModule WithDefaultExtension(this TModule @this, string value) + where TModule : FileModule + { + @this.DefaultExtension = value; + return @this; + } + + /// + /// Sets the default extension to . + /// + /// The type of the module on which this method is called. + /// The module on which this method is called. + /// with its DefaultExtension property + /// set to . + /// is . + /// The configuration of is locked. + /// + public static TModule WithoutDefaultExtension(this TModule @this) + where TModule : FileModule + { + @this.DefaultExtension = null; + return @this; + } + + /// + /// Sets the interface used to generate + /// directory listing in a module. + /// + /// The type of the module on which this method is called. + /// The module on which this method is called. + /// An interface, or + /// to disable the generation of directory listings. + /// with its DirectoryLister property + /// set to . + /// is . + /// The configuration of is locked. + /// + public static TModule WithDirectoryLister(this TModule @this, IDirectoryLister value) + where TModule : FileModule + { + @this.DirectoryLister = value; + return @this; + } + + /// + /// Sets a module's DirectoryLister property + /// to , disabling the generation of directory listings. + /// + /// The type of the module on which this method is called. + /// The module on which this method is called. + /// with its DirectoryLister property + /// set to . + /// is . + /// The configuration of is locked. + /// + public static TModule WithoutDirectoryLister(this TModule @this) + where TModule : FileModule + { + @this.DirectoryLister = null; + return @this; + } + + /// + /// Sets a that is called by a module whenever + /// the requested URL path could not be mapped to any file or directory. + /// + /// The type of the module on which this method is called. + /// The module on which this method is called. + /// The method to call. + /// with its OnMappingFailed property + /// set to . + /// is . + /// The configuration of is locked. + /// is . + /// + /// + public static TModule HandleMappingFailed(this TModule @this, FileRequestHandlerCallback callback) + where TModule : FileModule + { + @this.OnMappingFailed = callback; + return @this; + } + + /// + /// Sets a that is called by a module whenever + /// the requested URL path has been mapped to a directory, but directory listing has been + /// disabled. + /// + /// The type of the module on which this method is called. + /// The module on which this method is called. + /// The method to call. + /// with its OnDirectoryNotListable property + /// set to . + /// is . + /// The configuration of is locked. + /// is . + /// + /// + public static TModule HandleDirectoryNotListable(this TModule @this, FileRequestHandlerCallback callback) + where TModule : FileModule + { + @this.OnDirectoryNotListable = callback; + return @this; + } + + /// + /// Sets a that is called by a module whenever + /// the requested URL path has been mapped to a file or directory, but the request's + /// HTTP method is neither GET nor HEAD. + /// + /// The type of the module on which this method is called. + /// The module on which this method is called. + /// The method to call. + /// with its OnMethodNotAllowed property + /// set to . + /// is . + /// The configuration of is locked. + /// is . + /// + /// + public static TModule HandleMethodNotAllowed(this TModule @this, FileRequestHandlerCallback callback) + where TModule : FileModule + { + @this.OnMethodNotAllowed = callback; + return @this; + } + } +} diff --git a/Vendor/EmbedIO-3.5.2/Files/FileRequestHandler.cs b/Vendor/EmbedIO-3.5.2/Files/FileRequestHandler.cs new file mode 100644 index 0000000..805917c --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Files/FileRequestHandler.cs @@ -0,0 +1,53 @@ +using System.Threading.Tasks; + +namespace EmbedIO.Files +{ + /// + /// Provides standard handler callbacks for . + /// + /// + public static class FileRequestHandler + { +#pragma warning disable CA1801 // Unused parameters - Must respect FileRequestHandlerCallback signature. + /// + /// Unconditionally passes a request down the module chain. + /// + /// An interface representing the context of the request. + /// If the requested path has been successfully mapped to a resource (file or directory), the result of the mapping; + /// otherwise, . + /// This method never returns; it throws an exception instead. + public static Task PassThrough(IHttpContext context, MappedResourceInfo? info) + => throw RequestHandler.PassThrough(); + + /// + /// Unconditionally sends a 403 Unauthorized response. + /// + /// An interface representing the context of the request. + /// If the requested path has been successfully mapped to a resource (file or directory), the result of the mapping; + /// otherwise, . + /// This method never returns; it throws a instead. + public static Task ThrowUnauthorized(IHttpContext context, MappedResourceInfo? info) + => throw HttpException.Unauthorized(); + + /// + /// Unconditionally sends a 404 Not Found response. + /// + /// An interface representing the context of the request. + /// If the requested path has been successfully mapped to a resource (file or directory), the result of the mapping; + /// otherwise, . + /// This method never returns; it throws a instead. + public static Task ThrowNotFound(IHttpContext context, MappedResourceInfo? info) + => throw HttpException.NotFound(); + + /// + /// Unconditionally sends a 405 Method Not Allowed response. + /// + /// An interface representing the context of the request. + /// If the requested path has been successfully mapped to a resource (file or directory), the result of the mapping; + /// otherwise, . + /// This method never returns; it throws a instead. + public static Task ThrowMethodNotAllowed(IHttpContext context, MappedResourceInfo? info) + => throw HttpException.MethodNotAllowed(); +#pragma warning restore CA1801 + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Files/FileRequestHandlerCallback.cs b/Vendor/EmbedIO-3.5.2/Files/FileRequestHandlerCallback.cs new file mode 100644 index 0000000..0340e14 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Files/FileRequestHandlerCallback.cs @@ -0,0 +1,13 @@ +using System.Threading.Tasks; + +namespace EmbedIO.Files +{ + /// + /// A callback used to handle a request in . + /// + /// An interface representing the context of the request. + /// If the requested path has been successfully mapped to a resource (file or directory), the result of the mapping; + /// otherwise, . + /// A representing the ongoing operation. + public delegate Task FileRequestHandlerCallback(IHttpContext context, MappedResourceInfo? info); +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Files/FileSystemProvider.cs b/Vendor/EmbedIO-3.5.2/Files/FileSystemProvider.cs new file mode 100644 index 0000000..26f8f21 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Files/FileSystemProvider.cs @@ -0,0 +1,202 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices; +using System.Threading; +using EmbedIO.Utilities; + +namespace EmbedIO.Files +{ + /// + /// Provides access to the local file system to a . + /// + /// + public class FileSystemProvider : IDisposable, IFileProvider + { + private readonly FileSystemWatcher? _watcher; + + /// + /// Initializes a new instance of the class. + /// + /// + /// OSX doesn't support , the parameter will be always . + /// + /// The file system path. + /// if files and directories in + /// are not expected to change during a web server's + /// lifetime; otherwise. + /// is . + /// is not a valid local path. + /// + public FileSystemProvider(string fileSystemPath, bool isImmutable) + { + FileSystemPath = Validate.LocalPath(nameof(fileSystemPath), fileSystemPath, true); + IsImmutable = isImmutable || RuntimeInformation.IsOSPlatform(OSPlatform.OSX); + + try + { + if (!IsImmutable) + _watcher = new FileSystemWatcher(FileSystemPath); + } + catch (PlatformNotSupportedException) + { + IsImmutable = true; + } + } + + /// + /// Finalizes an instance of the class. + /// + ~FileSystemProvider() + { + Dispose(false); + } + + /// + public event Action? ResourceChanged; + + /// + /// Gets the file system path from which files are retrieved. + /// + public string FileSystemPath { get; } + + /// + public bool IsImmutable { get; } + + /// + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + /// + public void Start(CancellationToken cancellationToken) + { + if (_watcher != null) + { + _watcher.Changed += Watcher_ChangedOrDeleted; + _watcher.Deleted += Watcher_ChangedOrDeleted; + _watcher.Renamed += Watcher_Renamed; + _watcher.EnableRaisingEvents = true; + } + } + + /// + public MappedResourceInfo? MapUrlPath(string urlPath, IMimeTypeProvider mimeTypeProvider) + { + urlPath = urlPath.Substring(1); // Drop the initial slash + string localPath; + + // Disable CA1031 as there's little we can do if IsPathRooted or GetFullPath fails. +#pragma warning disable CA1031 + try + { + // Unescape the url before continue + urlPath = Uri.UnescapeDataString(urlPath); + + // Bail out early if the path is a rooted path, + // as Path.Combine would ignore our base path. + // See https://docs.microsoft.com/en-us/dotnet/api/system.io.path.combine + // (particularly the Remarks section). + // + // Under Windows, a relative URL path may be a full filesystem path + // (e.g. "D:\foo\bar" or "\\192.168.0.1\Shared\MyDocuments\BankAccounts.docx"). + // Under Unix-like operating systems we have no such problems, as relativeUrlPath + // can never start with a slash; however, loading one more class from Swan + // just to check the OS type would probably outweigh calling IsPathRooted. + if (Path.IsPathRooted(urlPath)) + return null; + + // Convert the relative URL path to a relative filesystem path + // (practically a no-op under Unix-like operating systems) + // and combine it with our base local path to obtain a full path. + localPath = Path.Combine(FileSystemPath, urlPath.Replace('/', Path.DirectorySeparatorChar)); + + // Use GetFullPath as an additional safety check + // for relative paths that contain a rooted path + // (e.g. "valid/path/C:\Windows\System.ini") + localPath = Path.GetFullPath(localPath); + } + catch + { + // Both IsPathRooted and GetFullPath throw exceptions + // if a path contains invalid characters or is otherwise invalid; + // bail out in this case too, as the path would not exist on disk anyway. + return null; + } +#pragma warning restore CA1031 + + // As a final precaution, check that the resulting local path + // is inside the folder intended to be served. + if (!localPath.StartsWith(FileSystemPath, StringComparison.Ordinal)) + return null; + + if (File.Exists(localPath)) + return GetMappedFileInfo(mimeTypeProvider, localPath); + + if (Directory.Exists(localPath)) + return GetMappedDirectoryInfo(localPath); + + return null; + } + + /// + public Stream OpenFile(string path) => new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); + + /// + public IEnumerable GetDirectoryEntries(string path, IMimeTypeProvider mimeTypeProvider) + => new DirectoryInfo(path).EnumerateFileSystemInfos() + .Select(fsi => GetMappedResourceInfo(mimeTypeProvider, fsi)); + + /// + /// Releases unmanaged and - optionally - managed resources. + /// + /// to release both managed and unmanaged resources; + /// to release only unmanaged resources. + protected virtual void Dispose(bool disposing) + { + ResourceChanged = null; // Release references to listeners + + if (_watcher != null) + { + _watcher.EnableRaisingEvents = false; + _watcher.Changed -= Watcher_ChangedOrDeleted; + _watcher.Deleted -= Watcher_ChangedOrDeleted; + _watcher.Renamed -= Watcher_Renamed; + + if (disposing) + _watcher.Dispose(); + } + } + + private static MappedResourceInfo GetMappedFileInfo(IMimeTypeProvider mimeTypeProvider, string localPath) + => GetMappedFileInfo(mimeTypeProvider, new FileInfo(localPath)); + + private static MappedResourceInfo GetMappedFileInfo(IMimeTypeProvider mimeTypeProvider, FileInfo info) + => MappedResourceInfo.ForFile( + info.FullName, + info.Name, + info.LastWriteTimeUtc, + info.Length, + mimeTypeProvider.GetMimeType(info.Extension)); + + private static MappedResourceInfo GetMappedDirectoryInfo(string localPath) + => GetMappedDirectoryInfo(new DirectoryInfo(localPath)); + + private static MappedResourceInfo GetMappedDirectoryInfo(DirectoryInfo info) + => MappedResourceInfo.ForDirectory(info.FullName, info.Name, info.LastWriteTimeUtc); + + private static MappedResourceInfo GetMappedResourceInfo(IMimeTypeProvider mimeTypeProvider, FileSystemInfo info) + => info is DirectoryInfo directoryInfo + ? GetMappedDirectoryInfo(directoryInfo) + : GetMappedFileInfo(mimeTypeProvider, (FileInfo) info); + + private void Watcher_ChangedOrDeleted(object sender, FileSystemEventArgs e) + => ResourceChanged?.Invoke(e.FullPath); + + private void Watcher_Renamed(object sender, RenamedEventArgs e) + => ResourceChanged?.Invoke(e.OldFullPath); + } +} diff --git a/Vendor/EmbedIO-3.5.2/Files/IDirectoryLister.cs b/Vendor/EmbedIO-3.5.2/Files/IDirectoryLister.cs new file mode 100644 index 0000000..0a2ba9a --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Files/IDirectoryLister.cs @@ -0,0 +1,35 @@ +using System.Collections.Generic; +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +namespace EmbedIO.Files +{ + /// + /// Represents an object that can render a directory listing to a stream. + /// + public interface IDirectoryLister + { + /// + /// Gets the MIME type of generated directory listings. + /// + string ContentType { get; } + + /// + /// Asynchronously generate a directory listing. + /// + /// A containing information about + /// the directory which is to be listed. + /// The absolute URL path that was mapped to . + /// An enumeration of the entries in the directory represented by . + /// A to which the directory listing must be written. + /// A used to cancel the operation. + /// A representing the ongoing operation. + Task ListDirectoryAsync( + MappedResourceInfo info, + string absoluteUrlPath, + IEnumerable entries, + Stream stream, + CancellationToken cancellationToken); + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Files/IFileProvider.cs b/Vendor/EmbedIO-3.5.2/Files/IFileProvider.cs new file mode 100644 index 0000000..048265c --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Files/IFileProvider.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Threading; + +namespace EmbedIO.Files +{ + /// + /// Represents an object that can provide files and/or directories to be served by a . + /// + public interface IFileProvider + { + /// + /// Occurs when a file or directory provided by this instance is modified or removed. + /// The event's parameter is the provider-specific path of the resource that changed. + /// + event Action ResourceChanged; + + /// + /// Gets a value indicating whether the files and directories provided by this instance + /// will never change. + /// + bool IsImmutable { get; } + + /// + /// Signals a file provider that the web server is starting. + /// + /// A used to stop the web server. + void Start(CancellationToken cancellationToken); + + /// + /// Maps a URL path to a provider-specific path. + /// + /// The URL path. + /// An interface to use + /// for determining the MIME type of a file. + /// A provider-specific path identifying a file or directory, + /// or if this instance cannot provide a resource associated + /// to . + MappedResourceInfo? MapUrlPath(string urlPath, IMimeTypeProvider mimeTypeProvider); + + /// + /// Opens a file for reading. + /// + /// The provider-specific path for the file. + /// + /// A readable of the file's contents. + /// + Stream OpenFile(string path); + + /// + /// Returns an enumeration of the entries of a directory. + /// + /// The provider-specific path for the directory. + /// An interface to use + /// for determining the MIME type of files. + /// An enumeration of objects identifying the entries + /// in the directory identified by . + IEnumerable GetDirectoryEntries(string path, IMimeTypeProvider mimeTypeProvider); + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Files/Internal/Base64Utility.cs b/Vendor/EmbedIO-3.5.2/Files/Internal/Base64Utility.cs new file mode 100644 index 0000000..19d1579 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Files/Internal/Base64Utility.cs @@ -0,0 +1,12 @@ +using System; + +namespace EmbedIO.Files.Internal +{ + internal static class Base64Utility + { + // long is 8 bytes + // base64 of 8 bytes is 12 chars, but the last one is padding + public static string LongToBase64(long value) + => Convert.ToBase64String(BitConverter.GetBytes(value)).Substring(0, 11); + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Files/Internal/EntityTag.cs b/Vendor/EmbedIO-3.5.2/Files/Internal/EntityTag.cs new file mode 100644 index 0000000..288d594 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Files/Internal/EntityTag.cs @@ -0,0 +1,28 @@ +using System; +using System.Text; + +namespace EmbedIO.Files.Internal +{ + internal static class EntityTag + { + public static string Compute(DateTime lastModifiedUtc, long length, CompressionMethod compressionMethod) + { + var sb = new StringBuilder() + .Append('"') + .Append(Base64Utility.LongToBase64(lastModifiedUtc.Ticks)) + .Append(Base64Utility.LongToBase64(length)); + + switch (compressionMethod) + { + case CompressionMethod.Deflate: + sb.Append('-').Append(CompressionMethodNames.Deflate); + break; + case CompressionMethod.Gzip: + sb.Append('-').Append(CompressionMethodNames.Gzip); + break; + } + + return sb.Append('"').ToString(); + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Files/Internal/FileCacheItem.cs b/Vendor/EmbedIO-3.5.2/Files/Internal/FileCacheItem.cs new file mode 100644 index 0000000..78aa18e --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Files/Internal/FileCacheItem.cs @@ -0,0 +1,164 @@ +using System; +using EmbedIO.Internal; + +namespace EmbedIO.Files.Internal +{ + internal sealed class FileCacheItem + { +#pragma warning disable SA1401 // Field should be private - performance is a stronger concern here. + // These fields create a sort of linked list of items + // inside the cache's dictionary. + // Their purpose is to keep track of items + // in order from least to most recently used. + internal string? PreviousKey; + internal string? NextKey; + internal long LastUsedAt; +#pragma warning restore SA1401 + + // Size of a pointer in bytes + private static readonly long SizeOfPointer = Environment.Is64BitProcess ? 8 : 4; + + // Size of a WeakReference in bytes + private static readonly long SizeOfWeakReference = Environment.Is64BitProcess ? 16 : 32; + + // Educated guess about the size of an Item in memory (see comments on constructor). + // 3 * SizeOfPointer + total size of fields, rounded up to a multiple of 16. + // + // Computed as follows: + // + // * for 32-bit: + // - initialize count to 3 (number of "hidden" pointers that compose the object header) + // - for every field / auto property, in order of declaration: + // - increment count by 1 for reference types, 2 for long and DateTime + // (as of time of writing there are no fields of other types here) + // - increment again by 1 if this field "weighs" 1 and the next one "weighs" 2 + // (padding for field alignment) + // - multiply count by 4 (size of a pointer) + // - if the result is not a multiple of 16, round it up to next multiple of 16 + // + // * for 64-bit: + // - initialize count to 3 (number of "hidden" pointers that compose the object header) + // - for every field / auto property, in order of declaration, increment count by 1 + // (at the time of writing there are no fields here that need padding on 64-bit) + // - multiply count by 8 (size of a pointer) + // - if the result is not a multiple of 16, round it up to next multiple of 16 + private static readonly long SizeOfItem = Environment.Is64BitProcess ? 96 : 128; + + private readonly object _syncRoot = new object(); + + // Used to update total size of section. + // Weak reference avoids circularity. + private readonly WeakReference _section; + + // There are only 3 possible compression methods, + // hence a dictionary (or two dictionaries) would be overkill. + private byte[]? _uncompressedContent; + private byte[]? _gzippedContent; + private byte[]? _deflatedContent; + + internal FileCacheItem(FileCache.Section section, DateTime lastModifiedUtc, long length) + { + _section = new WeakReference(section); + + LastModifiedUtc = lastModifiedUtc; + Length = length; + + // There is no way to know the actual size of an object at runtime. + // This method makes some educated guesses, based on the following + // article (among others): + // https://codingsight.com/precise-computation-of-clr-object-size/ + // PreviousKey and NextKey values aren't counted in + // because they are just references to existing strings. + SizeInCache = SizeOfItem + SizeOfWeakReference; + } + + public DateTime LastModifiedUtc { get; } + + public long Length { get; } + + // This is the (approximate) in-memory size of this object. + // It is NOT the length of the cache resource! + public long SizeInCache { get; private set; } + + public byte[]? GetContent(CompressionMethod compressionMethod) + { + // If there are both entity tag and content, use them. + switch (compressionMethod) + { + case CompressionMethod.Deflate: + if (_deflatedContent != null) return _deflatedContent; + break; + case CompressionMethod.Gzip: + if (_gzippedContent != null) return _gzippedContent; + break; + default: + if (_uncompressedContent != null) return _uncompressedContent; + break; + } + + // Try to convert existing content, if any. + byte[]? content; + if (_uncompressedContent != null) + { + content = CompressionUtility.ConvertCompression(_uncompressedContent, CompressionMethod.None, compressionMethod); + } + else if (_gzippedContent != null) + { + content = CompressionUtility.ConvertCompression(_gzippedContent, CompressionMethod.Gzip, compressionMethod); + } + else if (_deflatedContent != null) + { + content = CompressionUtility.ConvertCompression(_deflatedContent, CompressionMethod.Deflate, compressionMethod); + } + else + { + // No content whatsoever. + return null; + } + + return SetContent(compressionMethod, content); + } + + public byte[]? SetContent(CompressionMethod compressionMethod, byte[]? content) + { + // This is the bare minimum locking we need + // to ensure we don't mess sizes up. + byte[]? oldContent; + lock (_syncRoot) + { + switch (compressionMethod) + { + case CompressionMethod.Deflate: + oldContent = _deflatedContent; + _deflatedContent = content; + break; + case CompressionMethod.Gzip: + oldContent = _gzippedContent; + _gzippedContent = content; + break; + default: + oldContent = _uncompressedContent; + _uncompressedContent = content; + break; + } + } + + var sizeDelta = GetSizeOf(content) - GetSizeOf(oldContent); + SizeInCache += sizeDelta; + if (_section.TryGetTarget(out var section)) + section.UpdateTotalSize(sizeDelta); + + return content; + } + + // Round up to a multiple of 16 + private static long RoundUpTo16(long n) + { + var remainder = n % 16; + return remainder > 0 ? n + (16 - remainder) : n; + } + + // The size of a byte array is 3 * SizeOfPointer + 1 (size of byte) * Length + private static long GetSizeOf(byte[]? arr) => arr == null ? 0 : RoundUpTo16(3 * SizeOfPointer) + arr.Length; + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Files/Internal/HtmlDirectoryLister.cs b/Vendor/EmbedIO-3.5.2/Files/Internal/HtmlDirectoryLister.cs new file mode 100644 index 0000000..f85eebf --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Files/Internal/HtmlDirectoryLister.cs @@ -0,0 +1,73 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Net; +using System.Threading; +using System.Threading.Tasks; +using EmbedIO.Utilities; +using Swan; + +namespace EmbedIO.Files.Internal +{ + internal class HtmlDirectoryLister : IDirectoryLister + { + private static readonly Lazy LazyInstance = new Lazy(() => new HtmlDirectoryLister()); + + private HtmlDirectoryLister() + { + } + + public static IDirectoryLister Instance => LazyInstance.Value; + + public string ContentType { get; } = MimeType.Html + "; encoding=" + WebServer.DefaultEncoding.WebName; + + public async Task ListDirectoryAsync( + MappedResourceInfo info, + string absoluteUrlPath, + IEnumerable entries, + Stream stream, + CancellationToken cancellationToken) + { + const int MaxEntryLength = 50; + const int SizeIndent = -20; // Negative for right alignment + + if (!info.IsDirectory) + throw SelfCheck.Failure($"{nameof(HtmlDirectoryLister)}.{nameof(ListDirectoryAsync)} invoked with a file, not a directory."); + + var encodedPath = WebUtility.HtmlEncode(absoluteUrlPath); + using var text = new StreamWriter(stream, WebServer.DefaultEncoding); + text.Write("Index of "); + text.Write(encodedPath); + text.Write("

Index of "); + text.Write(encodedPath); + text.Write("



"); + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Files/Internal/MappedResourceInfoExtensions.cs b/Vendor/EmbedIO-3.5.2/Files/Internal/MappedResourceInfoExtensions.cs new file mode 100644 index 0000000..4d780d4 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Files/Internal/MappedResourceInfoExtensions.cs @@ -0,0 +1,8 @@ +namespace EmbedIO.Files.Internal +{ + internal static class MappedResourceInfoExtensions + { + public static string GetEntityTag(this MappedResourceInfo @this, CompressionMethod compressionMethod) + => EntityTag.Compute(@this.LastModifiedUtc, @this.Length, compressionMethod); + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Files/MappedResourceInfo.cs b/Vendor/EmbedIO-3.5.2/Files/MappedResourceInfo.cs new file mode 100644 index 0000000..914bc7a --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Files/MappedResourceInfo.cs @@ -0,0 +1,80 @@ +using System; + +namespace EmbedIO.Files +{ + /// + /// Contains information about a resource served via an . + /// + public sealed class MappedResourceInfo + { + private MappedResourceInfo(string path, string name, DateTime lastModifiedUtc, long length, string? contentType) + { + Path = path; + Name = name; + LastModifiedUtc = lastModifiedUtc; + Length = length; + ContentType = contentType; + } + + /// + /// Gets a value indicating whether this instance represents a directory. + /// + public bool IsDirectory => ContentType == null; + + /// + /// Gets a value indicating whether this instance represents a file. + /// + public bool IsFile => ContentType != null; + + /// + /// Gets a unique, provider-specific path for the resource. + /// + public string Path { get; } + + /// + /// Gets the name of the resource, as it would appear in a directory listing. + /// + public string Name { get; } + + /// + /// Gets the UTC date and time of the last modification made to the resource. + /// + public DateTime LastModifiedUtc { get; } + + /// + /// If is , gets the length of the file, expressed in bytes. + /// If is , this property is always zero. + /// + public long Length { get; } + + /// + /// If is , gets a MIME type describing the kind of contents of the file. + /// If is , this property is always . + /// + public string? ContentType { get; } + + /// + /// Creates and returns a new instance of the class, + /// representing a file. + /// + /// A unique, provider-specific path for the file. + /// The name of the file, as it would appear in a directory listing. + /// The UTC date and time of the last modification made to the file. + /// The length of the file, expressed in bytes. + /// A MIME type describing the kind of contents of the file. + /// A newly-constructed instance of . + public static MappedResourceInfo ForFile(string path, string name, DateTime lastModifiedUtc, long size, string contentType) + => new MappedResourceInfo(path, name, lastModifiedUtc, size, contentType ?? MimeType.Default); + + /// + /// Creates and returns a new instance of the class, + /// representing a directory. + /// + /// A unique, provider-specific path for the directory. + /// The name of the directory, as it would appear in a directory listing. + /// The UTC date and time of the last modification made to the directory. + /// A newly-constructed instance of . + public static MappedResourceInfo ForDirectory(string path, string name, DateTime lastModifiedUtc) + => new MappedResourceInfo(path, name, lastModifiedUtc, 0, null); + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Files/ResourceFileProvider.cs b/Vendor/EmbedIO-3.5.2/Files/ResourceFileProvider.cs new file mode 100644 index 0000000..21e850a --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Files/ResourceFileProvider.cs @@ -0,0 +1,94 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Threading; +using EmbedIO.Utilities; + +namespace EmbedIO.Files +{ + /// + /// Provides access to embedded resources to a . + /// + /// + public class ResourceFileProvider : IFileProvider + { + private readonly DateTime _fileTime = DateTime.UtcNow; + + /// + /// Initializes a new instance of the class. + /// + /// The assembly where served files are contained as embedded resources. + /// A string to prepend to provider-specific paths + /// to form the name of a manifest resource in . + /// is . + public ResourceFileProvider(Assembly assembly, string pathPrefix) + { + Assembly = Validate.NotNull(nameof(assembly), assembly); + PathPrefix = pathPrefix ?? string.Empty; + } + + /// + public event Action ResourceChanged + { + add { } + remove { } + } + + /// + /// Gets the assembly where served files are contained as embedded resources. + /// + public Assembly Assembly { get; } + + /// + /// Gets a string that is prepended to provider-specific paths to form the name of a manifest resource in . + /// + public string PathPrefix { get; } + + /// + public bool IsImmutable => true; + + /// + public void Start(CancellationToken cancellationToken) + { + } + + /// + public MappedResourceInfo? MapUrlPath(string urlPath, IMimeTypeProvider mimeTypeProvider) + { + var resourceName = PathPrefix + urlPath.Replace('/', '.'); + + long size; + try + { + using var stream = Assembly.GetManifestResourceStream(resourceName); + if (stream == null || stream == Stream.Null) + return null; + + size = stream.Length; + } + catch (FileNotFoundException) + { + return null; + } + + var lastSlashPos = urlPath.LastIndexOf('/'); + var name = urlPath.Substring(lastSlashPos + 1); + + return MappedResourceInfo.ForFile( + resourceName, + name, + _fileTime, + size, + mimeTypeProvider.GetMimeType(Path.GetExtension(name))); + } + + /// + public Stream OpenFile(string path) => Assembly.GetManifestResourceStream(path); + + /// + public IEnumerable GetDirectoryEntries(string path, IMimeTypeProvider mimeTypeProvider) + => Enumerable.Empty(); + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Files/ZipFileProvider.cs b/Vendor/EmbedIO-3.5.2/Files/ZipFileProvider.cs new file mode 100644 index 0000000..5a9c82d --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Files/ZipFileProvider.cs @@ -0,0 +1,110 @@ +using EmbedIO.Utilities; +using System; +using System.Collections.Generic; +using System.IO; +using System.IO.Compression; +using System.Linq; +using System.Threading; + +namespace EmbedIO.Files +{ + /// + /// Provides access to files contained in a .zip file to a . + /// + /// + public class ZipFileProvider : IDisposable, IFileProvider + { + private readonly ZipArchive _zipArchive; + + /// + /// Initializes a new instance of the class. + /// + /// The zip file path. + public ZipFileProvider(string zipFilePath) + : this(new FileStream(Validate.LocalPath(nameof(zipFilePath), zipFilePath, true), FileMode.Open)) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// The stream that contains the archive. + /// to leave the stream open after the web server + /// is disposed; otherwise, . + public ZipFileProvider(Stream stream, bool leaveOpen = false) + { + _zipArchive = new ZipArchive(stream, ZipArchiveMode.Read, leaveOpen); + } + + /// + /// Finalizes an instance of the class. + /// + ~ZipFileProvider() + { + Dispose(false); + } + + /// + public event Action ResourceChanged + { + add { } + remove { } + } + + /// + public bool IsImmutable => true; + + /// + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + /// + public void Start(CancellationToken cancellationToken) + { + } + + /// + public MappedResourceInfo? MapUrlPath(string urlPath, IMimeTypeProvider mimeTypeProvider) + { + if (urlPath.Length == 1) + return null; + + urlPath = Uri.UnescapeDataString(urlPath); + + var entry = _zipArchive.GetEntry(urlPath.Substring(1)); + if (entry == null) + return null; + + return MappedResourceInfo.ForFile( + entry.FullName, + entry.Name, + entry.LastWriteTime.DateTime, + entry.Length, + mimeTypeProvider.GetMimeType(Path.GetExtension(entry.Name))); + } + + /// + public Stream OpenFile(string path) + => _zipArchive.GetEntry(path)?.Open() ?? throw new FileNotFoundException($"\"{path}\" cannot be found in Zip archive."); + + /// + public IEnumerable GetDirectoryEntries(string path, IMimeTypeProvider mimeTypeProvider) + => Enumerable.Empty(); + + /// + /// Releases unmanaged and - optionally - managed resources. + /// + /// to release both managed and unmanaged resources; + /// to release only unmanaged resources. + protected virtual void Dispose(bool disposing) + { + if (!disposing) + return; + + _zipArchive.Dispose(); + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/HttpContextExtensions-Items.cs b/Vendor/EmbedIO-3.5.2/HttpContextExtensions-Items.cs new file mode 100644 index 0000000..d82f88f --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/HttpContextExtensions-Items.cs @@ -0,0 +1,47 @@ +using System; + +namespace EmbedIO +{ + partial class HttpContextExtensions + { + /// Gets the item associated with the specified key. + /// The desired type of the item. + /// The on which this method is called. + /// The key whose value to get from the Items dictionary. + /// + /// When this method returns, the item associated with the specified key, + /// if the key is found in Items + /// and the associated value is of type ; + /// otherwise, the default value for . + /// This parameter is passed uninitialized. + /// + /// if the item is found and is of type ; + /// otherwise, . + /// is . + /// is . + public static bool TryGetItem(this IHttpContext @this, object key, out T value) + { + if (@this.Items.TryGetValue(key, out var item) && item is T typedItem) + { + value = typedItem; + return true; + } + +#pragma warning disable CS8653 // value is non-nullable - We are returning false, so value is undefined. + value = default; +#pragma warning restore CS8653 + return false; + } + + /// Gets the item associated with the specified key. + /// The desired type of the item. + /// The on which this method is called. + /// The key whose value to get from the Items dictionary. + /// The item associated with the specified key, + /// if the key is found in Items + /// and the associated value is of type ; + /// otherwise, the default value for . + public static T GetItem(this IHttpContext @this, object key) + => @this.Items.TryGetValue(key, out var item) && item is T typedItem ? typedItem : default; + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/HttpContextExtensions-Redirect.cs b/Vendor/EmbedIO-3.5.2/HttpContextExtensions-Redirect.cs new file mode 100644 index 0000000..5cc7ff9 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/HttpContextExtensions-Redirect.cs @@ -0,0 +1,33 @@ +using System; +using System.Net; +using EmbedIO.Utilities; + +namespace EmbedIO +{ + partial class HttpContextExtensions + { + /// + /// Sets a redirection status code and adds a Location header to the response. + /// + /// The interface on which this method is called. + /// The URL to which the user agent should be redirected. + /// The status code to set on the response. + /// is . + /// is . + /// + /// is not a valid relative or absolute URL.. + /// - or - + /// is not a redirection (3xx) status code. + /// + public static void Redirect(this IHttpContext @this, string location, int statusCode = (int)HttpStatusCode.Found) + { + location = Validate.Url(nameof(location), location, @this.Request.Url); + + if (statusCode < 300 || statusCode > 399) + throw new ArgumentException("Redirect status code is not valid.", nameof(statusCode)); + + @this.Response.SetEmptyResponse(statusCode); + @this.Response.Headers[HttpHeaderNames.Location] = location; + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/HttpContextExtensions-RequestStream.cs b/Vendor/EmbedIO-3.5.2/HttpContextExtensions-RequestStream.cs new file mode 100644 index 0000000..9f9158e --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/HttpContextExtensions-RequestStream.cs @@ -0,0 +1,61 @@ +using System.IO; +using System.IO.Compression; +using System.Text; +using Swan.Logging; + +namespace EmbedIO +{ + partial class HttpContextExtensions + { + /// + /// Wraps the request input stream and returns a that can be used directly. + /// Decompression of compressed request bodies is implemented if specified in the web server's options. + /// + /// The on which this method is called. + /// + /// A that can be used to write response data. + /// This stream MUST be disposed when finished writing. + /// + /// + /// + public static Stream OpenRequestStream(this IHttpContext @this) + { + var stream = @this.Request.InputStream; + + var encoding = @this.Request.Headers[HttpHeaderNames.ContentEncoding]?.Trim(); + switch (encoding) + { + case CompressionMethodNames.Gzip: + if (@this.SupportCompressedRequests) + return new GZipStream(stream, CompressionMode.Decompress); + break; + case CompressionMethodNames.Deflate: + if (@this.SupportCompressedRequests) + return new DeflateStream(stream, CompressionMode.Decompress); + break; + case CompressionMethodNames.None: + case null: + return stream; + } + + $"[{@this.Id}] Unsupported request content encoding \"{encoding}\", sending 400 Bad Request..." + .Warn(nameof(OpenRequestStream)); + + throw HttpException.BadRequest($"Unsupported content encoding \"{encoding}\""); + } + + /// + /// Wraps the request input stream and returns a that can be used directly. + /// Decompression of compressed request bodies is implemented if specified in the web server's options. + /// + /// The on which this method is called. + /// + /// A that can be used to read the request body as text. + /// This reader MUST be disposed when finished reading. + /// + /// + /// + public static TextReader OpenRequestText(this IHttpContext @this) + => new StreamReader(OpenRequestStream(@this), @this.Request.ContentEncoding); + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/HttpContextExtensions-Requests.cs b/Vendor/EmbedIO-3.5.2/HttpContextExtensions-Requests.cs new file mode 100644 index 0000000..f3948ee --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/HttpContextExtensions-Requests.cs @@ -0,0 +1,175 @@ +using System; +using System.Collections.Specialized; +using System.IO; +using System.Threading.Tasks; +using EmbedIO.Utilities; +using Swan; + +namespace EmbedIO +{ + partial class HttpContextExtensions + { + private static readonly object FormDataKey = new object(); + private static readonly object QueryDataKey = new object(); + + /// + /// Asynchronously retrieves the request body as an array of s. + /// + /// The on which this method is called. + /// A Task, representing the ongoing operation, + /// whose result will be an array of s containing the request body. + /// is . + public static async Task GetRequestBodyAsByteArrayAsync(this IHttpContext @this) + { + using var buffer = new MemoryStream(); + using var stream = @this.OpenRequestStream(); + await stream.CopyToAsync(buffer, WebServer.StreamCopyBufferSize, @this.CancellationToken).ConfigureAwait(false); + return buffer.ToArray(); + } + + /// + /// Asynchronously buffers the request body into a read-only . + /// + /// The on which this method is called. + /// A Task, representing the ongoing operation, + /// whose result will be a read-only containing the request body. + /// is . + public static async Task GetRequestBodyAsMemoryStreamAsync(this IHttpContext @this) + => new MemoryStream( + await GetRequestBodyAsByteArrayAsync(@this).ConfigureAwait(false), + false); + + /// + /// Asynchronously retrieves the request body as a string. + /// + /// The on which this method is called. + /// A Task, representing the ongoing operation, + /// whose result will be a representation of the request body. + /// is . + public static async Task GetRequestBodyAsStringAsync(this IHttpContext @this) + { + using var reader = @this.OpenRequestText(); + return await reader.ReadToEndAsync().ConfigureAwait(false); + } + + /// + /// Asynchronously deserializes a request body, using the default request deserializer. + /// As of EmbedIO version 3.0, the default response serializer has the same behavior of JSON + /// request parsing methods of version 2. + /// + /// The expected type of the deserialized data. + /// The on which this method is called. + /// A Task, representing the ongoing operation, + /// whose result will be the deserialized data. + /// is . + public static Task GetRequestDataAsync(this IHttpContext @this) + => RequestDeserializer.Default(@this); + + /// + /// Asynchronously deserializes a request body, using the specified request deserializer. + /// + /// The expected type of the deserialized data. + /// The on which this method is called. + /// A used to deserialize the request body. + /// A Task, representing the ongoing operation, + /// whose result will be the deserialized data. + /// is . + /// is . + public static Task GetRequestDataAsync(this IHttpContext @this,RequestDeserializerCallback deserializer) + => Validate.NotNull(nameof(deserializer), deserializer)(@this); + + /// + /// Asynchronously parses a request body in application/x-www-form-urlencoded format. + /// + /// The on which this method is called. + /// A Task, representing the ongoing operation, + /// whose result will be a read-only of form field names and values. + /// is . + /// + /// This method may safely be called more than once for the same : + /// it will return the same collection instead of trying to parse the request body again. + /// + public static async Task GetRequestFormDataAsync(this IHttpContext @this) + { + if (!@this.Items.TryGetValue(FormDataKey, out var previousResult)) + { + NameValueCollection result; + try + { + using var reader = @this.OpenRequestText(); + result = UrlEncodedDataParser.Parse(await reader.ReadToEndAsync().ConfigureAwait(false), false); + } + catch (Exception e) + { + @this.Items[FormDataKey] = e; + throw; + } + + @this.Items[FormDataKey] = result; + return result; + } + + switch (previousResult) + { + case NameValueCollection collection: + return collection; + + case Exception exception: + throw exception.RethrowPreservingStackTrace(); + + case null: + throw SelfCheck.Failure($"Previous result of {nameof(HttpContextExtensions)}.{nameof(GetRequestFormDataAsync)} is null."); + + default: + throw SelfCheck.Failure($"Previous result of {nameof(HttpContextExtensions)}.{nameof(GetRequestFormDataAsync)} is of unexpected type {previousResult.GetType().FullName}"); + } + } + + /// + /// Parses a request URL query. Note that this is different from getting the property, + /// in that fields without an equal sign are treated as if they have an empty value, instead of their keys being grouped + /// as values of the null key. + /// + /// The on which this method is called. + /// A read-only . + /// is . + /// + /// This method may safely be called more than once for the same : + /// it will return the same collection instead of trying to parse the request body again. + /// + public static NameValueCollection GetRequestQueryData(this IHttpContext @this) + { + if (!@this.Items.TryGetValue(QueryDataKey, out var previousResult)) + { + NameValueCollection result; + try + { + result = UrlEncodedDataParser.Parse(@this.Request.Url.Query, false); + } + catch (Exception e) + { + @this.Items[FormDataKey] = e; + throw; + } + + @this.Items[FormDataKey] = result; + return result; + } + + switch (previousResult) + { + case NameValueCollection collection: + return collection; + + case Exception exception: + throw exception.RethrowPreservingStackTrace(); + + case null: + throw SelfCheck.Failure($"Previous result of {nameof(HttpContextExtensions)}.{nameof(GetRequestQueryData)} is null."); + + default: + throw SelfCheck.Failure($"Previous result of {nameof(HttpContextExtensions)}.{nameof(GetRequestQueryData)} is of unexpected type {previousResult.GetType().FullName}"); + } + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/HttpContextExtensions-ResponseStream.cs b/Vendor/EmbedIO-3.5.2/HttpContextExtensions-ResponseStream.cs new file mode 100644 index 0000000..59dd4be --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/HttpContextExtensions-ResponseStream.cs @@ -0,0 +1,68 @@ +using System.IO; +using System.IO.Compression; +using System.Text; +using EmbedIO.Internal; + +namespace EmbedIO +{ + partial class HttpContextExtensions + { + /// + /// Wraps the response output stream and returns a that can be used directly. + /// Optional buffering is applied, so that the response may be sent as one instead of using chunked transfer. + /// Proactive negotiation is performed to select the best compression method supported by the client. + /// + /// The on which this method is called. + /// If set to , sent data is collected + /// in a and sent all at once when the returned + /// is disposed; if set to (the default), chunked transfer will be used. + /// if sending compressed data is preferred over + /// sending non-compressed data; otherwise, . + /// + /// A that can be used to write response data. + /// This stream MUST be disposed when finished writing. + /// + /// + public static Stream OpenResponseStream(this IHttpContext @this, bool buffered = false, bool preferCompression = true) + { + // No need to check whether negotiation is successful; + // the returned callback will throw HttpNotAcceptableException if it was not. + _ = @this.Request.TryNegotiateContentEncoding(preferCompression, out var compressionMethod, out var prepareResponse); + prepareResponse(@this.Response); + var stream = buffered ? new BufferingResponseStream(@this.Response) : @this.Response.OutputStream; + + return compressionMethod switch { + CompressionMethod.Gzip => new GZipStream(stream, CompressionMode.Compress), + CompressionMethod.Deflate => new DeflateStream(stream, CompressionMode.Compress), + _ => stream + }; + } + + /// + /// Wraps the response output stream and returns a that can be used directly. + /// Optional buffering is applied, so that the response may be sent as one instead of using chunked transfer. + /// Proactive negotiation is performed to select the best compression method supported by the client. + /// + /// The on which this method is called. + /// + /// The to use to convert text to data bytes. + /// If (the default), (UTF-8 without a byte order mark) is used. + /// + /// If set to , sent data is collected + /// in a and sent all at once when the returned + /// is disposed; if set to (the default), chunked transfer will be used. + /// if sending compressed data is preferred over + /// sending non-compressed data; otherwise, . + /// + /// A that can be used to write response data. + /// This writer MUST be disposed when finished writing. + /// + /// + public static TextWriter OpenResponseText(this IHttpContext @this, Encoding? encoding = null, bool buffered = false, bool preferCompression = true) + { + encoding ??= WebServer.DefaultEncoding; + @this.Response.ContentEncoding = encoding; + return new StreamWriter(OpenResponseStream(@this, buffered, preferCompression), encoding); + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/HttpContextExtensions-Responses.cs b/Vendor/EmbedIO-3.5.2/HttpContextExtensions-Responses.cs new file mode 100644 index 0000000..3447ad4 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/HttpContextExtensions-Responses.cs @@ -0,0 +1,124 @@ +using System; +using System.IO; +using System.Net; +using System.Text; +using System.Threading.Tasks; +using EmbedIO.Utilities; + +namespace EmbedIO +{ + partial class HttpContextExtensions + { + private const string StandardHtmlHeaderFormat = "{0} - {1}

{0} - {1}

"; + private const string StandardHtmlFooter = ""; + + /// + /// Asynchronously sends a string as response. + /// + /// The interface on which this method is called. + /// The response content. + /// The MIME type of the content. If , the content type will not be set. + /// The to use. + /// A representing the ongoing operation. + /// is . + /// + /// is . + /// - or - + /// is . + /// + public static async Task SendStringAsync( + this IHttpContext @this, + string content, + string contentType, + Encoding encoding) + { + content = Validate.NotNull(nameof(content), content); + encoding = Validate.NotNull(nameof(encoding), encoding); + + if (contentType != null) + { + @this.Response.ContentType = contentType; + @this.Response.ContentEncoding = encoding; + } + + using var text = @this.OpenResponseText(encoding); + await text.WriteAsync(content).ConfigureAwait(false); + } + + /// + /// Asynchronously sends a standard HTML response for the specified status code. + /// + /// The interface on which this method is called. + /// The HTTP status code of the response. + /// A representing the ongoing operation. + /// is . + /// There is no standard status description for . + /// + public static Task SendStandardHtmlAsync(this IHttpContext @this, int statusCode) + => SendStandardHtmlAsync(@this, statusCode, null); + + /// + /// Asynchronously sends a standard HTML response for the specified status code. + /// + /// The interface on which this method is called. + /// The HTTP status code of the response. + /// A callback function that may write additional HTML code + /// to a representing the response output. + /// If not , the callback is called immediately before closing the HTML body tag. + /// A representing the ongoing operation. + /// is . + /// There is no standard status description for . + /// + public static Task SendStandardHtmlAsync( + this IHttpContext @this, + int statusCode, + Action? writeAdditionalHtml) + { + if (!HttpStatusDescription.TryGet(statusCode, out var statusDescription)) + throw new ArgumentException("Status code has no standard description.", nameof(statusCode)); + + @this.Response.StatusCode = statusCode; + @this.Response.StatusDescription = statusDescription; + @this.Response.ContentType = MimeType.Html; + @this.Response.ContentEncoding = WebServer.DefaultEncoding; + using (var text = @this.OpenResponseText(WebServer.DefaultEncoding)) + { + text.Write(StandardHtmlHeaderFormat, statusCode, statusDescription, WebServer.DefaultEncoding.WebName); + writeAdditionalHtml?.Invoke(text); + text.Write(StandardHtmlFooter); + } + + return Task.CompletedTask; + } + + /// + /// Asynchronously sends serialized data as a response, using the default response serializer. + /// As of EmbedIO version 3.0, the default response serializer has the same behavior of JSON + /// response methods of version 2. + /// + /// The interface on which this method is called. + /// The data to serialize. + /// A representing the ongoing operation. + /// is . + /// + /// + public static Task SendDataAsync(this IHttpContext @this, object data) + => ResponseSerializer.Default(@this, data); + + /// + /// Asynchronously sends serialized data as a response, using the specified response serializer. + /// As of EmbedIO version 3.0, the default response serializer has the same behavior of JSON + /// response methods of version 2. + /// + /// The interface on which this method is called. + /// A used to prepare the response. + /// The data to serialize. + /// A representing the ongoing operation. + /// is . + /// is . + /// + /// + public static Task SendDataAsync(this IHttpContext @this, ResponseSerializerCallback serializer, object data) + => Validate.NotNull(nameof(serializer), serializer)(@this, data); + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/HttpContextExtensions.cs b/Vendor/EmbedIO-3.5.2/HttpContextExtensions.cs new file mode 100644 index 0000000..46da20c --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/HttpContextExtensions.cs @@ -0,0 +1,30 @@ +using System; +using EmbedIO.Utilities; +using Swan; + +namespace EmbedIO +{ + /// + /// Provides extension methods for types implementing . + /// + public static partial class HttpContextExtensions + { + /// + /// Gets the underlying interface of an . + /// This API mainly supports the EmbedIO infrastructure; it is not intended to be used directly from your code, + /// unless to fulfill very specific needs in the development of plug-ins (modules, etc.) for EmbedIO. + /// + /// The interface on which this method is called. + /// The underlying interface representing + /// the HTTP context implementation. + /// + /// is . + /// + /// + /// does not implement . + /// + public static IHttpContextImpl GetImplementation(this IHttpContext @this) + => Validate.NotNull(nameof(@this), @this) as IHttpContextImpl + ?? throw SelfCheck.Failure($"{@this.GetType().FullName} does not implement {nameof(IHttpContextImpl)}."); + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/HttpException-Shortcuts.cs b/Vendor/EmbedIO-3.5.2/HttpException-Shortcuts.cs new file mode 100644 index 0000000..7c8c50b --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/HttpException-Shortcuts.cs @@ -0,0 +1,158 @@ +using System; +using System.Net; + +namespace EmbedIO +{ + partial class HttpException + { + /// + /// Returns a new instance of that, when thrown, + /// will break the request handling control flow and send a 500 Internal Server Error + /// response to the client. + /// + /// A message to include in the response. + /// The data object to include in the response. + /// + /// A newly-created . + /// + public static HttpException InternalServerError(string? message = null, object? data = null) + => new HttpException(HttpStatusCode.InternalServerError, message, data); + + /// + /// Returns a new instance of that, when thrown, + /// will break the request handling control flow and send a 401 Unauthorized + /// response to the client. + /// + /// A message to include in the response. + /// The data object to include in the response. + /// + /// A newly-created . + /// + public static HttpException Unauthorized(string? message = null, object? data = null) + => new HttpException(HttpStatusCode.Unauthorized, message, data); + + /// + /// Returns a new instance of that, when thrown, + /// will break the request handling control flow and send a 403 Forbidden + /// response to the client. + /// + /// A message to include in the response. + /// The data object to include in the response. + /// A newly-created . + public static HttpException Forbidden(string? message = null, object? data = null) + => new HttpException(HttpStatusCode.Forbidden, message, data); + + /// + /// Returns a new instance of that, when thrown, + /// will break the request handling control flow and send a 400 Bad Request + /// response to the client. + /// + /// A message to include in the response. + /// The data object to include in the response. + /// A newly-created . + public static HttpException BadRequest(string? message = null, object? data = null) + => new HttpException(HttpStatusCode.BadRequest, message, data); + + /// + /// Returns a new instance of that, when thrown, + /// will break the request handling control flow and send a 404 Not Found + /// response to the client. + /// + /// A message to include in the response. + /// The data object to include in the response. + /// A newly-created . + public static HttpException NotFound(string? message = null, object? data = null) + => new HttpException(HttpStatusCode.NotFound, message, data); + + /// + /// Returns a new instance of that, when thrown, + /// will break the request handling control flow and send a 405 Method Not Allowed + /// response to the client. + /// + /// A message to include in the response. + /// The data object to include in the response. + /// A newly-created . + public static HttpException MethodNotAllowed(string? message = null, object? data = null) + => new HttpException(HttpStatusCode.MethodNotAllowed, message, data); + + /// + /// Returns a new instance of that, when thrown, + /// will break the request handling control flow and send a 406 Not Acceptable + /// response to the client. + /// + /// A newly-created . + /// + public static HttpNotAcceptableException NotAcceptable() => new HttpNotAcceptableException(); + + /// + /// Returns a new instance of that, when thrown, + /// will break the request handling control flow and send a 406 Not Acceptable + /// response to the client. + /// + /// A value, or a comma-separated list of values, to set the response's Vary header to. + /// A newly-created . + /// + public static HttpNotAcceptableException NotAcceptable(string vary) => new HttpNotAcceptableException(vary); + + /// + /// Returns a new instance of that, when thrown, + /// will break the request handling control flow and send a 416 Range Not Satisfiable + /// response to the client. + /// + /// A newly-created . + /// + public static HttpRangeNotSatisfiableException RangeNotSatisfiable() => new HttpRangeNotSatisfiableException(); + + /// + /// Returns a new instance of that, when thrown, + /// will break the request handling control flow and send a 416 Range Not Satisfiable + /// response to the client. + /// + /// The total length of the requested resource, expressed in bytes, + /// or to omit the Content-Range header in the response. + /// A newly-created . + /// + public static HttpRangeNotSatisfiableException RangeNotSatisfiable(long? contentLength) + => new HttpRangeNotSatisfiableException(contentLength); + + /// + /// Returns a new instance of that, when thrown, + /// will break the request handling control flow and redirect the client + /// to the specified location, using response status code 302. + /// + /// The redirection target. + /// + /// A newly-created . + /// + public static HttpRedirectException Redirect(string location) + => new HttpRedirectException(location); + + /// + /// Returns a new instance of that, when thrown, + /// will break the request handling control flow and redirect the client + /// to the specified location, using the specified response status code. + /// + /// The redirection target. + /// The status code to set on the response, in the range from 300 to 399. + /// + /// A newly-created . + /// + /// is not in the 300-399 range. + public static HttpRedirectException Redirect(string location, int statusCode) + => new HttpRedirectException(location, statusCode); + + /// + /// Returns a new instance of that, when thrown, + /// will break the request handling control flow and redirect the client + /// to the specified location, using the specified response status code. + /// + /// The redirection target. + /// One of the redirection status codes, to be set on the response. + /// + /// A newly-created . + /// + /// is not a redirection status code. + public static HttpRedirectException Redirect(string location, HttpStatusCode statusCode) + => new HttpRedirectException(location, statusCode); + } +} diff --git a/Vendor/EmbedIO-3.5.2/HttpException.cs b/Vendor/EmbedIO-3.5.2/HttpException.cs new file mode 100644 index 0000000..be3e635 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/HttpException.cs @@ -0,0 +1,105 @@ +using System; +using System.Net; + +namespace EmbedIO +{ + /// + /// When thrown, breaks the request handling control flow + /// and sends an error response to the client. + /// +#pragma warning disable CA1032 // Implement standard exception constructors - they have no meaning here. + public partial class HttpException : Exception, IHttpException +#pragma warning restore CA1032 + { + /// + /// Initializes a new instance of the class, + /// with no message to include in the response. + /// + /// The status code to set on the response. + public HttpException(int statusCode) + { + StatusCode = statusCode; + } + + /// + /// Initializes a new instance of the class, + /// with no message to include in the response. + /// + /// The status code to set on the response. + public HttpException(HttpStatusCode statusCode) + : this((int)statusCode) + { + } + + /// + /// Initializes a new instance of the class, + /// with a message to include in the response. + /// + /// The status code to set on the response. + /// A message to include in the response as plain text. + public HttpException(int statusCode, string? message) + : base(message) + { + StatusCode = statusCode; + HttpExceptionMessage = message; + } + + /// + /// Initializes a new instance of the class, + /// with a message to include in the response. + /// + /// The status code to set on the response. + /// A message to include in the response as plain text. + public HttpException(HttpStatusCode statusCode, string? message) + : this((int)statusCode, message) + { + } + + /// + /// Initializes a new instance of the class, + /// with a message and a data object to include in the response. + /// + /// The status code to set on the response. + /// A message to include in the response as plain text. + /// The data object to include in the response. + public HttpException(int statusCode, string? message, object? data) + : this(statusCode, message) + { + DataObject = data; + } + + /// + /// Initializes a new instance of the class, + /// with a message and a data object to include in the response. + /// + /// The status code to set on the response. + /// A message to include in the response as plain text. + /// The data object to include in the response. + public HttpException(HttpStatusCode statusCode, string? message, object? data) + : this((int)statusCode, message, data) + { + } + + /// + public int StatusCode { get; } + + /// + public object? DataObject { get; } + + /// + string? IHttpException.Message => HttpExceptionMessage; + + // This property is necessary because when an exception with a null Message is thrown + // the CLR provides a standard message. We want null to remain null in IHttpException. + private string? HttpExceptionMessage { get; } + + /// + /// + /// This method does nothing; there is no need to call + /// base.PrepareResponse in overrides of this method. + /// + public virtual void PrepareResponse(IHttpContext context) + { + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/HttpExceptionHandler.cs b/Vendor/EmbedIO-3.5.2/HttpExceptionHandler.cs new file mode 100644 index 0000000..b72efa8 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/HttpExceptionHandler.cs @@ -0,0 +1,153 @@ +using System; +using System.Net; +using System.Runtime.ExceptionServices; +using System.Net.Http; +using System.Threading.Tasks; +using System.Web; +using EmbedIO.Utilities; +using Swan.Logging; + +namespace EmbedIO +{ + /// + /// Provides standard handlers for HTTP exceptions at both module and server level. + /// + /// + /// Where applicable, HTTP exception handlers defined in this class + /// use the and + /// properties to customize + /// their behavior. + /// + /// + /// + public static class HttpExceptionHandler + { + /// + /// Gets the default handler used by . + /// This is the same as . + /// + public static HttpExceptionHandlerCallback Default { get; } = HtmlResponse; + + /// + /// Sends an empty response. + /// + /// An interface representing the context of the request. + /// The HTTP exception. + /// A representing the ongoing operation. +#pragma warning disable CA1801 // Unused parameter + public static Task EmptyResponse(IHttpContext context, IHttpException httpException) +#pragma warning restore CA1801 + => Task.CompletedTask; + + /// + /// Sends a HTTP exception's Message property + /// as a plain text response. + /// This handler does not use the DataObject property. + /// + /// An interface representing the context of the request. + /// The HTTP exception. + /// A representing the ongoing operation. + public static Task PlainTextResponse(IHttpContext context, IHttpException httpException) + => context.SendStringAsync(httpException.Message ?? string.Empty, MimeType.PlainText, WebServer.DefaultEncoding); + + /// + /// Sends a response with a HTML payload + /// briefly describing the error, including contact information and/or a stack trace + /// if specified via the + /// and properties, respectively. + /// This handler does not use the DataObject property. + /// + /// An interface representing the context of the request. + /// The HTTP exception. + /// A representing the ongoing operation. + public static Task HtmlResponse(IHttpContext context, IHttpException httpException) + => context.SendStandardHtmlAsync( + httpException.StatusCode, + text => { + text.Write( + "

Exception type: {0}

Message: {1}", + WebUtility.HtmlEncode(httpException.GetType().FullName ?? ""), + WebUtility.HtmlEncode(httpException.Message)); + + text.Write("


If this error is completely unexpected to you, and you think you should not seeing this page, please contact the server administrator"); + + if (!string.IsNullOrEmpty(ExceptionHandler.ContactInformation)) + text.Write(" ({0})", WebUtility.HtmlEncode(ExceptionHandler.ContactInformation)); + + text.Write(", informing them of the time this error occurred and the action(s) you performed that resulted in this error.

"); + + if (ExceptionHandler.IncludeStackTraces) + { + text.Write( + "

Stack trace:


{0}
", + WebUtility.HtmlEncode(httpException.StackTrace)); + } + }); + + /// + /// Gets a that will serialize a HTTP exception's + /// DataObject property and send it as a JSON response. + /// + /// A used to serialize data and send it to the client. + /// A . + /// is . + public static HttpExceptionHandlerCallback DataResponse(ResponseSerializerCallback serializerCallback) + { + Validate.NotNull(nameof(serializerCallback), serializerCallback); + + return (context, httpException) => serializerCallback(context, httpException.DataObject); + } + + /// + /// Gets a that will serialize a HTTP exception's + /// Message and DataObject properties + /// and send them as a JSON response. + /// The response will be a JSON object with a message property and a data property. + /// + /// A used to serialize data and send it to the client. + /// A . + /// is . + public static HttpExceptionHandlerCallback FullDataResponse(ResponseSerializerCallback serializerCallback) + { + Validate.NotNull(nameof(serializerCallback), serializerCallback); + + return (context, httpException) => serializerCallback(context, new + { + message = httpException.Message, + data = httpException.DataObject, + }); + } + + internal static async Task Handle(string logSource, IHttpContext context, Exception exception, HttpExceptionHandlerCallback? handler) + { + if (handler == null || !(exception is IHttpException httpException)) + { + ExceptionDispatchInfo.Capture(exception).Throw(); + return; + } + + exception.Log(logSource, $"[{context.Id}] HTTP exception {httpException.StatusCode}"); + + try + { + context.Response.SetEmptyResponse(httpException.StatusCode); + context.Response.DisableCaching(); + httpException.PrepareResponse(context); + await handler(context, httpException) + .ConfigureAwait(false); + } + catch (OperationCanceledException) when (context.CancellationToken.IsCancellationRequested) + { + throw; + } + catch (HttpListenerException) + { + throw; + } + catch (Exception exception2) + { + exception2.Log(logSource, $"[{context.Id}] Unhandled exception while handling HTTP exception {httpException.StatusCode}"); + } + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/HttpExceptionHandlerCallback.cs b/Vendor/EmbedIO-3.5.2/HttpExceptionHandlerCallback.cs new file mode 100644 index 0000000..488f6d7 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/HttpExceptionHandlerCallback.cs @@ -0,0 +1,21 @@ +using System.Threading.Tasks; + +namespace EmbedIO +{ + /// + /// A callback used to build the contents of the response for an . + /// + /// An interface representing the context of the request. + /// An interface. + /// A representing the ongoing operation. + /// + /// When this delegate is called, the response's status code has already been set and the + /// method has already been called. The only thing left to do is preparing the response's content, according + /// to the property. + /// Any exception thrown by a handler (even a HTTP exception) will go unhandled: the web server + /// will not crash, but processing of the request will be aborted, and the response will be flushed as-is. + /// In other words, it is not a good ides to throw HttpException.NotFound() (or similar) + /// from a handler. + /// + public delegate Task HttpExceptionHandlerCallback(IHttpContext context, IHttpException httpException); +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/HttpHeaderNames.cs b/Vendor/EmbedIO-3.5.2/HttpHeaderNames.cs new file mode 100644 index 0000000..a29846f --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/HttpHeaderNames.cs @@ -0,0 +1,449 @@ +namespace EmbedIO +{ + /// + /// Exposes known HTTP header names. + /// + /// + /// The constants in this class have been extracted from a list of known HTTP header names. + /// The presence of a header name in this class is not a guarantee that EmbedIO supports, + /// or even recognizes, it. Refer to the documentation for each module for information about supported + /// headers. + /// + public static class HttpHeaderNames + { + // The .NET Core sources were taken as reference for this list of constants. + // See https://github.com/dotnet/corefx/blob/master/src/Common/src/System/Net/HttpKnownHeaderNames.cs + // However, not all constants come from there, so be careful not to copy-paste indiscriminately. + + /// + /// The Accept HTTP header. + /// + public const string Accept = "Accept"; + + /// + /// The Accept-Charset HTTP header. + /// + public const string AcceptCharset = "Accept-Charset"; + + /// + /// The Accept-Encoding HTTP header. + /// + public const string AcceptEncoding = "Accept-Encoding"; + + /// + /// The Accept-Language HTTP header. + /// + public const string AcceptLanguage = "Accept-Language"; + + /// + /// The Accept-Patch HTTP header. + /// + public const string AcceptPatch = "Accept-Patch"; + + /// + /// The Accept-Ranges HTTP header. + /// + public const string AcceptRanges = "Accept-Ranges"; + + /// + /// The Access-Control-Allow-Credentials HTTP header. + /// + public const string AccessControlAllowCredentials = "Access-Control-Allow-Credentials"; + + /// + /// The Access-Control-Allow-Headers HTTP header. + /// + public const string AccessControlAllowHeaders = "Access-Control-Allow-Headers"; + + /// + /// The Access-Control-Allow-Methods HTTP header. + /// + public const string AccessControlAllowMethods = "Access-Control-Allow-Methods"; + + /// + /// The Access-Control-Allow-Origin HTTP header. + /// + public const string AccessControlAllowOrigin = "Access-Control-Allow-Origin"; + + /// + /// The Access-Control-Expose-Headers HTTP header. + /// + public const string AccessControlExposeHeaders = "Access-Control-Expose-Headers"; + + /// + /// The Access-Control-Max-Age HTTP header. + /// + public const string AccessControlMaxAge = "Access-Control-Max-Age"; + + /// + /// The Access-Control-Request-Headers HTTP header. + /// + public const string AccessControlRequestHeaders = "Access-Control-Request-Headers"; + + /// + /// The Access-Control-Request-Method HTTP header. + /// + public const string AccessControlRequestMethod = "Access-Control-Request-Method"; + + /// + /// The Age HTTP header. + /// + public const string Age = "Age"; + + /// + /// The Allow HTTP header. + /// + public const string Allow = "Allow"; + + /// + /// The Alt-Svc HTTP header. + /// + public const string AltSvc = "Alt-Svc"; + + /// + /// The Authorization HTTP header. + /// + public const string Authorization = "Authorization"; + + /// + /// The Cache-Control HTTP header. + /// + public const string CacheControl = "Cache-Control"; + + /// + /// The Connection HTTP header. + /// + public const string Connection = "Connection"; + + /// + /// The Content-Disposition HTTP header. + /// + public const string ContentDisposition = "Content-Disposition"; + + /// + /// The Content-Encoding HTTP header. + /// + public const string ContentEncoding = "Content-Encoding"; + + /// + /// The Content-Language HTTP header. + /// + public const string ContentLanguage = "Content-Language"; + + /// + /// The Content-Length HTTP header. + /// + public const string ContentLength = "Content-Length"; + + /// + /// The Content-Location HTTP header. + /// + public const string ContentLocation = "Content-Location"; + + /// + /// The Content-MD5 HTTP header. + /// + public const string ContentMD5 = "Content-MD5"; + + /// + /// The Content-Range HTTP header. + /// + public const string ContentRange = "Content-Range"; + + /// + /// The Content-Security-Policy HTTP header. + /// + public const string ContentSecurityPolicy = "Content-Security-Policy"; + + /// + /// The Content-Type HTTP header. + /// + public const string ContentType = "Content-Type"; + + /// + /// The Cookie HTTP header. + /// + public const string Cookie = "Cookie"; + + /// + /// The Cookie2 HTTP header. + /// + public const string Cookie2 = "Cookie2"; + + /// + /// The Date HTTP header. + /// + public const string Date = "Date"; + + /// + /// The ETag HTTP header. + /// + public const string ETag = "ETag"; + + /// + /// The Expect HTTP header. + /// + public const string Expect = "Expect"; + + /// + /// The Expires HTTP header. + /// + public const string Expires = "Expires"; + + /// + /// The From HTTP header. + /// + public const string From = "From"; + + /// + /// The Host HTTP header. + /// + public const string Host = "Host"; + + /// + /// The If-Match HTTP header. + /// + public const string IfMatch = "If-Match"; + + /// + /// The If-Modified-Since HTTP header. + /// + public const string IfModifiedSince = "If-Modified-Since"; + + /// + /// The If-None-Match HTTP header. + /// + public const string IfNoneMatch = "If-None-Match"; + + /// + /// The If-Range HTTP header. + /// + public const string IfRange = "If-Range"; + + /// + /// The If-Unmodified-Since HTTP header. + /// + public const string IfUnmodifiedSince = "If-Unmodified-Since"; + + /// + /// The Keep-Alive HTTP header. + /// + public const string KeepAlive = "Keep-Alive"; + + /// + /// The Last-Modified HTTP header. + /// + public const string LastModified = "Last-Modified"; + + /// + /// The Link HTTP header. + /// + public const string Link = "Link"; + + /// + /// The Location HTTP header. + /// + public const string Location = "Location"; + + /// + /// The Max-Forwards HTTP header. + /// + public const string MaxForwards = "Max-Forwards"; + + /// + /// The Origin HTTP header. + /// + public const string Origin = "Origin"; + + /// + /// The P3P HTTP header. + /// + public const string P3P = "P3P"; + + /// + /// The Pragma HTTP header. + /// + public const string Pragma = "Pragma"; + + /// + /// The Proxy-Authenticate HTTP header. + /// + public const string ProxyAuthenticate = "Proxy-Authenticate"; + + /// + /// The Proxy-Authorization HTTP header. + /// + public const string ProxyAuthorization = "Proxy-Authorization"; + + /// + /// The Proxy-Connection HTTP header. + /// + public const string ProxyConnection = "Proxy-Connection"; + + /// + /// The Public-Key-Pins HTTP header. + /// + public const string PublicKeyPins = "Public-Key-Pins"; + + /// + /// The Range HTTP header. + /// + public const string Range = "Range"; + + /// + /// The Referer HTTP header. + /// + /// + /// The incorrect spelling ("Referer" instead of "Referrer") is intentional + /// and has historical reasons. + /// See the "Etymology" section of the Wikipedia article + /// on this header for more information. + /// + public const string Referer = "Referer"; + + /// + /// The Retry-After HTTP header. + /// + public const string RetryAfter = "Retry-After"; + + /// + /// The Sec-WebSocket-Accept HTTP header. + /// + public const string SecWebSocketAccept = "Sec-WebSocket-Accept"; + + /// + /// The Sec-WebSocket-Extensions HTTP header. + /// + public const string SecWebSocketExtensions = "Sec-WebSocket-Extensions"; + + /// + /// The Sec-WebSocket-Key HTTP header. + /// + public const string SecWebSocketKey = "Sec-WebSocket-Key"; + + /// + /// The Sec-WebSocket-Protocol HTTP header. + /// + public const string SecWebSocketProtocol = "Sec-WebSocket-Protocol"; + + /// + /// The Sec-WebSocket-Version HTTP header. + /// + public const string SecWebSocketVersion = "Sec-WebSocket-Version"; + + /// + /// The Server HTTP header. + /// + public const string Server = "Server"; + + /// + /// The Set-Cookie HTTP header. + /// + public const string SetCookie = "Set-Cookie"; + + /// + /// The Set-Cookie2 HTTP header. + /// + public const string SetCookie2 = "Set-Cookie2"; + + /// + /// The Strict-Transport-Security HTTP header. + /// + public const string StrictTransportSecurity = "Strict-Transport-Security"; + + /// + /// The TE HTTP header. + /// + public const string TE = "TE"; + + /// + /// The TSV HTTP header. + /// + public const string TSV = "TSV"; + + /// + /// The Trailer HTTP header. + /// + public const string Trailer = "Trailer"; + + /// + /// The Transfer-Encoding HTTP header. + /// + public const string TransferEncoding = "Transfer-Encoding"; + + /// + /// The Upgrade HTTP header. + /// + public const string Upgrade = "Upgrade"; + + /// + /// The Upgrade-Insecure-Requests HTTP header. + /// + public const string UpgradeInsecureRequests = "Upgrade-Insecure-Requests"; + + /// + /// The User-Agent HTTP header. + /// + public const string UserAgent = "User-Agent"; + + /// + /// The Vary HTTP header. + /// + public const string Vary = "Vary"; + + /// + /// The Via HTTP header. + /// + public const string Via = "Via"; + + /// + /// The WWW-Authenticate HTTP header. + /// + public const string WWWAuthenticate = "WWW-Authenticate"; + + /// + /// The Warning HTTP header. + /// + public const string Warning = "Warning"; + + /// + /// The X-AspNet-Version HTTP header. + /// + public const string XAspNetVersion = "X-AspNet-Version"; + + /// + /// The X-Content-Duration HTTP header. + /// + public const string XContentDuration = "X-Content-Duration"; + + /// + /// The X-Content-Type-Options HTTP header. + /// + public const string XContentTypeOptions = "X-Content-Type-Options"; + + /// + /// The X-Frame-Options HTTP header. + /// + public const string XFrameOptions = "X-Frame-Options"; + + /// + /// The X-MSEdge-Ref HTTP header. + /// + public const string XMSEdgeRef = "X-MSEdge-Ref"; + + /// + /// The X-Powered-By HTTP header. + /// + public const string XPoweredBy = "X-Powered-By"; + + /// + /// The X-Request-ID HTTP header. + /// + public const string XRequestID = "X-Request-ID"; + + /// + /// The X-UA-Compatible HTTP header. + /// + public const string XUACompatible = "X-UA-Compatible"; + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/HttpListenerMode.cs b/Vendor/EmbedIO-3.5.2/HttpListenerMode.cs new file mode 100644 index 0000000..3e10107 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/HttpListenerMode.cs @@ -0,0 +1,20 @@ +namespace EmbedIO +{ + /// + /// Defines the HTTP listeners available for use in a . + /// + public enum HttpListenerMode + { + /// + /// Use EmbedIO's internal HTTP listener implementation, + /// based on Mono's System.Net.HttpListener. + /// + EmbedIO, + + /// + /// Use the class + /// provided by the .NET runtime in use. + /// + Microsoft, + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/HttpNotAcceptableException.cs b/Vendor/EmbedIO-3.5.2/HttpNotAcceptableException.cs new file mode 100644 index 0000000..f84f47e --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/HttpNotAcceptableException.cs @@ -0,0 +1,55 @@ +using System.Net; + +namespace EmbedIO +{ + /// + /// When thrown, breaks the request handling control flow + /// and sends a redirection response to the client. + /// +#pragma warning disable CA1032 // Implement standard exception constructors - they have no meaning here. + public class HttpNotAcceptableException : HttpException +#pragma warning restore CA1032 + { + /// + /// Initializes a new instance of the class, + /// without specifying a value for the response's Vary header. + /// + public HttpNotAcceptableException() + : this(null) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// + /// A value, or a comma-separated list of values, to set the response's Vary header to. + /// Although not specified in RFC7231, + /// this may help the client to understand why the request has been rejected. + /// If this parameter is or the empty string, the response's Vary header + /// is not set. + /// + public HttpNotAcceptableException(string? vary) + : base((int)HttpStatusCode.NotAcceptable) + { + Vary = string.IsNullOrEmpty(vary) ? null : vary; + } + + /// + /// Gets the value, or comma-separated list of values, to be set + /// on the response's Vary header. + /// + /// + /// If the empty string has been passed to the + /// constructor, the value of this property is . + /// + public string? Vary { get; } + + /// + public override void PrepareResponse(IHttpContext context) + { + if (Vary != null) + context.Response.Headers.Add(HttpHeaderNames.Vary, Vary); + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/HttpRangeNotSatisfiableException.cs b/Vendor/EmbedIO-3.5.2/HttpRangeNotSatisfiableException.cs new file mode 100644 index 0000000..8397e1b --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/HttpRangeNotSatisfiableException.cs @@ -0,0 +1,50 @@ +using System.Net; + +namespace EmbedIO +{ + /// + /// When thrown, breaks the request handling control flow + /// and sends a redirection response to the client. + /// +#pragma warning disable CA1032 // Implement standard exception constructors - they have no meaning here. + public class HttpRangeNotSatisfiableException : HttpException +#pragma warning restore CA1032 + { + /// + /// Initializes a new instance of the class. + /// without specifying a value for the response's Content-Range header. + /// + public HttpRangeNotSatisfiableException() + : this(null) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// The total length of the requested resource, expressed in bytes, + /// or to omit the Content-Range header in the response. + public HttpRangeNotSatisfiableException(long? contentLength) + : base((int)HttpStatusCode.RequestedRangeNotSatisfiable) + { + ContentLength = contentLength; + } + + /// + /// Gets the total content length to be specified + /// on the response's Content-Range header. + /// + public long? ContentLength { get; } + + /// + public override void PrepareResponse(IHttpContext context) + { + // RFC 7233, Section 3.1: "When this status code is generated in response + // to a byte-range request, the sender + // SHOULD generate a Content-Range header field specifying + // the current length of the selected representation." + if (ContentLength.HasValue) + context.Response.Headers.Set(HttpHeaderNames.ContentRange, $"bytes */{ContentLength.Value}"); + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/HttpRedirectException.cs b/Vendor/EmbedIO-3.5.2/HttpRedirectException.cs new file mode 100644 index 0000000..22b6801 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/HttpRedirectException.cs @@ -0,0 +1,54 @@ +using System; +using System.Net; + +namespace EmbedIO +{ + /// + /// When thrown, breaks the request handling control flow + /// and sends a redirection response to the client. + /// +#pragma warning disable CA1032 // Implement standard exception constructors - they have no meaning here. + public class HttpRedirectException : HttpException +#pragma warning restore CA1032 + { + /// + /// Initializes a new instance of the class. + /// + /// The redirection target. + /// + /// The status code to set on the response, in the range from 300 to 399. + /// By default, status code 302 (Found) is used. + /// + /// is not in the 300-399 range. + public HttpRedirectException(string location, int statusCode = (int)HttpStatusCode.Found) + : base(statusCode) + { + if (statusCode < 300 || statusCode > 399) + throw new ArgumentException("Redirect status code is not valid.", nameof(statusCode)); + + Location = location; + } + + /// + /// Initializes a new instance of the class. + /// + /// The redirection target. + /// One of the redirection status codes, to be set on the response. + /// is not a redirection status code. + public HttpRedirectException(string location, HttpStatusCode statusCode) + : this(location, (int)statusCode) + { + } + + /// + /// Gets the URL where the client will be redirected. + /// + public string Location { get; } + + /// + public override void PrepareResponse(IHttpContext context) + { + context.Redirect(Location, StatusCode); + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/HttpRequestExtensions.cs b/Vendor/EmbedIO-3.5.2/HttpRequestExtensions.cs new file mode 100644 index 0000000..70e55aa --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/HttpRequestExtensions.cs @@ -0,0 +1,262 @@ +using System; +using System.Globalization; +using System.Linq; +using System.Net; +using System.Net.Http.Headers; +using EmbedIO.Utilities; + +namespace EmbedIO +{ + /// + /// Provides extension methods for types implementing . + /// + public static class HttpRequestExtensions + { + /// + /// Returns a string representing the remote IP address and port of an interface. + /// This method can be called even on a interface, or one that has no + /// remote end point, or no remote address; it will always return a non-, + /// non-empty string. + /// + /// The on which this method is called. + /// + /// If is , or its RemoteEndPoint + /// is , the string "<null>; otherwise, the remote end point's + /// Address (or the string "<???>" if it is ) + /// followed by a colon and the Port number. + /// + public static string SafeGetRemoteEndpointStr(this IHttpRequest @this) + { + var endPoint = @this?.RemoteEndPoint; + return endPoint == null + ? "" + : $"{endPoint.Address?.ToString() ?? ""}:{endPoint.Port.ToString(CultureInfo.InvariantCulture)}"; + } + + /// + /// Attempts to proactively negotiate a compression method for a response, + /// based on a request's Accept-Encoding header (or lack of it). + /// + /// The on which this method is called. + /// if sending compressed data is preferred over + /// sending non-compressed data; otherwise, . + /// When this method returns, the compression method to use for the response, + /// if content negotiation is successful. This parameter is passed uninitialized. + /// When this method returns, a callback that prepares data in an + /// according to the result of content negotiation. This parameter is passed uninitialized. + /// if content negotiation is successful; + /// otherwise, . + /// + /// If this method returns , the callback + /// will set appropriate response headers to reflect the results of content negotiation. + /// If this method returns , the callback + /// will throw a to send a 406 Not Acceptable response + /// with the Vary header set to Accept-Encoding, + /// so that the client may know the reason why the request has been rejected. + /// If has noAccept-Encoding header, this method + /// always returns and sets + /// to . + /// + /// + public static bool TryNegotiateContentEncoding( + this IHttpRequest @this, + bool preferCompression, + out CompressionMethod compressionMethod, + out Action prepareResponse) + { + var acceptedEncodings = new QValueList(true, @this.Headers.GetValues(HttpHeaderNames.AcceptEncoding)); + if (!acceptedEncodings.TryNegotiateContentEncoding(preferCompression, out compressionMethod, out var compressionMethodName)) + { + prepareResponse = r => throw HttpException.NotAcceptable(HttpHeaderNames.AcceptEncoding); + return false; + } + + prepareResponse = r => { + r.Headers.Add(HttpHeaderNames.Vary, HttpHeaderNames.AcceptEncoding); + r.Headers.Set(HttpHeaderNames.ContentEncoding, compressionMethodName); + }; + return true; + } + + /// + /// Checks whether an If-None-Match header exists in a request + /// and, if so, whether it contains a given entity tag. + /// See RFC7232, Section 3.2 + /// for a normative reference; however, see the Remarks section for more information + /// about the RFC compliance of this method. + /// + /// The on which this method is called. + /// The entity tag. + /// When this method returns, a value that indicates whether an + /// If-None-Match header is present in , regardless of the method's + /// return value. This parameter is passed uninitialized. + /// if an If-None-Match header is present in + /// and one of the entity tags listed in it is equal to ; + /// otherwise. + /// + /// RFC7232, Section 3.2 + /// states that a weak comparison function (as defined in + /// RFC7232, Section 2.3.2) + /// must be used for If-None-Match. That would mean parsing every entity tag, at least minimally, + /// to determine whether it is a "weak" or "strong" tag. Since EmbedIO currently generates only + /// "strong" tags, this method uses the default string comparer instead. + /// The behavior of this method is thus not, strictly speaking, RFC7232-compliant; + /// it works, though, with entity tags generated by EmbedIO. + /// + public static bool CheckIfNoneMatch(this IHttpRequest @this, string entityTag, out bool headerExists) + { + var values = @this.Headers.GetValues(HttpHeaderNames.IfNoneMatch); + if (values == null) + { + headerExists = false; + return false; + } + + headerExists = true; + return values.Select(t => t.Trim()).Contains(entityTag); + } + + // Check whether the If-Modified-Since request header exists + // and specifies a date and time more recent than or equal to + // the date and time of last modification of the requested resource. + // RFC7232, Section 3.3 + + /// + /// Checks whether an If-Modified-Since header exists in a request + /// and, if so, whether its value is a date and time more recent or equal to + /// a given . + /// See RFC7232, Section 3.3 + /// for a normative reference. + /// + /// The on which this method is called. + /// A date and time value, in Coordinated Universal Time, + /// expressing the last time a resource was modified. + /// When this method returns, a value that indicates whether an + /// If-Modified-Since header is present in , regardless of the method's + /// return value. This parameter is passed uninitialized. + /// if an If-Modified-Since header is present in + /// and its value is a date and time more recent or equal to ; + /// otherwise. + public static bool CheckIfModifiedSince(this IHttpRequest @this, DateTime lastModifiedUtc, out bool headerExists) + { + var value = @this.Headers.Get(HttpHeaderNames.IfModifiedSince); + if (value == null) + { + headerExists = false; + return false; + } + + headerExists = true; + return HttpDate.TryParse(value, out var dateTime) + && dateTime.UtcDateTime >= lastModifiedUtc; + } + + // Checks the Range request header to tell whether to send + // a "206 Partial Content" response. + + /// + /// Checks whether a Range header exists in a request + /// and, if so, determines whether it is possible to send a 206 Partial Content response. + /// See RFC7233 + /// for a normative reference; however, see the Remarks section for more information + /// about the RFC compliance of this method. + /// + /// The on which this method is called. + /// The total length, in bytes, of the response entity, i.e. + /// what would be sent in a 200 OK response. + /// An entity tag representing the response entity. This value is checked against + /// the If-Range header, if it is present. + /// The date and time value, in Coordinated Universal Time, + /// expressing the last modification time of the resource entity. This value is checked against + /// the If-Range header, if it is present. + /// When this method returns , the start of the requested byte range. + /// This parameter is passed uninitialized. + /// + /// When this method returns , the upper bound of the requested byte range. + /// This parameter is passed uninitialized. + /// Note that the upper bound of a range is NOT the sum of the range's start and length; + /// for example, a range expressed as bytes=0-99 has a start of 0, an upper bound of 99, + /// and a length of 100 bytes. + /// + /// + /// This method returns if the following conditions are satisfied: + /// + /// >the request's HTTP method is GET; + /// >a Range header is present in the request; + /// >either no If-Range header is present in the request, or it + /// specifies an entity tag equal to , or a UTC date and time + /// equal to ; + /// >the Range header specifies exactly one range; + /// >the specified range is entirely contained in the range from 0 to - 1. + /// + /// If the last condition is not satisfied, i.e. the specified range start and/or upper bound + /// are out of the range from 0 to - 1, this method does not return; + /// it throws a instead. + /// If any of the other conditions are not satisfied, this method returns . + /// + /// + /// According to RFC7233, Section 3.1, + /// there are several conditions under which a server may ignore or reject a range request; therefore, + /// clients are (or should be) prepared to receive a 200 OK response with the whole response + /// entity instead of the requested range(s). For this reason, until the generation of + /// multipart/byteranges responses is implemented in EmbedIO, this method will ignore + /// range requests specifying more than one range, even if this behavior is not, strictly speaking, + /// RFC7233-compliant. + /// To make clients aware that range requests are accepted for a resource, every 200 OK + /// (or 304 Not Modified) response for the same resource should include an Accept-Ranges + /// header with the string bytes as value. + /// + public static bool IsRangeRequest(this IHttpRequest @this, long contentLength, string entityTag, DateTime lastModifiedUtc, out long start, out long upperBound) + { + start = 0; + upperBound = contentLength - 1; + + // RFC7233, Section 3.1: + // "A server MUST ignore a Range header field received with a request method other than GET." + if (@this.HttpVerb != HttpVerbs.Get) + return false; + + // No Range header, no partial content. + var rangeHeader = @this.Headers.Get(HttpHeaderNames.Range); + if (rangeHeader == null) + return false; + + // Ignore the Range header if there is no If-Range header + // or if the If-Range header specifies a non-matching validator. + // RFC7233, Section 3.2: "If the validator given in the If-Range header field matches the + // current validator for the selected representation of the target + // resource, then the server SHOULD process the Range header field as + // requested.If the validator does not match, the server MUST ignore + // the Range header field.Note that this comparison by exact match, + // including when the validator is an HTTP-date, differs from the + // "earlier than or equal to" comparison used when evaluating an + // If-Unmodified-Since conditional." + var ifRange = @this.Headers.Get(HttpHeaderNames.IfRange)?.Trim(); + if (ifRange != null && ifRange != entityTag) + { + if (!HttpDate.TryParse(ifRange, out var rangeDate)) + return false; + + if (rangeDate.UtcDateTime != lastModifiedUtc) + return false; + } + + // Ignore the Range request header if it cannot be parsed successfully. + if (!RangeHeaderValue.TryParse(rangeHeader, out var range)) + return false; + + // EmbedIO does not support multipart/byteranges responses (yet), + // thus ignore range requests that specify one range. + if (range.Ranges.Count != 1) + return false; + + var firstRange = range.Ranges.First(); + start = firstRange.From ?? 0L; + upperBound = firstRange.To ?? contentLength - 1; + if (start >= contentLength || upperBound < start || upperBound >= contentLength) + throw HttpException.RangeNotSatisfiable(contentLength); + + return true; + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/HttpResponseExtensions.cs b/Vendor/EmbedIO-3.5.2/HttpResponseExtensions.cs new file mode 100644 index 0000000..ad4c6c4 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/HttpResponseExtensions.cs @@ -0,0 +1,43 @@ +using System; +using EmbedIO.Utilities; + +namespace EmbedIO +{ + /// + /// Provides extension methods for types implementing . + /// + public static class HttpResponseExtensions + { + /// + /// Sets the necessary headers to disable caching of a response on the client side. + /// + /// The interface on which this method is called. + /// is . + public static void DisableCaching(this IHttpResponse @this) + { + var headers = @this.Headers; + headers.Set(HttpHeaderNames.Expires, "Sat, 26 Jul 1997 05:00:00 GMT"); + headers.Set(HttpHeaderNames.LastModified, HttpDate.Format(DateTime.UtcNow)); + headers.Set(HttpHeaderNames.CacheControl, "no-store, no-cache, must-revalidate"); + headers.Add(HttpHeaderNames.Pragma, "no-cache"); + } + + /// + /// Prepares a standard response without a body for the specified status code. + /// + /// The interface on which this method is called. + /// The HTTP status code of the response. + /// is . + /// There is no standard status description for . + public static void SetEmptyResponse(this IHttpResponse @this, int statusCode) + { + if (!HttpStatusDescription.TryGet(statusCode, out var statusDescription)) + throw new ArgumentException("Status code has no standard description.", nameof(statusCode)); + + @this.StatusCode = statusCode; + @this.StatusDescription = statusDescription; + @this.ContentType = MimeType.Default; + @this.ContentEncoding = null; + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/HttpStatusDescription.cs b/Vendor/EmbedIO-3.5.2/HttpStatusDescription.cs new file mode 100644 index 0000000..a724005 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/HttpStatusDescription.cs @@ -0,0 +1,146 @@ +using System.Collections.Generic; +using System.Net; + +namespace EmbedIO +{ + /// + /// Provides standard HTTP status descriptions. + /// Data contained in this class comes from the following sources: + /// + /// RFC7231 Section 6 (HTTP/1.1 Semantics and Content) + /// RFC6585 (Additional HTTP Status Codes) + /// RFC2774 Section 7 (An HTTP Extension Framework) + /// RFC7540 Section 9.1.2 (HTTP/2) + /// RFC4918 Section 11 (WebDAV) + /// RFC5842 Section 7 (Binding Extensions to WebDAV) + /// RFC7538 Section 3 (HTTP Status Code 308) + /// RFC3229 Section 10.4.1 (Delta encoding in HTTP) + /// RFC8297 Section 2 (Early Hints) + /// RFC7725 Section 3 (HTTP-status-451) + /// RFC2295 Section 8.1 (Transparent Content Negotiation) + /// + /// + public static class HttpStatusDescription + { + private static readonly IReadOnlyDictionary Dictionary = new Dictionary { + { 100, "Continue" }, + { 101, "Switching Protocols" }, + { 102, "Processing" }, + { 103, "Early Hints" }, + { 200, "OK" }, + { 201, "Created" }, + { 202, "Accepted" }, + { 203, "Non-Authoritative Information" }, + { 204, "No Content" }, + { 205, "Reset Content" }, + { 206, "Partial Content" }, + { 207, "Multi-Status" }, + { 208, "Already Reported" }, + { 226, "IM Used" }, + { 300, "Multiple Choices" }, + { 301, "Moved Permanently" }, + { 302, "Found" }, + { 303, "See Other" }, + { 304, "Not Modified" }, + { 305, "Use Proxy" }, + { 307, "Temporary Redirect" }, + { 308, "Permanent Redirect" }, + { 400, "Bad Request" }, + { 401, "Unauthorized" }, + { 402, "Payment Required" }, + { 403, "Forbidden" }, + { 404, "Not Found" }, + { 405, "Method Not Allowed" }, + { 406, "Not Acceptable" }, + { 407, "Proxy Authentication Required" }, + { 408, "Request Timeout" }, + { 409, "Conflict" }, + { 410, "Gone" }, + { 411, "Length Required" }, + { 412, "Precondition Failed" }, + { 413, "Request Entity Too Large" }, + { 414, "Request-Uri Too Long" }, + { 415, "Unsupported Media Type" }, + { 416, "Requested Range Not Satisfiable" }, + { 417, "Expectation Failed" }, + { 421, "Misdirected Request" }, + { 422, "Unprocessable Entity" }, + { 423, "Locked" }, + { 424, "Failed Dependency" }, + { 426, "Upgrade Required" }, + { 428, "Precondition Required" }, + { 429, "Too Many Requests" }, + { 431, "Request Header Fields Too Large" }, + { 451, "Unavailable For Legal Reasons" }, + { 500, "Internal Server Error" }, + { 501, "Not Implemented" }, + { 502, "Bad Gateway" }, + { 503, "Service Unavailable" }, + { 504, "Gateway Timeout" }, + { 505, "Http Version Not Supported" }, + { 506, "Variant Also Negotiates" }, + { 507, "Insufficient Storage" }, + { 508, "Loop Detected" }, + { 510, "Not Extended" }, + { 511, "Network Authentication Required" }, + }; + + /// + /// Attempts to get the standard status description for a . + /// + /// The HTTP status code for which the standard description + /// is to be retrieved. + /// When this method returns, the standard HTTP status description + /// for the specified if it was found, or + /// if it was not found. This parameter is passed uninitialized. + /// if the specified was found + /// in the list of HTTP status codes for which the standard description is known; + /// otherwise, . + /// + /// + public static bool TryGet(HttpStatusCode code, out string description) => Dictionary.TryGetValue((int)code, out description); + + /// + /// Attempts to get the standard status description for a HTTP status code + /// specified as an . + /// + /// The HTTP status code for which the standard description + /// is to be retrieved. + /// When this method returns, the standard HTTP status description + /// for the specified if it was found, or + /// if it was not found. This parameter is passed uninitialized. + /// if the specified was found + /// in the list of HTTP status codes for which the standard description is known; + /// otherwise, . + /// + /// + public static bool TryGet(int code, out string description) => Dictionary.TryGetValue(code, out description); + + /// + /// Returns the standard status description for a . + /// + /// The HTTP status code for which the standard description + /// is to be retrieved. + /// The standard HTTP status description for the specified + /// if it was found, or if it was not found. + public static string Get(HttpStatusCode code) + { + Dictionary.TryGetValue((int)code, out var description); + return description; + } + + /// + /// Returns the standard status description for a HTTP status code + /// specified as an . + /// + /// The HTTP status code for which the standard description + /// is to be retrieved. + /// The standard HTTP status description for the specified + /// if it was found, or if it was not found. + public static string Get(int code) + { + Dictionary.TryGetValue(code, out var description); + return description; + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/HttpVerbs.cs b/Vendor/EmbedIO-3.5.2/HttpVerbs.cs new file mode 100644 index 0000000..765b01e --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/HttpVerbs.cs @@ -0,0 +1,48 @@ +namespace EmbedIO +{ + /// + /// Enumerates the different HTTP Verbs. + /// + public enum HttpVerbs + { + /// + /// Wildcard Method + /// + Any, + + /// + /// DELETE Method + /// + Delete, + + /// + /// GET Method + /// + Get, + + /// + /// HEAD method + /// + Head, + + /// + /// OPTIONS method + /// + Options, + + /// + /// PATCH method + /// + Patch, + + /// + /// POST method + /// + Post, + + /// + /// PUT method + /// + Put, + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/ICookieCollection.cs b/Vendor/EmbedIO-3.5.2/ICookieCollection.cs new file mode 100644 index 0000000..48f4f8f --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/ICookieCollection.cs @@ -0,0 +1,49 @@ +using System.Net; +using System.Collections; +using System.Collections.Generic; + +namespace EmbedIO +{ + /// + /// Interface for Cookie Collection. + /// + /// +#pragma warning disable CA1010 // Should implement ICollection - not possible when wrapping System.Net.CookieCollection. + public interface ICookieCollection : IEnumerable, ICollection +#pragma warning restore CA1010 + { + /// + /// Gets the with the specified name. + /// + /// + /// The . + /// + /// The name. + /// The cookie matching the specified name. + Cookie? this[string name] { get; } + + /// + /// Determines whether this contains the specified . + /// + /// The cookie to find in the . + /// + /// if this contains the specified ; + /// otherwise, . + /// + bool Contains(Cookie cookie); + + /// + /// Copies the elements of this to a array + /// starting at the specified index of the target array. + /// + /// The target array to which the will be copied. + /// The zero-based index in the target where copying begins. + void CopyTo(Cookie[] array, int index); + + /// + /// Adds the specified cookie. + /// + /// The cookie. + void Add(Cookie cookie); + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/IHttpContext.cs b/Vendor/EmbedIO-3.5.2/IHttpContext.cs new file mode 100644 index 0000000..bed7695 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/IHttpContext.cs @@ -0,0 +1,128 @@ +using System; +using System.Collections.Generic; +using System.Net; +using System.Security.Principal; +using System.Threading; +using System.Threading.Tasks; +using EmbedIO.Routing; +using EmbedIO.Sessions; + +namespace EmbedIO +{ + /// + /// Represents the context of a HTTP(s) request being handled by a web server. + /// + public interface IHttpContext : IMimeTypeProvider + { + /// + /// Gets a unique identifier for a HTTP context. + /// + string Id { get; } + + /// + /// Gets a used to stop processing of this context. + /// + CancellationToken CancellationToken { get; } + + /// + /// Gets the server IP address and port number to which the request is directed. + /// + IPEndPoint LocalEndPoint { get; } + + /// + /// Gets the client IP address and port number from which the request originated. + /// + IPEndPoint RemoteEndPoint { get; } + + /// + /// Gets the HTTP request. + /// + IHttpRequest Request { get; } + + /// + /// Gets the route matched by the requested URL path. + /// + RouteMatch Route { get; } + + /// + /// Gets the requested path, relative to the innermost module's base path. + /// + /// + /// This property derives from the path specified in the requested URL, stripped of the + /// BaseRoute of the handling module. + /// This property is in itself a valid URL path, including an initial + /// slash (/) character. + /// + string RequestedPath { get; } + + /// + /// Gets the HTTP response object. + /// + IHttpResponse Response { get; } + + /// + /// Gets the user. + /// + IPrincipal User { get; } + + /// + /// Gets the session proxy associated with this context. + /// + ISessionProxy Session { get; } + + /// + /// Gets a value indicating whether compressed request bodies are supported. + /// + /// + bool SupportCompressedRequests { get; } + + /// + /// Gets the dictionary of data to pass trough the EmbedIO pipeline. + /// + IDictionary Items { get; } + + /// + /// Gets the elapsed time, expressed in milliseconds, since the creation of this context. + /// + long Age { get; } + + /// + /// Gets a value indicating whether this + /// has been completely handled, so that no further processing is required. + /// When a HTTP context is created, this property is ; + /// as soon as it is set to , the context is not + /// passed to any further module's handler for processing. + /// Once it becomes , this property is guaranteed + /// to never become again. + /// + /// + /// When a module's IsFinalHandler property is + /// , this property is set to after the + /// returned by the module's HandleRequestAsync method + /// is completed. + /// + /// + /// + bool IsHandled { get; } + + /// + /// Marks this context as handled, so that it will not be + /// processed by any further module. + /// + /// + /// Calling this method from the + /// or of a module whose + /// property is + /// is redundant and has no effect. + /// + /// + /// + void SetHandled(); + + /// + /// Registers a callback to be called when processing is finished on a context. + /// + /// The callback. + void OnClose(Action callback); + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/IHttpContextHandler.cs b/Vendor/EmbedIO-3.5.2/IHttpContextHandler.cs new file mode 100644 index 0000000..ed0f311 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/IHttpContextHandler.cs @@ -0,0 +1,20 @@ +using System.Threading.Tasks; + +namespace EmbedIO +{ + /// + /// Represents an object that can handle a HTTP context. + /// This API supports the EmbedIO infrastructure and is not intended to be used directly from your code. + /// + public interface IHttpContextHandler + { + /// + /// Asynchronously handles a HTTP context, generating a suitable response + /// for an incoming request. + /// This API supports the EmbedIO infrastructure and is not intended to be used directly from your code. + /// + /// The HTTP context. + /// A representing the ongoing operation. + Task HandleContextAsync(IHttpContextImpl context); + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/IHttpContextImpl.cs b/Vendor/EmbedIO-3.5.2/IHttpContextImpl.cs new file mode 100644 index 0000000..de061bb --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/IHttpContextImpl.cs @@ -0,0 +1,88 @@ +using System; +using System.Collections.Generic; +using System.Security.Principal; +using System.Threading; +using System.Threading.Tasks; +using EmbedIO.Routing; +using EmbedIO.Sessions; +using EmbedIO.Utilities; +using EmbedIO.WebSockets; + +namespace EmbedIO +{ + /// + /// Represents a HTTP context implementation, i.e. a HTTP context as seen internally by EmbedIO. + /// This API mainly supports the EmbedIO infrastructure; it is not intended to be used directly from your code, + /// unless to address specific needs in the implementation of EmbedIO plug-ins (e.g. modules). + /// + /// + public interface IHttpContextImpl : IHttpContext + { + /// + /// Gets or sets a used to stop processing of this context. + /// This API supports the EmbedIO infrastructure and is not intended to be used directly from your code. + /// + new CancellationToken CancellationToken { get; set; } + + /// + /// Gets or sets the route matched by the requested URL path. + /// + new RouteMatch Route { get; set; } + + /// + /// Gets or sets the session proxy associated with this context. + /// This API supports the EmbedIO infrastructure and is not intended to be used directly from your code. + /// + /// + /// An interface. + /// + new ISessionProxy Session { get; set; } + + /// + /// Gets or sets the user. + /// This API supports the EmbedIO infrastructure and is not intended to be used directly from your code. + /// + new IPrincipal User { get; set; } + + /// + /// Gets or sets a value indicating whether compressed request bodies are supported. + /// This API supports the EmbedIO infrastructure and is not intended to be used directly from your code. + /// + /// + new bool SupportCompressedRequests { get; set; } + + /// + /// Gets the MIME type providers. + /// This API supports the EmbedIO infrastructure and is not intended to be used directly from your code. + /// + MimeTypeProviderStack MimeTypeProviders { get; } + + /// + /// Flushes and closes the response stream, then calls any registered close callbacks. + /// This API supports the EmbedIO infrastructure and is not intended to be used directly from your code. + /// + /// + void Close(); + + /// + /// Asynchronously handles a WebSockets opening handshake + /// and returns a newly-created interface. + /// This API supports the EmbedIO infrastructure and is not intended to be used directly from your code. + /// + /// The requested WebSocket sub-protocols. + /// The accepted WebSocket sub-protocol, + /// or the empty string is no sub-protocol has been agreed upon. + /// Size of the receive buffer. + /// The keep-alive interval. + /// A used to stop the server. + /// + /// An interface. + /// + Task AcceptWebSocketAsync( + IEnumerable requestedProtocols, + string acceptedProtocol, + int receiveBufferSize, + TimeSpan keepAliveInterval, + CancellationToken cancellationToken); + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/IHttpException.cs b/Vendor/EmbedIO-3.5.2/IHttpException.cs new file mode 100644 index 0000000..0349a16 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/IHttpException.cs @@ -0,0 +1,58 @@ +using System; + +namespace EmbedIO +{ + /// + /// Represents an exception that results in a particular + /// HTTP response to be sent to the client. + /// This interface is meant to be implemented + /// by classes derived from . + /// Either as message or a data object can be attached to + /// the exception; which one, if any, is sent to the client + /// will depend upon the handler used to send the response. + /// + /// + /// + public interface IHttpException + { + /// + /// Gets the response status code for a HTTP exception. + /// + int StatusCode { get; } + + /// + /// Gets the stack trace of a HTTP exception. + /// + string StackTrace { get; } + + /// + /// Gets a message that can be included in the response triggered + /// by a HTTP exception. + /// Whether the message is actually sent to the client will depend + /// upon the handler used to send the response. + /// + /// + /// Do not rely on to implement + /// this property if you want to support messages, + /// because a default message will be supplied by the CLR at throw time + /// when is . + /// + string? Message { get; } + + /// + /// Gets an object that can be serialized and included + /// in the response triggered by a HTTP exception. + /// Whether the object is actually sent to the client will depend + /// upon the handler used to send the response. + /// + object? DataObject { get; } + + /// + /// Sets necessary headers, as required by the nature + /// of the HTTP exception (e.g. Location for + /// ). + /// + /// The HTTP context of the response. + void PrepareResponse(IHttpContext context); + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/IHttpListener.cs b/Vendor/EmbedIO-3.5.2/IHttpListener.cs new file mode 100644 index 0000000..3ec376c --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/IHttpListener.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; + +namespace EmbedIO +{ + /// + /// Interface to create a HTTP Listener. + /// + public interface IHttpListener : IDisposable + { + /// + /// Gets or sets a value indicating whether the listener should ignore write exceptions. By default the flag is set on. + /// + /// + /// true if [ignore write exceptions]; otherwise, false. + /// + bool IgnoreWriteExceptions { get; set; } + + /// + /// Gets the prefixes. + /// + /// + /// The prefixes. + /// + List Prefixes { get; } + + /// + /// Gets a value indicating whether this instance is listening. + /// + /// + /// true if this instance is listening; otherwise, false. + /// + bool IsListening { get; } + + /// + /// Gets or sets the name. + /// + /// + /// The name. + /// + string Name { get; } + + /// + /// Starts this listener. + /// + void Start(); + + /// + /// Stops this listener. + /// +#pragma warning disable CA1716 // Rename method to avoid conflict with (VB) keyword - It is consistent with Microsoft's HttpListener + void Stop(); +#pragma warning restore CA1716 + + /// + /// Adds the prefix. + /// + /// The URL prefix. + void AddPrefix(string urlPrefix); + + /// + /// Gets the HTTP context asynchronous. + /// + /// The cancellation token. + /// + /// A task that represents the time delay for the HTTP Context. + /// + Task GetContextAsync(CancellationToken cancellationToken); + } +} diff --git a/Vendor/EmbedIO-3.5.2/IHttpMessage.cs b/Vendor/EmbedIO-3.5.2/IHttpMessage.cs new file mode 100644 index 0000000..61a5dde --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/IHttpMessage.cs @@ -0,0 +1,26 @@ +using System; + +namespace EmbedIO +{ + /// + /// Represents a HTTP request or response. + /// + public interface IHttpMessage + { + /// + /// Gets the cookies. + /// + /// + /// The cookies. + /// + ICookieCollection Cookies { get; } + + /// + /// Gets or sets the protocol version. + /// + /// + /// The protocol version. + /// + Version ProtocolVersion { get; } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/IHttpRequest.cs b/Vendor/EmbedIO-3.5.2/IHttpRequest.cs new file mode 100644 index 0000000..c4d6097 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/IHttpRequest.cs @@ -0,0 +1,115 @@ +using System; +using System.Collections.Specialized; +using System.IO; +using System.Net; +using System.Text; + +namespace EmbedIO +{ + /// + /// + /// Interface to create a HTTP Request. + /// + public interface IHttpRequest : IHttpMessage + { + /// + /// Gets the request headers. + /// + NameValueCollection Headers { get; } + + /// + /// Gets a value indicating whether [keep alive]. + /// + bool KeepAlive { get; } + + /// + /// Gets the raw URL. + /// + string RawUrl { get; } + + /// + /// Gets the query string. + /// + NameValueCollection QueryString { get; } + + /// + /// Gets the HTTP method. + /// + string HttpMethod { get; } + + /// + /// Gets a constant representing the HTTP method of the request. + /// + HttpVerbs HttpVerb { get; } + + /// + /// Gets the URL. + /// + Uri Url { get; } + + /// + /// Gets a value indicating whether this instance has entity body. + /// + bool HasEntityBody { get; } + + /// + /// Gets the input stream. + /// + Stream InputStream { get; } + + /// + /// Gets the content encoding. + /// + Encoding ContentEncoding { get; } + + /// + /// Gets the remote end point. + /// + IPEndPoint RemoteEndPoint { get; } + + /// + /// Gets a value indicating whether this instance is local. + /// + bool IsLocal { get; } + + /// + /// Gets a value indicating whether this request has been received over a SSL connection. + /// + bool IsSecureConnection { get; } + + /// + /// Gets the user agent. + /// + string UserAgent { get; } + + /// + /// Gets a value indicating whether this instance is web socket request. + /// + bool IsWebSocketRequest { get; } + + /// + /// Gets the local end point. + /// + IPEndPoint LocalEndPoint { get; } + + /// + /// Gets the type of the content. + /// + string? ContentType { get; } + + /// + /// Gets the content length. + /// + long ContentLength64 { get; } + + /// + /// Gets a value indicating whether this instance is authenticated. + /// + bool IsAuthenticated { get; } + + /// + /// Gets the URL referrer. + /// + Uri? UrlReferrer { get; } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/IHttpResponse.cs b/Vendor/EmbedIO-3.5.2/IHttpResponse.cs new file mode 100644 index 0000000..48d8b21 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/IHttpResponse.cs @@ -0,0 +1,69 @@ +using System.IO; +using System.Net; +using System.Text; + +namespace EmbedIO +{ + /// + /// + /// Interface to create a HTTP Response. + /// + public interface IHttpResponse : IHttpMessage + { + /// + /// Gets the response headers. + /// + WebHeaderCollection Headers { get; } + + /// + /// Gets or sets the status code. + /// + int StatusCode { get; set; } + + /// + /// Gets or sets the content length. + /// + long ContentLength64 { get; set; } + + /// + /// Gets or sets the type of the content. + /// + string ContentType { get; set; } + + /// + /// Gets the output stream. + /// + Stream OutputStream { get; } + + /// + /// Gets or sets the content encoding. + /// + Encoding? ContentEncoding { get; set; } + + /// + /// Gets or sets a value indicating whether [keep alive]. + /// + bool KeepAlive { get; set; } + + /// + /// Gets or sets a value indicating whether the response uses chunked transfer encoding. + /// + bool SendChunked { get; set; } + + /// + /// Gets or sets a text description of the HTTP status code. + /// + string StatusDescription { get; set; } + + /// + /// Sets the cookie. + /// + /// The session cookie. + void SetCookie(Cookie cookie); + + /// + /// Closes this instance and dispose the resources. + /// + void Close(); + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/IMimeTypeCustomizer.cs b/Vendor/EmbedIO-3.5.2/IMimeTypeCustomizer.cs new file mode 100644 index 0000000..ff9c70c --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/IMimeTypeCustomizer.cs @@ -0,0 +1,45 @@ +using System; + +namespace EmbedIO +{ + /// + /// Represents an object that can set information about specific MIME types and media ranges, + /// to be later retrieved via an interface. + /// + /// + public interface IMimeTypeCustomizer : IMimeTypeProvider + { + /// + /// Adds a custom association between a file extension and a MIME type. + /// + /// The file extension to associate to . + /// The MIME type to associate to . + /// The object implementing + /// has its configuration locked. + /// + /// is . + /// - or - + /// is . + /// + /// + /// is the empty string. + /// - or - + /// is not a valid MIME type. + /// + void AddCustomMimeType(string extension, string mimeType); + + /// + /// Indicates whether to prefer compression when negotiating content encoding + /// for a response with the specified content type, or whose content type is in + /// the specified media range. + /// + /// The MIME type or media range. + /// to prefer compression; + /// otherwise, . + /// The object implementing + /// has its configuration locked. + /// is . + /// is not a valid MIME type or media range. + void PreferCompression(string mimeType, bool preferCompression); + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/IMimeTypeProvider.cs b/Vendor/EmbedIO-3.5.2/IMimeTypeProvider.cs new file mode 100644 index 0000000..6d9458d --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/IMimeTypeProvider.cs @@ -0,0 +1,31 @@ +using System; + +namespace EmbedIO +{ + /// + /// Represents an object that contains information on specific MIME types and media ranges. + /// + public interface IMimeTypeProvider + { + /// + /// Gets the MIME type associated to a file extension. + /// + /// The file extension for which a corresponding MIME type is wanted. + /// The MIME type corresponding to , if one is found; + /// otherwise, . + /// is . + string GetMimeType(string extension); + + /// + /// Attempts to determine whether compression should be preferred + /// when negotiating content encoding for a response with the specified content type. + /// + /// The MIME type to check. + /// When this method returns , + /// a value indicating whether compression should be preferred. + /// This parameter is passed uninitialized. + /// if a value is found for ; + /// otherwise, . + bool TryDetermineCompression(string mimeType, out bool preferCompression); + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/IWebModule.cs b/Vendor/EmbedIO-3.5.2/IWebModule.cs new file mode 100644 index 0000000..594f101 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/IWebModule.cs @@ -0,0 +1,81 @@ +using System.Threading; +using System.Threading.Tasks; +using EmbedIO.Routing; + +namespace EmbedIO +{ + /// + /// Represents a module. + /// + public interface IWebModule + { + /// + /// Gets the base route of a module. + /// + /// + /// The base route. + /// + /// + /// A base route is either "/" (the root path), + /// or a prefix starting and ending with a '/' character. + /// + string BaseRoute { get; } + + /// + /// Gets a value indicating whether processing of a request should stop + /// after a module has handled it. + /// + /// + /// If this property is , a HTTP context's + /// method will be automatically called + /// immediately after after the returned by + /// is completed. This will prevent + /// the context from being passed further along to other modules. + /// + /// + /// + bool IsFinalHandler { get; } + + /// + /// Gets or sets a callback that is called every time an unhandled exception + /// occurs during the processing of a request. + /// If this property is (the default), + /// the exception will be handled by the web server, or by the containing + /// . + /// + /// + ExceptionHandlerCallback? OnUnhandledException { get; set; } + + /// + /// Gets or sets a callback that is called every time a HTTP exception + /// is thrown during the processing of a request. + /// If this property is (the default), + /// the exception will be handled by the web server, or by the containing + /// . + /// + /// + HttpExceptionHandlerCallback? OnHttpException { get; set; } + + /// + /// Signals a module that the web server is starting. + /// + /// A used to stop the web server. + void Start(CancellationToken cancellationToken); + + /// + /// Matches the specified URL path against a module's , + /// extracting values for the route's parameters and a sub-path. + /// + /// The URL path to match. + /// If the match is successful, a object; + /// otherwise, . + RouteMatch MatchUrlPath(string urlPath); + + /// + /// Handles a request from a client. + /// + /// The context of the request being handled. + /// A representing the ongoing operation. + Task HandleRequestAsync(IHttpContext context); + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/IWebModuleContainer.cs b/Vendor/EmbedIO-3.5.2/IWebModuleContainer.cs new file mode 100644 index 0000000..9e84235 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/IWebModuleContainer.cs @@ -0,0 +1,19 @@ +using System; +using EmbedIO.Utilities; + +namespace EmbedIO +{ + /// + /// Represents an object that contains a collection of interfaces. + /// + public interface IWebModuleContainer : IDisposable + { + /// + /// Gets the modules. + /// + /// + /// The modules. + /// + IComponentCollection Modules { get; } + } +} diff --git a/Vendor/EmbedIO-3.5.2/IWebServer.cs b/Vendor/EmbedIO-3.5.2/IWebServer.cs new file mode 100644 index 0000000..6bf0288 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/IWebServer.cs @@ -0,0 +1,68 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using EmbedIO.Sessions; + +namespace EmbedIO +{ + /// + /// Represents a web server. + /// The basic usage of a web server is as follows: + /// + /// add modules to the Modules collection; + /// set a if needed; + /// call to respond to incoming requests. + /// + /// + public interface IWebServer : IWebModuleContainer, IMimeTypeCustomizer + { + /// + /// Occurs when the property changes. + /// + event WebServerStateChangedEventHandler StateChanged; + + /// + /// Gets or sets a callback that is called every time an unhandled exception + /// occurs during the processing of a request. + /// This property can never be . + /// If it is still + /// + /// + ExceptionHandlerCallback OnUnhandledException { get; set; } + + /// + /// Gets or sets a callback that is called every time a HTTP exception + /// is thrown during the processing of a request. + /// This property can never be . + /// + /// + HttpExceptionHandlerCallback OnHttpException { get; set; } + + /// + /// Gets or sets the registered session ID manager, if any. + /// A session ID manager is an implementation of . + /// Note that this property can only be set before starting the web server. + /// + /// + /// The session manager, or if no session manager is present. + /// + /// This property is being set and the web server has already been started. + ISessionManager? SessionManager { get; set; } + + /// + /// Gets the state of the web server. + /// + /// The state. + /// + WebServerState State { get; } + + /// + /// Starts the listener and the registered modules. + /// + /// The cancellation token; when cancelled, the server cancels all pending requests and stops. + /// + /// Returns the task that the HTTP listener is running inside of, so that it can be waited upon after it's been canceled. + /// + Task RunAsync(CancellationToken cancellationToken = default); + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Internal/BufferingResponseStream.cs b/Vendor/EmbedIO-3.5.2/Internal/BufferingResponseStream.cs new file mode 100644 index 0000000..3323c6a --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Internal/BufferingResponseStream.cs @@ -0,0 +1,87 @@ +using System; +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +namespace EmbedIO.Internal +{ + // Wraps a response's output stream, buffering all data + // in a MemoryStream. + // When disposed, sets the response's ContentLength and copies all data + // to the output stream. + internal class BufferingResponseStream : Stream + { + private readonly IHttpResponse _response; + private readonly MemoryStream _buffer; + + public BufferingResponseStream(IHttpResponse response) + { + _response = response; + _buffer = new MemoryStream(); + } + + public override bool CanRead => false; + + public override bool CanSeek => false; + + public override bool CanWrite => true; + + public override long Length => _buffer.Length; + + public override long Position + { + get => _buffer.Position; + set => throw SeekingNotSupported(); + } + + public override void Flush() => _buffer.Flush(); + + public override Task FlushAsync(CancellationToken cancellationToken) => _buffer.FlushAsync(cancellationToken); + + public override int Read(byte[] buffer, int offset, int count) => throw ReadingNotSupported(); + + public override int ReadByte() => throw ReadingNotSupported(); + + public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, object state) + => throw ReadingNotSupported(); + + public override int EndRead(IAsyncResult asyncResult) => throw ReadingNotSupported(); + + public override Task ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) => throw ReadingNotSupported(); + + public override Task CopyToAsync(Stream destination, int bufferSize, CancellationToken cancellationToken) + => throw ReadingNotSupported(); + + public override long Seek(long offset, SeekOrigin origin) => throw SeekingNotSupported(); + + public override void SetLength(long value) => throw SeekingNotSupported(); + + public override void Write(byte[] buffer, int offset, int count) => _buffer.Write(buffer, offset, count); + + public override void WriteByte(byte value) => _buffer.WriteByte(value); + + public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback callback, object state) + => _buffer.BeginWrite(buffer, offset, count, callback, state); + + public override void EndWrite(IAsyncResult asyncResult) => _buffer.EndWrite(asyncResult); + + public override Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) + => _buffer.WriteAsync(buffer, offset, count, cancellationToken); + + protected override void Dispose(bool disposing) + { + _response.ContentLength64 = _buffer.Length; + _buffer.Position = 0; + _buffer.CopyTo(_response.OutputStream); + + if (disposing) + { + _buffer.Dispose(); + } + } + + private static Exception ReadingNotSupported() => new NotSupportedException("This stream does not support reading."); + + private static Exception SeekingNotSupported() => new NotSupportedException("This stream does not support seeking."); + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Internal/CompressionStream.cs b/Vendor/EmbedIO-3.5.2/Internal/CompressionStream.cs new file mode 100644 index 0000000..b777566 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Internal/CompressionStream.cs @@ -0,0 +1,121 @@ +using System; +using System.IO; +using System.IO.Compression; +using System.Threading; +using System.Threading.Tasks; + +namespace EmbedIO.Internal +{ + internal class CompressionStream : Stream + { + private readonly Stream _target; + private readonly bool _leaveOpen; + + public CompressionStream(Stream target, CompressionMethod compressionMethod) + { + switch (compressionMethod) + { + case CompressionMethod.Deflate: + _target = new DeflateStream(target, CompressionMode.Compress, true); + _leaveOpen = false; + break; + case CompressionMethod.Gzip: + _target = new GZipStream(target, CompressionMode.Compress, true); + _leaveOpen = false; + break; + default: + _target = target; + _leaveOpen = true; + break; + } + + UncompressedLength = 0; + } + + public long UncompressedLength { get; private set; } + + public override bool CanRead => false; + + public override bool CanSeek => false; + + public override bool CanWrite => true; + + public override long Length => throw SeekingNotSupported(); + + public override long Position + { + get => throw SeekingNotSupported(); + set => throw SeekingNotSupported(); + } + + public override void Flush() => _target.Flush(); + + public override Task FlushAsync(CancellationToken cancellationToken) => _target.FlushAsync(cancellationToken); + + public override int Read(byte[] buffer, int offset, int count) => throw ReadingNotSupported(); + + public override int ReadByte() => throw ReadingNotSupported(); + + public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, object state) + => throw ReadingNotSupported(); + + public override int EndRead(IAsyncResult asyncResult) => throw ReadingNotSupported(); + + public override Task ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) => throw ReadingNotSupported(); + + public override Task CopyToAsync(Stream destination, int bufferSize, CancellationToken cancellationToken) + => throw ReadingNotSupported(); + + public override long Seek(long offset, SeekOrigin origin) => throw SeekingNotSupported(); + + public override void SetLength(long value) => throw SeekingNotSupported(); + + public override void Write(byte[] buffer, int offset, int count) + { + _target.Write(buffer, offset, count); + UncompressedLength += count; + } + + public override void WriteByte(byte value) + { + _target.WriteByte(value); + UncompressedLength++; + } + + public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback callback, object state) + => _target.BeginWrite( + buffer, + offset, + count, + ar => { + UncompressedLength += count; + callback(ar); + }, + state); + + public override void EndWrite(IAsyncResult asyncResult) + { + _target.EndWrite(asyncResult); + } + + public override async Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) + { + await _target.WriteAsync(buffer, offset, count, cancellationToken).ConfigureAwait(false); + UncompressedLength += count; + } + + protected override void Dispose(bool disposing) + { + if (disposing && !_leaveOpen) + { + _target.Dispose(); + } + + base.Dispose(disposing); + } + + private static Exception ReadingNotSupported() => new NotSupportedException("This stream does not support reading."); + + private static Exception SeekingNotSupported() => new NotSupportedException("This stream does not support seeking."); + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Internal/CompressionUtility.cs b/Vendor/EmbedIO-3.5.2/Internal/CompressionUtility.cs new file mode 100644 index 0000000..58fe4ab --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Internal/CompressionUtility.cs @@ -0,0 +1,82 @@ +using System.IO; +using System.IO.Compression; + +namespace EmbedIO.Internal +{ + internal static class CompressionUtility + { + public static byte[]? ConvertCompression(byte[] source, CompressionMethod sourceMethod, CompressionMethod targetMethod) + { + if (source == null) + return null; + + if (sourceMethod == targetMethod) + return source; + + switch (sourceMethod) + { + case CompressionMethod.Deflate: + using (var sourceStream = new MemoryStream(source, false)) + { + using var decompressionStream = new DeflateStream(sourceStream, CompressionMode.Decompress, true); + using var targetStream = new MemoryStream(); + if (targetMethod == CompressionMethod.Gzip) + { + using var compressionStream = new GZipStream(targetStream, CompressionMode.Compress, true); + decompressionStream.CopyTo(compressionStream); + } + else + { + decompressionStream.CopyTo(targetStream); + } + + return targetStream.ToArray(); + } + + case CompressionMethod.Gzip: + using (var sourceStream = new MemoryStream(source, false)) + { + using var decompressionStream = new GZipStream(sourceStream, CompressionMode.Decompress, true); + using var targetStream = new MemoryStream(); + if (targetMethod == CompressionMethod.Deflate) + { + using var compressionStream = new DeflateStream(targetStream, CompressionMode.Compress, true); + decompressionStream.CopyToAsync(compressionStream); + } + else + { + decompressionStream.CopyTo(targetStream); + } + + return targetStream.ToArray(); + } + + default: + using (var sourceStream = new MemoryStream(source, false)) + { + using var targetStream = new MemoryStream(); + switch (targetMethod) + { + case CompressionMethod.Deflate: + using (var compressionStream = new DeflateStream(targetStream, CompressionMode.Compress, true)) + sourceStream.CopyTo(compressionStream); + + break; + + case CompressionMethod.Gzip: + using (var compressionStream = new GZipStream(targetStream, CompressionMode.Compress, true)) + sourceStream.CopyTo(compressionStream); + + break; + + default: + // Just in case. Consider all other values as None. + return source; + } + + return targetStream.ToArray(); + } + } + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Internal/DummyWebModuleContainer.cs b/Vendor/EmbedIO-3.5.2/Internal/DummyWebModuleContainer.cs new file mode 100644 index 0000000..1ee1079 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Internal/DummyWebModuleContainer.cs @@ -0,0 +1,27 @@ +using System.Collections.Concurrent; +using System.Runtime.CompilerServices; +using EmbedIO.Utilities; +using Swan; + +namespace EmbedIO.Internal +{ + internal sealed class DummyWebModuleContainer : IWebModuleContainer + { + public static readonly IWebModuleContainer Instance = new DummyWebModuleContainer(); + + private DummyWebModuleContainer() + { + } + + public IComponentCollection Modules => throw UnexpectedCall(); + + public ConcurrentDictionary SharedItems => throw UnexpectedCall(); + + public void Dispose() + { + } + + private InternalErrorException UnexpectedCall([CallerMemberName] string member = "") + => SelfCheck.Failure($"Unexpected call to {nameof(DummyWebModuleContainer)}.{member}."); + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Internal/LockableNameValueCollection.cs b/Vendor/EmbedIO-3.5.2/Internal/LockableNameValueCollection.cs new file mode 100644 index 0000000..75853f7 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Internal/LockableNameValueCollection.cs @@ -0,0 +1,9 @@ +using System.Collections.Specialized; + +namespace EmbedIO.Internal +{ + internal sealed class LockableNameValueCollection : NameValueCollection + { + public void MakeReadOnly() => IsReadOnly = true; + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Internal/MimeTypeCustomizer.cs b/Vendor/EmbedIO-3.5.2/Internal/MimeTypeCustomizer.cs new file mode 100644 index 0000000..1d39224 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Internal/MimeTypeCustomizer.cs @@ -0,0 +1,63 @@ +using System.Collections.Generic; +using EmbedIO.Utilities; +using Swan.Configuration; + +namespace EmbedIO.Internal +{ + internal sealed class MimeTypeCustomizer : ConfiguredObject, IMimeTypeCustomizer + { + private readonly Dictionary _customMimeTypes = new Dictionary(); + private readonly Dictionary<(string, string), bool> _data = new Dictionary<(string, string), bool>(); + + private bool? _defaultPreferCompression; + + public string GetMimeType(string extension) + { + _customMimeTypes.TryGetValue(Validate.NotNull(nameof(extension), extension), out var result); + return result; + } + + public bool TryDetermineCompression(string mimeType, out bool preferCompression) + { + var (type, subtype) = MimeType.UnsafeSplit( + Validate.MimeType(nameof(mimeType), mimeType, false)); + + if (_data.TryGetValue((type, subtype), out preferCompression)) + return true; + + if (_data.TryGetValue((type, "*"), out preferCompression)) + return true; + + if (!_defaultPreferCompression.HasValue) + return false; + + preferCompression = _defaultPreferCompression.Value; + return true; + } + + public void AddCustomMimeType(string extension, string mimeType) + { + EnsureConfigurationNotLocked(); + _customMimeTypes[Validate.NotNullOrEmpty(nameof(extension), extension)] + = Validate.MimeType(nameof(mimeType), mimeType, false); + } + + public void PreferCompression(string mimeType, bool preferCompression) + { + EnsureConfigurationNotLocked(); + var (type, subtype) = MimeType.UnsafeSplit( + Validate.MimeType(nameof(mimeType), mimeType, true)); + + if (type == "*") + { + _defaultPreferCompression = preferCompression; + } + else + { + _data[(type, subtype)] = preferCompression; + } + } + + public void Lock() => LockConfiguration(); + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Internal/RequestHandlerPassThroughException.cs b/Vendor/EmbedIO-3.5.2/Internal/RequestHandlerPassThroughException.cs new file mode 100644 index 0000000..c7be352 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Internal/RequestHandlerPassThroughException.cs @@ -0,0 +1,15 @@ +using System; + +namespace EmbedIO.Internal +{ +// This exception is only created and handled internally, +// so it doesn't need all the standard the bells and whistles. +#pragma warning disable CA1032 // Add standard exception constructors +#pragma warning disable CA1064 // Exceptions should be public + + internal class RequestHandlerPassThroughException : Exception + { + } +#pragma warning restore CA1032 +#pragma warning restore CA1064 +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Internal/TimeKeeper.cs b/Vendor/EmbedIO-3.5.2/Internal/TimeKeeper.cs new file mode 100644 index 0000000..03e9051 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Internal/TimeKeeper.cs @@ -0,0 +1,27 @@ +using System.Diagnostics; + +namespace EmbedIO.Internal +{ + /// + /// Represents a wrapper around Stopwatch. + /// + public sealed class TimeKeeper + { + private static readonly Stopwatch Stopwatch = Stopwatch.StartNew(); + + private readonly long _start; + + /// + /// Initializes a new instance of the class. + /// + public TimeKeeper() + { + _start = Stopwatch.ElapsedMilliseconds; + } + + /// + /// Gets the elapsed time since the class was initialized. + /// + public long ElapsedTime => Stopwatch.ElapsedMilliseconds - _start; + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Internal/UriUtility.cs b/Vendor/EmbedIO-3.5.2/Internal/UriUtility.cs new file mode 100644 index 0000000..585ba42 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Internal/UriUtility.cs @@ -0,0 +1,47 @@ +using System; + +namespace EmbedIO.Internal +{ + internal static class UriUtility + { + public static Uri StringToUri(string str) + { + _ = Uri.TryCreate(str, CanBeAbsoluteUrl(str) ? UriKind.Absolute : UriKind.Relative, out var result); + return result; + } + + public static Uri? StringToAbsoluteUri(string str) + { + if (!CanBeAbsoluteUrl(str)) + { + return null; + } + + _ = Uri.TryCreate(str, UriKind.Absolute, out var result); + return result; + } + + // Returns true if string starts with "http:", "https:", "ws:", or "wss:" + private static bool CanBeAbsoluteUrl(string str) + => !string.IsNullOrEmpty(str) + && str[0] switch { + 'h' => str.Length >= 5 + && str[1] == 't' + && str[2] == 't' + && str[3] == 'p' + && str[4] switch { + ':' => true, + 's' => str.Length >= 6 && str[5] == ':', + _ => false + }, + 'w' => str.Length >= 3 + && str[1] == 's' + && str[2] switch { + ':' => true, + 's' => str.Length >= 4 && str[3] == ':', + _ => false + }, + _ => false + }; + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Internal/WebModuleCollection.cs b/Vendor/EmbedIO-3.5.2/Internal/WebModuleCollection.cs new file mode 100644 index 0000000..093fed3 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Internal/WebModuleCollection.cs @@ -0,0 +1,46 @@ +using System.Threading; +using System.Threading.Tasks; +using EmbedIO.Utilities; +using Swan.Logging; + +namespace EmbedIO.Internal +{ + internal sealed class WebModuleCollection : DisposableComponentCollection + { + private readonly string _logSource; + + internal WebModuleCollection(string logSource) + { + _logSource = logSource; + } + + internal void StartAll(CancellationToken cancellationToken) + { + foreach (var (name, module) in WithSafeNames) + { + $"Starting module {name}...".Debug(_logSource); + module.Start(cancellationToken); + } + } + + internal async Task DispatchRequestAsync(IHttpContext context) + { + if (context.IsHandled) + return; + + var requestedPath = context.RequestedPath; + foreach (var (name, module) in WithSafeNames) + { + var routeMatch = module.MatchUrlPath(requestedPath); + if (routeMatch == null) + continue; + + $"[{context.Id}] Processing with {name}.".Debug(_logSource); + context.GetImplementation().Route = routeMatch; + await module.HandleRequestAsync(context).ConfigureAwait(false); + if (context.IsHandled) + break; + } + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/MimeType.Associations.cs b/Vendor/EmbedIO-3.5.2/MimeType.Associations.cs new file mode 100644 index 0000000..b78133f --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/MimeType.Associations.cs @@ -0,0 +1,648 @@ +using System; +using System.Collections.Generic; + +namespace EmbedIO +{ + partial class MimeType + { + // ------------------------------------------------------------------------------------------------- + // + // IMPORTANT NOTE TO CONTRIBUTORS + // ============================== + // + // When you update the MIME type list, remember to: + // + // * update the date in XML docs below; + // + // * check the LICENSE file to see if copyright year and/or license conditions have changed; + // + // * if the URL for the LICENSE file has changed, update EmbedIO's LICENSE file too. + // + // ------------------------------------------------------------------------------------------------- + + /// + /// Associates file extensions to MIME types. + /// + /// + /// The list of MIME types has been copied from + /// Samuel Neff's MIME Type Map + /// on April 26th, 2019. + /// Copyright (c) 2014 Samuel Neff. Redistributed under MIT license. + /// + public static IReadOnlyDictionary Associations { get; } = new Dictionary(StringComparer.OrdinalIgnoreCase) + { + {".323", "text/h323"}, + {".3g2", "video/3gpp2"}, + {".3gp", "video/3gpp"}, + {".3gp2", "video/3gpp2"}, + {".3gpp", "video/3gpp"}, + {".7z", "application/x-7z-compressed"}, + {".aa", "audio/audible"}, + {".AAC", "audio/aac"}, + {".aaf", "application/octet-stream"}, + {".aax", "audio/vnd.audible.aax"}, + {".ac3", "audio/ac3"}, + {".aca", "application/octet-stream"}, + {".accda", "application/msaccess.addin"}, + {".accdb", "application/msaccess"}, + {".accdc", "application/msaccess.cab"}, + {".accde", "application/msaccess"}, + {".accdr", "application/msaccess.runtime"}, + {".accdt", "application/msaccess"}, + {".accdw", "application/msaccess.webapplication"}, + {".accft", "application/msaccess.ftemplate"}, + {".acx", "application/internet-property-stream"}, + {".AddIn", "text/xml"}, + {".ade", "application/msaccess"}, + {".adobebridge", "application/x-bridge-url"}, + {".adp", "application/msaccess"}, + {".ADT", "audio/vnd.dlna.adts"}, + {".ADTS", "audio/aac"}, + {".afm", "application/octet-stream"}, + {".ai", "application/postscript"}, + {".aif", "audio/aiff"}, + {".aifc", "audio/aiff"}, + {".aiff", "audio/aiff"}, + {".air", "application/vnd.adobe.air-application-installer-package+zip"}, + {".amc", "application/mpeg"}, + {".anx", "application/annodex"}, + {".apk", "application/vnd.android.package-archive" }, + {".application", "application/x-ms-application"}, + {".art", "image/x-jg"}, + {".asa", "application/xml"}, + {".asax", "application/xml"}, + {".ascx", "application/xml"}, + {".asd", "application/octet-stream"}, + {".asf", "video/x-ms-asf"}, + {".ashx", "application/xml"}, + {".asi", "application/octet-stream"}, + {".asm", "text/plain"}, + {".asmx", "application/xml"}, + {".aspx", "application/xml"}, + {".asr", "video/x-ms-asf"}, + {".asx", "video/x-ms-asf"}, + {".atom", "application/atom+xml"}, + {".au", "audio/basic"}, + {".avi", "video/x-msvideo"}, + {".axa", "audio/annodex"}, + {".axs", "application/olescript"}, + {".axv", "video/annodex"}, + {".bas", "text/plain"}, + {".bcpio", "application/x-bcpio"}, + {".bin", "application/octet-stream"}, + {".bmp", "image/bmp"}, + {".c", "text/plain"}, + {".cab", "application/octet-stream"}, + {".caf", "audio/x-caf"}, + {".calx", "application/vnd.ms-office.calx"}, + {".cat", "application/vnd.ms-pki.seccat"}, + {".cc", "text/plain"}, + {".cd", "text/plain"}, + {".cdda", "audio/aiff"}, + {".cdf", "application/x-cdf"}, + {".cer", "application/x-x509-ca-cert"}, + {".cfg", "text/plain"}, + {".chm", "application/octet-stream"}, + {".class", "application/x-java-applet"}, + {".clp", "application/x-msclip"}, + {".cmd", "text/plain"}, + {".cmx", "image/x-cmx"}, + {".cnf", "text/plain"}, + {".cod", "image/cis-cod"}, + {".config", "application/xml"}, + {".contact", "text/x-ms-contact"}, + {".coverage", "application/xml"}, + {".cpio", "application/x-cpio"}, + {".cpp", "text/plain"}, + {".crd", "application/x-mscardfile"}, + {".crl", "application/pkix-crl"}, + {".crt", "application/x-x509-ca-cert"}, + {".cs", "text/plain"}, + {".csdproj", "text/plain"}, + {".csh", "application/x-csh"}, + {".csproj", "text/plain"}, + {".css", "text/css"}, + {".csv", "text/csv"}, + {".cur", "application/octet-stream"}, + {".cxx", "text/plain"}, + {".dat", "application/octet-stream"}, + {".datasource", "application/xml"}, + {".dbproj", "text/plain"}, + {".dcr", "application/x-director"}, + {".def", "text/plain"}, + {".deploy", "application/octet-stream"}, + {".der", "application/x-x509-ca-cert"}, + {".dgml", "application/xml"}, + {".dib", "image/bmp"}, + {".dif", "video/x-dv"}, + {".dir", "application/x-director"}, + {".disco", "text/xml"}, + {".divx", "video/divx"}, + {".dll", "application/x-msdownload"}, + {".dll.config", "text/xml"}, + {".dlm", "text/dlm"}, + {".doc", "application/msword"}, + {".docm", "application/vnd.ms-word.document.macroEnabled.12"}, + {".docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"}, + {".dot", "application/msword"}, + {".dotm", "application/vnd.ms-word.template.macroEnabled.12"}, + {".dotx", "application/vnd.openxmlformats-officedocument.wordprocessingml.template"}, + {".dsp", "application/octet-stream"}, + {".dsw", "text/plain"}, + {".dtd", "text/xml"}, + {".dtsConfig", "text/xml"}, + {".dv", "video/x-dv"}, + {".dvi", "application/x-dvi"}, + {".dwf", "drawing/x-dwf"}, + {".dwg", "application/acad"}, + {".dwp", "application/octet-stream"}, + {".dxf", "application/x-dxf" }, + {".dxr", "application/x-director"}, + {".eml", "message/rfc822"}, + {".emz", "application/octet-stream"}, + {".eot", "application/vnd.ms-fontobject"}, + {".eps", "application/postscript"}, + {".es", "application/ecmascript"}, + {".etl", "application/etl"}, + {".etx", "text/x-setext"}, + {".evy", "application/envoy"}, + {".exe", "application/octet-stream"}, + {".exe.config", "text/xml"}, + {".fdf", "application/vnd.fdf"}, + {".fif", "application/fractals"}, + {".filters", "application/xml"}, + {".fla", "application/octet-stream"}, + {".flac", "audio/flac"}, + {".flr", "x-world/x-vrml"}, + {".flv", "video/x-flv"}, + {".fsscript", "application/fsharp-script"}, + {".fsx", "application/fsharp-script"}, + {".generictest", "application/xml"}, + {".gif", "image/gif"}, + {".gpx", "application/gpx+xml"}, + {".group", "text/x-ms-group"}, + {".gsm", "audio/x-gsm"}, + {".gtar", "application/x-gtar"}, + {".gz", "application/x-gzip"}, + {".h", "text/plain"}, + {".hdf", "application/x-hdf"}, + {".hdml", "text/x-hdml"}, + {".hhc", "application/x-oleobject"}, + {".hhk", "application/octet-stream"}, + {".hhp", "application/octet-stream"}, + {".hlp", "application/winhlp"}, + {".hpp", "text/plain"}, + {".hqx", "application/mac-binhex40"}, + {".hta", "application/hta"}, + {".htc", "text/x-component"}, + {".htm", "text/html"}, + {".html", "text/html"}, + {".htt", "text/webviewhtml"}, + {".hxa", "application/xml"}, + {".hxc", "application/xml"}, + {".hxd", "application/octet-stream"}, + {".hxe", "application/xml"}, + {".hxf", "application/xml"}, + {".hxh", "application/octet-stream"}, + {".hxi", "application/octet-stream"}, + {".hxk", "application/xml"}, + {".hxq", "application/octet-stream"}, + {".hxr", "application/octet-stream"}, + {".hxs", "application/octet-stream"}, + {".hxt", "text/html"}, + {".hxv", "application/xml"}, + {".hxw", "application/octet-stream"}, + {".hxx", "text/plain"}, + {".i", "text/plain"}, + {".ico", "image/x-icon"}, + {".ics", "application/octet-stream"}, + {".idl", "text/plain"}, + {".ief", "image/ief"}, + {".iii", "application/x-iphone"}, + {".inc", "text/plain"}, + {".inf", "application/octet-stream"}, + {".ini", "text/plain"}, + {".inl", "text/plain"}, + {".ins", "application/x-internet-signup"}, + {".ipa", "application/x-itunes-ipa"}, + {".ipg", "application/x-itunes-ipg"}, + {".ipproj", "text/plain"}, + {".ipsw", "application/x-itunes-ipsw"}, + {".iqy", "text/x-ms-iqy"}, + {".isp", "application/x-internet-signup"}, + {".ite", "application/x-itunes-ite"}, + {".itlp", "application/x-itunes-itlp"}, + {".itms", "application/x-itunes-itms"}, + {".itpc", "application/x-itunes-itpc"}, + {".IVF", "video/x-ivf"}, + {".jar", "application/java-archive"}, + {".java", "application/octet-stream"}, + {".jck", "application/liquidmotion"}, + {".jcz", "application/liquidmotion"}, + {".jfif", "image/pjpeg"}, + {".jnlp", "application/x-java-jnlp-file"}, + {".jpb", "application/octet-stream"}, + {".jpe", "image/jpeg"}, + {".jpeg", "image/jpeg"}, + {".jpg", "image/jpeg"}, + {".js", "application/javascript"}, + {".json", "application/json"}, + {".jsx", "text/jscript"}, + {".jsxbin", "text/plain"}, + {".latex", "application/x-latex"}, + {".library-ms", "application/windows-library+xml"}, + {".lit", "application/x-ms-reader"}, + {".loadtest", "application/xml"}, + {".lpk", "application/octet-stream"}, + {".lsf", "video/x-la-asf"}, + {".lst", "text/plain"}, + {".lsx", "video/x-la-asf"}, + {".lzh", "application/octet-stream"}, + {".m13", "application/x-msmediaview"}, + {".m14", "application/x-msmediaview"}, + {".m1v", "video/mpeg"}, + {".m2t", "video/vnd.dlna.mpeg-tts"}, + {".m2ts", "video/vnd.dlna.mpeg-tts"}, + {".m2v", "video/mpeg"}, + {".m3u", "audio/x-mpegurl"}, + {".m3u8", "audio/x-mpegurl"}, + {".m4a", "audio/m4a"}, + {".m4b", "audio/m4b"}, + {".m4p", "audio/m4p"}, + {".m4r", "audio/x-m4r"}, + {".m4v", "video/x-m4v"}, + {".mac", "image/x-macpaint"}, + {".mak", "text/plain"}, + {".man", "application/x-troff-man"}, + {".manifest", "application/x-ms-manifest"}, + {".map", "text/plain"}, + {".master", "application/xml"}, + {".mbox", "application/mbox"}, + {".mda", "application/msaccess"}, + {".mdb", "application/x-msaccess"}, + {".mde", "application/msaccess"}, + {".mdp", "application/octet-stream"}, + {".me", "application/x-troff-me"}, + {".mfp", "application/x-shockwave-flash"}, + {".mht", "message/rfc822"}, + {".mhtml", "message/rfc822"}, + {".mid", "audio/mid"}, + {".midi", "audio/mid"}, + {".mix", "application/octet-stream"}, + {".mk", "text/plain"}, + {".mk3d", "video/x-matroska-3d"}, + {".mka", "audio/x-matroska"}, + {".mkv", "video/x-matroska"}, + {".mmf", "application/x-smaf"}, + {".mno", "text/xml"}, + {".mny", "application/x-msmoney"}, + {".mod", "video/mpeg"}, + {".mov", "video/quicktime"}, + {".movie", "video/x-sgi-movie"}, + {".mp2", "video/mpeg"}, + {".mp2v", "video/mpeg"}, + {".mp3", "audio/mpeg"}, + {".mp4", "video/mp4"}, + {".mp4v", "video/mp4"}, + {".mpa", "video/mpeg"}, + {".mpe", "video/mpeg"}, + {".mpeg", "video/mpeg"}, + {".mpf", "application/vnd.ms-mediapackage"}, + {".mpg", "video/mpeg"}, + {".mpp", "application/vnd.ms-project"}, + {".mpv2", "video/mpeg"}, + {".mqv", "video/quicktime"}, + {".ms", "application/x-troff-ms"}, + {".msg", "application/vnd.ms-outlook"}, + {".msi", "application/octet-stream"}, + {".mso", "application/octet-stream"}, + {".mts", "video/vnd.dlna.mpeg-tts"}, + {".mtx", "application/xml"}, + {".mvb", "application/x-msmediaview"}, + {".mvc", "application/x-miva-compiled"}, + {".mxp", "application/x-mmxp"}, + {".nc", "application/x-netcdf"}, + {".nsc", "video/x-ms-asf"}, + {".nws", "message/rfc822"}, + {".ocx", "application/octet-stream"}, + {".oda", "application/oda"}, + {".odb", "application/vnd.oasis.opendocument.database"}, + {".odc", "application/vnd.oasis.opendocument.chart"}, + {".odf", "application/vnd.oasis.opendocument.formula"}, + {".odg", "application/vnd.oasis.opendocument.graphics"}, + {".odh", "text/plain"}, + {".odi", "application/vnd.oasis.opendocument.image"}, + {".odl", "text/plain"}, + {".odm", "application/vnd.oasis.opendocument.text-master"}, + {".odp", "application/vnd.oasis.opendocument.presentation"}, + {".ods", "application/vnd.oasis.opendocument.spreadsheet"}, + {".odt", "application/vnd.oasis.opendocument.text"}, + {".oga", "audio/ogg"}, + {".ogg", "audio/ogg"}, + {".ogv", "video/ogg"}, + {".ogx", "application/ogg"}, + {".one", "application/onenote"}, + {".onea", "application/onenote"}, + {".onepkg", "application/onenote"}, + {".onetmp", "application/onenote"}, + {".onetoc", "application/onenote"}, + {".onetoc2", "application/onenote"}, + {".opus", "audio/ogg"}, + {".orderedtest", "application/xml"}, + {".osdx", "application/opensearchdescription+xml"}, + {".otf", "application/font-sfnt"}, + {".otg", "application/vnd.oasis.opendocument.graphics-template"}, + {".oth", "application/vnd.oasis.opendocument.text-web"}, + {".otp", "application/vnd.oasis.opendocument.presentation-template"}, + {".ots", "application/vnd.oasis.opendocument.spreadsheet-template"}, + {".ott", "application/vnd.oasis.opendocument.text-template"}, + {".oxt", "application/vnd.openofficeorg.extension"}, + {".p10", "application/pkcs10"}, + {".p12", "application/x-pkcs12"}, + {".p7b", "application/x-pkcs7-certificates"}, + {".p7c", "application/pkcs7-mime"}, + {".p7m", "application/pkcs7-mime"}, + {".p7r", "application/x-pkcs7-certreqresp"}, + {".p7s", "application/pkcs7-signature"}, + {".pbm", "image/x-portable-bitmap"}, + {".pcast", "application/x-podcast"}, + {".pct", "image/pict"}, + {".pcx", "application/octet-stream"}, + {".pcz", "application/octet-stream"}, + {".pdf", "application/pdf"}, + {".pfb", "application/octet-stream"}, + {".pfm", "application/octet-stream"}, + {".pfx", "application/x-pkcs12"}, + {".pgm", "image/x-portable-graymap"}, + {".pic", "image/pict"}, + {".pict", "image/pict"}, + {".pkgdef", "text/plain"}, + {".pkgundef", "text/plain"}, + {".pko", "application/vnd.ms-pki.pko"}, + {".pls", "audio/scpls"}, + {".pma", "application/x-perfmon"}, + {".pmc", "application/x-perfmon"}, + {".pml", "application/x-perfmon"}, + {".pmr", "application/x-perfmon"}, + {".pmw", "application/x-perfmon"}, + {".png", "image/png"}, + {".pnm", "image/x-portable-anymap"}, + {".pnt", "image/x-macpaint"}, + {".pntg", "image/x-macpaint"}, + {".pnz", "image/png"}, + {".pot", "application/vnd.ms-powerpoint"}, + {".potm", "application/vnd.ms-powerpoint.template.macroEnabled.12"}, + {".potx", "application/vnd.openxmlformats-officedocument.presentationml.template"}, + {".ppa", "application/vnd.ms-powerpoint"}, + {".ppam", "application/vnd.ms-powerpoint.addin.macroEnabled.12"}, + {".ppm", "image/x-portable-pixmap"}, + {".pps", "application/vnd.ms-powerpoint"}, + {".ppsm", "application/vnd.ms-powerpoint.slideshow.macroEnabled.12"}, + {".ppsx", "application/vnd.openxmlformats-officedocument.presentationml.slideshow"}, + {".ppt", "application/vnd.ms-powerpoint"}, + {".pptm", "application/vnd.ms-powerpoint.presentation.macroEnabled.12"}, + {".pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation"}, + {".prf", "application/pics-rules"}, + {".prm", "application/octet-stream"}, + {".prx", "application/octet-stream"}, + {".ps", "application/postscript"}, + {".psc1", "application/PowerShell"}, + {".psd", "application/octet-stream"}, + {".psess", "application/xml"}, + {".psm", "application/octet-stream"}, + {".psp", "application/octet-stream"}, + {".pst", "application/vnd.ms-outlook"}, + {".pub", "application/x-mspublisher"}, + {".pwz", "application/vnd.ms-powerpoint"}, + {".qht", "text/x-html-insertion"}, + {".qhtm", "text/x-html-insertion"}, + {".qt", "video/quicktime"}, + {".qti", "image/x-quicktime"}, + {".qtif", "image/x-quicktime"}, + {".qtl", "application/x-quicktimeplayer"}, + {".qxd", "application/octet-stream"}, + {".ra", "audio/x-pn-realaudio"}, + {".ram", "audio/x-pn-realaudio"}, + {".rar", "application/x-rar-compressed"}, + {".ras", "image/x-cmu-raster"}, + {".rat", "application/rat-file"}, + {".rc", "text/plain"}, + {".rc2", "text/plain"}, + {".rct", "text/plain"}, + {".rdlc", "application/xml"}, + {".reg", "text/plain"}, + {".resx", "application/xml"}, + {".rf", "image/vnd.rn-realflash"}, + {".rgb", "image/x-rgb"}, + {".rgs", "text/plain"}, + {".rm", "application/vnd.rn-realmedia"}, + {".rmi", "audio/mid"}, + {".rmp", "application/vnd.rn-rn_music_package"}, + {".roff", "application/x-troff"}, + {".rpm", "audio/x-pn-realaudio-plugin"}, + {".rqy", "text/x-ms-rqy"}, + {".rtf", "application/rtf"}, + {".rtx", "text/richtext"}, + {".rvt", "application/octet-stream" }, + {".ruleset", "application/xml"}, + {".s", "text/plain"}, + {".safariextz", "application/x-safari-safariextz"}, + {".scd", "application/x-msschedule"}, + {".scr", "text/plain"}, + {".sct", "text/scriptlet"}, + {".sd2", "audio/x-sd2"}, + {".sdp", "application/sdp"}, + {".sea", "application/octet-stream"}, + {".searchConnector-ms", "application/windows-search-connector+xml"}, + {".setpay", "application/set-payment-initiation"}, + {".setreg", "application/set-registration-initiation"}, + {".settings", "application/xml"}, + {".sgimb", "application/x-sgimb"}, + {".sgml", "text/sgml"}, + {".sh", "application/x-sh"}, + {".shar", "application/x-shar"}, + {".shtml", "text/html"}, + {".sit", "application/x-stuffit"}, + {".sitemap", "application/xml"}, + {".skin", "application/xml"}, + {".skp", "application/x-koan" }, + {".sldm", "application/vnd.ms-powerpoint.slide.macroEnabled.12"}, + {".sldx", "application/vnd.openxmlformats-officedocument.presentationml.slide"}, + {".slk", "application/vnd.ms-excel"}, + {".sln", "text/plain"}, + {".slupkg-ms", "application/x-ms-license"}, + {".smd", "audio/x-smd"}, + {".smi", "application/octet-stream"}, + {".smx", "audio/x-smd"}, + {".smz", "audio/x-smd"}, + {".snd", "audio/basic"}, + {".snippet", "application/xml"}, + {".snp", "application/octet-stream"}, + {".sol", "text/plain"}, + {".sor", "text/plain"}, + {".spc", "application/x-pkcs7-certificates"}, + {".spl", "application/futuresplash"}, + {".spx", "audio/ogg"}, + {".src", "application/x-wais-source"}, + {".srf", "text/plain"}, + {".SSISDeploymentManifest", "text/xml"}, + {".ssm", "application/streamingmedia"}, + {".sst", "application/vnd.ms-pki.certstore"}, + {".stl", "application/vnd.ms-pki.stl"}, + {".sv4cpio", "application/x-sv4cpio"}, + {".sv4crc", "application/x-sv4crc"}, + {".svc", "application/xml"}, + {".svg", "image/svg+xml"}, + {".swf", "application/x-shockwave-flash"}, + {".step", "application/step"}, + {".stp", "application/step"}, + {".t", "application/x-troff"}, + {".tar", "application/x-tar"}, + {".tcl", "application/x-tcl"}, + {".testrunconfig", "application/xml"}, + {".testsettings", "application/xml"}, + {".tex", "application/x-tex"}, + {".texi", "application/x-texinfo"}, + {".texinfo", "application/x-texinfo"}, + {".tgz", "application/x-compressed"}, + {".thmx", "application/vnd.ms-officetheme"}, + {".thn", "application/octet-stream"}, + {".tif", "image/tiff"}, + {".tiff", "image/tiff"}, + {".tlh", "text/plain"}, + {".tli", "text/plain"}, + {".toc", "application/octet-stream"}, + {".tr", "application/x-troff"}, + {".trm", "application/x-msterminal"}, + {".trx", "application/xml"}, + {".ts", "video/vnd.dlna.mpeg-tts"}, + {".tsv", "text/tab-separated-values"}, + {".ttf", "application/font-sfnt"}, + {".tts", "video/vnd.dlna.mpeg-tts"}, + {".txt", "text/plain"}, + {".u32", "application/octet-stream"}, + {".uls", "text/iuls"}, + {".user", "text/plain"}, + {".ustar", "application/x-ustar"}, + {".vb", "text/plain"}, + {".vbdproj", "text/plain"}, + {".vbk", "video/mpeg"}, + {".vbproj", "text/plain"}, + {".vbs", "text/vbscript"}, + {".vcf", "text/x-vcard"}, + {".vcproj", "application/xml"}, + {".vcs", "text/plain"}, + {".vcxproj", "application/xml"}, + {".vddproj", "text/plain"}, + {".vdp", "text/plain"}, + {".vdproj", "text/plain"}, + {".vdx", "application/vnd.ms-visio.viewer"}, + {".vml", "text/xml"}, + {".vscontent", "application/xml"}, + {".vsct", "text/xml"}, + {".vsd", "application/vnd.visio"}, + {".vsi", "application/ms-vsi"}, + {".vsix", "application/vsix"}, + {".vsixlangpack", "text/xml"}, + {".vsixmanifest", "text/xml"}, + {".vsmdi", "application/xml"}, + {".vspscc", "text/plain"}, + {".vss", "application/vnd.visio"}, + {".vsscc", "text/plain"}, + {".vssettings", "text/xml"}, + {".vssscc", "text/plain"}, + {".vst", "application/vnd.visio"}, + {".vstemplate", "text/xml"}, + {".vsto", "application/x-ms-vsto"}, + {".vsw", "application/vnd.visio"}, + {".vsx", "application/vnd.visio"}, + {".vtt", "text/vtt"}, + {".vtx", "application/vnd.visio"}, + {".wasm", "application/wasm"}, + {".wav", "audio/wav"}, + {".wave", "audio/wav"}, + {".wax", "audio/x-ms-wax"}, + {".wbk", "application/msword"}, + {".wbmp", "image/vnd.wap.wbmp"}, + {".wcm", "application/vnd.ms-works"}, + {".wdb", "application/vnd.ms-works"}, + {".wdp", "image/vnd.ms-photo"}, + {".webarchive", "application/x-safari-webarchive"}, + {".webm", "video/webm"}, + {".webp", "image/webp"}, /* https://en.wikipedia.org/wiki/WebP */ + {".webtest", "application/xml"}, + {".wiq", "application/xml"}, + {".wiz", "application/msword"}, + {".wks", "application/vnd.ms-works"}, + {".WLMP", "application/wlmoviemaker"}, + {".wlpginstall", "application/x-wlpg-detect"}, + {".wlpginstall3", "application/x-wlpg3-detect"}, + {".wm", "video/x-ms-wm"}, + {".wma", "audio/x-ms-wma"}, + {".wmd", "application/x-ms-wmd"}, + {".wmf", "application/x-msmetafile"}, + {".wml", "text/vnd.wap.wml"}, + {".wmlc", "application/vnd.wap.wmlc"}, + {".wmls", "text/vnd.wap.wmlscript"}, + {".wmlsc", "application/vnd.wap.wmlscriptc"}, + {".wmp", "video/x-ms-wmp"}, + {".wmv", "video/x-ms-wmv"}, + {".wmx", "video/x-ms-wmx"}, + {".wmz", "application/x-ms-wmz"}, + {".woff", "application/font-woff"}, + {".woff2", "application/font-woff2"}, + {".wpl", "application/vnd.ms-wpl"}, + {".wps", "application/vnd.ms-works"}, + {".wri", "application/x-mswrite"}, + {".wrl", "x-world/x-vrml"}, + {".wrz", "x-world/x-vrml"}, + {".wsc", "text/scriptlet"}, + {".wsdl", "text/xml"}, + {".wvx", "video/x-ms-wvx"}, + {".x", "application/directx"}, + {".xaf", "x-world/x-vrml"}, + {".xaml", "application/xaml+xml"}, + {".xap", "application/x-silverlight-app"}, + {".xbap", "application/x-ms-xbap"}, + {".xbm", "image/x-xbitmap"}, + {".xdr", "text/plain"}, + {".xht", "application/xhtml+xml"}, + {".xhtml", "application/xhtml+xml"}, + {".xla", "application/vnd.ms-excel"}, + {".xlam", "application/vnd.ms-excel.addin.macroEnabled.12"}, + {".xlc", "application/vnd.ms-excel"}, + {".xld", "application/vnd.ms-excel"}, + {".xlk", "application/vnd.ms-excel"}, + {".xll", "application/vnd.ms-excel"}, + {".xlm", "application/vnd.ms-excel"}, + {".xls", "application/vnd.ms-excel"}, + {".xlsb", "application/vnd.ms-excel.sheet.binary.macroEnabled.12"}, + {".xlsm", "application/vnd.ms-excel.sheet.macroEnabled.12"}, + {".xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"}, + {".xlt", "application/vnd.ms-excel"}, + {".xltm", "application/vnd.ms-excel.template.macroEnabled.12"}, + {".xltx", "application/vnd.openxmlformats-officedocument.spreadsheetml.template"}, + {".xlw", "application/vnd.ms-excel"}, + {".xml", "text/xml"}, + {".xmp", "application/octet-stream" }, + {".xmta", "application/xml"}, + {".xof", "x-world/x-vrml"}, + {".XOML", "text/plain"}, + {".xpm", "image/x-xpixmap"}, + {".xps", "application/vnd.ms-xpsdocument"}, + {".xrm-ms", "text/xml"}, + {".xsc", "application/xml"}, + {".xsd", "text/xml"}, + {".xsf", "text/xml"}, + {".xsl", "text/xml"}, + {".xslt", "text/xml"}, + {".xsn", "application/octet-stream"}, + {".xss", "application/xml"}, + {".xspf", "application/xspf+xml"}, + {".xtp", "application/octet-stream"}, + {".xwd", "image/x-xwindowdump"}, + {".z", "application/x-compress"}, + {".zip", "application/zip"}, + }; + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/MimeType.cs b/Vendor/EmbedIO-3.5.2/MimeType.cs new file mode 100644 index 0000000..071407c --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/MimeType.cs @@ -0,0 +1,174 @@ +using System; +using EmbedIO.Utilities; + +namespace EmbedIO +{ + /// + /// Provides constants for commonly-used MIME types and association between file extensions and MIME types. + /// + /// + public static partial class MimeType + { + /// + /// The default MIME type for data whose type is unknown, + /// i.e. application/octet-stream. + /// + public const string Default = "application/octet-stream"; + + /// + /// The MIME type for plain text, i.e. text/plain. + /// + public const string PlainText = "text/plain"; + + /// + /// The MIME type for HTML, i.e. text/html. + /// + public const string Html = "text/html"; + + /// + /// The MIME type for JSON, i.e. application/json. + /// + public const string Json = "application/json"; + + /// + /// The MIME type for URL-encoded HTML forms, + /// i.e. application/x-www-form-urlencoded. + /// + internal const string UrlEncodedForm = "application/x-www-form-urlencoded"; + + /// + /// Strips parameters, if present (e.g. ; encoding=UTF-8), from a MIME type. + /// + /// The MIME type. + /// without parameters. + /// + /// This method does not validate : if it is not + /// a valid MIME type or media range, it is just returned unchanged. + /// + public static string StripParameters(string value) + { + if (string.IsNullOrEmpty(value)) + return value; + + var semicolonPos = value.IndexOf(';'); + return semicolonPos < 0 + ? value + : value.Substring(0, semicolonPos).TrimEnd(); + } + + /// + /// Determines whether the specified string is a valid MIME type or media range. + /// + /// The value. + /// If set to , both media ranges + /// (e.g. "text/*", "*/*") and specific MIME types (e.g. "text/html") + /// are considered valid; if set to , only specific MIME types + /// are considered valid. + /// if is valid, + /// according to the value of ; + /// otherwise, . + public static bool IsMimeType(string value, bool acceptMediaRange) + { + if (string.IsNullOrEmpty(value)) + return false; + + var slashPos = value.IndexOf('/'); + if (slashPos < 0) + return false; + + var isWildcardSubtype = false; + var subtype = value.Substring(slashPos + 1); + if (subtype == "*") + { + if (!acceptMediaRange) + return false; + + isWildcardSubtype = true; + } + else if (!Validate.IsRfc2616Token(subtype)) + { + return false; + } + + var type = value.Substring(0, slashPos); + return type == "*" + ? acceptMediaRange && isWildcardSubtype + : Validate.IsRfc2616Token(type); + } + + /// + /// Splits the specified MIME type or media range into type and subtype. + /// + /// The MIME type or media range to split. + /// A tuple of type and subtype. + /// is . + /// is not a valid + /// MIME type or media range. + public static (string type, string subtype) Split(string mimeType) + => UnsafeSplit(Validate.MimeType(nameof(mimeType), mimeType, true)); + + /// + /// Matches the specified MIME type to a media range. + /// + /// The MIME type to match. + /// The media range. + /// if is either + /// the same as , or has the same type and a subtype + /// of "*", or is "*/*". + /// + /// is . + /// - or - + /// is . + /// + /// + /// is not a valid MIME type. + /// - or - + /// is not a valid MIME media range. + /// + public static bool IsInRange(string mimeType, string mediaRange) + => UnsafeIsInRange( + Validate.MimeType(nameof(mimeType), mimeType, false), + Validate.MimeType(nameof(mediaRange), mediaRange, true)); + + internal static (string type, string subtype) UnsafeSplit(string mimeType) + { + var slashPos = mimeType.IndexOf('/'); + return (mimeType.Substring(0, slashPos), mimeType.Substring(slashPos + 1)); + } + + internal static bool UnsafeIsInRange(string mimeType, string mediaRange) + { + // A validated media range that starts with '*' can only be '*/*' + if (mediaRange[0] == '*') + return true; + + var typeSlashPos = mimeType.IndexOf('/'); + var rangeSlashPos = mediaRange.IndexOf('/'); + + if (typeSlashPos != rangeSlashPos) + return false; + + for (var i = 0; i < typeSlashPos; i++) + { + if (mimeType[i] != mediaRange[i]) + return false; + } + + // A validated token has at least 1 character, + // thus there must be at least 1 character after a slash. + if (mediaRange[rangeSlashPos + 1] == '*') + return true; + + if (mimeType.Length != mediaRange.Length) + return false; + + for (var i = typeSlashPos + 1; i < mimeType.Length; i++) + { + if (mimeType[i] != mediaRange[i]) + return false; + } + + return true; + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/MimeTypeCustomizerExtensions.cs b/Vendor/EmbedIO-3.5.2/MimeTypeCustomizerExtensions.cs new file mode 100644 index 0000000..1c8121d --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/MimeTypeCustomizerExtensions.cs @@ -0,0 +1,99 @@ +using System; + +namespace EmbedIO +{ + /// + /// Provides extension methods for types implementing . + /// + public static class MimeTypeCustomizerExtensions + { + /// + /// Adds a custom association between a file extension and a MIME type. + /// + /// The type of the object to which this method is applied. + /// The object to which this method is applied. + /// The file extension to associate to . + /// The MIME type to associate to . + /// with the custom association added. + /// is . + /// has its configuration locked. + /// + /// is . + /// - or - + /// is . + /// + /// + /// is the empty string. + /// - or - + /// is not a valid MIME type. + /// + public static T WithCustomMimeType(this T @this, string extension, string mimeType) + where T : IMimeTypeCustomizer + { + @this.AddCustomMimeType(extension, mimeType); + return @this; + } + + /// + /// Indicates whether to prefer compression when negotiating content encoding + /// for a response with the specified content type, or whose content type is in + /// the specified media range. + /// + /// The type of the object to which this method is applied. + /// The object to which this method is applied. + /// The MIME type or media range. + /// to prefer compression; + /// otherwise, . + /// with the specified preference added. + /// is . + /// has its configuration locked. + /// is . + /// is not a valid MIME type or media range. + public static T PreferCompressionFor(this T @this, string mimeType, bool preferCompression) + where T : IMimeTypeCustomizer + { + @this.PreferCompression(mimeType, preferCompression); + return @this; + } + + /// + /// Indicates that compression should be preferred when negotiating content encoding + /// for a response with the specified content type, or whose content type is in + /// the specified media range. + /// + /// The type of the object to which this method is applied. + /// The object to which this method is applied. + /// The MIME type or media range. + /// with the specified preference added. + /// is . + /// has its configuration locked. + /// is . + /// is not a valid MIME type or media range. + public static T PreferCompressionFor(this T @this, string mimeType) + where T : IMimeTypeCustomizer + { + @this.PreferCompression(mimeType, true); + return @this; + } + + /// + /// Indicates that no compression should be preferred when negotiating content encoding + /// for a response with the specified content type, or whose content type is in + /// the specified media range. + /// + /// The type of the object to which this method is applied. + /// The object to which this method is applied. + /// The MIME type or media range. + /// with the specified preference added. + /// is . + /// has its configuration locked. + /// is . + /// is not a valid MIME type or media range. + public static T PreferNoCompressionFor(this T @this, string mimeType) + where T : IMimeTypeCustomizer + { + @this.PreferCompression(mimeType, false); + return @this; + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/ModuleGroup.cs b/Vendor/EmbedIO-3.5.2/ModuleGroup.cs new file mode 100644 index 0000000..ad4db32 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/ModuleGroup.cs @@ -0,0 +1,111 @@ +using System; +using System.Collections.Concurrent; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using EmbedIO.Internal; +using EmbedIO.Utilities; + +namespace EmbedIO +{ + /// + /// Groups modules under a common base URL path. + /// The BaseRoute property + /// of modules contained in a ModuleGroup is relative to the + /// ModuleGroup's BaseRoute property. + /// For example, given the following code: + /// new ModuleGroup("/download") + /// .WithStaticFilesAt("/docs", "/var/my/documents"); + /// files contained in the /var/my/documents folder will be + /// available to clients under the /download/docs/ URL. + /// + /// + /// + /// + public class ModuleGroup : WebModuleBase, IDisposable, IWebModuleContainer, IMimeTypeCustomizer + { + private readonly WebModuleCollection _modules; + private readonly MimeTypeCustomizer _mimeTypeCustomizer = new MimeTypeCustomizer(); + + /// + /// Initializes a new instance of the class. + /// + /// The base route served by this module. + /// The value to set the property to. + /// See the help for the property for more information. + /// + /// + public ModuleGroup(string baseRoute, bool isFinalHandler) + : base(baseRoute) + { + IsFinalHandler = isFinalHandler; + _modules = new WebModuleCollection(nameof(ModuleGroup)); + } + + /// + /// Finalizes an instance of the class. + /// + ~ModuleGroup() + { + Dispose(false); + } + + /// + public sealed override bool IsFinalHandler { get; } + + /// + public IComponentCollection Modules => _modules; + + /// + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + string IMimeTypeProvider.GetMimeType(string extension) + => _mimeTypeCustomizer.GetMimeType(extension); + + bool IMimeTypeProvider.TryDetermineCompression(string mimeType, out bool preferCompression) + => _mimeTypeCustomizer.TryDetermineCompression(mimeType, out preferCompression); + + /// + public void AddCustomMimeType(string extension, string mimeType) + => _mimeTypeCustomizer.AddCustomMimeType(extension, mimeType); + + /// + public void PreferCompression(string mimeType, bool preferCompression) + => _mimeTypeCustomizer.PreferCompression(mimeType, preferCompression); + + /// + protected override Task OnRequestAsync(IHttpContext context) + => _modules.DispatchRequestAsync(context); + + /// + /// Releases unmanaged and - optionally - managed resources. + /// + /// to release both managed and unmanaged resources; + /// to release only unmanaged resources. + protected virtual void Dispose(bool disposing) + { + if (!disposing) + return; + + _modules.Dispose(); + } + + /// + protected override void OnBeforeLockConfiguration() + { + base.OnBeforeLockConfiguration(); + + _mimeTypeCustomizer.Lock(); + } + + /// + protected override void OnStart(CancellationToken cancellationToken) + { + _modules.StartAll(cancellationToken); + } + } +} diff --git a/Vendor/EmbedIO-3.5.2/Net/CookieList.cs b/Vendor/EmbedIO-3.5.2/Net/CookieList.cs new file mode 100644 index 0000000..75bf4a4 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Net/CookieList.cs @@ -0,0 +1,243 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Net; +using System.Text; +using EmbedIO.Internal; +using EmbedIO.Net.Internal; +using EmbedIO.Utilities; + +namespace EmbedIO.Net +{ + /// + /// Provides a collection container for instances of . + /// This class is meant to be used internally by EmbedIO; you don't need to + /// use this class directly. + /// +#pragma warning disable CA1710 // Rename class to end in 'Collection' - it ends in 'List', i.e. 'Indexed Collection'. + public sealed class CookieList : List, ICookieCollection +#pragma warning restore CA1710 + { + /// + public bool IsSynchronized => false; + + /// + public Cookie? this[string name] + { + get + { + if (name == null) + throw new ArgumentNullException(nameof(name)); + + if (Count == 0) + return null; + + var list = new List(this); + + list.Sort(CompareCookieWithinSorted); + + return list.FirstOrDefault(cookie => cookie.Name.Equals(name, StringComparison.OrdinalIgnoreCase)); + } + } + + /// Creates a by parsing + /// the value of one or more Cookie or Set-Cookie headers. + /// The value, or comma-separated list of values, + /// of the header or headers. + /// A newly-created instance of . + public static CookieList Parse(string headerValue) + { + var cookies = new CookieList(); + + Cookie? cookie = null; + var pairs = SplitCookieHeaderValue(headerValue); + + for (var i = 0; i < pairs.Length; i++) + { + var pair = pairs[i].Trim(); + if (pair.Length == 0) + continue; + + if (pair.StartsWith("version", StringComparison.OrdinalIgnoreCase) && cookie != null) + { + cookie.Version = int.Parse(GetValue(pair, true), CultureInfo.InvariantCulture); + } + else if (pair.StartsWith("expires", StringComparison.OrdinalIgnoreCase) && cookie != null) + { + var buff = new StringBuilder(GetValue(pair), 32); + if (i < pairs.Length - 1) + buff.AppendFormat(CultureInfo.InvariantCulture, ", {0}", pairs[++i].Trim()); + + if (!HttpDate.TryParse(buff.ToString(), out var expires)) + expires = DateTimeOffset.Now; + + if (cookie.Expires == DateTime.MinValue) + cookie.Expires = expires.LocalDateTime; + } + else if (pair.StartsWith("max-age", StringComparison.OrdinalIgnoreCase) && cookie != null) + { + var max = int.Parse(GetValue(pair, true), CultureInfo.InvariantCulture); + + cookie.Expires = DateTime.Now.AddSeconds(max); + } + else if (pair.StartsWith("path", StringComparison.OrdinalIgnoreCase) && cookie != null) + { + cookie.Path = GetValue(pair); + } + else if (pair.StartsWith("domain", StringComparison.OrdinalIgnoreCase) && cookie != null) + { + cookie.Domain = GetValue(pair); + } + else if (pair.StartsWith("port", StringComparison.OrdinalIgnoreCase) && cookie != null) + { + cookie.Port = pair.Equals("port", StringComparison.OrdinalIgnoreCase) + ? "\"\"" + : GetValue(pair); + } + else if (pair.StartsWith("comment", StringComparison.OrdinalIgnoreCase) && cookie != null) + { + cookie.Comment = WebUtility.UrlDecode(GetValue(pair)); + } + else if (pair.StartsWith("commenturl", StringComparison.OrdinalIgnoreCase) && cookie != null) + { + cookie.CommentUri = UriUtility.StringToUri(GetValue(pair, true)); + } + else if (pair.StartsWith("discard", StringComparison.OrdinalIgnoreCase) && cookie != null) + { + cookie.Discard = true; + } + else if (pair.StartsWith("secure", StringComparison.OrdinalIgnoreCase) && cookie != null) + { + cookie.Secure = true; + } + else if (pair.StartsWith("httponly", StringComparison.OrdinalIgnoreCase) && cookie != null) + { + cookie.HttpOnly = true; + } + else + { + if (cookie != null) + cookies.Add(cookie); + + cookie = ParseCookie(pair); + } + } + + if (cookie != null) + cookies.Add(cookie); + + return cookies; + } + + /// + public new void Add(Cookie cookie) + { + if (cookie == null) + throw new ArgumentNullException(nameof(cookie)); + + var pos = SearchCookie(cookie); + if (pos == -1) + { + base.Add(cookie); + return; + } + + this[pos] = cookie; + } + + /// + public void CopyTo(Array array, int index) + { + if (array == null) + throw new ArgumentNullException(nameof(array)); + + if (index < 0) + throw new ArgumentOutOfRangeException(nameof(index), "Less than zero."); + + if (array.Rank > 1) + throw new ArgumentException("Multidimensional.", nameof(array)); + + if (array.Length - index < Count) + { + throw new ArgumentException( + "The number of elements in this collection is greater than the available space of the destination array."); + } + + if (array.GetType().GetElementType()?.IsAssignableFrom(typeof(Cookie)) != true) + { + throw new InvalidCastException( + "The elements in this collection cannot be cast automatically to the type of the destination array."); + } + + ((IList) this).CopyTo(array, index); + } + + private static string? GetValue(string nameAndValue, bool unquote = false) + { + var idx = nameAndValue.IndexOf('='); + + if (idx < 0 || idx == nameAndValue.Length - 1) + return null; + + var val = nameAndValue.Substring(idx + 1).Trim(); + return unquote ? val.Unquote() : val; + } + + private static string[] SplitCookieHeaderValue(string value) => value.SplitHeaderValue(true).ToArray(); + + private static int CompareCookieWithinSorted(Cookie x, Cookie y) + { + var ret = x.Version - y.Version; + return ret != 0 + ? ret + : (ret = string.Compare(x.Name, y.Name, StringComparison.Ordinal)) != 0 + ? ret + : y.Path.Length - x.Path.Length; + } + + private static Cookie ParseCookie(string pair) + { + string name; + var val = string.Empty; + + var pos = pair.IndexOf('='); + if (pos == -1) + { + name = pair; + } + else if (pos == pair.Length - 1) + { + name = pair.Substring(0, pos).TrimEnd(' '); + } + else + { + name = pair.Substring(0, pos).TrimEnd(' '); + val = pair.Substring(pos + 1).TrimStart(' '); + } + + return new Cookie(name, val); + } + + private int SearchCookie(Cookie cookie) + { + var name = cookie.Name; + var path = cookie.Path; + var domain = cookie.Domain; + var ver = cookie.Version; + + for (var i = Count - 1; i >= 0; i--) + { + var c = this[i]; + if (c.Name.Equals(name, StringComparison.OrdinalIgnoreCase) && + c.Path.Equals(path, StringComparison.OrdinalIgnoreCase) && + c.Domain.Equals(domain, StringComparison.OrdinalIgnoreCase) && + c.Version == ver) + return i; + } + + return -1; + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Net/EndPointManager.cs b/Vendor/EmbedIO-3.5.2/Net/EndPointManager.cs new file mode 100644 index 0000000..2103312 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Net/EndPointManager.cs @@ -0,0 +1,141 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Net; +using System.Net.Sockets; +using EmbedIO.Net.Internal; +using Swan.Logging; + +namespace EmbedIO.Net +{ + /// + /// Represents the EndPoint Manager. + /// + public static class EndPointManager + { + private static readonly ConcurrentDictionary> IPToEndpoints = new (); + + /// + /// Gets or sets a value indicating whether [use IPv6]. By default, this flag is set. + /// + /// + /// true if [use IPv6]; otherwise, false. + /// + public static bool UseIpv6 { get; set; } = true; + + internal static void AddListener(HttpListener listener) + { + var added = new List(); + + try + { + foreach (var prefix in listener.Prefixes) + { + AddPrefix(prefix, listener); + added.Add(prefix); + } + } + catch (Exception ex) + { + ex.Log(nameof(AddListener)); + + foreach (var prefix in added) + { + RemovePrefix(prefix, listener); + } + + throw; + } + } + + internal static void RemoveEndPoint(EndPointListener epl, IPEndPoint ep) + { + if (IPToEndpoints.TryGetValue(ep.Address, out var p)) + { + if (p.TryRemove(ep.Port, out _) && p.Count == 0) + { + _ = IPToEndpoints.TryRemove(ep.Address, out _); + } + } + + epl.Dispose(); + } + + internal static void RemoveListener(HttpListener listener) + { + foreach (var prefix in listener.Prefixes) + { + RemovePrefix(prefix, listener); + } + } + + internal static void AddPrefix(string p, HttpListener listener) + { + var lp = new ListenerPrefix(p); + + if (!lp.IsValid()) + { + throw new HttpListenerException(400, "Invalid path."); + } + + // listens on all the interfaces if host name cannot be parsed by IPAddress. + var epl = GetEpListener(lp.Host, lp.Port, listener, lp.Secure); + epl.AddPrefix(lp, listener); + } + + private static EndPointListener GetEpListener(string host, int port, HttpListener listener, bool secure = false) + { + var address = ResolveAddress(host); + + var p = IPToEndpoints.GetOrAdd(address, x => new ConcurrentDictionary()); + return p.GetOrAdd(port, x => new EndPointListener(listener, address, x, secure)); + } + + private static IPAddress ResolveAddress(string host) + { + if (host == "*" || host == "+" || host == "0.0.0.0") + { + return UseIpv6 ? IPAddress.IPv6Any : IPAddress.Any; + } + + if (IPAddress.TryParse(host, out var address)) + { + return address; + } + + try + { + var hostEntry = new IPHostEntry { + HostName = host, + AddressList = Dns.GetHostAddresses(host), + }; + + return hostEntry.AddressList[0]; + } + catch + { + return UseIpv6 ? IPAddress.IPv6Any : IPAddress.Any; + } + } + + private static void RemovePrefix(string prefix, HttpListener listener) + { + try + { + var lp = new ListenerPrefix(prefix); + + if (!lp.IsValid()) + { + return; + } + + var epl = GetEpListener(lp.Host, lp.Port, listener, lp.Secure); + epl.RemovePrefix(lp); + } + catch (SocketException) + { + // ignored + } + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Net/HttpListener.cs b/Vendor/EmbedIO-3.5.2/Net/HttpListener.cs new file mode 100644 index 0000000..2f96ffb --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Net/HttpListener.cs @@ -0,0 +1,161 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Security.Cryptography.X509Certificates; +using System.Threading; +using System.Threading.Tasks; +using EmbedIO.Net.Internal; + +namespace EmbedIO.Net +{ + /// + /// The EmbedIO implementation of the standard HTTP Listener class. + /// + /// Based on MONO HttpListener class. + /// + /// + public sealed class HttpListener : IHttpListener + { + private readonly SemaphoreSlim _ctxQueueSem = new (0); + private readonly ConcurrentDictionary _ctxQueue; + private readonly ConcurrentDictionary _connections; + private readonly HttpListenerPrefixCollection _prefixes; + private bool _disposed; + + /// + /// Initializes a new instance of the class. + /// + /// The certificate. + public HttpListener(X509Certificate? certificate = null) + { + Certificate = certificate; + + _prefixes = new HttpListenerPrefixCollection(this); + _connections = new ConcurrentDictionary(); + _ctxQueue = new ConcurrentDictionary(); + } + + /// + public bool IgnoreWriteExceptions { get; set; } = true; + + /// + public bool IsListening { get; private set; } + + /// + public string Name { get; } = "Unosquare HTTP Listener"; + + /// + public List Prefixes => _prefixes.ToList(); + + /// + /// Gets the certificate. + /// + /// + /// The certificate. + /// + internal X509Certificate? Certificate { get; } + + /// + public void Start() + { + if (IsListening) + { + return; + } + + EndPointManager.AddListener(this); + IsListening = true; + } + + /// + public void Stop() + { + IsListening = false; + Close(false); + } + + /// + public void AddPrefix(string urlPrefix) => _prefixes.Add(urlPrefix); + + /// + public void Dispose() + { + if (_disposed) + { + return; + } + + Close(true); + _ctxQueueSem.Dispose(); + _disposed = true; + } + + /// + public async Task GetContextAsync(CancellationToken cancellationToken) + { + while (true) + { + await _ctxQueueSem.WaitAsync(cancellationToken).ConfigureAwait(false); + + foreach (var key in _ctxQueue.Keys) + { + if (_ctxQueue.TryRemove(key, out var context)) + { + return context; + } + + break; + } + } + } + + internal void RegisterContext(HttpListenerContext context) + { + if (!_ctxQueue.TryAdd(context.Id, context)) + { + throw new InvalidOperationException("Unable to register context"); + } + + _ = _ctxQueueSem.Release(); + } + + internal void UnregisterContext(HttpListenerContext context) => _ctxQueue.TryRemove(context.Id, out _); + + internal void AddConnection(HttpConnection cnc) => _connections[cnc] = cnc; + + internal void RemoveConnection(HttpConnection cnc) => _connections.TryRemove(cnc, out _); + + private void Close(bool closeExisting) + { + EndPointManager.RemoveListener(this); + + var keys = _connections.Keys; + var connections = new HttpConnection[keys.Count]; + keys.CopyTo(connections, 0); + _connections.Clear(); + var list = new List(connections); + + for (var i = list.Count - 1; i >= 0; i--) + { + list[i].Close(true); + } + + if (!closeExisting) + { + return; + } + + while (!_ctxQueue.IsEmpty) + { + foreach (var key in _ctxQueue.Keys.ToArray()) + { + if (_ctxQueue.TryGetValue(key, out var context)) + { + context.Connection.Close(true); + } + } + } + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Net/Internal/EndPointListener.cs b/Vendor/EmbedIO-3.5.2/Net/Internal/EndPointListener.cs new file mode 100644 index 0000000..caab9c7 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Net/Internal/EndPointListener.cs @@ -0,0 +1,429 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Net.Sockets; +using System.Threading; + +namespace EmbedIO.Net.Internal +{ + internal sealed class EndPointListener : IDisposable + { + private readonly Dictionary _unregistered; + private readonly IPEndPoint _endpoint; + private readonly Socket _sock; + private Dictionary _prefixes; + private List? _unhandled; // unhandled; host = '*' + private List? _all; // all; host = '+ + + public EndPointListener(HttpListener listener, IPAddress address, int port, bool secure) + { + Listener = listener; + Secure = secure; + _endpoint = new IPEndPoint(address, port); + _sock = new Socket(address.AddressFamily, SocketType.Stream, ProtocolType.Tcp); + + if (address.AddressFamily == AddressFamily.InterNetworkV6 && EndPointManager.UseIpv6) + { + _sock.SetSocketOption(SocketOptionLevel.IPv6, SocketOptionName.IPv6Only, false); + } + + _sock.Bind(_endpoint); + _sock.Listen(500); + var args = new SocketAsyncEventArgs { UserToken = this }; + args.Completed += OnAccept; + Socket? dummy = null; + Accept(_sock, args, ref dummy); + _prefixes = new Dictionary(); + _unregistered = new Dictionary(); + } + + internal HttpListener Listener { get; } + + internal bool Secure { get; } + + public bool BindContext(HttpListenerContext context) + { + var req = context.Request; + var listener = SearchListener(req.Url, out var prefix); + + if (listener == null) + { + return false; + } + + context.Listener = listener; + context.Connection.Prefix = prefix; + return true; + } + + public void UnbindContext(HttpListenerContext context) => context.Listener.UnregisterContext(context); + + public void Dispose() + { + _sock.Dispose(); + List connections; + + lock (_unregistered) + { + // Clone the list because RemoveConnection can be called from Close + connections = new List(_unregistered.Keys); + _unregistered.Clear(); + } + + foreach (var c in connections) + { + c.Dispose(); + } + } + + public void AddPrefix(ListenerPrefix prefix, HttpListener listener) + { + List? current; + List future; + + if (prefix.Host == "*") + { + do + { + current = _unhandled; + + // TODO: Should we clone the items? + future = current?.ToList() ?? new List(); + prefix.Listener = listener; + AddSpecial(future, prefix); + } + while (Interlocked.CompareExchange(ref _unhandled, future, current) != current); + + return; + } + + if (prefix.Host == "+") + { + do + { + current = _all; + future = current?.ToList() ?? new List(); + prefix.Listener = listener; + AddSpecial(future, prefix); + } + while (Interlocked.CompareExchange(ref _all, future, current) != current); + return; + } + + Dictionary prefs, p2; + + do + { + prefs = _prefixes; + if (prefs.ContainsKey(prefix)) + { + if (prefs[prefix] != listener) + { + throw new HttpListenerException(400, $"There is another listener for {prefix}"); + } + + return; + } + + p2 = prefs.ToDictionary(x => x.Key, x => x.Value); + p2[prefix] = listener; + } + while (Interlocked.CompareExchange(ref _prefixes, p2, prefs) != prefs); + } + + public void RemovePrefix(ListenerPrefix prefix) + { + List? current; + List future; + + if (prefix.Host == "*") + { + do + { + current = _unhandled; + future = current?.ToList() ?? new List(); + if (!RemoveSpecial(future, prefix)) + { + break; // Prefix not found + } + } + while (Interlocked.CompareExchange(ref _unhandled, future, current) != current); + + CheckIfRemove(); + return; + } + + if (prefix.Host == "+") + { + do + { + current = _all; + future = current?.ToList() ?? new List(); + if (!RemoveSpecial(future, prefix)) + { + break; // Prefix not found + } + } + while (Interlocked.CompareExchange(ref _all, future, current) != current); + + CheckIfRemove(); + return; + } + + Dictionary prefs, p2; + + do + { + prefs = _prefixes; + var prefixKey = _prefixes.Keys.FirstOrDefault(p => p.Path == prefix.Path); + + if (prefixKey is null) + { + break; + } + + p2 = prefs.ToDictionary(x => x.Key, x => x.Value); + _ = p2.Remove(prefixKey); + } + while (Interlocked.CompareExchange(ref _prefixes, p2, prefs) != prefs); + + CheckIfRemove(); + } + + internal void RemoveConnection(HttpConnection conn) + { + lock (_unregistered) + { + _ = _unregistered.Remove(conn); + } + } + + private static void Accept(Socket socket, SocketAsyncEventArgs e, ref Socket? accepted) + { + e.AcceptSocket = null; + bool acceptPending; + + try + { + acceptPending = socket.AcceptAsync(e); + } + catch + { + try + { + accepted?.Dispose(); + } + catch + { + // ignored + } + + accepted = null; + return; + } + + if (!acceptPending) + { + ProcessAccept(e); + } + } + + private static void ProcessAccept(SocketAsyncEventArgs args) + { + Socket? accepted = null; + if (args.SocketError == SocketError.Success) + { + accepted = args.AcceptSocket; + } + + var epl = (EndPointListener)args.UserToken; + + Accept(epl._sock, args, ref accepted); + if (accepted == null) + { + return; + } + + if (epl.Secure && epl.Listener.Certificate == null) + { + accepted.Dispose(); + return; + } + + HttpConnection conn; + try + { + conn = new HttpConnection(accepted, epl); + } + catch + { + return; + } + + lock (epl._unregistered) + { + epl._unregistered[conn] = conn; + } + + _ = conn.BeginReadRequest(); + } + + private static void OnAccept(object sender, SocketAsyncEventArgs e) => ProcessAccept(e); + + private static HttpListener? MatchFromList(string path, List? list, out ListenerPrefix? prefix) + { + prefix = null; + if (list == null) + { + return null; + } + + HttpListener? bestMatch = null; + var bestLength = -1; + + foreach (var p in list) + { + if (p.Path.Length < bestLength || !path.StartsWith(p.Path, StringComparison.Ordinal)) + { + continue; + } + + bestLength = p.Path.Length; + bestMatch = p.Listener; + prefix = p; + } + + return bestMatch; + } + + private static void AddSpecial(ICollection coll, ListenerPrefix prefix) + { + if (coll == null) + { + return; + } + + if (coll.Any(p => p.Path == prefix.Path)) + { + throw new HttpListenerException(400, "Prefix already in use."); + } + + coll.Add(prefix); + } + + private static bool RemoveSpecial(IList coll, ListenerPrefix prefix) + { + if (coll == null) + { + return false; + } + + var c = coll.Count; + for (var i = 0; i < c; i++) + { + if (coll[i].Path != prefix.Path) + { + continue; + } + + coll.RemoveAt(i); + return true; + } + + return false; + } + + private HttpListener? SearchListener(Uri uri, out ListenerPrefix? prefix) + { + prefix = null; + if (uri == null) + { + return null; + } + + var host = uri.Host; + var port = uri.Port; + var path = WebUtility.UrlDecode(uri.AbsolutePath); + var pathSlash = path[path.Length - 1] == '/' ? path : path + "/"; + + HttpListener? bestMatch = null; + var bestLength = -1; + + if (!string.IsNullOrEmpty(host)) + { + var result = _prefixes; + + foreach (var p in result.Keys) + { + if (p.Path.Length < bestLength) + { + continue; + } + + if (p.Host != host || p.Port != port) + { + continue; + } + + if (!path.StartsWith(p.Path, StringComparison.Ordinal) && !pathSlash.StartsWith(p.Path, StringComparison.Ordinal)) + { + continue; + } + + bestLength = p.Path.Length; + bestMatch = result[p]; + prefix = p; + } + + if (bestLength != -1) + { + return bestMatch; + } + } + + var list = _unhandled; + bestMatch = MatchFromList(path, list, out prefix); + if (path != pathSlash && bestMatch == null) + { + bestMatch = MatchFromList(pathSlash, list, out prefix); + } + + if (bestMatch != null) + { + return bestMatch; + } + + list = _all; + bestMatch = MatchFromList(path, list, out prefix); + if (path != pathSlash && bestMatch == null) + { + bestMatch = MatchFromList(pathSlash, list, out prefix); + } + + return bestMatch; + } + + private void CheckIfRemove() + { + if (_prefixes.Count > 0) + { + return; + } + + var list = _unhandled; + if (list != null && list.Count > 0) + { + return; + } + + list = _all; + if (list != null && list.Count > 0) + { + return; + } + + EndPointManager.RemoveEndPoint(this, _endpoint); + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Net/Internal/HeaderUtility.cs b/Vendor/EmbedIO-3.5.2/Net/Internal/HeaderUtility.cs new file mode 100644 index 0000000..6e24e11 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Net/Internal/HeaderUtility.cs @@ -0,0 +1,23 @@ +using System; +using System.Linq; + +namespace EmbedIO.Net.Internal +{ + internal static class HeaderUtility + { + public static string? GetCharset(string? contentType) + => contentType? + .Split(';') + .Select(p => p.Trim()) + .Where(part => part.StartsWith("charset", StringComparison.OrdinalIgnoreCase)) + .Select(GetAttributeValue) + .FirstOrDefault(); + + public static string? GetAttributeValue(string nameAndValue) + { + var idx = nameAndValue.IndexOf('='); + + return idx < 0 || idx == nameAndValue.Length - 1 ? null : nameAndValue.Substring(idx + 1).Trim().Unquote(); + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Net/Internal/HttpConnection.InputState.cs b/Vendor/EmbedIO-3.5.2/Net/Internal/HttpConnection.InputState.cs new file mode 100644 index 0000000..57bc2c5 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Net/Internal/HttpConnection.InputState.cs @@ -0,0 +1,11 @@ +namespace EmbedIO.Net.Internal +{ + partial class HttpConnection + { + private enum InputState + { + RequestLine, + Headers, + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Net/Internal/HttpConnection.LineState.cs b/Vendor/EmbedIO-3.5.2/Net/Internal/HttpConnection.LineState.cs new file mode 100644 index 0000000..4a3feca --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Net/Internal/HttpConnection.LineState.cs @@ -0,0 +1,12 @@ +namespace EmbedIO.Net.Internal +{ + partial class HttpConnection + { + private enum LineState + { + None, + Cr, + Lf, + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Net/Internal/HttpConnection.cs b/Vendor/EmbedIO-3.5.2/Net/Internal/HttpConnection.cs new file mode 100644 index 0000000..230a46d --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Net/Internal/HttpConnection.cs @@ -0,0 +1,416 @@ +using System; +using System.IO; +using System.Net; +using System.Net.Security; +using System.Net.Sockets; +using System.Security.Cryptography.X509Certificates; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace EmbedIO.Net.Internal +{ + internal sealed partial class HttpConnection : IDisposable + { + private const int BufferSize = 8192; + + private readonly Timer _timer; + private readonly EndPointListener _epl; + private Socket? _sock; + private MemoryStream? _ms; + private byte[]? _buffer; + private HttpListenerContext _context; + private StringBuilder? _currentLine; + private RequestStream? _iStream; + private ResponseStream? _oStream; + private bool _contextBound; + private int _sTimeout = 90000; // 90k ms for first request, 15k ms from then on + private HttpListener? _lastListener; + private InputState _inputState = InputState.RequestLine; + private LineState _lineState = LineState.None; + private int _position; + private string? _errorMessage; + + public HttpConnection(Socket sock, EndPointListener epl) + { + _sock = sock; + _epl = epl; + IsSecure = epl.Secure; + LocalEndPoint = (IPEndPoint) sock.LocalEndPoint; + RemoteEndPoint = (IPEndPoint) sock.RemoteEndPoint; + + Stream = new NetworkStream(sock, false); + if (IsSecure) + { + var sslStream = new SslStream(Stream, true); + + try + { + sslStream.AuthenticateAsServer(epl.Listener.Certificate); + } + catch + { + CloseSocket(); + throw; + } + + Stream = sslStream; + } + + _timer = new Timer(OnTimeout, null, Timeout.Infinite, Timeout.Infinite); + _context = null!; // Silence warning about uninitialized field - _context will be initialized by the Init method + Init(); + } + + public int Reuses { get; private set; } + + public Stream Stream { get; } + + public IPEndPoint LocalEndPoint { get; } + + public IPEndPoint RemoteEndPoint { get; } + + public bool IsSecure { get; } + + public ListenerPrefix? Prefix { get; set; } + + public void Dispose() + { + Close(true); + + _timer.Dispose(); + _sock?.Dispose(); + _ms?.Dispose(); + _iStream?.Dispose(); + _oStream?.Dispose(); + Stream?.Dispose(); + _lastListener?.Dispose(); + } + + public async Task BeginReadRequest() + { + _buffer ??= new byte[BufferSize]; + + try + { + if (Reuses == 1) + { + _sTimeout = 15000; + } + + _ = _timer.Change(_sTimeout, Timeout.Infinite); + + var data = await Stream.ReadAsync(_buffer, 0, BufferSize).ConfigureAwait(false); + await OnReadInternal(data).ConfigureAwait(false); + } + catch + { + _ = _timer.Change(Timeout.Infinite, Timeout.Infinite); + CloseSocket(); + Unbind(); + } + } + + public RequestStream GetRequestStream(long contentLength) + { + if (_iStream == null) + { + var buffer = _ms.ToArray(); + var length = (int) _ms.Length; + _ms = null; + + _iStream = new RequestStream(Stream, buffer, _position, length - _position, contentLength); + } + + return _iStream; + } + + public ResponseStream GetResponseStream() => _oStream ??= new ResponseStream(Stream, _context.HttpListenerResponse, _context.Listener?.IgnoreWriteExceptions ?? true); + + internal void SetError(string message) => _errorMessage = message; + + internal void ForceClose() => Close(true); + + internal void Close(bool forceClose = false) + { + if (_sock != null) + { + _oStream?.Dispose(); + _oStream = null; + } + + if (_sock == null) + { + return; + } + + forceClose = forceClose + || !_context.Request.KeepAlive + || _context.Response.Headers["connection"] == "close"; + + if (!forceClose) + { + if (_context.HttpListenerRequest.FlushInput()) + { + Reuses++; + Unbind(); + Init(); + _ = BeginReadRequest(); + return; + } + } + + using (var s = _sock) + { + _sock = null; + try + { + s?.Shutdown(SocketShutdown.Both); + } + catch + { + // ignored + } + } + + Unbind(); + RemoveConnection(); + } + + private void Init() + { + _contextBound = false; + _iStream = null; + _oStream = null; + Prefix = null; + _ms = new MemoryStream(); + _position = 0; + _inputState = InputState.RequestLine; + _lineState = LineState.None; + _context = new HttpListenerContext(this); + } + + private void OnTimeout(object unused) + { + CloseSocket(); + Unbind(); + } + + private async Task OnReadInternal(int offset) + { + _ = _timer.Change(Timeout.Infinite, Timeout.Infinite); + + // Continue reading until full header is received. + // Especially important for multipart requests when the second part of the header arrives after a tiny delay + // because the web browser has to measure the content length first. + while (true) + { + try + { + await _ms.WriteAsync(_buffer, 0, offset).ConfigureAwait(false); + if (_ms.Length > 32768) + { + Close(true); + return; + } + } + catch + { + CloseSocket(); + Unbind(); + return; + } + + if (offset == 0) + { + CloseSocket(); + Unbind(); + return; + } + + if (ProcessInput(_ms)) + { + if (_errorMessage is null) + { + _context.HttpListenerRequest.FinishInitialization(); + } + + if (_errorMessage != null || !_epl.BindContext(_context)) + { + Close(true); + return; + } + + var listener = _context.Listener; + if (_lastListener != listener) + { + RemoveConnection(); + listener.AddConnection(this); + _lastListener = listener; + } + + _contextBound = true; + listener.RegisterContext(_context); + return; + } + + offset = await Stream.ReadAsync(_buffer, 0, BufferSize).ConfigureAwait(false); + } + } + + private void RemoveConnection() + { + if (_lastListener != null) + { + _lastListener.RemoveConnection(this); + } + else + { + _epl.RemoveConnection(this); + } + } + + // true -> done processing + // false -> need more input + private bool ProcessInput(MemoryStream ms) + { + var buffer = ms.ToArray(); + var len = (int)ms.Length; + var used = 0; + + while (true) + { + if (_errorMessage != null) + { + return true; + } + + if (_position >= len) + { + break; + } + + string? line; + try + { + line = ReadLine(buffer, _position, len - _position, out used); + _position += used; + } + catch + { + _errorMessage = "Bad request"; + return true; + } + + if (line == null) + { + break; + } + + if (string.IsNullOrEmpty(line)) + { + if (_inputState == InputState.RequestLine) + { + continue; + } + + _currentLine = null; + + return true; + } + + if (_inputState == InputState.RequestLine) + { + _context.HttpListenerRequest.SetRequestLine(line); + _inputState = InputState.Headers; + } + else + { + try + { + _context.HttpListenerRequest.AddHeader(line); + } + catch (Exception e) + { + _errorMessage = e.Message; + return true; + } + } + } + + if (used == len) + { + ms.SetLength(0); + _position = 0; + } + + return false; + } + + private string? ReadLine(byte[] buffer, int offset, int len, out int used) + { + _currentLine ??= new StringBuilder(128); + + var last = offset + len; + used = 0; + for (var i = offset; i < last && _lineState != LineState.Lf; i++) + { + used++; + var b = buffer[i]; + + switch (b) + { + case 13: + _lineState = LineState.Cr; + break; + case 10: + _lineState = LineState.Lf; + break; + default: + _ = _currentLine.Append((char)b); + break; + } + } + + if (_lineState != LineState.Lf) + { + return null; + } + + _lineState = LineState.None; + var result = _currentLine.ToString(); + _currentLine.Length = 0; + return result; + } + + private void Unbind() + { + if (!_contextBound) + { + return; + } + + _epl.UnbindContext(_context); + _contextBound = false; + } + + private void CloseSocket() + { + if (_sock == null) + { + return; + } + + try + { + _sock.Dispose(); + } + finally + { + _sock = null; + } + + RemoveConnection(); + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Net/Internal/HttpListenerContext.cs b/Vendor/EmbedIO-3.5.2/Net/Internal/HttpListenerContext.cs new file mode 100644 index 0000000..134493c --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Net/Internal/HttpListenerContext.cs @@ -0,0 +1,129 @@ +using System; +using System.Collections.Generic; +using System.Net; +using System.Security.Principal; +using System.Threading; +using System.Threading.Tasks; +using EmbedIO.Authentication; +using EmbedIO.Internal; +using EmbedIO.Routing; +using EmbedIO.Sessions; +using EmbedIO.Utilities; +using EmbedIO.WebSockets; +using EmbedIO.WebSockets.Internal; +using Swan.Logging; + +namespace EmbedIO.Net.Internal +{ + // Provides access to the request and response objects used by the HttpListener class. + internal sealed class HttpListenerContext : IHttpContextImpl + { + private readonly Lazy> _items = new (() => new Dictionary(), true); + + private readonly TimeKeeper _ageKeeper = new (); + + private readonly Stack> _closeCallbacks = new (); + + private bool _closed; + + internal HttpListenerContext(HttpConnection cnc) + { + Connection = cnc; + HttpListenerRequest = new HttpListenerRequest(this); + User = Auth.NoUser; + HttpListenerResponse = new HttpListenerResponse(this); + Id = UniqueIdGenerator.GetNext(); + LocalEndPoint = Request.LocalEndPoint; + RemoteEndPoint = Request.RemoteEndPoint; + Route = RouteMatch.None; + Session = SessionProxy.None; + } + + public string Id { get; } + + public CancellationToken CancellationToken { get; set; } + + public long Age => _ageKeeper.ElapsedTime; + + public IPEndPoint LocalEndPoint { get; } + + public IPEndPoint RemoteEndPoint { get; } + + public IHttpRequest Request => HttpListenerRequest; + + public RouteMatch Route { get; set; } + + public string RequestedPath => Route.SubPath ?? string.Empty; // It will never be empty, because modules are matched via base routes - this is just to silence a warning. + + public IHttpResponse Response => HttpListenerResponse; + + public IPrincipal User { get; set; } + + public ISessionProxy Session { get; set; } + + public bool SupportCompressedRequests { get; set; } + + public IDictionary Items => _items.Value; + + public bool IsHandled { get; private set; } + + public MimeTypeProviderStack MimeTypeProviders { get; } = new MimeTypeProviderStack(); + + internal HttpListenerRequest HttpListenerRequest { get; } + + internal HttpListenerResponse HttpListenerResponse { get; } + + internal HttpListener? Listener { get; set; } + + internal HttpConnection Connection { get; } + + public void SetHandled() => IsHandled = true; + + public void OnClose(Action callback) + { + if (_closed) + { + throw new InvalidOperationException("HTTP context has already been closed."); + } + + _closeCallbacks.Push(Validate.NotNull(nameof(callback), callback)); + } + + public void Close() + { + _closed = true; + + // Always close the response stream no matter what. + Response.Close(); + + foreach (var callback in _closeCallbacks) + { + try + { + callback(this); + } + catch (Exception e) + { + e.Log("HTTP context", $"[{Id}] Exception thrown by a HTTP context close callback."); + } + } + } + + public async Task AcceptWebSocketAsync( + IEnumerable requestedProtocols, + string acceptedProtocol, + int receiveBufferSize, + TimeSpan keepAliveInterval, + CancellationToken cancellationToken) + { + var webSocket = await WebSocket.AcceptAsync(this, acceptedProtocol).ConfigureAwait(false); + return new WebSocketContext(this, WebSocket.SupportedVersion, requestedProtocols, acceptedProtocol, webSocket, cancellationToken); + } + + public string GetMimeType(string extension) + => MimeTypeProviders.GetMimeType(extension); + + public bool TryDetermineCompression(string mimeType, out bool preferCompression) + => MimeTypeProviders.TryDetermineCompression(mimeType, out preferCompression); + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Net/Internal/HttpListenerPrefixCollection.cs b/Vendor/EmbedIO-3.5.2/Net/Internal/HttpListenerPrefixCollection.cs new file mode 100644 index 0000000..6248b6f --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Net/Internal/HttpListenerPrefixCollection.cs @@ -0,0 +1,30 @@ +using System.Collections.Generic; + +namespace EmbedIO.Net.Internal +{ + internal class HttpListenerPrefixCollection : List + { + private readonly HttpListener _listener; + + internal HttpListenerPrefixCollection(HttpListener listener) + { + _listener = listener; + } + + public new void Add(string uriPrefix) + { + ListenerPrefix.CheckUri(uriPrefix); + if (Contains(uriPrefix)) + { + return; + } + + base.Add(uriPrefix); + + if (_listener.IsListening) + { + EndPointManager.AddPrefix(uriPrefix, _listener); + } + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Net/Internal/HttpListenerRequest.cs b/Vendor/EmbedIO-3.5.2/Net/Internal/HttpListenerRequest.cs new file mode 100644 index 0000000..548f44d --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Net/Internal/HttpListenerRequest.cs @@ -0,0 +1,497 @@ +using System; +using System.Collections.Specialized; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Net; +using System.Security.Cryptography.X509Certificates; +using System.Text; +using EmbedIO.Internal; +using EmbedIO.Utilities; + +namespace EmbedIO.Net.Internal +{ + /// + /// Represents an HTTP Listener Request. + /// + internal sealed partial class HttpListenerRequest : IHttpRequest + { + private static readonly byte[] HttpStatus100 = WebServer.DefaultEncoding.GetBytes("HTTP/1.1 100 Continue\r\n\r\n"); + private static readonly char[] Separators = { ' ' }; + + private readonly HttpConnection _connection; + private CookieList? _cookies; + private Stream? _inputStream; + private bool _kaSet; + private bool _keepAlive; + + internal HttpListenerRequest(HttpListenerContext context) + { + _connection = context.Connection; + } + + /// + /// Gets the MIME accept types. + /// + /// + /// The accept types. + /// + public string[] AcceptTypes { get; private set; } = Array.Empty(); + + /// + public Encoding ContentEncoding + { + get + { + if (!HasEntityBody || ContentType == null) + { + return WebServer.DefaultEncoding; + } + + var charSet = HeaderUtility.GetCharset(ContentType); + if (string.IsNullOrEmpty(charSet)) + { + return WebServer.DefaultEncoding; + } + + try + { + return Encoding.GetEncoding(charSet); + } + catch (ArgumentException) + { + return WebServer.DefaultEncoding; + } + } + } + + /// + public long ContentLength64 => long.TryParse(Headers[HttpHeaderNames.ContentLength], out var val) ? val : 0; + + /// + public string ContentType => Headers[HttpHeaderNames.ContentType]; + + /// + public ICookieCollection Cookies => _cookies ??= new CookieList(); + + /// + public bool HasEntityBody => ContentLength64 > 0; + + /// + public NameValueCollection Headers { get; } = new (); + + /// + public string HttpMethod { get; private set; } = string.Empty; + + /// + public HttpVerbs HttpVerb { get; private set; } + + /// + public Stream InputStream => _inputStream ??= ContentLength64 > 0 ? _connection.GetRequestStream(ContentLength64) : Stream.Null; + + /// + public bool IsAuthenticated => false; + + /// + public bool IsLocal => LocalEndPoint.Address?.Equals(RemoteEndPoint.Address) ?? true; + + /// + public bool IsSecureConnection => _connection.IsSecure; + + /// + public bool KeepAlive + { + get + { + if (!_kaSet) + { + var cnc = Headers.GetValues(HttpHeaderNames.Connection); + _keepAlive = ProtocolVersion < HttpVersion.Version11 + ? cnc != null && cnc.Length == 1 && string.Compare(cnc[0], "keep-alive", StringComparison.OrdinalIgnoreCase) == 0 + : cnc == null || cnc.All(s => string.Compare(s, "close", StringComparison.OrdinalIgnoreCase) != 0); + + _kaSet = true; + } + + return _keepAlive; + } + } + + /// + public IPEndPoint LocalEndPoint => _connection.LocalEndPoint; + + /// + public Version ProtocolVersion { get; private set; } = HttpVersion.Version11; + + /// + public NameValueCollection QueryString { get; } = new (); + + /// + public string RawUrl { get; private set; } = string.Empty; + + /// + public IPEndPoint RemoteEndPoint => _connection.RemoteEndPoint; + + /// + public Uri Url { get; private set; } = WebServer.NullUri; + + /// + public Uri? UrlReferrer { get; private set; } + + /// + public string UserAgent => Headers[HttpHeaderNames.UserAgent]; + + public string UserHostAddress => LocalEndPoint.ToString(); + + public string UserHostName => Headers[HttpHeaderNames.Host]; + + public string[] UserLanguages { get; private set; } = Array.Empty(); + + /// + public bool IsWebSocketRequest + => HttpVerb == HttpVerbs.Get + && ProtocolVersion >= HttpVersion.Version11 + && Headers.Contains(HttpHeaderNames.Upgrade, "websocket") + && Headers.Contains(HttpHeaderNames.Connection, "Upgrade"); + + internal void SetRequestLine(string req) + { + const string forbiddenMethodChars = "\"(),/:;<=>?@[\\]{}"; + + var parts = req.Split(Separators, 3); + if (parts.Length != 3) + { + _connection.SetError("Invalid request line (parts)."); + return; + } + + HttpMethod = parts[0]; + foreach (var c in HttpMethod) + { + // See https://tools.ietf.org/html/rfc7230#section-3.2.6 + // for the list of allowed characters + if (c < 32 || c >= 127 || forbiddenMethodChars.IndexOf(c) >= 0) + { + _connection.SetError("(Invalid verb)"); + return; + } + } + + HttpVerb = IsKnownHttpMethod(HttpMethod, out var verb) ? verb : HttpVerbs.Any; + + RawUrl = parts[1]; + if (parts[2].Length != 8 || !parts[2].StartsWith("HTTP/", StringComparison.Ordinal)) + { + _connection.SetError("Invalid request line (missing HTTP version)."); + return; + } + + try + { + ProtocolVersion = new Version(parts[2].Substring(5)); + + if (ProtocolVersion.Major < 1) + { + throw new InvalidOperationException(); + } + } + catch + { + _connection.SetError("Invalid request line (could not parse HTTP version)."); + } + } + + internal void FinishInitialization() + { + var host = UserHostName; + if (ProtocolVersion > HttpVersion.Version10 && string.IsNullOrEmpty(host)) + { + _connection.SetError("Invalid host name"); + return; + } + + var rawUri = UriUtility.StringToAbsoluteUri(RawUrl.ToLowerInvariant()); + var path = rawUri?.PathAndQuery ?? RawUrl; + + if (string.IsNullOrEmpty(host)) + { + host = rawUri?.Host ?? UserHostAddress; + } + + var colonPos = host.LastIndexOf(':'); + var closedSquareBracketPos = host.LastIndexOf(']'); + if (colonPos >= 0 && closedSquareBracketPos < colonPos) + { + host = host.Substring(0, colonPos); + } + + // var baseUri = $"{(IsSecureConnection ? "https" : "http")}://{host}:{LocalEndPoint.Port}"; + var baseUri = $"http://{host}:{LocalEndPoint.Port}"; + + if (!Uri.TryCreate(baseUri + path, UriKind.Absolute, out var url)) + { + _connection.SetError(WebUtility.HtmlEncode($"Invalid url: {baseUri}{path}")); + return; + } + + Url = url; + InitializeQueryString(Url.Query); + + if (ContentLength64 == 0 && (HttpVerb == HttpVerbs.Post || HttpVerb == HttpVerbs.Put)) + { + return; + } + + if (string.Compare(Headers["Expect"], "100-continue", StringComparison.OrdinalIgnoreCase) == 0) + { + _connection.GetResponseStream().InternalWrite(HttpStatus100, 0, HttpStatus100.Length); + } + } + + internal void AddHeader(string header) + { + var colon = header.IndexOf(':'); + if (colon == -1 || colon == 0) + { + _connection.SetError("Bad Request"); + return; + } + + var name = header.Substring(0, colon).Trim(); + var val = header.Substring(colon + 1).Trim(); + + Headers.Set(name, val); + + switch (name.ToLowerInvariant()) + { + case "accept-language": + UserLanguages = val.SplitByComma(); // yes, only split with a ',' + break; + case "accept": + AcceptTypes = val.SplitByComma(); // yes, only split with a ',' + break; + case "content-length": + Headers[HttpHeaderNames.ContentLength] = val.Trim(); + + if (ContentLength64 < 0) + { + _connection.SetError("Invalid Content-Length."); + } + + break; + case "referer": + try + { + UrlReferrer = new Uri(val); + } + catch + { + UrlReferrer = null; + } + + break; + case "cookie": + ParseCookies(val); + + break; + } + } + + // returns true is the stream could be reused. + internal bool FlushInput() + { + if (!HasEntityBody) + { + return true; + } + + var length = 2048; + if (ContentLength64 > 0) + { + length = (int)Math.Min(ContentLength64, length); + } + + var bytes = new byte[length]; + + while (true) + { + try + { + if (InputStream.Read(bytes, 0, length) <= 0) + { + return true; + } + } + catch (ObjectDisposedException) + { + _inputStream = null; + return true; + } + catch + { + return false; + } + } + } + + // Optimized for the following list of methods: + // "DELETE", "GET", "HEAD", "OPTIONS", "PATCH", "POST", "PUT" + // ***NOTE***: The verb parameter is NOT VALID upon exit if false is returned. + private static bool IsKnownHttpMethod(string method, out HttpVerbs verb) + { + switch (method.Length) + { + case 3: + switch (method[0]) + { + case 'G': + verb = HttpVerbs.Get; + return method[1] == 'E' && method[2] == 'T'; + + case 'P': + verb = HttpVerbs.Put; + return method[1] == 'U' && method[2] == 'T'; + + default: + verb = HttpVerbs.Any; + return false; + } + + case 4: + switch (method[0]) + { + case 'H': + verb = HttpVerbs.Head; + return method[1] == 'E' && method[2] == 'A' && method[3] == 'D'; + + case 'P': + verb = HttpVerbs.Post; + return method[1] == 'O' && method[2] == 'S' && method[3] == 'T'; + + default: + verb = HttpVerbs.Any; + return false; + } + + case 5: + verb = HttpVerbs.Patch; + return method[0] == 'P' + && method[1] == 'A' + && method[2] == 'T' + && method[3] == 'C' + && method[4] == 'H'; + + case 6: + verb = HttpVerbs.Delete; + return method[0] == 'D' + && method[1] == 'E' + && method[2] == 'L' + && method[3] == 'E' + && method[4] == 'T' + && method[5] == 'E'; + + case 7: + verb = HttpVerbs.Options; + return method[0] == 'O' + && method[1] == 'P' + && method[2] == 'T' + && method[3] == 'I' + && method[4] == 'O' + && method[5] == 'N' + && method[6] == 'S'; + + default: + verb = HttpVerbs.Any; + return false; + } + } + + private void ParseCookies(string val) + { + _cookies ??= new CookieList(); + + var cookieStrings = val.SplitByAny(';', ',') + .Where(x => !string.IsNullOrEmpty(x)); + Cookie? current = null; + var version = 0; + + foreach (var str in cookieStrings) + { + if (str.StartsWith("$Version", StringComparison.Ordinal)) + { + version = int.Parse(str.Substring(str.IndexOf('=') + 1).Unquote(), CultureInfo.InvariantCulture); + } + else if (str.StartsWith("$Path", StringComparison.Ordinal) && current != null) + { + current.Path = str.Substring(str.IndexOf('=') + 1).Trim(); + } + else if (str.StartsWith("$Domain", StringComparison.Ordinal) && current != null) + { + current.Domain = str.Substring(str.IndexOf('=') + 1).Trim(); + } + else if (str.StartsWith("$Port", StringComparison.Ordinal) && current != null) + { + current.Port = str.Substring(str.IndexOf('=') + 1).Trim(); + } + else + { + if (current != null) + { + _cookies.Add(current); + } + + current = new Cookie(); + var idx = str.IndexOf('='); + if (idx > 0) + { + current.Name = str.Substring(0, idx).Trim(); + current.Value = str.Substring(idx + 1).Trim(); + } + else + { + current.Name = str.Trim(); + current.Value = string.Empty; + } + + current.Version = version; + } + } + + if (current != null) + { + _cookies.Add(current); + } + } + + private void InitializeQueryString(string query) + { + if (string.IsNullOrEmpty(query)) + { + return; + } + + if (query[0] == '?') + { + query = query.Substring(1); + } + + var components = query.Split('&'); + + foreach (var kv in components) + { + var pos = kv.IndexOf('='); + if (pos == -1) + { + QueryString.Add(null, WebUtility.UrlDecode(kv)); + } + else + { + var key = WebUtility.UrlDecode(kv.Substring(0, pos)); + var val = WebUtility.UrlDecode(kv.Substring(pos + 1)); + + QueryString.Add(key, val); + } + } + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Net/Internal/HttpListenerResponse.cs b/Vendor/EmbedIO-3.5.2/Net/Internal/HttpListenerResponse.cs new file mode 100644 index 0000000..be8703a --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Net/Internal/HttpListenerResponse.cs @@ -0,0 +1,411 @@ +using System; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Net; +using System.Text; +using EmbedIO.Utilities; + +namespace EmbedIO.Net.Internal +{ + /// + /// Represents an HTTP Listener's response. + /// + /// + internal sealed class HttpListenerResponse : IHttpResponse, IDisposable + { + private readonly HttpConnection _connection; + private readonly HttpListenerRequest _request; + private readonly string _id; + private bool _disposed; + private string _contentType = MimeType.Html; // Same default value as Microsoft's implementation + private CookieList? _cookies; + private bool _keepAlive; + private ResponseStream? _outputStream; + private int _statusCode = 200; + private bool _chunked; + + internal HttpListenerResponse(HttpListenerContext context) + { + _request = context.HttpListenerRequest; + _connection = context.Connection; + _id = context.Id; + _keepAlive = context.Request.KeepAlive; + } + + /// + public Encoding? ContentEncoding { get; set; } = WebServer.DefaultEncoding; + + /// + /// This instance has been disposed. + /// This property is being set and headers were already sent. + public long ContentLength64 + { + get => Headers.ContainsKey(HttpHeaderNames.ContentLength) && long.TryParse(Headers[HttpHeaderNames.ContentLength], out var val) ? val : 0; + + set + { + EnsureCanChangeHeaders(); + if (value < 0) + { + throw new ArgumentOutOfRangeException(nameof(value), "Must be >= 0"); + } + + Headers[HttpHeaderNames.ContentLength] = value.ToString(CultureInfo.InvariantCulture); + } + } + + /// + /// This instance has been disposed. + /// This property is being set and headers were already sent. + /// This property is being set to . + /// This property is being set to the empty string. + public string ContentType + { + get => _contentType; + + set + { + EnsureCanChangeHeaders(); + _contentType = Validate.NotNullOrEmpty(nameof(value), value); + } + } + + /// + public ICookieCollection Cookies => CookieCollection; + + /// + public WebHeaderCollection Headers { get; } = new WebHeaderCollection(); + + /// + public bool KeepAlive + { + get => _keepAlive; + + set + { + EnsureCanChangeHeaders(); + _keepAlive = value; + } + } + + /// + public Stream OutputStream => _outputStream ??= _connection.GetResponseStream(); + + /// + public Version ProtocolVersion => _request.ProtocolVersion; + + /// + /// This instance has been disposed. + /// This property is being set and headers were already sent. + public bool SendChunked + { + get => _chunked; + + set + { + EnsureCanChangeHeaders(); + _chunked = value; + } + } + + /// + /// This instance has been disposed. + /// This property is being set and headers were already sent. + public int StatusCode + { + get => _statusCode; + + set + { + EnsureCanChangeHeaders(); + if (value < 100 || value > 999) + { + throw new ArgumentOutOfRangeException(nameof(StatusCode), "StatusCode must be between 100 and 999."); + } + + _statusCode = value; + StatusDescription = HttpListenerResponseHelper.GetStatusDescription(value); + } + } + + /// + public string StatusDescription { get; set; } = "OK"; + + internal CookieList CookieCollection + { + get => _cookies ??= new CookieList(); + set => _cookies = value; + } + + internal bool HeadersSent { get; set; } + + void IDisposable.Dispose() => Close(true); + + public void Close() + { + if (!_disposed) + { + Close(false); + } + } + + /// + public void SetCookie(Cookie cookie) + { + if (cookie == null) + { + throw new ArgumentNullException(nameof(cookie)); + } + + if (_cookies != null) + { + if (_cookies.Any(c => cookie.Name == c.Name && cookie.Domain == c.Domain && cookie.Path == c.Path)) + { + throw new ArgumentException("The cookie already exists."); + } + } + else + { + _cookies = new CookieList(); + } + + _cookies.Add(cookie); + } + + internal MemoryStream SendHeaders(bool closing) + { + if (_contentType != null) + { + var contentTypeValue = _contentType.IndexOf("charset=", StringComparison.Ordinal) == -1 && ContentEncoding is not null + ? $"{_contentType}; charset={ContentEncoding.WebName}" + : _contentType; + + Headers.Add(HttpHeaderNames.ContentType, contentTypeValue); + } + + if (Headers[HttpHeaderNames.Server] == null) + { + Headers.Add(HttpHeaderNames.Server, WebServer.Signature); + } + + if (Headers[HttpHeaderNames.Date] == null) + { + Headers.Add(HttpHeaderNames.Date, HttpDate.Format(DateTime.UtcNow)); + } + + // HTTP did not support chunked transfer encoding before version 1.1; + // besides, there's no point in setting transfer encoding at all without a request body. + if (closing || ProtocolVersion < HttpVersion.Version11) + { + _chunked = false; + } + + // Was content length set to a valid value, AND chunked encoding not set? + // Note that this does not mean that a response body _will_ be sent + // as this could be the response to a HEAD request. + var haveContentLength = !_chunked + && Headers.ContainsKey(HttpHeaderNames.ContentLength) + && long.TryParse(Headers[HttpHeaderNames.ContentLength], NumberStyles.None, CultureInfo.InvariantCulture, out var contentLength) + && contentLength >= 0L; + + if (!haveContentLength) + { + // Content length could have been set to an invalid value (e.g. "-1") + // so we must either force it to 0, or remove the header completely. + if (closing) + { + // Content length was not explicitly set to a valid value, + // and there is no request body. + Headers[HttpHeaderNames.ContentLength] = "0"; + } + else + { + // Content length was not explicitly set to a valid value, + // and we're going to send a request body. + // - Remove possibly invalid Content-Length header + // - Enable chunked transfer encoding for HTTP 1.1 + Headers.Remove(HttpHeaderNames.ContentLength); + if (ProtocolVersion >= HttpVersion.Version11) + { + _chunked = true; + } + } + } + + if (_chunked) + { + Headers.Add(HttpHeaderNames.TransferEncoding, "chunked"); + } + + //// Apache forces closing the connection for these status codes: + //// HttpStatusCode.BadRequest 400 + //// HttpStatusCode.RequestTimeout 408 + //// HttpStatusCode.LengthRequired 411 + //// HttpStatusCode.RequestEntityTooLarge 413 + //// HttpStatusCode.RequestUriTooLong 414 + //// HttpStatusCode.InternalServerError 500 + //// HttpStatusCode.ServiceUnavailable 503 + var reuses = _connection.Reuses; + var keepAlive = _statusCode switch { + 400 => false, + 408 => false, + 411 => false, + 413 => false, + 414 => false, + 500 => false, + 503 => false, + _ => _keepAlive && reuses < 100 + }; + + _keepAlive = keepAlive; + if (keepAlive) + { + Headers.Add(HttpHeaderNames.Connection, "keep-alive"); + if (ProtocolVersion >= HttpVersion.Version11) + { + Headers.Add(HttpHeaderNames.KeepAlive, $"timeout=15,max={100 - reuses}"); + } + } + else + { + Headers.Add(HttpHeaderNames.Connection, "close"); + } + + return WriteHeaders(); + } + + private static void AppendSetCookieHeader(StringBuilder sb, Cookie cookie) + { + if (cookie.Name.Length == 0) + { + return; + } + + _ = sb.Append("Set-Cookie: "); + + if (cookie.Version > 0) + { + _ = sb.Append("Version=").Append(cookie.Version).Append("; "); + } + + _ = sb + .Append(cookie.Name) + .Append('=') + .Append(cookie.Value); + + if (cookie.Expires != DateTime.MinValue) + { + _ = sb + .Append("; Expires=") + .Append(HttpDate.Format(cookie.Expires)); + } + + if (!string.IsNullOrEmpty(cookie.Path)) + { + _ = sb.Append("; Path=").Append(QuotedString(cookie, cookie.Path)); + } + + if (!string.IsNullOrEmpty(cookie.Domain)) + { + _ = sb.Append("; Domain=").Append(QuotedString(cookie, cookie.Domain)); + } + + if (!string.IsNullOrEmpty(cookie.Port)) + { + _ = sb.Append("; Port=").Append(cookie.Port); + } + + if (cookie.Secure) + { + _ = sb.Append("; Secure"); + } + + if (cookie.HttpOnly) + { + _ = sb.Append("; HttpOnly"); + } + + _ = sb.Append("\r\n"); + } + + private static string QuotedString(Cookie cookie, string value) + => cookie.Version == 0 || value.IsToken() ? value : "\"" + value.Replace("\"", "\\\"") + "\""; + + private void Close(bool force) + { + _disposed = true; + + _connection.Close(force); + } + + private string GetHeaderData() + { + var sb = new StringBuilder() + .Append("HTTP/") + .Append(ProtocolVersion) + .Append(' ') + .Append(_statusCode) + .Append(' ') + .Append(StatusDescription) + .Append("\r\n"); + + foreach (var key in Headers.AllKeys.Where(x => x != "Set-Cookie")) + { + _ = sb + .Append(key) + .Append(": ") + .Append(Headers[key]) + .Append("\r\n"); + } + + if (_cookies != null) + { + foreach (var cookie in _cookies) + { + AppendSetCookieHeader(sb, cookie); + } + } + + if (Headers.ContainsKey(HttpHeaderNames.SetCookie)) + { + foreach (var cookie in CookieList.Parse(Headers[HttpHeaderNames.SetCookie])) + { + AppendSetCookieHeader(sb, cookie); + } + } + + return sb.Append("\r\n").ToString(); + } + + private MemoryStream WriteHeaders() + { + var stream = new MemoryStream(); + var data = WebServer.DefaultEncoding.GetBytes(GetHeaderData()); + var preamble = WebServer.DefaultEncoding.GetPreamble(); + stream.Write(preamble, 0, preamble.Length); + stream.Write(data, 0, data.Length); + + _outputStream ??= _connection.GetResponseStream(); + + // Assumes that the ms was at position 0 + stream.Position = preamble.Length; + HeadersSent = true; + + return stream; + } + + private void EnsureCanChangeHeaders() + { + if (_disposed) + { + throw new ObjectDisposedException(_id); + } + + if (HeadersSent) + { + throw new InvalidOperationException("Header values cannot be changed after headers are sent."); + } + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Net/Internal/HttpListenerResponseHelper.cs b/Vendor/EmbedIO-3.5.2/Net/Internal/HttpListenerResponseHelper.cs new file mode 100644 index 0000000..944a1b6 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Net/Internal/HttpListenerResponseHelper.cs @@ -0,0 +1,55 @@ +namespace EmbedIO.Net.Internal +{ + internal static class HttpListenerResponseHelper + { + internal static string GetStatusDescription(int code) => code switch { + 100 => "Continue", + 101 => "Switching Protocols", + 102 => "Processing", + 200 => "OK", + 201 => "Created", + 202 => "Accepted", + 203 => "Non-Authoritative Information", + 204 => "No Content", + 205 => "Reset Content", + 206 => "Partial Content", + 207 => "Multi-Status", + 300 => "Multiple Choices", + 301 => "Moved Permanently", + 302 => "Found", + 303 => "See Other", + 304 => "Not Modified", + 305 => "Use Proxy", + 307 => "Temporary Redirect", + 400 => "Bad Request", + 401 => "Unauthorized", + 402 => "Payment Required", + 403 => "Forbidden", + 404 => "Not Found", + 405 => "Method Not Allowed", + 406 => "Not Acceptable", + 407 => "Proxy Authentication Required", + 408 => "Request Timeout", + 409 => "Conflict", + 410 => "Gone", + 411 => "Length Required", + 412 => "Precondition Failed", + 413 => "Request Entity Too Large", + 414 => "Request-Uri Too Long", + 415 => "Unsupported Media Type", + 416 => "Requested Range Not Satisfiable", + 417 => "Expectation Failed", + 422 => "Unprocessable Entity", + 423 => "Locked", + 424 => "Failed Dependency", + 500 => "Internal Server Error", + 501 => "Not Implemented", + 502 => "Bad Gateway", + 503 => "Service Unavailable", + 504 => "Gateway Timeout", + 505 => "Http Version Not Supported", + 507 => "Insufficient Storage", + _ => string.Empty + }; + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Net/Internal/ListenerPrefix.cs b/Vendor/EmbedIO-3.5.2/Net/Internal/ListenerPrefix.cs new file mode 100644 index 0000000..7bd2f1e --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Net/Internal/ListenerPrefix.cs @@ -0,0 +1,35 @@ +using System; + +namespace EmbedIO.Net.Internal +{ + internal sealed class ListenerPrefix + { + public ListenerPrefix(string uri) + { + var parsedUri = ListenerUri.Parse(uri); + Secure = parsedUri.Secure; + Host = parsedUri.Host; + Port = parsedUri.Port; + Path = parsedUri.Path; + } + + public HttpListener? Listener { get; set; } + + public bool Secure { get; } + + public string Host { get; } + + public int Port { get; } + + public string Path { get; } + + public static void CheckUri(string uri) + { + _ = ListenerUri.Parse(uri); + } + + public bool IsValid() => Path.IndexOf('%') == -1 && Path.IndexOf("//", StringComparison.Ordinal) == -1; + + public override string ToString() => $"{Host}:{Port} ({(Secure ? "Secure" : "Insecure")}"; + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Net/Internal/ListenerUri.cs b/Vendor/EmbedIO-3.5.2/Net/Internal/ListenerUri.cs new file mode 100644 index 0000000..e89080d --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Net/Internal/ListenerUri.cs @@ -0,0 +1,91 @@ +using System; + +namespace EmbedIO.Net.Internal +{ + internal class ListenerUri + { + private ListenerUri(bool secure, + string host, + int port, + string path) + { + Secure = secure; + Host = host; + Port = port; + Path = path; + } + + public bool Secure { get; private set; } + + public string Host { get; private set; } + + public int Port { get; private set; } + + public string Path { get; private set; } + + public static ListenerUri Parse(string uri) + { + bool secure; + int port; + int parsingPosition; + if (uri.StartsWith("http://")) + { + secure = false; + port = 80; + parsingPosition = "http://".Length; + } + else if (uri.StartsWith("https://")) + { + secure = true; + port = 443; + parsingPosition = "https://".Length; + } + else + { + throw new Exception("Only 'http' and 'https' schemes are supported."); + } + + var startOfPath = uri.IndexOf('/', parsingPosition); + if (startOfPath == -1) + { + throw new ArgumentException("Path should end in '/'."); + } + + var hostWithPort = uri.Substring(parsingPosition, startOfPath - parsingPosition); + + var startOfPortWithColon = hostWithPort.LastIndexOf(':'); + if (startOfPortWithColon > -1) + { + startOfPortWithColon += parsingPosition; + } + + var endOfIpV6 = hostWithPort.LastIndexOf(']'); + if (endOfIpV6 > -1) + { + endOfIpV6 += parsingPosition; + } + + if (endOfIpV6 > startOfPortWithColon) + { + startOfPortWithColon = -1; + } + + if (startOfPortWithColon != -1 && startOfPortWithColon < startOfPath) + { + if (!int.TryParse(uri.Substring(startOfPortWithColon + 1, startOfPath - startOfPortWithColon - 1), out port) || port <= 0 || port >= 65535) + { + throw new ArgumentException("Invalid port."); + } + } + + var host = uri.Substring(parsingPosition, (startOfPortWithColon == -1 ? startOfPath : startOfPortWithColon) - parsingPosition); + var path = uri.Substring(startOfPath); + if (!path.EndsWith("/")) + { + throw new ArgumentException("Path should end in '/'."); + } + + return new ListenerUri(secure, host, port, path); + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Net/Internal/NetExtensions.cs b/Vendor/EmbedIO-3.5.2/Net/Internal/NetExtensions.cs new file mode 100644 index 0000000..4d80bd0 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Net/Internal/NetExtensions.cs @@ -0,0 +1,44 @@ +using System; +using System.Linq; +using Swan; + +namespace EmbedIO.Net.Internal +{ + /// + /// Represents some System.NET custom extensions. + /// + internal static class NetExtensions + { + internal static byte[] ToByteArray(this ushort value, Endianness order) + { + var bytes = BitConverter.GetBytes(value); + if (!order.IsHostOrder()) + { + Array.Reverse(bytes); + } + + return bytes; + } + + internal static byte[] ToByteArray(this ulong value, Endianness order) + { + var bytes = BitConverter.GetBytes(value); + if (!order.IsHostOrder()) + { + Array.Reverse(bytes); + } + + return bytes; + } + + internal static byte[] ToHostOrder(this byte[] source, Endianness sourceOrder) + => source.Length < 1 ? source + : sourceOrder.IsHostOrder() ? source + : source.Reverse().ToArray(); + + // true: !(true ^ true) or !(false ^ false) + // false: !(true ^ false) or !(false ^ true) + private static bool IsHostOrder(this Endianness order) + => !(BitConverter.IsLittleEndian ^ (order == Endianness.Little)); + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Net/Internal/RequestStream.cs b/Vendor/EmbedIO-3.5.2/Net/Internal/RequestStream.cs new file mode 100644 index 0000000..9e7fbd6 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Net/Internal/RequestStream.cs @@ -0,0 +1,143 @@ +using System; +using System.IO; +using System.Runtime.InteropServices; + +namespace EmbedIO.Net.Internal +{ + internal class RequestStream : Stream + { + private readonly Stream _stream; + private readonly byte[] _buffer; + private int _offset; + private int _length; + private long _remainingBody; + + internal RequestStream(Stream stream, byte[] buffer, int offset, int length, long contentLength = -1) + { + _stream = stream; + _buffer = buffer; + _offset = offset; + _length = length; + _remainingBody = contentLength; + } + + public override bool CanRead => true; + + public override bool CanSeek => false; + + public override bool CanWrite => false; + + public override long Length => throw new NotSupportedException(); + + public override long Position + { + get => throw new NotSupportedException(); + set => throw new NotSupportedException(); + } + + public override void Flush() + { + } + + public override int Read([In, Out] byte[] buffer, int offset, int count) + { + // Call FillFromBuffer to check for buffer boundaries even when remaining_body is 0 + var nread = FillFromBuffer(buffer, offset, count); + + if (nread == -1) + { + // No more bytes available (Content-Length) + return 0; + } + + if (nread > 0) + { + return nread; + } + + nread = _stream.Read(buffer, offset, count); + + if (nread > 0 && _remainingBody > 0) + { + _remainingBody -= nread; + } + + return nread; + } + + public override long Seek(long offset, SeekOrigin origin) => throw new NotSupportedException(); + + public override void SetLength(long value) => throw new NotSupportedException(); + + public override void Write(byte[] buffer, int offset, int count) => throw new NotSupportedException(); + + // Returns 0 if we can keep reading from the base stream, + // > 0 if we read something from the buffer. + // -1 if we had a content length set and we finished reading that many bytes. + private int FillFromBuffer(byte[] buffer, int off, int count) + { + if (buffer == null) + { + throw new ArgumentNullException(nameof(buffer)); + } + + if (off < 0) + { + throw new ArgumentOutOfRangeException(nameof(off), "< 0"); + } + + if (count < 0) + { + throw new ArgumentOutOfRangeException(nameof(count), "< 0"); + } + + var len = buffer.Length; + + if (off > len) + { + throw new ArgumentException("destination offset is beyond array size"); + } + + if (off > len - count) + { + throw new ArgumentException("Reading would overrun buffer"); + } + + if (_remainingBody == 0) + { + return -1; + } + + if (_length == 0) + { + return 0; + } + + var size = Math.Min(_length, count); + if (_remainingBody > 0) + { + size = (int) Math.Min(size, _remainingBody); + } + + if (_offset > _buffer.Length - size) + { + size = Math.Min(size, _buffer.Length - _offset); + } + + if (size == 0) + { + return 0; + } + + Buffer.BlockCopy(_buffer, _offset, buffer, off, size); + _offset += size; + _length -= size; + if (_remainingBody > 0) + { + _remainingBody -= size; + } + + return size; + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Net/Internal/ResponseStream.cs b/Vendor/EmbedIO-3.5.2/Net/Internal/ResponseStream.cs new file mode 100644 index 0000000..884d305 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Net/Internal/ResponseStream.cs @@ -0,0 +1,190 @@ +using System; +using System.IO; +using System.Runtime.InteropServices; +using System.Text; + +namespace EmbedIO.Net.Internal +{ + internal class ResponseStream : Stream + { + private static readonly byte[] CrLf = { 13, 10 }; + private readonly object _headersSyncRoot = new (); + + private readonly Stream _stream; + private readonly HttpListenerResponse _response; + private readonly bool _ignoreErrors; + private bool _disposed; + private bool _trailerSent; + + internal ResponseStream(Stream stream, HttpListenerResponse response, bool ignoreErrors) + { + _response = response; + _ignoreErrors = ignoreErrors; + _stream = stream; + } + + /// + public override bool CanRead => false; + + /// + public override bool CanSeek => false; + + /// + public override bool CanWrite => true; + + /// + public override long Length => throw new NotSupportedException(); + + /// + public override long Position + { + get => throw new NotSupportedException(); + set => throw new NotSupportedException(); + } + + /// + public override void Flush() + { + } + + /// + public override void Write(byte[] buffer, int offset, int count) + { + if (_disposed) + { + throw new ObjectDisposedException(nameof(ResponseStream)); + } + + byte[] bytes; + var ms = GetHeaders(false); + var chunked = _response.SendChunked; + + if (ms != null) + { + var start = ms.Position; // After the possible preamble for the encoding + ms.Position = ms.Length; + if (chunked) + { + bytes = GetChunkSizeBytes(count, false); + ms.Write(bytes, 0, bytes.Length); + } + + var newCount = Math.Min(count, 16384 - (int)ms.Position + (int)start); + ms.Write(buffer, offset, newCount); + count -= newCount; + offset += newCount; + InternalWrite(ms.ToArray(), (int)start, (int)(ms.Length - start)); + ms.SetLength(0); + ms.Capacity = 0; // 'dispose' the buffer in ms. + } + else if (chunked) + { + bytes = GetChunkSizeBytes(count, false); + InternalWrite(bytes, 0, bytes.Length); + } + + if (count > 0) + { + InternalWrite(buffer, offset, count); + } + + if (chunked) + { + InternalWrite(CrLf, 0, 2); + } + } + + /// + public override int Read([In, Out] byte[] buffer, int offset, int count) => throw new NotSupportedException(); + + /// + public override long Seek(long offset, SeekOrigin origin) => throw new NotSupportedException(); + + /// + public override void SetLength(long value) => throw new NotSupportedException(); + + internal void InternalWrite(byte[] buffer, int offset, int count) + { + if (_ignoreErrors) + { + try + { + _stream.Write(buffer, offset, count); + } + catch + { + // ignored + } + } + else + { + _stream.Write(buffer, offset, count); + } + } + + protected override void Dispose(bool disposing) + { + if (_disposed) + { + return; + } + + _disposed = true; + + if (!disposing) + { + return; + } + + using var ms = GetHeaders(true); + var chunked = _response.SendChunked; + + if (_stream.CanWrite) + { + try + { + byte[] bytes; + if (ms != null) + { + var start = ms.Position; + if (chunked && !_trailerSent) + { + bytes = GetChunkSizeBytes(0, true); + ms.Position = ms.Length; + ms.Write(bytes, 0, bytes.Length); + } + + InternalWrite(ms.ToArray(), (int)start, (int)(ms.Length - start)); + _trailerSent = true; + } + else if (chunked && !_trailerSent) + { + bytes = GetChunkSizeBytes(0, true); + InternalWrite(bytes, 0, bytes.Length); + _trailerSent = true; + } + } + catch (ObjectDisposedException) + { + // Ignored + } + catch (IOException) + { + // Ignore error due to connection reset by peer + } + } + + _response.Close(); + } + + private static byte[] GetChunkSizeBytes(int size, bool final) => WebServer.DefaultEncoding.GetBytes($"{size:x}\r\n{(final ? "\r\n" : string.Empty)}"); + + private MemoryStream? GetHeaders(bool closing) + { + lock (_headersSyncRoot) + { + return _response.HeadersSent ? null : _response.SendHeaders(closing); + } + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Net/Internal/StringExtensions.cs b/Vendor/EmbedIO-3.5.2/Net/Internal/StringExtensions.cs new file mode 100644 index 0000000..fab8333 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Net/Internal/StringExtensions.cs @@ -0,0 +1,77 @@ +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace EmbedIO.Net.Internal +{ + internal static class StringExtensions + { + private const string TokenSpecialChars = "()<>@,;:\\\"/[]?={} \t"; + + internal static bool IsToken(this string @this) + => @this.All(c => c >= 0x20 && c < 0x7f && TokenSpecialChars.IndexOf(c) < 0); + + internal static IEnumerable SplitHeaderValue(this string @this, bool useCookieSeparators) + { + var len = @this.Length; + + var buff = new StringBuilder(32); + var escaped = false; + var quoted = false; + + for (var i = 0; i < len; i++) + { + var c = @this[i]; + + if (c == '"') + { + if (escaped) + { + escaped = false; + } + else + { + quoted = !quoted; + } + } + else if (c == '\\') + { + if (i < len - 1 && @this[i + 1] == '"') + { + escaped = true; + } + } + else if (c == ',' || (useCookieSeparators && c == ';')) + { + if (!quoted) + { + yield return buff.ToString(); + buff.Length = 0; + + continue; + } + } + + _ = buff.Append(c); + } + + if (buff.Length > 0) + { + yield return buff.ToString(); + } + } + + internal static string Unquote(this string str) + { + var start = str.IndexOf('\"'); + var end = str.LastIndexOf('\"'); + + if (start >= 0 && end >= 0) + { + str = str.Substring(start + 1, end - 1); + } + + return str.Trim(); + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Net/Internal/SystemCookieCollection.cs b/Vendor/EmbedIO-3.5.2/Net/Internal/SystemCookieCollection.cs new file mode 100644 index 0000000..b792aef --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Net/Internal/SystemCookieCollection.cs @@ -0,0 +1,56 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Net; + +namespace EmbedIO.Net.Internal +{ + /// + /// Represents a wrapper for System.Net.CookieCollection. + /// + /// + internal sealed class SystemCookieCollection : ICookieCollection + { + private readonly CookieCollection _collection; + + /// + /// Initializes a new instance of the class. + /// + /// The cookie collection. + public SystemCookieCollection(CookieCollection collection) + { + _collection = collection; + } + + /// + public int Count => _collection.Count; + + /// + public bool IsSynchronized => _collection.IsSynchronized; + + /// + public object SyncRoot => _collection.SyncRoot; + + /// + public Cookie? this[string name] => _collection[name]; + + /// + IEnumerator IEnumerable.GetEnumerator() => _collection.OfType().GetEnumerator(); + + /// + public IEnumerator GetEnumerator() => _collection.GetEnumerator(); + + /// + public void CopyTo(Array array, int index) => _collection.CopyTo(array, index); + + /// + public void CopyTo(Cookie[] array, int index) => _collection.CopyTo(array, index); + + /// + public void Add(Cookie cookie) => _collection.Add(cookie); + + /// + public bool Contains(Cookie cookie) => _collection.OfType().Contains(cookie); + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Net/Internal/SystemHttpContext.cs b/Vendor/EmbedIO-3.5.2/Net/Internal/SystemHttpContext.cs new file mode 100644 index 0000000..4ebd097 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Net/Internal/SystemHttpContext.cs @@ -0,0 +1,125 @@ +using System; +using System.Collections.Generic; +using System.Net; +using System.Security.Principal; +using System.Threading; +using System.Threading.Tasks; +using EmbedIO.Authentication; +using EmbedIO.Internal; +using EmbedIO.Routing; +using EmbedIO.Sessions; +using EmbedIO.Utilities; +using EmbedIO.WebSockets; +using EmbedIO.WebSockets.Internal; +using Swan.Logging; + +namespace EmbedIO.Net.Internal +{ + internal sealed class SystemHttpContext : IHttpContextImpl + { + private readonly System.Net.HttpListenerContext _context; + + private readonly TimeKeeper _ageKeeper = new (); + + private readonly Stack> _closeCallbacks = new (); + + private bool _closed; + + public SystemHttpContext(System.Net.HttpListenerContext context) + { + _context = context; + + Request = new SystemHttpRequest(_context); + User = _context.User ?? Auth.NoUser; + Response = new SystemHttpResponse(_context); + Id = UniqueIdGenerator.GetNext(); + LocalEndPoint = Request.LocalEndPoint; + RemoteEndPoint = Request.RemoteEndPoint; + Route = RouteMatch.None; + Session = SessionProxy.None; + } + + public string Id { get; } + + public CancellationToken CancellationToken { get; set; } + + public long Age => _ageKeeper.ElapsedTime; + + public IPEndPoint LocalEndPoint { get; } + + public IPEndPoint RemoteEndPoint { get; } + + public IHttpRequest Request { get; } + + public RouteMatch Route { get; set; } + + public string RequestedPath => Route.SubPath ?? string.Empty; // It will never be empty, because modules are matched via base routes - this is just to silence a warning. + + public IHttpResponse Response { get; } + + public IPrincipal User { get; set; } + + public ISessionProxy Session { get; set; } + + public bool SupportCompressedRequests { get; set; } + + public IDictionary Items { get; } = new Dictionary(); + + public bool IsHandled { get; private set; } + + public MimeTypeProviderStack MimeTypeProviders { get; } = new MimeTypeProviderStack(); + + public void SetHandled() => IsHandled = true; + + public void OnClose(Action callback) + { + if (_closed) + { + throw new InvalidOperationException("HTTP context has already been closed."); + } + + _closeCallbacks.Push(Validate.NotNull(nameof(callback), callback)); + } + + public async Task AcceptWebSocketAsync( + IEnumerable requestedProtocols, + string acceptedProtocol, + int receiveBufferSize, + TimeSpan keepAliveInterval, + CancellationToken cancellationToken) + { + var context = await _context.AcceptWebSocketAsync( + acceptedProtocol.NullIfEmpty(), // Empty string would throw; use null to signify "no subprotocol" here. + receiveBufferSize, + keepAliveInterval) + .ConfigureAwait(false); + return new WebSocketContext(this, context.SecWebSocketVersion, requestedProtocols, acceptedProtocol, new SystemWebSocket(context.WebSocket), cancellationToken); + } + + public void Close() + { + _closed = true; + + // Always close the response stream no matter what. + Response.Close(); + + foreach (var callback in _closeCallbacks) + { + try + { + callback(this); + } + catch (Exception e) + { + e.Log("HTTP context", "[Id] Exception thrown by a HTTP context close callback."); + } + } + } + + public string GetMimeType(string extension) + => MimeTypeProviders.GetMimeType(extension); + + public bool TryDetermineCompression(string mimeType, out bool preferCompression) + => MimeTypeProviders.TryDetermineCompression(mimeType, out preferCompression); + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Net/Internal/SystemHttpListener.cs b/Vendor/EmbedIO-3.5.2/Net/Internal/SystemHttpListener.cs new file mode 100644 index 0000000..5d14883 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Net/Internal/SystemHttpListener.cs @@ -0,0 +1,71 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +namespace EmbedIO.Net.Internal +{ + /// + /// Represents a wrapper for Microsoft HTTP Listener. + /// + internal class SystemHttpListener : IHttpListener + { + private readonly System.Net.HttpListener _httpListener; + + public SystemHttpListener(System.Net.HttpListener httpListener) + { + _httpListener = httpListener; + } + + /// + public bool IgnoreWriteExceptions + { + get => _httpListener.IgnoreWriteExceptions; + set => _httpListener.IgnoreWriteExceptions = value; + } + + /// + public List Prefixes => _httpListener.Prefixes.ToList(); + + /// + public bool IsListening => _httpListener.IsListening; + + /// + public string Name { get; } = "Microsoft HTTP Listener"; + + /// + public void Start() => _httpListener.Start(); + + /// + public void Stop() => _httpListener.Stop(); + + /// + public void AddPrefix(string urlPrefix) => _httpListener.Prefixes.Add(urlPrefix); + + /// + public async Task GetContextAsync(CancellationToken cancellationToken) + { + // System.Net.HttpListener.GetContextAsync may throw ObjectDisposedException + // when stopping a WebServer. This has been observed on Mono 5.20.1.19 + // on Raspberry Pi, but the fact remains that the method does not take + // a CancellationToken as parameter, and WebServerBase<>.RunAsync counts on it. + System.Net.HttpListenerContext context; + try + { + context = await _httpListener.GetContextAsync().ConfigureAwait(false); + } + catch (Exception e) when (cancellationToken.IsCancellationRequested) + { + throw new OperationCanceledException( + "Probable cancellation detected by catching an exception in System.Net.HttpListener.GetContextAsync", + e, + cancellationToken); + } + + return new SystemHttpContext(context); + } + + void IDisposable.Dispose() => ((IDisposable)_httpListener)?.Dispose(); + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Net/Internal/SystemHttpRequest.cs b/Vendor/EmbedIO-3.5.2/Net/Internal/SystemHttpRequest.cs new file mode 100644 index 0000000..c266a35 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Net/Internal/SystemHttpRequest.cs @@ -0,0 +1,121 @@ +using System; +using System.Collections.Specialized; +using System.IO; +using System.Net; +using System.Text; + +namespace EmbedIO.Net.Internal +{ + /// + /// Represents a wrapper for HttpListenerContext.Request. + /// + /// + public class SystemHttpRequest : IHttpRequest + { + private readonly System.Net.HttpListenerRequest _request; + + /// + /// Initializes a new instance of the class. + /// + /// The context. + public SystemHttpRequest(System.Net.HttpListenerContext context) + { + _request = context.Request; + _ = Enum.TryParse(_request.HttpMethod.Trim(), true, out var verb); + HttpVerb = verb; + Cookies = new SystemCookieCollection(_request.Cookies); + LocalEndPoint = _request.LocalEndPoint!; + RemoteEndPoint = _request.RemoteEndPoint!; + } + + /// + public NameValueCollection Headers => _request.Headers; + + /// + public Version ProtocolVersion => _request.ProtocolVersion; + + /// + public bool KeepAlive => _request.KeepAlive; + + /// + public ICookieCollection Cookies { get; } + + /// + public string RawUrl => _request.RawUrl; + + /// + public NameValueCollection QueryString => _request.QueryString; + + /// + public string HttpMethod => _request.HttpMethod; + + /// + public HttpVerbs HttpVerb { get; } + + /// + public Uri Url => _request.Url; + + /// + public bool HasEntityBody => _request.HasEntityBody; + + /// + public Stream InputStream => _request.InputStream; + + /// + public Encoding ContentEncoding + { + get + { + if (!_request.HasEntityBody || _request.ContentType == null) + { + return WebServer.DefaultEncoding; + } + + var charSet = HeaderUtility.GetCharset(ContentType); + if (string.IsNullOrEmpty(charSet)) + { + return WebServer.DefaultEncoding; + } + + try + { + return Encoding.GetEncoding(charSet); + } + catch (ArgumentException) + { + return WebServer.DefaultEncoding; + } + } + } + + /// + public IPEndPoint RemoteEndPoint { get; } + + /// + public bool IsSecureConnection => _request.IsSecureConnection; + + /// + public bool IsLocal => _request.IsLocal; + + /// + public string UserAgent => _request.UserAgent; + + /// + public bool IsWebSocketRequest => _request.IsWebSocketRequest; + + /// + public IPEndPoint LocalEndPoint { get; } + + /// + public string ContentType => _request.ContentType; + + /// + public long ContentLength64 => _request.ContentLength64; + + /// + public bool IsAuthenticated => _request.IsAuthenticated; + + /// + public Uri? UrlReferrer => _request.UrlReferrer; + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Net/Internal/SystemHttpResponse.cs b/Vendor/EmbedIO-3.5.2/Net/Internal/SystemHttpResponse.cs new file mode 100644 index 0000000..a3496f6 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Net/Internal/SystemHttpResponse.cs @@ -0,0 +1,97 @@ +using System; +using System.IO; +using System.Net; +using System.Text; + +namespace EmbedIO.Net.Internal +{ + /// + /// Represents a wrapper for HttpListenerContext.Response. + /// + /// + public class SystemHttpResponse : IHttpResponse + { + private readonly System.Net.HttpListenerResponse _response; + + /// + /// Initializes a new instance of the class. + /// + /// The context. + public SystemHttpResponse(System.Net.HttpListenerContext context) + { + _response = context.Response; + Cookies = new SystemCookieCollection(_response.Cookies); + } + + /// + public WebHeaderCollection Headers => _response.Headers; + + /// + public int StatusCode + { + get => _response.StatusCode; + set => _response.StatusCode = value; + } + + /// + public long ContentLength64 + { + get => _response.ContentLength64; + set => _response.ContentLength64 = value; + } + + /// + public string ContentType + { + get => _response.ContentType; + set => _response.ContentType = value; + } + + /// + public Stream OutputStream => _response.OutputStream; + + /// + public ICookieCollection Cookies { get; } + + /// + public Encoding? ContentEncoding + { + get => _response.ContentEncoding; + set => _response.ContentEncoding = value; + } + + /// + public bool KeepAlive + { + get => _response.KeepAlive; + set => _response.KeepAlive = value; + } + + /// + public bool SendChunked + { + get => _response.SendChunked; + set => _response.SendChunked = value; + } + + /// + public Version ProtocolVersion + { + get => _response.ProtocolVersion; + set => _response.ProtocolVersion = value; + } + + /// + public string StatusDescription + { + get => _response.StatusDescription; + set => _response.StatusDescription = value; + } + + /// + public void SetCookie(Cookie cookie) => _response.SetCookie(cookie); + + /// + public void Close() => _response.OutputStream?.Dispose(); + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Net/Internal/WebSocketHandshakeResponse.cs b/Vendor/EmbedIO-3.5.2/Net/Internal/WebSocketHandshakeResponse.cs new file mode 100644 index 0000000..a5dee52 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Net/Internal/WebSocketHandshakeResponse.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Specialized; +using System.Globalization; +using System.Net; +using System.Text; + +namespace EmbedIO.Net.Internal +{ + internal class WebSocketHandshakeResponse + { + private const int HandshakeStatusCode = (int)HttpStatusCode.SwitchingProtocols; + + internal WebSocketHandshakeResponse(IHttpContext context) + { + ProtocolVersion = HttpVersion.Version11; + Headers = context.Response.Headers; + Headers.Clear(); // Use only headers mentioned in RFC6455 - scrap all the rest. + StatusCode = HandshakeStatusCode; + Reason = HttpListenerResponseHelper.GetStatusDescription(HandshakeStatusCode); + + Headers[HttpHeaderNames.Upgrade] = "websocket"; + Headers[HttpHeaderNames.Connection] = "Upgrade"; + + foreach (var cookie in context.Request.Cookies) + { + Headers.Add("Set-Cookie", cookie.ToString()); + } + } + + public string Reason { get; } + + public int StatusCode { get; } + + public NameValueCollection Headers { get; } + + public Version ProtocolVersion { get; } + + public override string ToString() + { + var output = new StringBuilder(64) + .AppendFormat(CultureInfo.InvariantCulture, "HTTP/{0} {1} {2}\r\n", ProtocolVersion, StatusCode, Reason); + + foreach (var key in Headers.AllKeys) + { + _ = output.AppendFormat(CultureInfo.InvariantCulture, "{0}: {1}\r\n", key, Headers[key]); + } + + _ = output.Append("\r\n"); + + return output.ToString(); + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/RequestDeserializer.cs b/Vendor/EmbedIO-3.5.2/RequestDeserializer.cs new file mode 100644 index 0000000..dc97545 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/RequestDeserializer.cs @@ -0,0 +1,64 @@ +using System; +using System.Threading.Tasks; +using Swan.Formatters; +using Swan.Logging; + +namespace EmbedIO +{ + /// + /// Provides standard request deserialization callbacks. + /// + public static class RequestDeserializer + { + /// + /// The default request deserializer used by EmbedIO. + /// Equivalent to . + /// + /// The expected type of the deserialized data. + /// The whose request body is to be deserialized. + /// A Task, representing the ongoing operation, + /// whose result will be the deserialized data. + public static Task Default(IHttpContext context) => Json(context); + + /// + /// Asynchronously deserializes a request body in JSON format. + /// + /// The expected type of the deserialized data. + /// The whose request body is to be deserialized. + /// A Task, representing the ongoing operation, + /// whose result will be the deserialized data. + public static Task Json(IHttpContext context) => JsonInternal(context, default); + + /// + /// Returns a RequestDeserializerCallback + /// that will deserialize an HTTP request body in JSON format, using the specified property name casing. + /// + /// The expected type of the deserialized data. + /// The to use. + /// A that can be used to deserialize + /// a JSON request body. + public static RequestDeserializerCallback Json(JsonSerializerCase jsonSerializerCase) + => context => JsonInternal(context, jsonSerializerCase); + + private static async Task JsonInternal(IHttpContext context, JsonSerializerCase jsonSerializerCase) + { + string body; + using (var reader = context.OpenRequestText()) + { + body = await reader.ReadToEndAsync().ConfigureAwait(false); + } + + try + { + return Swan.Formatters.Json.Deserialize(body, jsonSerializerCase); + } + catch (FormatException) + { + $"[{context.Id}] Cannot convert JSON request body to {typeof(TData).Name}, sending 400 Bad Request..." + .Warn($"{nameof(RequestDeserializer)}.{nameof(Json)}"); + + throw HttpException.BadRequest("Incorrect request data format."); + } + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/RequestDeserializerCallback`1.cs b/Vendor/EmbedIO-3.5.2/RequestDeserializerCallback`1.cs new file mode 100644 index 0000000..74ea808 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/RequestDeserializerCallback`1.cs @@ -0,0 +1,13 @@ +using System.Threading.Tasks; + +namespace EmbedIO +{ + /// + /// A callback used to deserialize an HTTP request body. + /// + /// The expected type of the deserialized data. + /// The whose request body is to be deserialized. + /// A Task, representing the ongoing operation, + /// whose result will be the deserialized data. + public delegate Task RequestDeserializerCallback(IHttpContext context); +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/RequestHandler.cs b/Vendor/EmbedIO-3.5.2/RequestHandler.cs new file mode 100644 index 0000000..4258b53 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/RequestHandler.cs @@ -0,0 +1,61 @@ +using System; +using EmbedIO.Internal; + +namespace EmbedIO +{ + /// + /// Provides standard request handler callbacks. + /// + /// + public static class RequestHandler + { + /// + /// Returns an exception object that, when thrown from a module's + /// HandleRequestAsync method, will cause the HTTP context + /// to be passed down along the module chain, regardless of the value of the module's + /// IsFinalHandler property. + /// + /// A newly-created . + public static Exception PassThrough() => new RequestHandlerPassThroughException(); + + /// + /// Returns a that unconditionally sends a 401 Unauthorized response. + /// + /// A message to include in the response. + /// A . + public static RequestHandlerCallback ThrowUnauthorized(string? message = null) + => _ => throw HttpException.Unauthorized(message); + + /// + /// Returns a that unconditionally sends a 403 Forbidden response. + /// + /// A message to include in the response. + /// A . + public static RequestHandlerCallback ThrowForbidden(string? message = null) + => _ => throw HttpException.Forbidden(message); + + /// + /// Returns a that unconditionally sends a 400 Bad Request response. + /// + /// A message to include in the response. + /// A . + public static RequestHandlerCallback ThrowBadRequest(string? message = null) + => _ => throw HttpException.BadRequest(message); + + /// + /// Returns a that unconditionally sends a 404 Not Found response. + /// + /// A message to include in the response. + /// A . + public static RequestHandlerCallback ThrowNotFound(string? message = null) + => _ => throw HttpException.NotFound(message); + + /// + /// Returns a that unconditionally sends a 405 Method Not Allowed response. + /// + /// A message to include in the response. + /// A . + public static RequestHandlerCallback ThrowMethodNotAllowed(string? message = null) + => _ => throw HttpException.MethodNotAllowed(message); + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/RequestHandlerCallback.cs b/Vendor/EmbedIO-3.5.2/RequestHandlerCallback.cs new file mode 100644 index 0000000..6e95234 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/RequestHandlerCallback.cs @@ -0,0 +1,11 @@ +using System.Threading.Tasks; + +namespace EmbedIO +{ + /// + /// A callback used to handle a request. + /// + /// An interface representing the context of the request. + /// A representing the ongoing operation. + public delegate Task RequestHandlerCallback(IHttpContext context); +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/ResponseSerializer.cs b/Vendor/EmbedIO-3.5.2/ResponseSerializer.cs new file mode 100644 index 0000000..311d4ad --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/ResponseSerializer.cs @@ -0,0 +1,181 @@ +using EmbedIO.Utilities; +using Swan.Formatters; +using System; +using System.Threading.Tasks; + +namespace EmbedIO +{ + /// + /// Provides standard response serializer callbacks. + /// + /// + public static class ResponseSerializer + { + /// + /// The default response serializer callback used by EmbedIO. + /// Equivalent to Json. + /// + public static readonly ResponseSerializerCallback Default = Json; + + private static readonly ResponseSerializerCallback ChunkedEncodingBaseSerializer = GetBaseSerializer(false); + private static readonly ResponseSerializerCallback BufferingBaseSerializer = GetBaseSerializer(true); + + /// + /// Serializes data in JSON format to a HTTP response, + /// using the utility class. + /// + /// The HTTP context of the request. + /// The data to serialize. + /// A representing the ongoing operation. + public static async Task Json(IHttpContext context, object? data) + { + context.Response.ContentType = MimeType.Json; + context.Response.ContentEncoding = WebServer.Utf8NoBomEncoding; + await ChunkedEncodingBaseSerializer(context, Swan.Formatters.Json.Serialize(data)).ConfigureAwait(false); + } + + /// + /// Serializes data in JSON format with the specified + /// to a HTTP response, using the utility class. + /// + /// The JSON serializer case. + /// A that can be used to serialize + /// data to a HTTP response. + public static ResponseSerializerCallback Json(JsonSerializerCase jsonSerializerCase) + => async (context, data) => { + context.Response.ContentType = MimeType.Json; + context.Response.ContentEncoding = WebServer.Utf8NoBomEncoding; + await ChunkedEncodingBaseSerializer(context, Swan.Formatters.Json.Serialize(data, jsonSerializerCase)) + .ConfigureAwait(false); + }; + + /// + /// Serializes data in JSON format with the specified + /// to a HTTP response, using the utility class. + /// + /// The JSON serializer options. + /// A that can be used to serialize + /// data to a HTTP response. + /// + /// is . + /// + public static ResponseSerializerCallback Json(SerializerOptions serializerOptions) + { + _ = Validate.NotNull(nameof(serializerOptions), serializerOptions); + + return async (context, data) => { + context.Response.ContentType = MimeType.Json; + context.Response.ContentEncoding = WebServer.Utf8NoBomEncoding; + await ChunkedEncodingBaseSerializer(context, Swan.Formatters.Json.Serialize(data, serializerOptions)) + .ConfigureAwait(false); + }; + } + + /// + /// Serializes data in JSON format to a HTTP response, using the utility class. + /// + /// to write the response body to a memory buffer first, + /// then send it all together with a Content-Length header; to use chunked + /// transfer encoding. + /// A that can be used to serialize + /// data to a HTTP response. + public static ResponseSerializerCallback Json(bool bufferResponse) + => async (context, data) => { + context.Response.ContentType = MimeType.Json; + context.Response.ContentEncoding = WebServer.Utf8NoBomEncoding; + var baseSerializer = None(bufferResponse); + await baseSerializer(context, Swan.Formatters.Json.Serialize(data)) + .ConfigureAwait(false); + }; + + /// + /// Serializes data in JSON format with the specified + /// to a HTTP response, using the utility class. + /// + /// to write the response body to a memory buffer first, + /// then send it all together with a Content-Length header; to use chunked + /// transfer encoding. + /// The JSON serializer case. + /// A that can be used to serialize + /// data to a HTTP response. + public static ResponseSerializerCallback Json(bool bufferResponse, JsonSerializerCase jsonSerializerCase) + => async (context, data) => { + context.Response.ContentType = MimeType.Json; + context.Response.ContentEncoding = WebServer.Utf8NoBomEncoding; + var baseSerializer = None(bufferResponse); + await baseSerializer(context, Swan.Formatters.Json.Serialize(data, jsonSerializerCase)) + .ConfigureAwait(false); + }; + + /// + /// Serializes data in JSON format with the specified + /// to a HTTP response, using the utility class. + /// + /// to write the response body to a memory buffer first, + /// then send it all together with a Content-Length header; to use chunked + /// transfer encoding. + /// The JSON serializer options. + /// A that can be used to serialize + /// data to a HTTP response. + /// + /// is . + /// + public static ResponseSerializerCallback Json(bool bufferResponse, SerializerOptions serializerOptions) + { + _ = Validate.NotNull(nameof(serializerOptions), serializerOptions); + + return async (context, data) => { + context.Response.ContentType = MimeType.Json; + context.Response.ContentEncoding = WebServer.Utf8NoBomEncoding; + var baseSerializer = None(bufferResponse); + await baseSerializer(context, Swan.Formatters.Json.Serialize(data, serializerOptions)) + .ConfigureAwait(false); + }; + } + + /// + /// Sends data in a HTTP response without serialization. + /// + /// to write the response body to a memory buffer first, + /// then send it all together with a Content-Length header; to use chunked + /// transfer encoding. + /// A that can be used to serialize data to a HTTP response. + /// + /// s and one-dimensional arrays of s + /// are sent to the client unchanged; every other type is converted to a string. + /// The ContentType set on the response is used to negotiate + /// a compression method, according to request headers. + /// Strings (and other types converted to strings) are sent with the encoding specified by . + /// + public static ResponseSerializerCallback None(bool bufferResponse) + => bufferResponse ? BufferingBaseSerializer : ChunkedEncodingBaseSerializer; + + private static ResponseSerializerCallback GetBaseSerializer(bool bufferResponse) + => async (context, data) => { + if (data is null) + { + return; + } + + var isBinaryResponse = data is byte[]; + + if (!context.TryDetermineCompression(context.Response.ContentType, out var preferCompression)) + { + preferCompression = true; + } + + if (isBinaryResponse) + { + var responseBytes = (byte[])data; + using var stream = context.OpenResponseStream(bufferResponse, preferCompression); + await stream.WriteAsync(responseBytes, 0, responseBytes.Length).ConfigureAwait(false); + } + else + { + var responseString = data is string stringData ? stringData : data.ToString() ?? string.Empty; + using var text = context.OpenResponseText(context.Response.ContentEncoding, bufferResponse, preferCompression); + await text.WriteAsync(responseString).ConfigureAwait(false); + } + }; + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/ResponseSerializerCallback.cs b/Vendor/EmbedIO-3.5.2/ResponseSerializerCallback.cs new file mode 100644 index 0000000..f84cca1 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/ResponseSerializerCallback.cs @@ -0,0 +1,12 @@ +using System.Threading.Tasks; + +namespace EmbedIO +{ + /// + /// A callback used to serialize data to a HTTP response. + /// + /// The HTTP context of the request. + /// The data to serialize. + /// A representing the ongoing operation. + public delegate Task ResponseSerializerCallback(IHttpContext context, object? data); +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Routing/BaseRouteAttribute.cs b/Vendor/EmbedIO-3.5.2/Routing/BaseRouteAttribute.cs new file mode 100644 index 0000000..df449fb --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Routing/BaseRouteAttribute.cs @@ -0,0 +1,31 @@ +using System; + +namespace EmbedIO.Routing +{ + /// + /// Decorate methods within controllers with this attribute in order to make them callable from the Web API Module + /// Method Must match the WebServerModule. + /// + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true, Inherited = true)] + public class BaseRouteAttribute : RouteAttribute + { + /// + /// Initializes a new instance of the class. + /// + /// The verb. + /// The route. + /// is . + /// + /// is empty. + /// - or - + /// does not start with a slash (/) character. + /// - or - + /// does not comply with route syntax. + /// + /// + public BaseRouteAttribute(HttpVerbs verb, string route) + : base(verb, route, true) + { + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Routing/Route.cs b/Vendor/EmbedIO-3.5.2/Routing/Route.cs new file mode 100644 index 0000000..f02fdf2 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Routing/Route.cs @@ -0,0 +1,310 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using EmbedIO.WebApi; + +namespace EmbedIO.Routing +{ + /// + /// Provides utility methods to work with routes. + /// + /// + /// + /// + public static class Route + { + // Characters in ValidParameterNameChars MUST be in ascending ordinal order! + private static readonly char[] ValidParameterNameChars = + "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz".ToCharArray(); + + /// + /// Determines whether a string is a valid route parameter name. + /// To be considered a valid route parameter name, the specified string: + /// + /// must not be ; + /// must not be the empty string; + /// must consist entirely of decimal digits, upper- or lower-case + /// letters of the English alphabet, or underscore ('_') characters; + /// must not start with a decimal digit. + /// + /// + /// The value. + /// if is a valid route parameter; + /// otherwise, . + public static bool IsValidParameterName(string value) + => !string.IsNullOrEmpty(value) + && value[0] > '9' + && !value.Any(c => c < '0' || c > 'z' || Array.BinarySearch(ValidParameterNameChars, c) < 0); + + /// + /// Determines whether a string is a valid route. + /// To be considered a valid route, the specified string: + /// + /// must not be ; + /// must not be the empty string; + /// must start with a slash ('/') character; + /// if a base route, must end with a slash ('/') character; + /// if not a base route, must not end with a slash ('/') character, + /// unless it is the only character in the string; + /// must not contain consecutive runs of two or more slash ('/') characters; + /// may contain one or more parameter specifications. + /// + /// Each parameter specification must be enclosed in curly brackets ('{' + /// and '}'. No whitespace is allowed inside a parameter specification. + /// Two parameter specifications must be separated by literal text. + /// A parameter specification consists of a valid parameter name, optionally + /// followed by a '?' character to signify that it will also match an empty string. + /// If '?' is not present, a parameter by default will NOT match an empty string. + /// See for the definition of a valid parameter name. + /// To include a literal open curly bracket in the route, it must be doubled ("{{"). + /// A literal closed curly bracket ('}') may be included in the route as-is. + /// A segment of a base route cannot consist only of an optional parameter. + /// + /// The route to check. + /// if checking for a base route; + /// otherwise, . + /// if is a valid route; + /// otherwise, . + public static bool IsValid(string route, bool isBaseRoute) => ValidateInternal(nameof(route), route, isBaseRoute) == null; + + // Check the validity of a route by parsing it without storing the results. + // Returns: ArgumentNullException, ArgumentException, null if OK + internal static Exception? ValidateInternal(string argumentName, string value, bool isBaseRoute) => ParseInternal(value, isBaseRoute, null) switch { + ArgumentNullException _ => new ArgumentNullException(argumentName), + FormatException formatException => new ArgumentException(formatException.Message, argumentName), + Exception exception => exception, + _ => null + }; + + // Validate and parse a route, constructing a Regex pattern. + // setResult will be called at the end with the isBaseRoute flag, parameter names and the constructed pattern. + // Returns: ArgumentNullException, FormatException, null if OK + internal static Exception? ParseInternal(string route, bool isBaseRoute, Action, string>? setResult) + { + if (route == null) + return new ArgumentNullException(nameof(route)); + + if (route.Length == 0) + return new FormatException("Route is empty."); + + if (route[0] != '/') + return new FormatException("Route does not start with a slash."); + + /* + * Regex options set at start of pattern: + * IgnoreCase : no + * Multiline : no + * Singleline : yes + * ExplicitCapture : yes + * IgnorePatternWhitespace : no + * See https://docs.microsoft.com/en-us/dotnet/standard/base-types/regular-expression-options + * See https://docs.microsoft.com/en-us/dotnet/standard/base-types/grouping-constructs-in-regular-expressions#group_options + */ + const string InitialRegexOptions = "(?sn-imx)"; + + // If setResult is null we don't need the StringBuilder. + var sb = setResult == null ? null : new StringBuilder("^"); + + var parameterNames = new List(); + if (route.Length == 1) + { + // If the route consists of a single slash, only a single slash will match. + sb?.Append(isBaseRoute ? "/" : "/$"); + } + else + { + // First of all divide the route in segments. + // Segments are separated by slashes. + // The route is not necessarily normalized, so there could be runs of consecutive slashes. + var segmentCount = 0; + var optionalSegmentCount = 0; + foreach (var segment in GetSegments(route)) + { + segmentCount++; + + // Parse the segment, looking alternately for a '{', that opens a parameter specification, + // then for a '}', that closes it. + // Characters outside parameter specifications are Regex-escaped and added to the pattern. + // A parameter specification consists of a parameter name, optionally followed by '?' + // to indicate that an empty parameter will match. + // The default is to NOT match empty parameters, consistently with ASP.NET and EmbedIO version 2. + // More syntax rules: + // - There cannot be two parameters without literal text in between. + // - If a segment consists ONLY of an OPTIONAL parameter, then the slash preceding it is optional too. + var inParameterSpec = false; + var afterParameter = false; + for (var position = 0; ;) + { + if (inParameterSpec) + { + // Look for end of spec, bail out if not found. + var closePosition = segment.IndexOf('}', position); + if (closePosition < 0) + return new FormatException("Route syntax error: unclosed parameter specification."); + + // Parameter spec cannot be empty. + if (closePosition == position) + return new FormatException("Route syntax error: empty parameter specification."); + + // Check the last character: + // {name} means empty parameter does not match + // {name?} means empty parameter matches + // If '?'is found, the parameter name ends before it + var nameEndPosition = closePosition; + var allowEmpty = false; + if (segment[closePosition - 1] == '?') + { + allowEmpty = true; + nameEndPosition--; + } + + // Bail out if only '?' is found inside the spec. + if (nameEndPosition == position) + return new FormatException("Route syntax error: missing parameter name."); + + // Extract the parameter name. + var parameterName = segment.Substring(position, nameEndPosition - position); + + // Ensure that the parameter name contains only valid characters. + if (!IsValidParameterName(parameterName)) + return new FormatException("Route syntax error: parameter name contains one or more invalid characters."); + + // Ensure that the parameter name is not a duplicate. + if (parameterNames.Contains(parameterName)) + return new FormatException("Route syntax error: duplicate parameter name."); + + // The spec is valid, so add the parameter to the list. + parameterNames.Add(parameterName); + + // Append a capturing group with the same name to the pattern. + // Parameters must be made of non-slash characters ("[^/]") + // and must match non-greedily ("*?" if optional, "+?" if non optional). + // Position will be 1 at the start, not 0, because we've skipped the opening '{'. + if (allowEmpty && position == 1 && closePosition == segment.Length - 1) + { + if (isBaseRoute) + return new FormatException("No segment of a base route can be optional."); + + // If the segment consists only of an optional parameter, + // then the slash preceding the segment is optional as well. + // In this case the parameter must match only is not empty, + // because it's (slash + parameter) that is optional. + sb?.Append("(/(?<").Append(parameterName).Append(">[^/]+?))?"); + optionalSegmentCount++; + } + else + { + // If at the start of a segment, don't forget the slash! + // Position will be 1 at the start, not 0, because we've skipped the opening '{'. + if (position == 1) + sb?.Append('/'); + + sb?.Append("(?<").Append(parameterName).Append(">[^/]").Append(allowEmpty ? '*' : '+').Append("?)"); + } + + // Go on with parsing. + position = closePosition + 1; + inParameterSpec = false; + afterParameter = true; + } + else + { + // Look for start of parameter spec. + var openPosition = segment.IndexOf('{', position); + if (openPosition < 0) + { + // If at the start of a segment, don't forget the slash. + if (position == 0) + sb?.Append('/'); + + // No more parameter specs: escape the remainder of the string + // and add it to the pattern. + sb?.Append(Regex.Escape(segment.Substring(position))); + break; + } + + var nextPosition = openPosition + 1; + if (nextPosition < segment.Length && segment[nextPosition] == '{') + { + // If another identical char follows, treat the two as a single literal char. + // If at the start of a segment, don't forget the slash! + if (position == 0) + sb?.Append('/'); + + sb?.Append(@"\\{"); + } + else if (afterParameter && openPosition == position) + { + // If a parameter immediately follows another parameter, + // with no literal text in between, it's a syntax error. + return new FormatException("Route syntax error: parameters must be separated by literal text."); + } + else + { + // If at the start of a segment, don't forget the slash, + // but only if there actually is some literal text. + // Otherwise let the parameter spec parsing code deal with the slash, + // because we don't know whether this is an optional segment yet. + if (position == 0 && openPosition > 0) + sb?.Append('/'); + + // Escape the part of the pattern outside the parameter spec + // and add it to the pattern. + sb?.Append(Regex.Escape(segment.Substring(position, openPosition - position))); + inParameterSpec = true; + } + + // Go on parsing. + position = nextPosition; + afterParameter = false; + } + } + } + + // Close the pattern + sb?.Append(isBaseRoute ? "(/|$)" : "$"); + + // If all segments are optional segments, "/" must match too. + if (optionalSegmentCount == segmentCount) + sb?.Insert(0, "(/$)|(").Append(')'); + } + + // Pass the results to the callback if needed. + setResult?.Invoke(isBaseRoute, parameterNames, InitialRegexOptions + sb); + + // Everything's fine, thus no exception. + return null; + } + + // Enumerate the segments of a route, ignoring consecutive slashes. + private static IEnumerable GetSegments(string route) + { + var length = route.Length; + var position = 0; + for (; ; ) + { + while (route[position] == '/') + { + position++; + if (position >= length) + break; + } + + if (position >= length) + break; + + var slashPosition = route.IndexOf('/', position); + if (slashPosition < 0) + { + yield return route.Substring(position); + break; + } + + yield return route.Substring(position, slashPosition - position); + position = slashPosition; + } + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Routing/RouteAttribute.cs b/Vendor/EmbedIO-3.5.2/Routing/RouteAttribute.cs new file mode 100644 index 0000000..3705fd7 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Routing/RouteAttribute.cs @@ -0,0 +1,54 @@ +using System; + +namespace EmbedIO.Routing +{ + /// + /// Decorate methods within controllers with this attribute in order to make them callable from the Web API Module + /// Method Must match the WebServerModule. + /// + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true, Inherited = true)] + public class RouteAttribute : Attribute + { + /// + /// Initializes a new instance of the class. + /// + /// if this attribute represents a base route; + /// (the default) if it represents a terminal (non-base) route. + /// The verb. + /// The route. + /// is . + /// + /// is empty. + /// - or - + /// does not start with a slash (/) character. + /// - or - + /// does not comply with route syntax. + /// + /// + public RouteAttribute(HttpVerbs verb, string route, bool isBaseRoute = false) + { + Matcher = RouteMatcher.Parse(route, isBaseRoute); + Verb = verb; + } + + /// + /// Gets the HTTP verb handled by a method with this attribute. + /// + public HttpVerbs Verb { get; } + + /// + /// Gets a that will match URLs against this attribute's data. + /// + public RouteMatcher Matcher { get; } + + /// + /// Gets the route handled by a method with this attribute. + /// + public string Route => Matcher.Route; + + /// + /// Gets a value indicating whether this attribute represents a base route. + /// + public bool IsBaseRoute => Matcher.IsBaseRoute; + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Routing/RouteHandlerCallback.cs b/Vendor/EmbedIO-3.5.2/Routing/RouteHandlerCallback.cs new file mode 100644 index 0000000..bd5076b --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Routing/RouteHandlerCallback.cs @@ -0,0 +1,13 @@ +using System.Threading.Tasks; + +namespace EmbedIO.Routing +{ + /// + /// Base class for callbacks used to handle routed requests. + /// + /// An interface representing the context of the request. + /// The matched route. + /// A representing the ongoing operation. + /// + public delegate Task RouteHandlerCallback(IHttpContext context, RouteMatch route); +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Routing/RouteMatch.cs b/Vendor/EmbedIO-3.5.2/Routing/RouteMatch.cs new file mode 100644 index 0000000..38e3d49 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Routing/RouteMatch.cs @@ -0,0 +1,199 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using EmbedIO.Utilities; + +namespace EmbedIO.Routing +{ + /// + /// Represents a route resolved by a . + /// This class may be used both as a dictionary of route parameter names and values, + /// and a list of the values. + /// Because of its double nature, this class cannot be enumerated directly. However, + /// you may use the property to iterate over name / value pairs, and the + /// property to iterate over values. + /// When enumerated in a non-generic fashion via the interface, + /// this class iterates over name / value pairs. + /// +#pragma warning disable CA1710 // Rename class to end in "Collection" + public sealed class RouteMatch : IReadOnlyList, IReadOnlyDictionary +#pragma warning restore CA1710 + { + private static readonly IReadOnlyList EmptyStringList = Array.Empty(); + + private readonly IReadOnlyList _values; + + internal RouteMatch(string path, IReadOnlyList names, IReadOnlyList values, string? subPath) + { + Path = path; + Names = names; + _values = values; + SubPath = subPath; + } + + /// + /// Gets a instance that represents no match at all. + /// + /// + /// The instance returned by this property + /// has the following specifications: + /// + /// its Path property is the empty string; + /// it has no parameters; + /// its SubPath property is . + /// + /// This instance is only useful to initialize + /// a non-nullable property of type , provided that it is subsequently + /// set to a meaningful value before being used. + /// + public static RouteMatch None { get; } = new RouteMatch( + string.Empty, + Array.Empty(), + Array.Empty(), + null); + + /// + /// Gets the URL path that was successfully matched against the route. + /// + public string Path { get; } + + /// + /// For a base route, gets the part of that follows the matched route; + /// for a non-base route, this property is always . + /// + public string? SubPath { get; } + + /// + /// Gets a list of the names of the route's parameters. + /// + public IReadOnlyList Names { get; } + + /// + public int Count => _values.Count; + + /// + public IEnumerable Keys => Names; + + /// + public IEnumerable Values => _values; + + /// + /// Gets an interface that can be used + /// to iterate over name / value pairs. + /// + public IEnumerable> Pairs => this; + + /// + public string this[int index] => _values[index]; + + /// + public string this[string key] + { + get + { + var count = Names.Count; + for (var i = 0; i < count; i++) + { + if (Names[i] == key) + { + return _values[i]; + } + } + + throw new KeyNotFoundException("The parameter name was not found."); + } + } + + /// + /// Returns a object equal to the one + /// that would result by matching the specified URL path against a + /// base route of "/". + /// + /// The URL path to match. + /// A newly-constructed . + /// + /// This method assumes that + /// is a valid, non-base URL path or route. Otherwise, the behavior of this method + /// is unspecified. + /// Ensure that you validate before + /// calling this method, using either + /// or . + /// + public static RouteMatch UnsafeFromRoot(string urlPath) + => new RouteMatch(urlPath, EmptyStringList, EmptyStringList, urlPath); + + /// + /// Returns a object equal to the one + /// that would result by matching the specified URL path against + /// the specified parameterless base route. + /// + /// The base route to match against. + /// The URL path to match. + /// A newly-constructed . + /// + /// This method assumes that is a + /// valid base URL path, and + /// is a valid, non-base URL path or route. Otherwise, the behavior of this method + /// is unspecified. + /// Ensure that you validate both parameters before + /// calling this method, using either + /// or . + /// + public static RouteMatch? UnsafeFromBasePath(string baseUrlPath, string urlPath) + { + var subPath = UrlPath.UnsafeStripPrefix(urlPath, baseUrlPath); + return subPath == null ? null : new RouteMatch(urlPath, EmptyStringList, EmptyStringList, "/" + subPath); + } + + /// + public bool ContainsKey(string key) => Names.Any(n => n == key); + + /// + public bool TryGetValue(string key, out string? value) + { + var count = Names.Count; + for (var i = 0; i < count; i++) + { + if (Names[i] == key) + { + value = _values[i]; + return true; + } + } + + value = null; + return false; + } + + /// + /// Returns the index of the parameter with the specified name. + /// + /// The parameter name. + /// The index of the parameter, or -1 if none of the + /// route parameters have the specified name. + public int IndexOf(string name) + { + var count = Names.Count; + for (var i = 0; i < count; i++) + { + if (Names[i] == name) + { + return i; + } + } + + return -1; + } + + /// + IEnumerator> IEnumerable>.GetEnumerator() + => Names.Zip(_values, (n, v) => new KeyValuePair(n, v)).GetEnumerator(); + + /// + IEnumerator IEnumerable.GetEnumerator() => _values.GetEnumerator(); + + /// + IEnumerator IEnumerable.GetEnumerator() => Pairs.GetEnumerator(); + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Routing/RouteMatcher.cs b/Vendor/EmbedIO-3.5.2/Routing/RouteMatcher.cs new file mode 100644 index 0000000..d66ec96 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Routing/RouteMatcher.cs @@ -0,0 +1,183 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Text.RegularExpressions; +using EmbedIO.Utilities; +using Swan; + +namespace EmbedIO.Routing +{ + /// + /// Matches URL paths against a route. + /// + public sealed class RouteMatcher : IEquatable + { + private static readonly object SyncRoot = new object(); + private static readonly Dictionary<(bool, string), RouteMatcher> Cache = new Dictionary<(bool, string), RouteMatcher>(); + + private readonly Regex _regex; + + private RouteMatcher(bool isBaseRoute, string route, string pattern, IReadOnlyList parameterNames) + { + IsBaseRoute = isBaseRoute; + Route = route; + ParameterNames = parameterNames; + _regex = new Regex(pattern, RegexOptions.Compiled | RegexOptions.CultureInvariant); + } + + /// + /// Gets a value indicating whether the property + /// is a base route. + /// + public bool IsBaseRoute { get; } + + /// + /// Gets the route this instance matches URL paths against. + /// + public string Route { get; } + + /// + /// Gets the names of the route's parameters. + /// + public IReadOnlyList ParameterNames { get; } + + /// + /// Constructs an instance of by parsing the specified route. + /// If the same route was previously parsed and the method has not been called since, + /// this method obtains an instance from a static cache. + /// + /// The route to parse. + /// if the route to parse + /// is a base route; otherwise, . + /// A newly-constructed instance of + /// that will match URL paths against . + /// is . + /// is not a valid route. + /// + /// + public static RouteMatcher Parse(string route, bool isBaseRoute) + { + var exception = TryParseInternal(route, isBaseRoute, out var result); + if (exception != null) + throw exception; + + return result!; + } + + /// + /// Attempts to obtain an instance of by parsing the specified route. + /// If the same route was previously parsed and the method has not been called since, + /// this method obtains an instance from a static cache. + /// + /// The route to parse. + /// if the route to parse + /// is a base route; otherwise, . + /// When this method returns , a newly-constructed instance of + /// that will match URL paths against ; otherwise, . + /// This parameter is passed uninitialized. + /// if parsing was successful; otherwise, . + /// + /// + public static bool TryParse(string route, bool isBaseRoute, out RouteMatcher? result) + => TryParseInternal(route, isBaseRoute, out result) == null; + + /// + /// Clears 's internal instance cache. + /// + /// + /// + public static void ClearCache() + { + lock (SyncRoot) + { + Cache.Clear(); + } + } + + /// + /// Returns a hash code for this instance. + /// + /// A hash code for this instance, suitable for use in hashing algorithms + /// and data structures like a hash table. + public override int GetHashCode() => CompositeHashCode.Using(Route, IsBaseRoute); + + /// + /// Determines whether the specified is equal to this instance. + /// + /// The to compare with this instance. + /// if is equal to this instance; + /// otherwise, . + public override bool Equals(object? obj) => obj is RouteMatcher other && Equals(other); + + /// + /// Indicates whether this instance is equal to another instance of . + /// + /// A to compare with this instance. + /// if this instance is equal to ; + /// otherwise, . + public bool Equals(RouteMatcher? other) + => other != null + && other.Route == Route + && other.IsBaseRoute == IsBaseRoute; + + /// + /// Matches the specified URL path against + /// and extracts values for the route's parameters. + /// + /// The URL path to match. + /// If the match is successful, a object; + /// otherwise, . + public RouteMatch? Match(string path) + { + if (path == null) + return null; + + // Optimize for parameterless base routes + if (IsBaseRoute) + { + if (Route.Length == 1) + return RouteMatch.UnsafeFromRoot(path); + + if (ParameterNames.Count == 0) + return RouteMatch.UnsafeFromBasePath(Route, path); + } + + var match = _regex.Match(path); + if (!match.Success) + return null; + + return new RouteMatch( + path, + ParameterNames, + match.Groups.Cast().Skip(1).Select(g => WebUtility.UrlDecode(g.Value)).ToArray(), + IsBaseRoute ? "/" + path.Substring(match.Groups[0].Length) : null); + } + + private static Exception? TryParseInternal(string route, bool isBaseRoute, out RouteMatcher? result) + { + lock (SyncRoot) + { + string? pattern = null; + var parameterNames = new List(); + var exception = Routing.Route.ParseInternal(route, isBaseRoute, (_, n, p) => { + parameterNames.AddRange(n); + pattern = p; + }); + if (exception != null) + { + result = null; + return exception; + } + + route = UrlPath.UnsafeNormalize(route, isBaseRoute); + if (Cache.TryGetValue((isBaseRoute, route), out result)) + return null; + + result = new RouteMatcher(isBaseRoute, route, pattern!, parameterNames); + Cache.Add((isBaseRoute, route), result); + return null; + } + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Routing/RouteResolutionResult.cs b/Vendor/EmbedIO-3.5.2/Routing/RouteResolutionResult.cs new file mode 100644 index 0000000..198d059 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Routing/RouteResolutionResult.cs @@ -0,0 +1,35 @@ +namespace EmbedIO.Routing +{ + /// + /// Represents the outcome of resolving a context and a path against a route. + /// + public enum RouteResolutionResult + { + /* DO NOT reorder members! + * RouteNotMatched < NoHandlerSelected < NoHandlerSuccessful < Success + * + * See comments in RouteResolverBase<,>.ResolveAsync for further explanation. + */ + + /// + /// The route didn't match. + /// + RouteNotMatched, + + /// + /// The route did match, but no registered handler was suitable for the context. + /// + NoHandlerSelected, + + /// + /// The route matched and one or more suitable handlers were found, + /// but none of them returned . + /// + NoHandlerSuccessful, + + /// + /// The route has been resolved. + /// + Success, + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Routing/RouteResolverBase`1.cs b/Vendor/EmbedIO-3.5.2/Routing/RouteResolverBase`1.cs new file mode 100644 index 0000000..1556324 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Routing/RouteResolverBase`1.cs @@ -0,0 +1,166 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using EmbedIO.Internal; +using EmbedIO.Utilities; +using Swan.Configuration; + +namespace EmbedIO.Routing +{ + /// + /// Implements the logic for resolving the requested path of a HTTP context against a route, + /// possibly handling different contexts via different handlers. + /// + /// The type of the data used to select a suitable handler + /// for the context. + /// + public abstract class RouteResolverBase : ConfiguredObject + { + private readonly List<(TData data, RouteHandlerCallback handler)> _dataHandlerPairs + = new List<(TData data, RouteHandlerCallback handler)>(); + + /// + /// Initializes a new instance of the class. + /// + /// The to match URL paths against. + /// + /// is . + /// + protected RouteResolverBase(RouteMatcher matcher) + { + Matcher = Validate.NotNull(nameof(matcher), matcher); + } + + /// + /// Gets the used to match routes. + /// + public RouteMatcher Matcher { get; } + + /// + /// Gets the route this resolver matches URL paths against. + /// + public string Route => Matcher.Route; + + /// + /// Gets a value indicating whether is a base route. + /// + public bool IsBaseRoute => Matcher.IsBaseRoute; + + /// + /// Associates some data to a handler. + /// The method calls + /// to extract data from the context; then, for each registered data / handler pair, + /// is called to determine whether + /// should be called. + /// + /// Data used to determine which contexts are + /// suitable to be handled by . + /// A callback used to handle matching contexts. + /// is . + /// + /// + /// + /// + public void Add(TData data, RouteHandlerCallback handler) + { + EnsureConfigurationNotLocked(); + + handler = Validate.NotNull(nameof(handler), handler); + _dataHandlerPairs.Add((data, handler)); + } + + /// + /// Associates some data to a synchronous handler. + /// The method calls + /// to extract data from the context; then, for each registered data / handler pair, + /// is called to determine whether + /// should be called. + /// + /// Data used to determine which contexts are + /// suitable to be handled by . + /// A callback used to handle matching contexts. + /// is . + /// + /// + /// + /// + public void Add(TData data, SyncRouteHandlerCallback handler) + { + EnsureConfigurationNotLocked(); + + handler = Validate.NotNull(nameof(handler), handler); + _dataHandlerPairs.Add((data, (ctx, route) => { + handler(ctx, route); + return Task.CompletedTask; + })); + } + + /// + /// Locks this instance, preventing further handler additions. + /// + public void Lock() => LockConfiguration(); + + /// + /// Asynchronously matches a URL path against ; + /// if the match is successful, tries to handle the specified + /// using handlers selected according to data extracted from the context. + /// Registered data / handler pairs are tried in the same order they were added. + /// + /// The context to handle. + /// A , representing the ongoing operation, + /// that will return a result in the form of one of the constants. + /// + /// + /// + /// + public async Task ResolveAsync(IHttpContext context) + { + LockConfiguration(); + + var match = Matcher.Match(context.RequestedPath); + if (match == null) + return RouteResolutionResult.RouteNotMatched; + + var contextData = GetContextData(context); + var result = RouteResolutionResult.NoHandlerSelected; + foreach (var (data, handler) in _dataHandlerPairs) + { + if (!MatchContextData(contextData, data)) + continue; + + try + { + await handler(context, match).ConfigureAwait(false); + return RouteResolutionResult.Success; + } + catch (RequestHandlerPassThroughException) + { + result = RouteResolutionResult.NoHandlerSuccessful; + } + } + + return result; + } + + /// + /// Called by to extract data from a context. + /// The extracted data are then used to select which handlers are suitable + /// to handle the context. + /// + /// The HTTP context to extract data from. + /// The extracted data. + /// + /// + protected abstract TData GetContextData(IHttpContext context); + + /// + /// Called by to match data extracted from a context + /// against data associated with a handler. + /// + /// The data extracted from the context. + /// The data associated with the handler. + /// if the handler should be called to handle the context; + /// otherwise, . + protected abstract bool MatchContextData(TData contextData, TData handlerData); + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Routing/RouteResolverCollectionBase`2.cs b/Vendor/EmbedIO-3.5.2/Routing/RouteResolverCollectionBase`2.cs new file mode 100644 index 0000000..7795ff5 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Routing/RouteResolverCollectionBase`2.cs @@ -0,0 +1,150 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using EmbedIO.Internal; +using EmbedIO.Utilities; +using Swan; +using Swan.Collections; +using Swan.Configuration; + +namespace EmbedIO.Routing +{ + /// + /// Implements the logic for resolving a context and a URL path against a list of routes, + /// possibly handling different HTTP methods via different handlers. + /// + /// The type of the data used to select a suitable handler + /// for a context. + /// The type of the route resolver. + /// + public abstract class RouteResolverCollectionBase : ConfiguredObject + where TResolver : RouteResolverBase + { + private readonly List _resolvers = new List(); + + /// + /// Associates some data and a route to a handler. + /// + /// Data used to determine which contexts are + /// suitable to be handled by . + /// The to match URL paths against. + /// A callback used to handle matching contexts. + /// + /// is . + /// - or - + /// is . + /// + /// The method + /// returned . + /// + /// + /// + public void Add(TData data, RouteMatcher matcher, RouteHandlerCallback handler) + { + matcher = Validate.NotNull(nameof(matcher), matcher); + handler = Validate.NotNull(nameof(handler), handler); + GetResolver(matcher).Add(data, handler); + } + + /// + /// Associates some data and a route to a synchronous handler. + /// + /// Data used to determine which contexts are + /// suitable to be handled by . + /// The to match URL paths against. + /// A callback used to handle matching contexts. + /// + /// is . + /// - or - + /// is . + /// + /// The method + /// returned . + /// + /// + /// + public void Add(TData data, RouteMatcher matcher, SyncRouteHandlerCallback handler) + { + matcher = Validate.NotNull(nameof(matcher), matcher); + handler = Validate.NotNull(nameof(handler), handler); + GetResolver(matcher).Add(data, handler); + } + + /// + /// Asynchronously matches a URL path against ; + /// if the match is successful, tries to handle the specified + /// using handlers selected according to data extracted from the context. + /// Registered resolvers are tried in the same order they were added by calling + /// . + /// + /// The context to handle. + /// A , representing the ongoing operation, + /// that will return a result in the form of one of the constants. + /// + public async Task ResolveAsync(IHttpContext context) + { + var result = RouteResolutionResult.RouteNotMatched; + foreach (var resolver in _resolvers) + { + var resolverResult = await resolver.ResolveAsync(context).ConfigureAwait(false); + OnResolverCalled(context, resolver, resolverResult); + if (resolverResult == RouteResolutionResult.Success) + return RouteResolutionResult.Success; + + // This is why RouteResolutionResult constants must not be reordered. + if (resolverResult > result) + result = resolverResult; + } + + return result; + } + + /// + /// Locks this collection, preventing further additions. + /// + public void Lock() => LockConfiguration(); + + /// + protected override void OnBeforeLockConfiguration() + { + foreach (var resolver in _resolvers) + resolver.Lock(); + } + + /// + /// Called by + /// and to create an instance + /// of that can resolve the specified route. + /// If this method returns , an + /// is thrown by the calling method. + /// + /// The to match URL paths against. + /// A newly-constructed instance of . + protected abstract TResolver CreateResolver(RouteMatcher matcher); + + /// + /// Called by when a resolver's + /// ResolveAsync method has been called + /// to resolve a context. + /// This callback method may be used e.g. for logging or testing. + /// + /// The context to handle. + /// The resolver just called. + /// The result returned by .ResolveAsync. + protected virtual void OnResolverCalled(IHttpContext context, TResolver resolver, RouteResolutionResult result) + { + } + + private TResolver GetResolver(RouteMatcher matcher) + { + var resolver = _resolvers.FirstOrDefault(r => r.Matcher.Equals(matcher)); + if (resolver != null) + return resolver; + + resolver = CreateResolver(matcher); + _resolvers.Add(resolver ?? throw SelfCheck.Failure($"{nameof(CreateResolver)} returned null.")); + return resolver; + } + } +} diff --git a/Vendor/EmbedIO-3.5.2/Routing/RouteVerbResolver.cs b/Vendor/EmbedIO-3.5.2/Routing/RouteVerbResolver.cs new file mode 100644 index 0000000..82e7b5a --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Routing/RouteVerbResolver.cs @@ -0,0 +1,30 @@ +using System; + +namespace EmbedIO.Routing +{ + /// + /// Handles a HTTP request by matching it against a route, + /// possibly handling different HTTP methods via different handlers. + /// + public sealed class RouteVerbResolver : RouteResolverBase + { + /// + /// Initializes a new instance of the class. + /// + /// The to match URL paths against. + /// + /// is . + /// + public RouteVerbResolver(RouteMatcher matcher) + : base(matcher) + { + } + + /// + protected override HttpVerbs GetContextData(IHttpContext context) => context.Request.HttpVerb; + + /// + protected override bool MatchContextData(HttpVerbs contextVerb, HttpVerbs handlerVerb) + => handlerVerb == HttpVerbs.Any || contextVerb == handlerVerb; + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Routing/RouteVerbResolverCollection.cs b/Vendor/EmbedIO-3.5.2/Routing/RouteVerbResolverCollection.cs new file mode 100644 index 0000000..d3f97f2 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Routing/RouteVerbResolverCollection.cs @@ -0,0 +1,140 @@ +using System; +using System.Linq; +using System.Linq.Expressions; +using System.Reflection; +using System.Threading.Tasks; +using EmbedIO.Utilities; +using Swan.Logging; + +namespace EmbedIO.Routing +{ + /// + /// Handles a HTTP request by matching it against a list of routes, + /// possibly handling different HTTP methods via different handlers. + /// + /// + /// + public sealed class RouteVerbResolverCollection : RouteResolverCollectionBase + { + private readonly string _logSource; + + internal RouteVerbResolverCollection(string logSource) + { + _logSource = logSource; + } + + /// + /// Adds handlers, associating them with HTTP method / route pairs by means + /// of Route attributes. + /// A compatible handler is a static or instance method that takes 2 + /// parameters having the following types, in order: + /// + /// + /// + /// + /// The return type of a compatible handler may be either + /// or . + /// A compatible handler, in order to be added to a , + /// must have one or more Route attributes. + /// The same handler will be added once for each such attribute, either declared on the handler, + /// or inherited (if the handler is a virtual method). + /// This method behaves according to the type of the + /// parameter: + /// + /// if is a , all public static methods of + /// the type (either declared on the same type or inherited) that are compatible handlers will be added + /// to the collection; + /// if is an , all public static methods of + /// each exported type of the assembly (either declared on the same type or inherited) that are compatible handlers will be added + /// to the collection; + /// if is a referring to a compatible handler, + /// it will be added to the collection; + /// if is a whose Method + /// refers to a compatible handler, that method will be added to the collection; + /// if is none of the above, all public instance methods of + /// its type (either declared on the same type or inherited) that are compatible handlers will be bound to + /// and added to the collection. + /// + /// + /// Where to look for compatible handlers. See the Summary section for more information. + /// + /// The number of handlers that were added to the collection. + /// Note that methods with multiple Route attributes + /// will count as one for each attribute. + /// + /// is . + public int AddFrom(object target) => Validate.NotNull(nameof(target), target) switch { + Type type => AddFrom(null, type), + Assembly assembly => assembly.GetExportedTypes().Sum(t => AddFrom(null, t)), + MethodInfo method => method.IsStatic ? Add(null, method) : 0, + Delegate callback => Add(callback.Target, callback.Method), + _ => AddFrom(target, target.GetType()) + }; + + /// + protected override RouteVerbResolver CreateResolver(RouteMatcher matcher) => new RouteVerbResolver(matcher); + + /// + protected override void OnResolverCalled(IHttpContext context, RouteVerbResolver resolver, RouteResolutionResult result) + => $"[{context.Id}] Route {resolver.Route} : {result}".Trace(_logSource); + + private static bool IsHandlerCompatibleMethod(MethodInfo method, out bool isSynchronous) + { + isSynchronous = false; + var returnType = method.ReturnType; + if (returnType == typeof(void)) + { + isSynchronous = true; + } + else if (returnType != typeof(Task)) + { + return false; + } + + var parameters = method.GetParameters(); + return parameters.Length == 2 + && parameters[0].ParameterType.IsAssignableFrom(typeof(IHttpContext)) + && parameters[1].ParameterType.IsAssignableFrom(typeof(RouteMatch)); + } + + // Call Add with all suitable methods of a Type, return sum of results. + private int AddFrom(object? target, Type type) + => type.GetMethods(target == null + ? BindingFlags.Public | BindingFlags.Static + : BindingFlags.Public | BindingFlags.Instance) + .Where(method => method.IsPublic + && !method.IsAbstract + && !method.ContainsGenericParameters) + .Sum(m => Add(target, m)); + + private int Add(object? target, MethodInfo method) + { + if (!IsHandlerCompatibleMethod(method, out var isSynchronous)) + return 0; + + var attributes = method.GetCustomAttributes(true).OfType().ToArray(); + if (attributes.Length == 0) + return 0; + + var parameters = new[] { + Expression.Parameter(typeof(IHttpContext), "context"), + Expression.Parameter(typeof(RouteMatch), "route"), + }; + + Expression body = Expression.Call(Expression.Constant(target), method, parameters.Cast()); + if (isSynchronous) + { + // Convert void to Task by evaluating Task.CompletedTask + body = Expression.Block(typeof(Task), body, Expression.Constant(Task.CompletedTask)); + } + + var handler = Expression.Lambda(body, parameters).Compile(); + foreach (var attribute in attributes) + { + Add(attribute.Verb, attribute.Matcher, handler); + } + + return attributes.Length; + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Routing/RoutingModule.cs b/Vendor/EmbedIO-3.5.2/Routing/RoutingModule.cs new file mode 100644 index 0000000..2875677 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Routing/RoutingModule.cs @@ -0,0 +1,62 @@ +using System; + +namespace EmbedIO.Routing +{ + /// + /// A module that handles requests by resolving route / method pairs associated with handlers. + /// + /// + public class RoutingModule : RoutingModuleBase + { + /// + /// + /// Initializes a new instance of the class. + /// + public RoutingModule(string baseRoute) + : base(baseRoute) + { + } + + /// + /// Associates a HTTP method and a route to a handler. + /// + /// A constant representing the HTTP method + /// to associate with , or + /// if can handle all HTTP methods. + /// The used to match URL paths. + /// A callback used to handle matching contexts. + /// + /// is . + /// - or - + /// is . + /// + public void Add(HttpVerbs verb, RouteMatcher matcher, RouteHandlerCallback handler) + => AddHandler(verb, matcher, handler); + + /// + /// Associates a HTTP method and a route to a synchronous handler. + /// + /// A constant representing the HTTP method + /// to associate with , or + /// if can handle all HTTP methods. + /// The used to match URL paths. + /// A callback used to handle matching contexts. + /// + /// is . + /// - or - + /// is . + /// + public void Add(HttpVerbs verb, RouteMatcher matcher, SyncRouteHandlerCallback handler) + => AddHandler(verb, matcher, handler); + + /// + /// Adds handlers, associating them with HTTP method / route pairs by means + /// of Route attributes. + /// See for further information. + /// + /// Where to look for compatible handlers. + /// The number of handlers that were added. + /// is . + public int AddFrom(object target) => AddHandlersFrom(target); + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Routing/RoutingModuleBase.cs b/Vendor/EmbedIO-3.5.2/Routing/RoutingModuleBase.cs new file mode 100644 index 0000000..56e9cc9 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Routing/RoutingModuleBase.cs @@ -0,0 +1,317 @@ +using System; +using System.Threading.Tasks; +using Swan; + +namespace EmbedIO.Routing +{ + /// + /// Base class for modules that handle requests by resolving route / method pairs associated with handlers. + /// + /// + public abstract class RoutingModuleBase : WebModuleBase + { + private readonly RouteVerbResolverCollection _resolvers = new RouteVerbResolverCollection(nameof(RoutingModuleBase)); + + /// + /// + /// Initializes a new instance of the class. + /// + protected RoutingModuleBase(string baseRoute) + : base(baseRoute) + { + } + + /// + public override bool IsFinalHandler => true; + + /// + protected override async Task OnRequestAsync(IHttpContext context) + { + var result = await _resolvers.ResolveAsync(context).ConfigureAwait(false); + switch (result) + { + case RouteResolutionResult.RouteNotMatched: + case RouteResolutionResult.NoHandlerSuccessful: + await OnPathNotFoundAsync(context).ConfigureAwait(false); + break; + case RouteResolutionResult.NoHandlerSelected: + await OnMethodNotAllowedAsync(context).ConfigureAwait(false); + break; + case RouteResolutionResult.Success: + return; + default: + throw SelfCheck.Failure($"Internal error: unknown route resolution result {result}."); + } + } + + /// + /// Associates a HTTP method and a route to a handler. + /// + /// A constant representing the HTTP method + /// to associate with , or + /// if can handle all HTTP methods. + /// The used to match URL paths. + /// A callback used to handle matching contexts. + /// + /// is . + /// - or - + /// is . + /// + protected void AddHandler(HttpVerbs verb, RouteMatcher matcher, RouteHandlerCallback handler) + => _resolvers.Add(verb, matcher, handler); + + /// + /// Associates a HTTP method and a route to a synchronous handler. + /// + /// A constant representing the HTTP method + /// to associate with , or + /// if can handle all HTTP methods. + /// The used to match URL paths. + /// A callback used to handle matching contexts. + /// + /// is . + /// - or - + /// is . + /// + protected void AddHandler(HttpVerbs verb, RouteMatcher matcher, SyncRouteHandlerCallback handler) + => _resolvers.Add(verb, matcher, handler); + + /// + /// Adds handlers, associating them with HTTP method / route pairs by means + /// of Route attributes. + /// See for further information. + /// + /// Where to look for compatible handlers. + /// The number of handlers that were added. + /// is . + protected int AddHandlersFrom(object target) + => _resolvers.AddFrom(target); + + /// + /// Associates all requests matching a route to a handler. + /// + /// The used to match URL paths. + /// A callback used to handle matching contexts. + /// + /// is . + /// - or - + /// is . + /// + protected void OnAny(RouteMatcher matcher, RouteHandlerCallback handler) + => _resolvers.Add(HttpVerbs.Any, matcher, handler); + + /// + /// Associates all requests matching a route to a synchronous handler. + /// + /// The used to match URL paths. + /// A callback used to handle matching contexts. + /// + /// is . + /// - or - + /// is . + /// + protected void OnAny(RouteMatcher matcher, SyncRouteHandlerCallback handler) + => _resolvers.Add(HttpVerbs.Any, matcher, handler); + + /// + /// Associates DELETE requests matching a route to a handler. + /// + /// The used to match URL paths. + /// A callback used to handle matching contexts. + /// + /// is . + /// - or - + /// is . + /// + protected void OnDelete(RouteMatcher matcher, RouteHandlerCallback handler) + => _resolvers.Add(HttpVerbs.Delete, matcher, handler); + + /// + /// Associates DELETE requests matching a route to a synchronous handler. + /// + /// The used to match URL paths. + /// A callback used to handle matching contexts. + /// + /// is . + /// - or - + /// is . + /// + protected void OnDelete(RouteMatcher matcher, SyncRouteHandlerCallback handler) + => _resolvers.Add(HttpVerbs.Delete, matcher, handler); + + /// + /// Associates GET requests matching a route to a handler. + /// + /// The used to match URL paths. + /// A callback used to handle matching contexts. + /// + /// is . + /// - or - + /// is . + /// + protected void OnGet(RouteMatcher matcher, RouteHandlerCallback handler) + => _resolvers.Add(HttpVerbs.Get, matcher, handler); + + /// + /// Associates GET requests matching a route to a synchronous handler. + /// + /// The used to match URL paths. + /// A callback used to handle matching contexts. + /// + /// is . + /// - or - + /// is . + /// + protected void OnGet(RouteMatcher matcher, SyncRouteHandlerCallback handler) + => _resolvers.Add(HttpVerbs.Get, matcher, handler); + + /// + /// Associates HEAD requests matching a route to a handler. + /// + /// The used to match URL paths. + /// A callback used to handle matching contexts. + /// + /// is . + /// - or - + /// is . + /// + protected void OnHead(RouteMatcher matcher, RouteHandlerCallback handler) + => _resolvers.Add(HttpVerbs.Head, matcher, handler); + + /// + /// Associates HEAD requests matching a route to a synchronous handler. + /// + /// The used to match URL paths. + /// A callback used to handle matching contexts. + /// + /// is . + /// - or - + /// is . + /// + protected void OnHead(RouteMatcher matcher, SyncRouteHandlerCallback handler) + => _resolvers.Add(HttpVerbs.Head, matcher, handler); + + /// + /// Associates OPTIONS requests matching a route to a handler. + /// + /// The used to match URL paths. + /// A callback used to handle matching contexts. + /// + /// is . + /// - or - + /// is . + /// + protected void OnOptions(RouteMatcher matcher, RouteHandlerCallback handler) + => _resolvers.Add(HttpVerbs.Options, matcher, handler); + + /// + /// Associates OPTIONS requests matching a route to a synchronous handler. + /// + /// The used to match URL paths. + /// A callback used to handle matching contexts. + /// + /// is . + /// - or - + /// is . + /// + protected void OnOptions(RouteMatcher matcher, SyncRouteHandlerCallback handler) + => _resolvers.Add(HttpVerbs.Options, matcher, handler); + + /// + /// Associates PATCH requests matching a route to a handler. + /// + /// The used to match URL paths. + /// A callback used to handle matching contexts. + /// + /// is . + /// - or - + /// is . + /// + protected void OnPatch(RouteMatcher matcher, RouteHandlerCallback handler) + => _resolvers.Add(HttpVerbs.Patch, matcher, handler); + + /// + /// Associates PATCH requests matching a route to a synchronous handler. + /// + /// The used to match URL paths. + /// A callback used to handle matching contexts. + /// + /// is . + /// - or - + /// is . + /// + protected void OnPatch(RouteMatcher matcher, SyncRouteHandlerCallback handler) + => _resolvers.Add(HttpVerbs.Patch, matcher, handler); + + /// + /// Associates POST requests matching a route to a handler. + /// + /// The used to match URL paths. + /// A callback used to handle matching contexts. + /// + /// is . + /// - or - + /// is . + /// + protected void OnPost(RouteMatcher matcher, RouteHandlerCallback handler) + => _resolvers.Add(HttpVerbs.Post, matcher, handler); + + /// + /// Associates POST requests matching a route to a synchronous handler. + /// + /// The used to match URL paths. + /// A callback used to handle matching contexts. + /// + /// is . + /// - or - + /// is . + /// + protected void OnPost(RouteMatcher matcher, SyncRouteHandlerCallback handler) + => _resolvers.Add(HttpVerbs.Post, matcher, handler); + + /// + /// Associates PUT requests matching a route to a handler. + /// + /// The used to match URL paths. + /// A callback used to handle matching contexts. + /// + /// is . + /// - or - + /// is . + /// + protected void OnPut(RouteMatcher matcher, RouteHandlerCallback handler) + => _resolvers.Add(HttpVerbs.Put, matcher, handler); + + /// + /// Associates PUT requests matching a route to a synchronous handler. + /// + /// The used to match URL paths. + /// A callback used to handle matching contexts. + /// + /// is . + /// - or - + /// is . + /// + protected void OnPut(RouteMatcher matcher, SyncRouteHandlerCallback handler) + => _resolvers.Add(HttpVerbs.Put, matcher, handler); + + /// + /// Called when no route is matched for the requested URL path. + /// The default behavior is to send an empty 404 Not Found response. + /// + /// The context of the request being handled. + /// A representing the ongoing operation. + protected virtual Task OnPathNotFoundAsync(IHttpContext context) + => throw HttpException.NotFound(); + + /// + /// Called when at least one route is matched for the requested URL path, + /// but none of them is associated with the HTTP method of the request. + /// The default behavior is to send an empty 405 Method Not Allowed response. + /// + /// The context of the request being handled. + /// A representing the ongoing operation. + protected virtual Task OnMethodNotAllowedAsync(IHttpContext context) + => throw HttpException.MethodNotAllowed(); + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Routing/RoutingModuleExtensions-AddHandlerFromBaseOrTerminalRoute.cs b/Vendor/EmbedIO-3.5.2/Routing/RoutingModuleExtensions-AddHandlerFromBaseOrTerminalRoute.cs new file mode 100644 index 0000000..321a738 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Routing/RoutingModuleExtensions-AddHandlerFromBaseOrTerminalRoute.cs @@ -0,0 +1,429 @@ +using System; + +namespace EmbedIO.Routing +{ + partial class RoutingModuleExtensions + { + /// + /// Adds a handler to a . + /// + /// The on which this method is called. + /// A constant representing the HTTP method + /// to associate with , or + /// if can handle all HTTP methods. + /// The route to match URL paths against. + /// if + /// is a base route; if + /// is a terminal (non-base) route. + /// A callback used to handle matching contexts. + /// with the handler added. + /// is . + /// + /// is . + /// - or - + /// is . + /// + /// is not a valid route. + /// + public static RoutingModule Handle(this RoutingModule @this, HttpVerbs verb, string route, bool isBaseRoute, RouteHandlerCallback handler) + { + @this.Add(verb, RouteMatcher.Parse(route, isBaseRoute), handler); + return @this; + } + + /// + /// Adds a synchronous handler to a . + /// + /// The on which this method is called. + /// A constant representing the HTTP method + /// to associate with , or + /// if can handle all HTTP methods. + /// The route to match URL paths against. + /// if + /// is a base route; if + /// is a terminal (non-base) route. + /// A callback used to handle matching contexts. + /// with the handler added. + /// is . + /// + /// is . + /// - or - + /// is . + /// + /// is not a valid route. + /// + public static RoutingModule Handle(this RoutingModule @this, HttpVerbs verb, string route, bool isBaseRoute, SyncRouteHandlerCallback handler) + { + @this.Add(verb, RouteMatcher.Parse(route, isBaseRoute), handler); + return @this; + } + + /// + /// Associates all requests matching a route to a handler. + /// + /// The on which this method is called. + /// The route to match URL paths against. + /// if + /// is a base route; if + /// is a terminal (non-base) route. + /// A callback used to handle matching contexts. + /// with the handler added. + /// is . + /// + /// is . + /// - or - + /// is . + /// + /// is not a valid route. + public static RoutingModule OnAny(this RoutingModule @this, string route, bool isBaseRoute, RouteHandlerCallback handler) + { + @this.Add(HttpVerbs.Any, RouteMatcher.Parse(route, isBaseRoute), handler); + return @this; + } + + /// + /// Associates all requests matching a route to a synchronous handler. + /// + /// The on which this method is called. + /// The route to match URL paths against. + /// if + /// is a base route; if + /// is a terminal (non-base) route. + /// A callback used to handle matching contexts. + /// with the handler added. + /// is . + /// + /// is . + /// - or - + /// is . + /// + /// is not a valid route. + public static RoutingModule OnAny(this RoutingModule @this, string route, bool isBaseRoute, SyncRouteHandlerCallback handler) + { + @this.Add(HttpVerbs.Any, RouteMatcher.Parse(route, isBaseRoute), handler); + return @this; + } + + /// + /// Associates DELETE requests matching a route to a handler. + /// + /// The on which this method is called. + /// The route to match URL paths against. + /// if + /// is a base route; if + /// is a terminal (non-base) route. + /// A callback used to handle matching contexts. + /// with the handler added. + /// is . + /// + /// is . + /// - or - + /// is . + /// + /// is not a valid route. + public static RoutingModule OnDelete(this RoutingModule @this, string route, bool isBaseRoute, RouteHandlerCallback handler) + { + @this.Add(HttpVerbs.Delete, RouteMatcher.Parse(route, isBaseRoute), handler); + return @this; + } + + /// + /// Associates DELETE requests matching a route to a synchronous handler. + /// + /// The on which this method is called. + /// The route to match URL paths against. + /// if + /// is a base route; if + /// is a terminal (non-base) route. + /// A callback used to handle matching contexts. + /// with the handler added. + /// is . + /// + /// is . + /// - or - + /// is . + /// + /// is not a valid route. + public static RoutingModule OnDelete(this RoutingModule @this, string route, bool isBaseRoute, SyncRouteHandlerCallback handler) + { + @this.Add(HttpVerbs.Delete, RouteMatcher.Parse(route, isBaseRoute), handler); + return @this; + } + + /// + /// Associates GET requests matching a route to a handler. + /// + /// The on which this method is called. + /// The route to match URL paths against. + /// if + /// is a base route; if + /// is a terminal (non-base) route. + /// A callback used to handle matching contexts. + /// with the handler added. + /// is . + /// + /// is . + /// - or - + /// is . + /// + /// is not a valid route. + public static RoutingModule OnGet(this RoutingModule @this, string route, bool isBaseRoute, RouteHandlerCallback handler) + { + @this.Add(HttpVerbs.Get, RouteMatcher.Parse(route, isBaseRoute), handler); + return @this; + } + + /// + /// Associates GET requests matching a route to a synchronous handler. + /// + /// The on which this method is called. + /// The route to match URL paths against. + /// if + /// is a base route; if + /// is a terminal (non-base) route. + /// A callback used to handle matching contexts. + /// with the handler added. + /// is . + /// + /// is . + /// - or - + /// is . + /// + /// is not a valid route. + public static RoutingModule OnGet(this RoutingModule @this, string route, bool isBaseRoute, SyncRouteHandlerCallback handler) + { + @this.Add(HttpVerbs.Get, RouteMatcher.Parse(route, isBaseRoute), handler); + return @this; + } + + /// + /// Associates HEAD requests matching a route to a handler. + /// + /// The on which this method is called. + /// The route to match URL paths against. + /// if + /// is a base route; if + /// is a terminal (non-base) route. + /// A callback used to handle matching contexts. + /// with the handler added. + /// is . + /// + /// is . + /// - or - + /// is . + /// + /// is not a valid route. + public static RoutingModule OnHead(this RoutingModule @this, string route, bool isBaseRoute, RouteHandlerCallback handler) + { + @this.Add(HttpVerbs.Head, RouteMatcher.Parse(route, isBaseRoute), handler); + return @this; + } + + /// + /// Associates HEAD requests matching a route to a synchronous handler. + /// + /// The on which this method is called. + /// The route to match URL paths against. + /// if + /// is a base route; if + /// is a terminal (non-base) route. + /// A callback used to handle matching contexts. + /// with the handler added. + /// is . + /// + /// is . + /// - or - + /// is . + /// + /// is not a valid route. + public static RoutingModule OnHead(this RoutingModule @this, string route, bool isBaseRoute, SyncRouteHandlerCallback handler) + { + @this.Add(HttpVerbs.Head, RouteMatcher.Parse(route, isBaseRoute), handler); + return @this; + } + + /// + /// Associates OPTIONS requests matching a route to a handler. + /// + /// The on which this method is called. + /// The route to match URL paths against. + /// if + /// is a base route; if + /// is a terminal (non-base) route. + /// A callback used to handle matching contexts. + /// with the handler added. + /// is . + /// + /// is . + /// - or - + /// is . + /// + /// is not a valid route. + public static RoutingModule OnOptions(this RoutingModule @this, string route, bool isBaseRoute, RouteHandlerCallback handler) + { + @this.Add(HttpVerbs.Options, RouteMatcher.Parse(route, isBaseRoute), handler); + return @this; + } + + /// + /// Associates OPTIONS requests matching a route to a synchronous handler. + /// + /// The on which this method is called. + /// The route to match URL paths against. + /// if + /// is a base route; if + /// is a terminal (non-base) route. + /// A callback used to handle matching contexts. + /// with the handler added. + /// is . + /// + /// is . + /// - or - + /// is . + /// + /// is not a valid route. + public static RoutingModule OnOptions(this RoutingModule @this, string route, bool isBaseRoute, SyncRouteHandlerCallback handler) + { + @this.Add(HttpVerbs.Options, RouteMatcher.Parse(route, isBaseRoute), handler); + return @this; + } + + /// + /// Associates PATCH requests matching a route to a handler. + /// + /// The on which this method is called. + /// The route to match URL paths against. + /// if + /// is a base route; if + /// is a terminal (non-base) route. + /// A callback used to handle matching contexts. + /// with the handler added. + /// is . + /// + /// is . + /// - or - + /// is . + /// + /// is not a valid route. + public static RoutingModule OnPatch(this RoutingModule @this, string route, bool isBaseRoute, RouteHandlerCallback handler) + { + @this.Add(HttpVerbs.Patch, RouteMatcher.Parse(route, isBaseRoute), handler); + return @this; + } + + /// + /// Associates PATCH requests matching a route to a synchronous handler. + /// + /// The on which this method is called. + /// The route to match URL paths against. + /// if + /// is a base route; if + /// is a terminal (non-base) route. + /// A callback used to handle matching contexts. + /// with the handler added. + /// is . + /// + /// is . + /// - or - + /// is . + /// + /// is not a valid route. + public static RoutingModule OnPatch(this RoutingModule @this, string route, bool isBaseRoute, SyncRouteHandlerCallback handler) + { + @this.Add(HttpVerbs.Patch, RouteMatcher.Parse(route, isBaseRoute), handler); + return @this; + } + + /// + /// Associates POST requests matching a route to a handler. + /// + /// The on which this method is called. + /// The route to match URL paths against. + /// if + /// is a base route; if + /// is a terminal (non-base) route. + /// A callback used to handle matching contexts. + /// with the handler added. + /// is . + /// + /// is . + /// - or - + /// is . + /// + /// is not a valid route. + public static RoutingModule OnPost(this RoutingModule @this, string route, bool isBaseRoute, RouteHandlerCallback handler) + { + @this.Add(HttpVerbs.Post, RouteMatcher.Parse(route, isBaseRoute), handler); + return @this; + } + + /// + /// Associates POST requests matching a route to a synchronous handler. + /// + /// The on which this method is called. + /// The route to match URL paths against. + /// if + /// is a base route; if + /// is a terminal (non-base) route. + /// A callback used to handle matching contexts. + /// with the handler added. + /// is . + /// + /// is . + /// - or - + /// is . + /// + /// is not a valid route. + public static RoutingModule OnPost(this RoutingModule @this, string route, bool isBaseRoute, SyncRouteHandlerCallback handler) + { + @this.Add(HttpVerbs.Post, RouteMatcher.Parse(route, isBaseRoute), handler); + return @this; + } + + /// + /// Associates PUT requests matching a route to a handler. + /// + /// The on which this method is called. + /// The route to match URL paths against. + /// if + /// is a base route; if + /// is a terminal (non-base) route. + /// A callback used to handle matching contexts. + /// with the handler added. + /// is . + /// + /// is . + /// - or - + /// is . + /// + /// is not a valid route. + public static RoutingModule OnPut(this RoutingModule @this, string route, bool isBaseRoute, RouteHandlerCallback handler) + { + @this.Add(HttpVerbs.Put, RouteMatcher.Parse(route, isBaseRoute), handler); + return @this; + } + + /// + /// Associates PUT requests matching a route to a synchronous handler. + /// + /// The on which this method is called. + /// The route to match URL paths against. + /// if + /// is a base route; if + /// is a terminal (non-base) route. + /// A callback used to handle matching contexts. + /// with the handler added. + /// is . + /// + /// is . + /// - or - + /// is . + /// + /// is not a valid route. + public static RoutingModule OnPut(this RoutingModule @this, string route, bool isBaseRoute, SyncRouteHandlerCallback handler) + { + @this.Add(HttpVerbs.Put, RouteMatcher.Parse(route, isBaseRoute), handler); + return @this; + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Routing/RoutingModuleExtensions-AddHandlerFromRouteMatcher.cs b/Vendor/EmbedIO-3.5.2/Routing/RoutingModuleExtensions-AddHandlerFromRouteMatcher.cs new file mode 100644 index 0000000..fb0e255 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Routing/RoutingModuleExtensions-AddHandlerFromRouteMatcher.cs @@ -0,0 +1,357 @@ +using System; + +namespace EmbedIO.Routing +{ + partial class RoutingModuleExtensions + { + /// + /// Adds a handler to a . + /// + /// The on which this method is called. + /// A constant representing the HTTP method + /// to associate with , or + /// if can handle all HTTP methods. + /// The used to match URL paths. + /// A callback used to handle matching contexts. + /// with the handler added. + /// is . + /// + /// is . + /// - or - + /// is . + /// + /// + public static RoutingModule Handle(this RoutingModule @this, HttpVerbs verb, RouteMatcher matcher, RouteHandlerCallback handler) + { + @this.Add(verb, matcher, handler); + return @this; + } + + /// + /// Adds a synchronous handler to a . + /// + /// The on which this method is called. + /// A constant representing the HTTP method + /// to associate with , or + /// if can handle all HTTP methods. + /// The used to match URL paths. + /// A callback used to handle matching contexts. + /// with the handler added. + /// is . + /// + /// is . + /// - or - + /// is . + /// + /// + public static RoutingModule Handle(this RoutingModule @this, HttpVerbs verb, RouteMatcher matcher, SyncRouteHandlerCallback handler) + { + @this.Add(verb, matcher, handler); + return @this; + } + + /// + /// Associates all requests matching a route to a handler. + /// + /// The on which this method is called. + /// The used to match URL paths. + /// A callback used to handle matching contexts. + /// with the handler added. + /// is . + /// + /// is . + /// - or - + /// is . + /// + public static RoutingModule OnAny(this RoutingModule @this, RouteMatcher matcher, RouteHandlerCallback handler) + { + @this.Add(HttpVerbs.Any, matcher, handler); + return @this; + } + + /// + /// Associates all requests matching a route to a synchronous handler. + /// + /// The on which this method is called. + /// The used to match URL paths. + /// A callback used to handle matching contexts. + /// with the handler added. + /// is . + /// + /// is . + /// - or - + /// is . + /// + public static RoutingModule OnAny(this RoutingModule @this, RouteMatcher matcher, SyncRouteHandlerCallback handler) + { + @this.Add(HttpVerbs.Any, matcher, handler); + return @this; + } + + /// + /// Associates DELETE requests matching a route to a handler. + /// + /// The on which this method is called. + /// The used to match URL paths. + /// A callback used to handle matching contexts. + /// with the handler added. + /// is . + /// + /// is . + /// - or - + /// is . + /// + public static RoutingModule OnDelete(this RoutingModule @this, RouteMatcher matcher, RouteHandlerCallback handler) + { + @this.Add(HttpVerbs.Delete, matcher, handler); + return @this; + } + + /// + /// Associates DELETE requests matching a route to a synchronous handler. + /// + /// The on which this method is called. + /// The used to match URL paths. + /// A callback used to handle matching contexts. + /// with the handler added. + /// is . + /// + /// is . + /// - or - + /// is . + /// + public static RoutingModule OnDelete(this RoutingModule @this, RouteMatcher matcher, SyncRouteHandlerCallback handler) + { + @this.Add(HttpVerbs.Delete, matcher, handler); + return @this; + } + + /// + /// Associates GET requests matching a route to a handler. + /// + /// The on which this method is called. + /// The used to match URL paths. + /// A callback used to handle matching contexts. + /// with the handler added. + /// is . + /// + /// is . + /// - or - + /// is . + /// + public static RoutingModule OnGet(this RoutingModule @this, RouteMatcher matcher, RouteHandlerCallback handler) + { + @this.Add(HttpVerbs.Get, matcher, handler); + return @this; + } + + /// + /// Associates GET requests matching a route to a synchronous handler. + /// + /// The on which this method is called. + /// The used to match URL paths. + /// A callback used to handle matching contexts. + /// with the handler added. + /// is . + /// + /// is . + /// - or - + /// is . + /// + public static RoutingModule OnGet(this RoutingModule @this, RouteMatcher matcher, SyncRouteHandlerCallback handler) + { + @this.Add(HttpVerbs.Get, matcher, handler); + return @this; + } + + /// + /// Associates HEAD requests matching a route to a handler. + /// + /// The on which this method is called. + /// The used to match URL paths. + /// A callback used to handle matching contexts. + /// with the handler added. + /// is . + /// + /// is . + /// - or - + /// is . + /// + public static RoutingModule OnHead(this RoutingModule @this, RouteMatcher matcher, RouteHandlerCallback handler) + { + @this.Add(HttpVerbs.Head, matcher, handler); + return @this; + } + + /// + /// Associates HEAD requests matching a route to a synchronous handler. + /// + /// The on which this method is called. + /// The used to match URL paths. + /// A callback used to handle matching contexts. + /// with the handler added. + /// is . + /// + /// is . + /// - or - + /// is . + /// + public static RoutingModule OnHead(this RoutingModule @this, RouteMatcher matcher, SyncRouteHandlerCallback handler) + { + @this.Add(HttpVerbs.Head, matcher, handler); + return @this; + } + + /// + /// Associates OPTIONS requests matching a route to a handler. + /// + /// The on which this method is called. + /// The used to match URL paths. + /// A callback used to handle matching contexts. + /// with the handler added. + /// is . + /// + /// is . + /// - or - + /// is . + /// + public static RoutingModule OnOptions(this RoutingModule @this, RouteMatcher matcher, RouteHandlerCallback handler) + { + @this.Add(HttpVerbs.Options, matcher, handler); + return @this; + } + + /// + /// Associates OPTIONS requests matching a route to a synchronous handler. + /// + /// The on which this method is called. + /// The used to match URL paths. + /// A callback used to handle matching contexts. + /// with the handler added. + /// is . + /// + /// is . + /// - or - + /// is . + /// + public static RoutingModule OnOptions(this RoutingModule @this, RouteMatcher matcher, SyncRouteHandlerCallback handler) + { + @this.Add(HttpVerbs.Options, matcher, handler); + return @this; + } + + /// + /// Associates PATCH requests matching a route to a handler. + /// + /// The on which this method is called. + /// The used to match URL paths. + /// A callback used to handle matching contexts. + /// with the handler added. + /// is . + /// + /// is . + /// - or - + /// is . + /// + public static RoutingModule OnPatch(this RoutingModule @this, RouteMatcher matcher, RouteHandlerCallback handler) + { + @this.Add(HttpVerbs.Patch, matcher, handler); + return @this; + } + + /// + /// Associates PATCH requests matching a route to a synchronous handler. + /// + /// The on which this method is called. + /// The used to match URL paths. + /// A callback used to handle matching contexts. + /// with the handler added. + /// is . + /// + /// is . + /// - or - + /// is . + /// + public static RoutingModule OnPatch(this RoutingModule @this, RouteMatcher matcher, SyncRouteHandlerCallback handler) + { + @this.Add(HttpVerbs.Patch, matcher, handler); + return @this; + } + + /// + /// Associates POST requests matching a route to a handler. + /// + /// The on which this method is called. + /// The used to match URL paths. + /// A callback used to handle matching contexts. + /// with the handler added. + /// is . + /// + /// is . + /// - or - + /// is . + /// + public static RoutingModule OnPost(this RoutingModule @this, RouteMatcher matcher, RouteHandlerCallback handler) + { + @this.Add(HttpVerbs.Post, matcher, handler); + return @this; + } + + /// + /// Associates POST requests matching a route to a synchronous handler. + /// + /// The on which this method is called. + /// The used to match URL paths. + /// A callback used to handle matching contexts. + /// with the handler added. + /// is . + /// + /// is . + /// - or - + /// is . + /// + public static RoutingModule OnPost(this RoutingModule @this, RouteMatcher matcher, SyncRouteHandlerCallback handler) + { + @this.Add(HttpVerbs.Post, matcher, handler); + return @this; + } + + /// + /// Associates PUT requests matching a route to a handler. + /// + /// The on which this method is called. + /// The used to match URL paths. + /// A callback used to handle matching contexts. + /// with the handler added. + /// is . + /// + /// is . + /// - or - + /// is . + /// + public static RoutingModule OnPut(this RoutingModule @this, RouteMatcher matcher, RouteHandlerCallback handler) + { + @this.Add(HttpVerbs.Put, matcher, handler); + return @this; + } + + /// + /// Associates PUT requests matching a route to a synchronous handler. + /// + /// The on which this method is called. + /// The used to match URL paths. + /// A callback used to handle matching contexts. + /// with the handler added. + /// is . + /// + /// is . + /// - or - + /// is . + /// + public static RoutingModule OnPut(this RoutingModule @this, RouteMatcher matcher, SyncRouteHandlerCallback handler) + { + @this.Add(HttpVerbs.Put, matcher, handler); + return @this; + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Routing/RoutingModuleExtensions-AddHandlerFromTerminalRoute.cs b/Vendor/EmbedIO-3.5.2/Routing/RoutingModuleExtensions-AddHandlerFromTerminalRoute.cs new file mode 100644 index 0000000..4e34ae7 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Routing/RoutingModuleExtensions-AddHandlerFromTerminalRoute.cs @@ -0,0 +1,375 @@ +using System; + +namespace EmbedIO.Routing +{ + partial class RoutingModuleExtensions + { + /// + /// Adds a handler to a . + /// + /// The on which this method is called. + /// A constant representing the HTTP method + /// to associate with , or + /// if can handle all HTTP methods. + /// The route to match URL paths against. + /// A callback used to handle matching contexts. + /// with the handler added. + /// is . + /// + /// is . + /// - or - + /// is . + /// + /// is not a valid route. + /// + public static RoutingModule Handle(this RoutingModule @this, HttpVerbs verb, string route, RouteHandlerCallback handler) + { + @this.Add(verb, RouteMatcher.Parse(route, false), handler); + return @this; + } + + /// + /// Adds a synchronous handler to a . + /// + /// The on which this method is called. + /// A constant representing the HTTP method + /// to associate with , or + /// if can handle all HTTP methods. + /// The route to match URL paths against. + /// A callback used to handle matching contexts. + /// with the handler added. + /// is . + /// + /// is . + /// - or - + /// is . + /// + /// is not a valid route. + /// + public static RoutingModule Handle(this RoutingModule @this, HttpVerbs verb, string route, SyncRouteHandlerCallback handler) + { + @this.Add(verb, RouteMatcher.Parse(route, false), handler); + return @this; + } + + /// + /// Associates all requests matching a route to a handler. + /// + /// The on which this method is called. + /// The route to match URL paths against. + /// A callback used to handle matching contexts. + /// with the handler added. + /// is . + /// + /// is . + /// - or - + /// is . + /// + /// is not a valid route. + public static RoutingModule OnAny(this RoutingModule @this, string route, RouteHandlerCallback handler) + { + @this.Add(HttpVerbs.Any, RouteMatcher.Parse(route, false), handler); + return @this; + } + + /// + /// Associates all requests matching a route to a synchronous handler. + /// + /// The on which this method is called. + /// The route to match URL paths against. + /// A callback used to handle matching contexts. + /// with the handler added. + /// is . + /// + /// is . + /// - or - + /// is . + /// + /// is not a valid route. + public static RoutingModule OnAny(this RoutingModule @this, string route, SyncRouteHandlerCallback handler) + { + @this.Add(HttpVerbs.Any, RouteMatcher.Parse(route, false), handler); + return @this; + } + + /// + /// Associates DELETE requests matching a route to a handler. + /// + /// The on which this method is called. + /// The route to match URL paths against. + /// A callback used to handle matching contexts. + /// with the handler added. + /// is . + /// + /// is . + /// - or - + /// is . + /// + /// is not a valid route. + public static RoutingModule OnDelete(this RoutingModule @this, string route, RouteHandlerCallback handler) + { + @this.Add(HttpVerbs.Delete, RouteMatcher.Parse(route, false), handler); + return @this; + } + + /// + /// Associates DELETE requests matching a route to a synchronous handler. + /// + /// The on which this method is called. + /// The route to match URL paths against. + /// A callback used to handle matching contexts. + /// with the handler added. + /// is . + /// + /// is . + /// - or - + /// is . + /// + /// is not a valid route. + public static RoutingModule OnDelete(this RoutingModule @this, string route, SyncRouteHandlerCallback handler) + { + @this.Add(HttpVerbs.Delete, RouteMatcher.Parse(route, false), handler); + return @this; + } + + /// + /// Associates GET requests matching a route to a handler. + /// + /// The on which this method is called. + /// The route to match URL paths against. + /// A callback used to handle matching contexts. + /// with the handler added. + /// is . + /// + /// is . + /// - or - + /// is . + /// + /// is not a valid route. + public static RoutingModule OnGet(this RoutingModule @this, string route, RouteHandlerCallback handler) + { + @this.Add(HttpVerbs.Get, RouteMatcher.Parse(route, false), handler); + return @this; + } + + /// + /// Associates GET requests matching a route to a synchronous handler. + /// + /// The on which this method is called. + /// The route to match URL paths against. + /// A callback used to handle matching contexts. + /// with the handler added. + /// is . + /// + /// is . + /// - or - + /// is . + /// + /// is not a valid route. + public static RoutingModule OnGet(this RoutingModule @this, string route, SyncRouteHandlerCallback handler) + { + @this.Add(HttpVerbs.Get, RouteMatcher.Parse(route, false), handler); + return @this; + } + + /// + /// Associates HEAD requests matching a route to a handler. + /// + /// The on which this method is called. + /// The route to match URL paths against. + /// A callback used to handle matching contexts. + /// with the handler added. + /// is . + /// + /// is . + /// - or - + /// is . + /// + /// is not a valid route. + public static RoutingModule OnHead(this RoutingModule @this, string route, RouteHandlerCallback handler) + { + @this.Add(HttpVerbs.Head, RouteMatcher.Parse(route, false), handler); + return @this; + } + + /// + /// Associates HEAD requests matching a route to a synchronous handler. + /// + /// The on which this method is called. + /// The route to match URL paths against. + /// A callback used to handle matching contexts. + /// with the handler added. + /// is . + /// + /// is . + /// - or - + /// is . + /// + /// is not a valid route. + public static RoutingModule OnHead(this RoutingModule @this, string route, SyncRouteHandlerCallback handler) + { + @this.Add(HttpVerbs.Head, RouteMatcher.Parse(route, false), handler); + return @this; + } + + /// + /// Associates OPTIONS requests matching a route to a handler. + /// + /// The on which this method is called. + /// The route to match URL paths against. + /// A callback used to handle matching contexts. + /// with the handler added. + /// is . + /// + /// is . + /// - or - + /// is . + /// + /// is not a valid route. + public static RoutingModule OnOptions(this RoutingModule @this, string route, RouteHandlerCallback handler) + { + @this.Add(HttpVerbs.Options, RouteMatcher.Parse(route, false), handler); + return @this; + } + + /// + /// Associates OPTIONS requests matching a route to a synchronous handler. + /// + /// The on which this method is called. + /// The route to match URL paths against. + /// A callback used to handle matching contexts. + /// with the handler added. + /// is . + /// + /// is . + /// - or - + /// is . + /// + /// is not a valid route. + public static RoutingModule OnOptions(this RoutingModule @this, string route, SyncRouteHandlerCallback handler) + { + @this.Add(HttpVerbs.Options, RouteMatcher.Parse(route, false), handler); + return @this; + } + + /// + /// Associates PATCH requests matching a route to a handler. + /// + /// The on which this method is called. + /// The route to match URL paths against. + /// A callback used to handle matching contexts. + /// with the handler added. + /// is . + /// + /// is . + /// - or - + /// is . + /// + /// is not a valid route. + public static RoutingModule OnPatch(this RoutingModule @this, string route, RouteHandlerCallback handler) + { + @this.Add(HttpVerbs.Patch, RouteMatcher.Parse(route, false), handler); + return @this; + } + + /// + /// Associates PATCH requests matching a route to a synchronous handler. + /// + /// The on which this method is called. + /// The route to match URL paths against. + /// A callback used to handle matching contexts. + /// with the handler added. + /// is . + /// + /// is . + /// - or - + /// is . + /// + /// is not a valid route. + public static RoutingModule OnPatch(this RoutingModule @this, string route, SyncRouteHandlerCallback handler) + { + @this.Add(HttpVerbs.Patch, RouteMatcher.Parse(route, false), handler); + return @this; + } + + /// + /// Associates POST requests matching a route to a handler. + /// + /// The on which this method is called. + /// The route to match URL paths against. + /// A callback used to handle matching contexts. + /// with the handler added. + /// is . + /// + /// is . + /// - or - + /// is . + /// + /// is not a valid route. + public static RoutingModule OnPost(this RoutingModule @this, string route, RouteHandlerCallback handler) + { + @this.Add(HttpVerbs.Post, RouteMatcher.Parse(route, false), handler); + return @this; + } + + /// + /// Associates POST requests matching a route to a synchronous handler. + /// + /// The on which this method is called. + /// The route to match URL paths against. + /// A callback used to handle matching contexts. + /// with the handler added. + /// is . + /// + /// is . + /// - or - + /// is . + /// + /// is not a valid route. + public static RoutingModule OnPost(this RoutingModule @this, string route, SyncRouteHandlerCallback handler) + { + @this.Add(HttpVerbs.Post, RouteMatcher.Parse(route, false), handler); + return @this; + } + + /// + /// Associates PUT requests matching a route to a handler. + /// + /// The on which this method is called. + /// The route to match URL paths against. + /// A callback used to handle matching contexts. + /// with the handler added. + /// is . + /// + /// is . + /// - or - + /// is . + /// + /// is not a valid route. + public static RoutingModule OnPut(this RoutingModule @this, string route, RouteHandlerCallback handler) + { + @this.Add(HttpVerbs.Put, RouteMatcher.Parse(route, false), handler); + return @this; + } + + /// + /// Associates PUT requests matching a route to a synchronous handler. + /// + /// The on which this method is called. + /// The route to match URL paths against. + /// A callback used to handle matching contexts. + /// with the handler added. + /// is . + /// + /// is . + /// - or - + /// is . + /// + /// is not a valid route. + public static RoutingModule OnPut(this RoutingModule @this, string route, SyncRouteHandlerCallback handler) + { + @this.Add(HttpVerbs.Put, RouteMatcher.Parse(route, false), handler); + return @this; + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Routing/RoutingModuleExtensions.cs b/Vendor/EmbedIO-3.5.2/Routing/RoutingModuleExtensions.cs new file mode 100644 index 0000000..8be3263 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Routing/RoutingModuleExtensions.cs @@ -0,0 +1,26 @@ +using System; + +namespace EmbedIO.Routing +{ + /// + /// Provides extension methods for . + /// + public static partial class RoutingModuleExtensions + { + /// + /// Adds handlers, associating them with HTTP method / route pairs by means + /// of Route attributes. + /// See for further information. + /// + /// The on which this method is called. + /// Where to look for compatible handlers. + /// with handlers added. + /// is . + /// is . + public static RoutingModule WithHandlersFrom(this RoutingModule @this, object target) + { + @this.AddFrom(target); + return @this; + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Routing/SyncRouteHandlerCallback.cs b/Vendor/EmbedIO-3.5.2/Routing/SyncRouteHandlerCallback.cs new file mode 100644 index 0000000..c858b9f --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Routing/SyncRouteHandlerCallback.cs @@ -0,0 +1,10 @@ +namespace EmbedIO.Routing +{ + /// + /// Base class for callbacks used to handle routed requests synchronously. + /// + /// An interface representing the context of the request. + /// The matched route. + /// + public delegate void SyncRouteHandlerCallback(IHttpContext context, RouteMatch route); +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Security/BanInfo.cs b/Vendor/EmbedIO-3.5.2/Security/BanInfo.cs new file mode 100644 index 0000000..83a6269 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Security/BanInfo.cs @@ -0,0 +1,25 @@ +using System.Net; + +namespace EmbedIO.Security +{ + /// + /// Contains information about the ban of an IP address. + /// + public class BanInfo + { + /// + /// Gets or sets the banned IP address. + /// + public IPAddress IPAddress { get; set; } + + /// + /// Gets or sets the expiration time of the ban. + /// + public long ExpiresAt { get; set; } + + /// + /// Gets or sets a value indicating whether this instance was explicitly banned. + /// + public bool IsExplicit { get; set; } + } +} diff --git a/Vendor/EmbedIO-3.5.2/Security/IIPBanningCriterion.cs b/Vendor/EmbedIO-3.5.2/Security/IIPBanningCriterion.cs new file mode 100644 index 0000000..7a13ee1 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Security/IIPBanningCriterion.cs @@ -0,0 +1,30 @@ +using System; +using System.Net; +using System.Threading.Tasks; + +namespace EmbedIO.Security +{ + /// + /// Represents a criterion for . + /// + public interface IIPBanningCriterion : IDisposable + { + /// + /// Validates the IP address should be banned or not. + /// + /// The address. + /// true if the IP Address should be banned, otherwise false. + Task ValidateIPAddress(IPAddress address); + + /// + /// Clears the data generated by an IP address. + /// + /// The address. + void ClearIPAddress(IPAddress address); + + /// + /// Purges the data of the Criterion. + /// + void PurgeData(); + } +} diff --git a/Vendor/EmbedIO-3.5.2/Security/IPBanningConfiguration.cs b/Vendor/EmbedIO-3.5.2/Security/IPBanningConfiguration.cs new file mode 100644 index 0000000..a91b89f --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Security/IPBanningConfiguration.cs @@ -0,0 +1,188 @@ +using EmbedIO.Utilities; +using Swan.Configuration; +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Threading.Tasks; + +namespace EmbedIO.Security +{ + /// + /// Represents a configuration object for . + /// + /// + public class IPBanningConfiguration : ConfiguredObject, IDisposable + { + private readonly List _criterions = new List(); + private readonly ConcurrentDictionary _blacklistDictionary = new ConcurrentDictionary(); + private readonly ConcurrentBag _whiteListBag = new ConcurrentBag(); + private readonly int _banTime; + private bool _disposed; + + internal IPBanningConfiguration(int banTime) + { + _banTime = banTime; + } + + /// + /// Finalizes an instance of the class. + /// + ~IPBanningConfiguration() + { + Dispose(false); + } + + /// + /// Gets the black list. + /// + /// + /// The black list. + /// + public List BlackList => _blacklistDictionary.Values.ToList(); + + /// + /// Check if a Criterion should continue testing an IP Address. + /// + /// The address. + /// true if the Criterion should continue, otherwise false. + public bool ShouldContinue(IPAddress address) => + !_whiteListBag.Contains(address) || !_blacklistDictionary.ContainsKey(address); + + /// + /// Purges this instance. + /// + public void Purge() + { + PurgeBlackList(); + + foreach (var criterion in _criterions) + { + criterion.PurgeData(); + } + } + + /// + /// Checks the client. + /// + /// The client address. + /// A representing the asynchronous operation. + public async Task CheckClient(IPAddress clientAddress) + { + if (_whiteListBag.Contains(clientAddress)) + return; + + foreach (var criterion in _criterions) + { + var result = await criterion.ValidateIPAddress(clientAddress).ConfigureAwait(false); + + if (!result) continue; + + TryBanIP(clientAddress, false); + break; + } + + if (_blacklistDictionary.ContainsKey(clientAddress)) + throw HttpException.Forbidden(); + } + + /// + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + internal async Task AddToWhitelistAsync(IEnumerable? whitelist) + { + if (whitelist?.Any() != true) + return; + + foreach (var whiteAddress in whitelist) + { + var parsedAddresses = await IPParser.ParseAsync(whiteAddress).ConfigureAwait(false); + foreach (var address in parsedAddresses.Where(x => !_whiteListBag.Contains(x))) + { + _whiteListBag.Add(address); + } + } + } + + internal void Lock() => LockConfiguration(); + + internal bool TryRemoveBlackList(IPAddress address) + { + foreach (var criterion in _criterions) + { + criterion.ClearIPAddress(address); + } + + return _blacklistDictionary.TryRemove(address, out _); + } + + internal void RegisterCriterion(IIPBanningCriterion criterion) + { + EnsureConfigurationNotLocked(); + _criterions.Add(criterion); + } + + internal bool TryBanIP(IPAddress address, bool isExplicit, DateTime? banUntil = null) + { + try + { + _blacklistDictionary.AddOrUpdate(address, + k => + new BanInfo + { + IPAddress = k, + ExpiresAt = banUntil?.Ticks ?? DateTime.Now.AddMinutes(_banTime).Ticks, + IsExplicit = isExplicit, + }, + (k, v) => + new BanInfo + { + IPAddress = k, + ExpiresAt = banUntil?.Ticks ?? DateTime.Now.AddMinutes(_banTime).Ticks, + IsExplicit = isExplicit, + }); + + return true; + } + catch + { + return false; + } + } + + /// + /// Releases unmanaged and - optionally - managed resources. + /// + /// true to release both managed and unmanaged resources; false to release only unmanaged resources. + protected virtual void Dispose(bool disposing) + { + if (_disposed) + return; + + if (disposing) + { + _blacklistDictionary.Clear(); + + _criterions.ForEach(x => x.Dispose()); + _criterions.Clear(); + } + + _disposed = true; + } + + private void PurgeBlackList() + { + foreach (var k in _blacklistDictionary.Keys) + { + if (_blacklistDictionary.TryGetValue(k, out var info) && + DateTime.Now.Ticks > info.ExpiresAt) + _blacklistDictionary.TryRemove(k, out _); + } + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Security/IPBanningModule.cs b/Vendor/EmbedIO-3.5.2/Security/IPBanningModule.cs new file mode 100644 index 0000000..639b33c --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Security/IPBanningModule.cs @@ -0,0 +1,182 @@ +using System; +using System.Collections.Generic; +using System.Net; +using System.Threading; +using System.Threading.Tasks; +using EmbedIO.Security.Internal; + +namespace EmbedIO.Security +{ + /// + /// A module to ban clients by IP address, based on TCP requests-per-second or RegEx matches on log messages. + /// + /// + public class IPBanningModule : WebModuleBase, IDisposable + { + /// + /// The default ban minutes. + /// + public const int DefaultBanMinutes = 30; + + private const string NoConfigurationFound = "No configuration was found for the base route provided."; + + private bool _disposed; + + /// + /// Initializes a new instance of the class. + /// + /// The base route. + /// A collection of valid IPs that never will be banned. + /// Minutes that an IP will remain banned. + public IPBanningModule(string baseRoute = "/", + IEnumerable? whitelist = null, + int banMinutes = DefaultBanMinutes) + : base(baseRoute) + { + Configuration = IPBanningExecutor.RetrieveInstance(baseRoute, banMinutes); + + AddToWhitelist(whitelist); + } + + /// + /// Finalizes an instance of the class. + /// + ~IPBanningModule() + { + Dispose(false); + } + + /// + public override bool IsFinalHandler => false; + + /// + /// Gets the client address. + /// + /// + /// The client address. + /// + public IPAddress? ClientAddress { get; private set; } + + internal IPBanningConfiguration Configuration { get; } + + /// + /// Registers the criterion. + /// + /// The criterion. + public void RegisterCriterion(IIPBanningCriterion criterion) => + Configuration.RegisterCriterion(criterion); + + /// + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + /// + /// Gets the list of current banned IPs. + /// + /// The base route. + /// + /// A collection of in the blacklist. + /// + /// baseRoute + public static IEnumerable GetBannedIPs(string baseRoute = "/") => + IPBanningExecutor.TryGetInstance(baseRoute, out var instance) + ? instance.BlackList + : throw new ArgumentException(NoConfigurationFound, nameof(baseRoute)); + + /// + /// Tries to ban an IP explicitly. + /// + /// The IP address to ban. + /// Minutes that the IP will remain banned. + /// The base route. + /// true if the IP was explicitly banned. + /// + /// true if the IP was added to the blacklist; otherwise, false. + /// + public static bool TryBanIP(IPAddress address, int banMinutes, string baseRoute = "/", bool isExplicit = true) => + TryBanIP(address, DateTime.Now.AddMinutes(banMinutes), baseRoute, isExplicit); + + /// + /// Tries to ban an IP explicitly. + /// + /// The IP address to ban. + /// A specifying the duration that the IP will remain banned. + /// The base route. + /// true if the IP was explicitly banned. + /// + /// true if the IP was added to the blacklist; otherwise, false. + /// + public static bool TryBanIP(IPAddress address, TimeSpan banDuration, string baseRoute = "/", bool isExplicit = true) => + TryBanIP(address, DateTime.Now.Add(banDuration), baseRoute, isExplicit); + + /// + /// Tries to ban an IP explicitly. + /// + /// The IP address to ban. + /// A specifying the expiration time of the ban. + /// The base route. + /// true if the IP was explicitly banned. + /// + /// true if the IP was added to the blacklist; otherwise, false. + /// + /// baseRoute + public static bool TryBanIP(IPAddress address, DateTime banUntil, string baseRoute = "/", bool isExplicit = true) + { + if (!IPBanningExecutor.TryGetInstance(baseRoute, out var instance)) + throw new ArgumentException(NoConfigurationFound, nameof(baseRoute)); + + return instance.TryBanIP(address, isExplicit, banUntil); + } + + /// + /// Tries to unban an IP explicitly. + /// + /// The IP address. + /// The base route. + /// + /// true if the IP was removed from the blacklist; otherwise, false. + /// + /// baseRoute + public static bool TryUnbanIP(IPAddress address, string baseRoute = "/") => + IPBanningExecutor.TryGetInstance(baseRoute, out var instance) + ? instance.TryRemoveBlackList(address) + : throw new ArgumentException(NoConfigurationFound, nameof(baseRoute)); + + internal void AddToWhitelist(IEnumerable? whitelist) => + Configuration.AddToWhitelistAsync(whitelist).GetAwaiter().GetResult(); + + /// + protected override void OnStart(CancellationToken cancellationToken) + { + Configuration.Lock(); + + base.OnStart(cancellationToken); + } + + /// + protected override Task OnRequestAsync(IHttpContext context) + { + ClientAddress = context.Request.RemoteEndPoint.Address; + return Configuration.CheckClient(ClientAddress); + } + + /// + /// Releases unmanaged and - optionally - managed resources. + /// + /// true to release both managed and unmanaged resources; false to release only unmanaged resources. + protected virtual void Dispose(bool disposing) + { + if (_disposed) return; + if (disposing) + { + IPBanningExecutor.TryRemoveInstance(BaseRoute); + Configuration.Dispose(); + } + + _disposed = true; + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Security/IPBanningModuleExtensions.cs b/Vendor/EmbedIO-3.5.2/Security/IPBanningModuleExtensions.cs new file mode 100644 index 0000000..fd0d9a0 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Security/IPBanningModuleExtensions.cs @@ -0,0 +1,74 @@ +namespace EmbedIO.Security +{ + /// + /// Provides extension methods for and derived classes. + /// + public static class IPBanningModuleExtensions + { + /// + /// Adds a collection of valid IPs that never will be banned. + /// + /// The type of the module. + /// The module on which this method is called. + /// A collection of valid IPs that never will be banned. + /// + /// with its whitelist configured. + /// + public static TModule WithWhitelist(this TModule @this, params string[] value) + where TModule : IPBanningModule + { + @this.AddToWhitelist(value); + return @this; + } + + /// + /// Add a collection of Regex to match the log messages against as a criterion for banning IP addresses. + /// + /// The type of the module. + /// The module on which this method is called. + /// A collection of regex to match log messages against. + /// + /// with a fail regex criterion configured. + /// + public static TModule WithRegexRules(this TModule @this, params string[] value) + where TModule : IPBanningModule => + WithRegexRules(@this, IPBanningRegexCriterion.DefaultMaxMatchCount, IPBanningRegexCriterion.DefaultSecondsMatchingPeriod, value); + + /// + /// Add a collection of Regex to match the log messages against as a criterion for banning IP addresses. + /// + /// The type of the module. + /// The module on which this method is called. + /// The maximum match count. + /// The seconds matching period. + /// A collection of regex to match log messages against. + /// + /// with a fail regex criterion configured. + /// + public static TModule WithRegexRules(this TModule @this, + int maxMatchCount, + int secondsMatchingPeriod, + params string[] value) + where TModule : IPBanningModule + { + @this.RegisterCriterion(new IPBanningRegexCriterion(@this, value, maxMatchCount, secondsMatchingPeriod)); + return @this; + } + + /// + /// Sets a maximum amount of requests per second as a criterion for banning IP addresses. + /// + /// The type of the module. + /// The module on which this method is called. + /// The maximum requests per second. + /// + /// with a maximum requests per second configured. + /// + public static TModule WithMaxRequestsPerSecond(this TModule @this, int maxRequests = IPBanningRequestsCriterion.DefaultMaxRequestsPerSecond) + where TModule : IPBanningModule + { + @this.RegisterCriterion(new IPBanningRequestsCriterion(maxRequests)); + return @this; + } + } +} diff --git a/Vendor/EmbedIO-3.5.2/Security/IPBanningRegexCriterion.cs b/Vendor/EmbedIO-3.5.2/Security/IPBanningRegexCriterion.cs new file mode 100644 index 0000000..810d1bb --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Security/IPBanningRegexCriterion.cs @@ -0,0 +1,197 @@ +using Swan.Logging; +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Text.RegularExpressions; +using System.Threading.Tasks; + +namespace EmbedIO.Security +{ + /// + /// Represents a log message regex matching criterion for . + /// + /// + public class IPBanningRegexCriterion : IIPBanningCriterion + { + /// + /// The default matching period. + /// + public const int DefaultSecondsMatchingPeriod = 60; + + /// + /// The default maximum match count per period. + /// + public const int DefaultMaxMatchCount = 10; + + private readonly ConcurrentDictionary> _failRegexMatches = new ConcurrentDictionary>(); + private readonly ConcurrentDictionary _failRegex = new ConcurrentDictionary(); + private readonly IPBanningModule _parent; + private readonly int _secondsMatchingPeriod; + private readonly int _maxMatchCount; + private readonly ILogger? _innerLogger; + private bool _disposed; + + /// + /// Initializes a new instance of the class. + /// + /// The parent. + /// The rules. + /// The maximum match count. + /// The seconds matching period. + public IPBanningRegexCriterion(IPBanningModule parent, IEnumerable rules, int maxMatchCount = DefaultMaxMatchCount, int secondsMatchingPeriod = DefaultSecondsMatchingPeriod) + { + _secondsMatchingPeriod = secondsMatchingPeriod; + _maxMatchCount = maxMatchCount; + _parent = parent; + + AddRules(rules); + + if (_failRegex.Any()) + _innerLogger = new InnerRegexCriterionLogger(this); + } + + /// + /// Finalizes an instance of the class. + /// + ~IPBanningRegexCriterion() + { + Dispose(false); + } + + /// + public Task ValidateIPAddress(IPAddress address) + { + var minTime = DateTime.Now.AddSeconds(-1 * _secondsMatchingPeriod).Ticks; + var shouldBan = _failRegexMatches.TryGetValue(address, out var attempts) && + attempts.Count(x => x >= minTime) >= _maxMatchCount; + + return Task.FromResult(shouldBan); + } + + /// + public void ClearIPAddress(IPAddress address) => + _failRegexMatches.TryRemove(address, out _); + + /// + public void PurgeData() + { + var minTime = DateTime.Now.AddSeconds(-1 * _secondsMatchingPeriod).Ticks; + + foreach (var k in _failRegexMatches.Keys) + { + if (!_failRegexMatches.TryGetValue(k, out var failRegexMatches)) continue; + + var recentMatches = new ConcurrentBag(failRegexMatches.Where(x => x >= minTime)); + if (!recentMatches.Any()) + _failRegexMatches.TryRemove(k, out _); + else + _failRegexMatches.AddOrUpdate(k, recentMatches, (x, y) => recentMatches); + } + } + + /// + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposing) + { + if (_disposed) + return; + + if (disposing) + { + _failRegexMatches.Clear(); + _failRegex.Clear(); + if (_innerLogger != null) + { + try + { + Logger.UnregisterLogger(_innerLogger); + } + catch + { + // ignore + } + + _innerLogger.Dispose(); + } + } + + _disposed = true; + } + + private void MatchIP(IPAddress address, string message) + { + if (!_parent.Configuration.ShouldContinue(address)) + return; + + foreach (var regex in _failRegex.Values) + { + try + { + if (!regex.IsMatch(message)) continue; + + _failRegexMatches.GetOrAdd(address, new ConcurrentBag()).Add(DateTime.Now.Ticks); + break; + } + catch (RegexMatchTimeoutException ex) + { + $"Timeout trying to match '{ex.Input}' with pattern '{ex.Pattern}'.".Error(nameof(InnerRegexCriterionLogger)); + } + } + } + + private void AddRules(IEnumerable patterns) + { + foreach (var pattern in patterns) + AddRule(pattern); + } + + private void AddRule(string pattern) + { + try + { + _failRegex.TryAdd(pattern, new Regex(pattern, RegexOptions.Compiled | RegexOptions.CultureInvariant, TimeSpan.FromMilliseconds(500))); + } + catch (Exception ex) + { + ex.Log(nameof(IPBanningModule), $"Invalid regex - '{pattern}'."); + } + } + + private sealed class InnerRegexCriterionLogger : ILogger + { + private readonly IPBanningRegexCriterion _parent; + + public InnerRegexCriterionLogger(IPBanningRegexCriterion parent) + { + _parent = parent; + Logger.RegisterLogger(this); + } + + /// + public LogLevel LogLevel => LogLevel.Trace; + + public void Dispose() + { + // DO nothing + } + + /// + public void Log(LogMessageReceivedEventArgs logEvent) + { + var clientAddress = _parent._parent.ClientAddress; + + if (clientAddress == null || string.IsNullOrWhiteSpace(logEvent.Message)) + return; + + _parent.MatchIP(clientAddress, logEvent.Message); + } + } + } +} diff --git a/Vendor/EmbedIO-3.5.2/Security/IPBanningRequestsCriterion.cs b/Vendor/EmbedIO-3.5.2/Security/IPBanningRequestsCriterion.cs new file mode 100644 index 0000000..0cb2294 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Security/IPBanningRequestsCriterion.cs @@ -0,0 +1,93 @@ +using System; +using System.Collections.Concurrent; +using System.Linq; +using System.Net; +using System.Threading.Tasks; + +namespace EmbedIO.Security +{ + /// + /// Represents a maximun requests per second criterion for . + /// + /// + public class IPBanningRequestsCriterion : IIPBanningCriterion + { + /// + /// The default maximum request per second. + /// + public const int DefaultMaxRequestsPerSecond = 50; + + private static readonly ConcurrentDictionary> Requests = new ConcurrentDictionary>(); + + private readonly int _maxRequestsPerSecond; + + private bool _disposed; + + internal IPBanningRequestsCriterion(int maxRequestsPerSecond) + { + _maxRequestsPerSecond = maxRequestsPerSecond; + } + + /// + /// Finalizes an instance of the class. + /// + ~IPBanningRequestsCriterion() + { + Dispose(false); + } + + /// + public Task ValidateIPAddress(IPAddress address) + { + Requests.GetOrAdd(address, new ConcurrentBag()).Add(DateTime.Now.Ticks); + + var lastSecond = DateTime.Now.AddSeconds(-1).Ticks; + var lastMinute = DateTime.Now.AddMinutes(-1).Ticks; + + var shouldBan = Requests.TryGetValue(address, out var attempts) && + (attempts.Count(x => x >= lastSecond) >= _maxRequestsPerSecond || + (attempts.Count(x => x >= lastMinute) / 60) >= _maxRequestsPerSecond); + + return Task.FromResult(shouldBan); + } + + /// + public void ClearIPAddress(IPAddress address) => + Requests.TryRemove(address, out _); + + /// + public void PurgeData() + { + var minTime = DateTime.Now.AddMinutes(-1).Ticks; + + foreach (var k in Requests.Keys) + { + if (!Requests.TryGetValue(k, out var requests)) continue; + + var recentRequests = new ConcurrentBag(requests.Where(x => x >= minTime)); + if (!recentRequests.Any()) + Requests.TryRemove(k, out _); + else + Requests.AddOrUpdate(k, recentRequests, (x, y) => recentRequests); + } + } + + /// + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposing) + { + if (_disposed) return; + if (disposing) + { + Requests.Clear(); + } + + _disposed = true; + } + } +} diff --git a/Vendor/EmbedIO-3.5.2/Security/Internal/IPBanningExecutor.cs b/Vendor/EmbedIO-3.5.2/Security/Internal/IPBanningExecutor.cs new file mode 100644 index 0000000..b20dad9 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Security/Internal/IPBanningExecutor.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Concurrent; +using System.Threading.Tasks; +using Swan.Threading; + +namespace EmbedIO.Security.Internal +{ + internal static class IPBanningExecutor + { + private static readonly ConcurrentDictionary Configurations = new ConcurrentDictionary(); + + private static readonly PeriodicTask Purger = new PeriodicTask(TimeSpan.FromMinutes(1), ct => { + foreach (var conf in Configurations.Keys) + { + if (Configurations.TryGetValue(conf, out var instance)) + instance.Purge(); + } + + return Task.CompletedTask; + }); + + public static IPBanningConfiguration RetrieveInstance(string baseRoute, int banMinutes) => + Configurations.GetOrAdd(baseRoute, x => new IPBanningConfiguration(banMinutes)); + + public static bool TryGetInstance(string baseRoute, out IPBanningConfiguration configuration) => + Configurations.TryGetValue(baseRoute, out configuration); + + public static bool TryRemoveInstance(string baseRoute) => + Configurations.TryRemove(baseRoute, out _); + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Sessions/ISession.cs b/Vendor/EmbedIO-3.5.2/Sessions/ISession.cs new file mode 100644 index 0000000..5222687 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Sessions/ISession.cs @@ -0,0 +1,112 @@ +using System; +using System.Collections.Generic; + +namespace EmbedIO.Sessions +{ + /// + /// Represents a session. + /// + public interface ISession + { + /// + /// A unique identifier for the session. + /// + /// The unique identifier for this session. + /// + /// + string Id { get; } + + /// + /// Gets the time interval, starting from , + /// after which the session expires. + /// + /// The expiration time. + TimeSpan Duration { get; } + + /// + /// Gets the UTC date and time of last activity on the session. + /// + /// + /// The UTC date and time of last activity on the session. + /// + DateTime LastActivity { get; } + + /// + /// Gets the number of key/value pairs contained in a session. + /// + /// + /// The number of key/value pairs contained in the object that implements . + /// + int Count { get; } + + /// + /// Gets a value that indicates whether a session is empty. + /// + /// + /// if the object that implements is empty, + /// i.e. contains no key / value pairs; otherwise, . + /// + bool IsEmpty { get; } + + /// + /// Gets or sets the value associated with the specified key. + /// Note that a session does not store null values; therefore, setting this property to + /// has the same effect as removing from the dictionary. + /// + /// + /// The value associated with the specified key, if + /// is found in the dictionary; otherwise, . + /// + /// The key of the value to get or set. + /// is . + object this[string key] { get; set; } + + /// + /// Removes all keys and values from a session. + /// + void Clear(); + + /// + /// Determines whether a session contains an element with the specified key. + /// + /// The key to locate in the object that implements . + /// + /// if the object that implements contains an element with the key; + /// otherwise, . + /// + /// is . + bool ContainsKey(string key); + + /// + /// Gets the value associated with the specified key. + /// + /// The key whose value to get. + /// When this method returns, the value associated with the specified , + /// if the key is found; otherwise, . This parameter is passed uninitialized. + /// if the object that implements + /// contains an element with the specified key; otherwise, . + /// is . + bool TryGetValue(string key, out object value); + + /// + /// Attempts to remove and return the value that has the specified key from a session. + /// + /// The key of the element to remove and return. + /// When this method returns, the value removed from the object that implements , + /// if the key is found; otherwise, . This parameter is passed uninitialized. + /// if the value was removed successfully; otherwise, . + /// is . + bool TryRemove(string key, out object value); + + /// + /// Takes and returns a snapshot of the contents of a session at the time of calling. + /// + /// An IReadOnlyList<KeyValuePair<string,object>> interface + /// containing an immutable copy of the session data as it was at the time of calling this method. + /// + /// The objects contained in the session data are copied by reference, not cloned; therefore + /// you should be aware that their state may change even after the snapshot is taken. + /// + IReadOnlyList> TakeSnapshot(); + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Sessions/ISessionManager.cs b/Vendor/EmbedIO-3.5.2/Sessions/ISessionManager.cs new file mode 100644 index 0000000..b82b8ba --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Sessions/ISessionManager.cs @@ -0,0 +1,46 @@ +using System.Threading; + +namespace EmbedIO.Sessions +{ + /// + /// Represents a session manager, which is in charge of managing session objects + /// and their association to HTTP contexts. + /// + public interface ISessionManager + { + /// + /// Signals a session manager that the web server is starting. + /// + /// The cancellation token used to stop the web server. + void Start(CancellationToken cancellationToken); + + /// + /// Returns the session associated with an . + /// If a session ID can be retrieved for the context and stored session data + /// are available, the returned will contain those data; + /// otherwise, a new session is created and its ID is stored in the response + /// to be retrieved by subsequent requests. + /// + /// The HTTP context. + /// An interface. + ISession Create(IHttpContext context); + + /// + /// Deletes the session (if any) associated with the specified context + /// and removes the session's ID from the context. + /// + /// The HTTP context. + /// The unique ID of the session. + /// + void Delete(IHttpContext context, string id); + + /// + /// Called by a session proxy when a session has been obtained + /// for an and the context is closed, + /// even if the session was subsequently deleted. + /// This method can be used to save session data to a storage medium. + /// + /// The for which a session was obtained. + void OnContextClose(IHttpContext context); + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Sessions/ISessionProxy.cs b/Vendor/EmbedIO-3.5.2/Sessions/ISessionProxy.cs new file mode 100644 index 0000000..299b8ad --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Sessions/ISessionProxy.cs @@ -0,0 +1,33 @@ +namespace EmbedIO.Sessions +{ + /// + /// Represents a session proxy, i.e. an object that provides + /// the same interface as a session object, plus a basic interface + /// to a session manager. + /// + /// + /// A session proxy can be used just as if it were a session object. + /// A session is automatically created wherever its data are accessed. + /// + /// + public interface ISessionProxy : ISession + { + /// + /// Gets a value indicating whether a session exists for the current context. + /// + /// + /// if a session exists; otherwise, . + /// + bool Exists { get; } + + /// + /// Deletes the session for the current context. + /// + void Delete(); + + /// + /// Deletes the session for the current context and creates a new one. + /// + void Regenerate(); + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Sessions/Internal/DummySessionProxy.cs b/Vendor/EmbedIO-3.5.2/Sessions/Internal/DummySessionProxy.cs new file mode 100644 index 0000000..a781a41 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Sessions/Internal/DummySessionProxy.cs @@ -0,0 +1,65 @@ +using System; +using System.Collections.Generic; + +namespace EmbedIO.Sessions.Internal +{ + internal sealed class DummySessionProxy : ISessionProxy + { + private DummySessionProxy() + { + } + + public static ISessionProxy Instance { get; } = new DummySessionProxy(); + + public bool Exists => false; + + /// + public string Id => throw NoSessionManager(); + + /// + public TimeSpan Duration => throw NoSessionManager(); + + /// + public DateTime LastActivity => throw NoSessionManager(); + + /// + public int Count => 0; + + /// + public bool IsEmpty => true; + + /// + public object this[string key] + { + get => throw NoSessionManager(); + set => throw NoSessionManager(); + } + + /// + public void Delete() + { + } + + /// + public void Regenerate() => throw NoSessionManager(); + + /// + public void Clear() + { + } + + /// + public bool ContainsKey(string key) => throw NoSessionManager(); + + /// + public bool TryGetValue(string key, out object value) => throw NoSessionManager(); + + /// + public bool TryRemove(string key, out object value) => throw NoSessionManager(); + + /// + public IReadOnlyList> TakeSnapshot() => throw NoSessionManager(); + + private InvalidOperationException NoSessionManager() => new InvalidOperationException("No session manager registered in the web server."); + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Sessions/LocalSessionManager.SessionImpl.cs b/Vendor/EmbedIO-3.5.2/Sessions/LocalSessionManager.SessionImpl.cs new file mode 100644 index 0000000..4804103 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Sessions/LocalSessionManager.SessionImpl.cs @@ -0,0 +1,150 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using EmbedIO.Utilities; + +namespace EmbedIO.Sessions +{ + partial class LocalSessionManager + { + private class SessionImpl : ISession + { + private readonly Dictionary _data = new Dictionary(Session.KeyComparer); + + private int _usageCount; + + public SessionImpl(string id, TimeSpan duration) + { + Id = Validate.NotNullOrEmpty(nameof(id), id); + Duration = duration; + LastActivity = DateTime.UtcNow; + _usageCount = 1; + } + + public string Id { get; } + + public TimeSpan Duration { get; } + + public DateTime LastActivity { get; private set; } + + public int Count + { + get + { + lock (_data) + { + return _data.Count; + } + } + } + + public bool IsEmpty + { + get + { + lock (_data) + { + return _data.Count == 0; + } + } + } + + public object? this[string key] + { + get + { + lock (_data) + { + return _data.TryGetValue(key, out var value) ? value : null; + } + } + set + { + lock (_data) + { + if (value == null) + _data.Remove(key); + else + _data[key] = value; + } + } + } + + public void Clear() + { + lock (_data) + { + _data.Clear(); + } + } + + public bool ContainsKey(string key) + { + lock (_data) + { + return _data.ContainsKey(key); + } + } + + public bool TryRemove(string key, out object value) + { + lock (_data) + { + if (!_data.TryGetValue(key, out value)) + return false; + + _data.Remove(key); + return true; + } + } + + public IReadOnlyList> TakeSnapshot() + { + lock (_data) + { + return _data.ToArray(); + } + } + + public bool TryGetValue(string key, out object value) + { + lock (_data) + { + return _data.TryGetValue(key, out value); + } + } + + internal void BeginUse() + { + lock (_data) + { + _usageCount++; + LastActivity = DateTime.UtcNow; + } + } + + internal void EndUse(Action unregister) + { + lock (_data) + { + --_usageCount; + UnregisterIfNeededCore(unregister); + } + } + + internal void UnregisterIfNeeded(Action unregister) + { + lock (_data) + { + UnregisterIfNeededCore(unregister); + } + } + + private void UnregisterIfNeededCore(Action unregister) + { + if (_usageCount < 1 && (IsEmpty || DateTime.UtcNow > LastActivity + Duration)) + unregister(); + } + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Sessions/LocalSessionManager.cs b/Vendor/EmbedIO-3.5.2/Sessions/LocalSessionManager.cs new file mode 100644 index 0000000..54d2ceb --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Sessions/LocalSessionManager.cs @@ -0,0 +1,303 @@ +using System; +using System.Collections.Concurrent; +using System.Linq; +using System.Net; +using System.Threading; +using System.Threading.Tasks; +using EmbedIO.Utilities; + +namespace EmbedIO.Sessions +{ + /// + /// A simple session manager to handle in-memory sessions. + /// Not for intensive use or for distributed applications. + /// + public partial class LocalSessionManager : ISessionManager + { + /// + /// The default name for session cookies, i.e. "__session". + /// + public const string DefaultCookieName = "__session"; + + /// + /// The default path for session cookies, i.e. "/". + /// + public const string DefaultCookiePath = "/"; + + /// + /// The default HTTP-only flag for session cookies, i.e. . + /// + public const bool DefaultCookieHttpOnly = true; + + /// + /// The default duration for session cookies, i.e. . + /// + public static readonly TimeSpan DefaultCookieDuration = TimeSpan.Zero; + + /// + /// The default duration for sessions, i.e. 30 minutes. + /// + public static readonly TimeSpan DefaultSessionDuration = TimeSpan.FromMinutes(30); + + /// + /// The default interval between automatic purges of expired and empty sessions, i.e. 30 seconds. + /// + public static readonly TimeSpan DefaultPurgeInterval = TimeSpan.FromSeconds(30); + + private readonly ConcurrentDictionary _sessions = + new ConcurrentDictionary(Session.KeyComparer); + + private string _cookieName = DefaultCookieName; + + private string _cookiePath = DefaultCookiePath; + + private TimeSpan _cookieDuration = DefaultCookieDuration; + + private bool _cookieHttpOnly = DefaultCookieHttpOnly; + + private TimeSpan _sessionDuration = DefaultSessionDuration; + + private TimeSpan _purgeInterval = DefaultPurgeInterval; + + /// + /// Initializes a new instance of the class + /// with default values for all properties. + /// + /// + /// + /// + /// + /// + /// + public LocalSessionManager() + { + } + + /// + /// Gets or sets the duration of newly-created sessions. + /// + /// This property is being set after calling + /// the method. + /// + public TimeSpan SessionDuration + { + get => _sessionDuration; + set + { + EnsureConfigurationNotLocked(); + _sessionDuration = value; + } + } + + /// + /// Gets or sets the interval between purges of expired sessions. + /// + /// This property is being set after calling + /// the method. + /// + public TimeSpan PurgeInterval + { + get => _purgeInterval; + set + { + EnsureConfigurationNotLocked(); + _purgeInterval = value; + } + } + + /// + /// Gets or sets the name for session cookies. + /// + /// This property is being set after calling + /// the method. + /// This property is being set to . + /// This property is being set and the provided value + /// is not a valid URL path. + /// + public string CookieName + { + get => _cookieName; + set + { + EnsureConfigurationNotLocked(); + _cookieName = Validate.Rfc2616Token(nameof(value), value); + } + } + + /// + /// Gets or sets the path for session cookies. + /// + /// This property is being set after calling + /// the method. + /// This property is being set to . + /// This property is being set and the provided value + /// is not a valid URL path. + /// + public string CookiePath + { + get => _cookiePath; + set + { + EnsureConfigurationNotLocked(); + _cookiePath = Validate.UrlPath(nameof(value), value, true); + } + } + + /// + /// Gets or sets the duration of session cookies. + /// + /// This property is being set after calling + /// the method. + /// + public TimeSpan CookieDuration + { + get => _cookieDuration; + set + { + EnsureConfigurationNotLocked(); + _cookieDuration = value; + } + } + + /// + /// Gets or sets a value indicating whether session cookies are hidden from Javascript code running on a user agent. + /// + /// This property is being set after calling + /// the method. + /// + public bool CookieHttpOnly + { + get => _cookieHttpOnly; + set + { + EnsureConfigurationNotLocked(); + _cookieHttpOnly = value; + } + } + + private bool ConfigurationLocked { get; set; } + + /// + public void Start(CancellationToken cancellationToken) + { + ConfigurationLocked = true; + + Task.Run(async () => + { + try + { + while (!cancellationToken.IsCancellationRequested) + { + PurgeExpiredAndEmptySessions(); + await Task.Delay(PurgeInterval, cancellationToken).ConfigureAwait(false); + } + } + catch (TaskCanceledException) + { + // ignore + } + }, cancellationToken); + } + + /// + public ISession Create(IHttpContext context) + { + var id = context.Request.Cookies.FirstOrDefault(IsSessionCookie)?.Value.Trim(); + + SessionImpl session; + lock (_sessions) + { + if (!string.IsNullOrEmpty(id) && _sessions.TryGetValue(id!, out session)) + { + session.BeginUse(); + } + else + { + id = UniqueIdGenerator.GetNext(); + session = new SessionImpl(id, SessionDuration); + _sessions.TryAdd(id, session); + } + } + + context.Request.Cookies.Add(BuildSessionCookie(id)); + context.Response.Cookies.Add(BuildSessionCookie(id)); + return session; + } + + /// + public void Delete(IHttpContext context, string id) + { + lock (_sessions) + { + if (_sessions.TryGetValue(id, out var session)) + session.EndUse(() => _sessions.TryRemove(id, out _)); + } + + context.Request.Cookies.Add(BuildSessionCookie(string.Empty)); + context.Response.Cookies.Add(BuildSessionCookie(string.Empty)); + } + + /// + public void OnContextClose(IHttpContext context) + { + if (!context.Session.Exists) + return; + + var id = context.Session.Id; + lock (_sessions) + { + if (_sessions.TryGetValue(id, out var session)) + { + session.EndUse(() => _sessions.TryRemove(id, out _)); + } + } + } + + private void EnsureConfigurationNotLocked() + { + if (ConfigurationLocked) + throw new InvalidOperationException($"Cannot configure a {nameof(LocalSessionManager)} once it has been started."); + } + + private bool IsSessionCookie(Cookie cookie) + => cookie.Name.Equals(CookieName, StringComparison.OrdinalIgnoreCase) + && !cookie.Expired; + + private Cookie BuildSessionCookie(string? id) + { + var cookie = new Cookie(CookieName, id, CookiePath) + { + HttpOnly = CookieHttpOnly, + }; + + if (CookieDuration > TimeSpan.Zero) + { + cookie.Expires = DateTime.UtcNow.Add(CookieDuration); + } + + return cookie; + } + + private void PurgeExpiredAndEmptySessions() + { + string[] ids; + lock (_sessions) + { + ids = _sessions.Keys.ToArray(); + } + + foreach (var id in ids) + { + lock (_sessions) + { + if (!_sessions.TryGetValue(id, out var session)) + return; + + session.UnregisterIfNeeded(() => _sessions.TryRemove(id, out _)); + } + } + } + + private string GetSessionId(IHttpContext context) => context.Request.Cookies.FirstOrDefault(IsSessionCookie)?.Value.Trim() ?? string.Empty; + } +} diff --git a/Vendor/EmbedIO-3.5.2/Sessions/Session.cs b/Vendor/EmbedIO-3.5.2/Sessions/Session.cs new file mode 100644 index 0000000..bc8d990 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Sessions/Session.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; + +namespace EmbedIO.Sessions +{ + /// + /// Provides useful constants related to session management. + /// + public static class Session + { + /// + /// The used to disambiguate session IDs. + /// Corresponds to . + /// + public const StringComparison IdComparison = StringComparison.Ordinal; + + /// + /// The used to disambiguate session keys. + /// Corresponds to . + /// + public const StringComparison KeyComparison = StringComparison.InvariantCulture; + + /// + /// The equality comparer used for session IDs. + /// Corresponds to . + /// + public static readonly IEqualityComparer IdComparer = StringComparer.Ordinal; + + /// + /// The equality comparer used for session keys. + /// Corresponds to . + /// + public static readonly IEqualityComparer KeyComparer = StringComparer.InvariantCulture; + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Sessions/SessionExtensions.cs b/Vendor/EmbedIO-3.5.2/Sessions/SessionExtensions.cs new file mode 100644 index 0000000..0ac44cc --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Sessions/SessionExtensions.cs @@ -0,0 +1,60 @@ +using System; + +namespace EmbedIO.Sessions +{ + /// + /// Provides extension methods for types implementing . + /// + public static class SessionExtensions + { + /// Gets the value associated with the specified key. + /// The desired type of the value. + /// The on which this method is called. + /// The key whose value to get from the session. + /// + /// When this method returns, the value associated with the specified key, + /// if the key is found and the associated value is of type ; + /// otherwise, the default value for . + /// This parameter is passed uninitialized. + /// + /// if the key is found and the associated value is of type ; + /// otherwise, . + /// is . + /// is . + public static bool TryGetValue(this ISession @this, string key, out T value) + { + if (@this.TryGetValue(key, out var foundValue) && foundValue is T typedValue) + { + value = typedValue; + return true; + } + +#pragma warning disable CS8653 // "default" can be null - We are returning false, so value is undefined + value = default; +#pragma warning restore CS8653 + return false; + } + + /// Gets the value associated with the specified key. + /// The desired type of the value. + /// The on which this method is called. + /// The key whose value to get from the session. + /// The value associated with the specified key, + /// if the key is found and the associated value is of type ; + /// otherwise, the default value for . + public static T GetValue(this ISession @this, string key) + => @this.TryGetValue(key, out var value) && value is T typedValue ? typedValue : default; + + /// Gets the value associated with the specified key. + /// The desired type of the value. + /// The on which this method is called. + /// The key whose value to get from the session. + /// The default value to return if the key is not found + /// or its associated value is not of type . + /// The value associated with the specified key, + /// if the key is found and the associated value is of type ; + /// otherwise, . + public static T GetOrDefault(this ISession @this, string key, T defaultValue) + => @this.TryGetValue(key, out var value) && value is T typedValue ? typedValue : defaultValue; + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Sessions/SessionProxy.cs b/Vendor/EmbedIO-3.5.2/Sessions/SessionProxy.cs new file mode 100644 index 0000000..8637f39 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Sessions/SessionProxy.cs @@ -0,0 +1,167 @@ +using System; +using System.Collections.Generic; +using EmbedIO.Sessions.Internal; + +namespace EmbedIO.Sessions +{ + /// + /// Provides the same interface as a session object, + /// plus a basic interface to a session manager. + /// + /// + /// A session proxy can be used just as if it were a session object. + /// A session is automatically created wherever its data are accessed. + /// + /// + public sealed class SessionProxy : ISessionProxy + { + private readonly IHttpContext _context; + private readonly ISessionManager? _sessionManager; + + private ISession? _session; + private bool _onCloseRegistered; + + internal SessionProxy(IHttpContext context, ISessionManager? sessionManager) + { + _context = context; + _sessionManager = sessionManager; + } + + /// + /// Returns a "dummy" interface that will always behave as if no session manager has been defined. + /// + /// + /// The returned interface is only useful + /// to initialize a non-nullable property of type . + /// + public static ISessionProxy None => DummySessionProxy.Instance; + + /// + public bool Exists => _session != null; + + /// + public string Id + { + get + { + EnsureSessionExists(); + return _session!.Id; + } + } + + /// + public TimeSpan Duration + { + get + { + EnsureSessionExists(); + return _session!.Duration; + } + } + + /// + public DateTime LastActivity + { + get + { + EnsureSessionExists(); + return _session!.LastActivity; + } + } + + /// + public int Count => _session?.Count ?? 0; + + /// + public bool IsEmpty => _session?.IsEmpty ?? true; + + /// + public object this[string key] + { + get + { + EnsureSessionExists(); + return _session![key]; + } + set + { + EnsureSessionExists(); + _session![key] = value; + } + } + + /// + public void Delete() + { + EnsureSessionExists(); + + if (_session == null) + return; + + _sessionManager!.Delete(_context, _session.Id); + _session = null; + } + + /// + public void Regenerate() + { + if (_session != null) + _sessionManager!.Delete(_context, _session.Id); + + EnsureSessionManagerExists(); + _session = _sessionManager!.Create(_context); + } + + /// + public void Clear() => _session?.Clear(); + + /// + public bool ContainsKey(string key) + { + EnsureSessionExists(); + return _session!.ContainsKey(key); + } + + /// + public bool TryGetValue(string key, out object value) + { + EnsureSessionExists(); + return _session!.TryGetValue(key, out value); + } + + /// + public bool TryRemove(string key, out object value) + { + EnsureSessionExists(); + return _session!.TryRemove(key, out value); + } + + /// + public IReadOnlyList> TakeSnapshot() + { + EnsureSessionExists(); + return _session!.TakeSnapshot(); + } + + private void EnsureSessionManagerExists() + { + if (_sessionManager == null) + throw new InvalidOperationException("No session manager registered in the web server."); + } + + private void EnsureSessionExists() + { + if (_session != null) + return; + + EnsureSessionManagerExists(); + _session = _sessionManager!.Create(_context); + + if (_onCloseRegistered) + return; + + _context.OnClose(_sessionManager.OnContextClose); + _onCloseRegistered = true; + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Utilities/ComponentCollectionExtensions.cs b/Vendor/EmbedIO-3.5.2/Utilities/ComponentCollectionExtensions.cs new file mode 100644 index 0000000..a814cba --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Utilities/ComponentCollectionExtensions.cs @@ -0,0 +1,20 @@ +using System; + +namespace EmbedIO.Utilities +{ + /// + /// Provides extension methods for types implementing . + /// + public static class ComponentCollectionExtensions + { + /// + /// Adds the specified component to a collection, without giving it a name. + /// + /// The type of components in the collection. + /// The on which this method is called. + /// The component to add. + /// is . + /// + public static void Add(this IComponentCollection @this, T component) => @this.Add(null, component); + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Utilities/ComponentCollection`1.cs b/Vendor/EmbedIO-3.5.2/Utilities/ComponentCollection`1.cs new file mode 100644 index 0000000..4a5dd98 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Utilities/ComponentCollection`1.cs @@ -0,0 +1,76 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using Swan.Configuration; + +namespace EmbedIO.Utilities +{ + /// + /// Implements a collection of components. + /// Each component in the collection may be given a unique name for later retrieval. + /// + /// The type of components in the collection. + /// + public class ComponentCollection : ConfiguredObject, IComponentCollection + { + private readonly List _components = new List(); + + private readonly List<(string, T)> _componentsWithSafeNames = new List<(string, T)>(); + + private readonly Dictionary _namedComponents = new Dictionary(); + + /// + public int Count => _components.Count; + + /// + public IReadOnlyDictionary Named => _namedComponents; + + /// + public IReadOnlyList<(string SafeName, T Component)> WithSafeNames => _componentsWithSafeNames; + + /// + public T this[int index] => _components[index]; + + /// + public T this[string key] => _namedComponents[key]; + + /// + public IEnumerator GetEnumerator() => _components.GetEnumerator(); + + /// + IEnumerator IEnumerable.GetEnumerator() => ((IEnumerable)_components).GetEnumerator(); + + /// + /// The collection is locked. + public void Add(string? name, T component) + { + EnsureConfigurationNotLocked(); + + if (name != null) + { + if (name.Length == 0) + throw new ArgumentException("Component name is empty.", nameof(name)); + + if (_namedComponents.ContainsKey(name)) + throw new ArgumentException("Duplicate component name.", nameof(name)); + } + + if (component == null) + throw new ArgumentNullException(nameof(component)); + + if (_components.Contains(component)) + throw new ArgumentException("Component has already been added.", nameof(component)); + + _components.Add(component); + _componentsWithSafeNames.Add((name ?? $"<{component.GetType().Name}>", component)); + + if (name != null) + _namedComponents.Add(name, component); + } + + /// + /// Locks the collection, preventing further additions. + /// + public void Lock() => LockConfiguration(); + } +} diff --git a/Vendor/EmbedIO-3.5.2/Utilities/DisposableComponentCollection`1.cs b/Vendor/EmbedIO-3.5.2/Utilities/DisposableComponentCollection`1.cs new file mode 100644 index 0000000..99e990b --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Utilities/DisposableComponentCollection`1.cs @@ -0,0 +1,49 @@ +using System; + +namespace EmbedIO.Utilities +{ + /// + /// Implements a collection of components that automatically disposes each component + /// implementing . + /// Each component in the collection may be given a unique name for later retrieval. + /// + /// The type of components in the collection. + /// + /// + public class DisposableComponentCollection : ComponentCollection, IDisposable + { + /// + /// Finalizes an instance of the class. + /// + ~DisposableComponentCollection() + { + Dispose(false); + } + + /// + /// Releases unmanaged and - optionally - managed resources. + /// + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + /// + /// Releases unmanaged and - optionally - managed resources. + /// + /// + /// to release both managed and unmanaged resources; to release only unmanaged resources. + /// + protected virtual void Dispose(bool disposing) + { + if (!disposing) return; + + foreach (var component in this) + { + if (component is IDisposable disposable) + disposable.Dispose(); + } + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Utilities/HttpDate.cs b/Vendor/EmbedIO-3.5.2/Utilities/HttpDate.cs new file mode 100644 index 0000000..529e4f0 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Utilities/HttpDate.cs @@ -0,0 +1,78 @@ +using System; +using System.Globalization; + +namespace EmbedIO.Utilities +{ + /// + /// Provides standard methods to parse and format s according to various RFCs. + /// + public static class HttpDate + { + // https://github.com/dotnet/corefx/blob/master/src/Common/src/System/Net/HttpDateParser.cs + private static readonly string[] DateFormats = { + // "r", // RFC 1123, required output format but too strict for input + "ddd, d MMM yyyy H:m:s 'GMT'", // RFC 1123 (r, except it allows both 1 and 01 for date and time) + "ddd, d MMM yyyy H:m:s 'UTC'", // RFC 1123, UTC + "ddd, d MMM yyyy H:m:s", // RFC 1123, no zone - assume GMT + "d MMM yyyy H:m:s 'GMT'", // RFC 1123, no day-of-week + "d MMM yyyy H:m:s 'UTC'", // RFC 1123, UTC, no day-of-week + "d MMM yyyy H:m:s", // RFC 1123, no day-of-week, no zone + "ddd, d MMM yy H:m:s 'GMT'", // RFC 1123, short year + "ddd, d MMM yy H:m:s 'UTC'", // RFC 1123, UTC, short year + "ddd, d MMM yy H:m:s", // RFC 1123, short year, no zone + "d MMM yy H:m:s 'GMT'", // RFC 1123, no day-of-week, short year + "d MMM yy H:m:s 'UTC'", // RFC 1123, UTC, no day-of-week, short year + "d MMM yy H:m:s", // RFC 1123, no day-of-week, short year, no zone + + "dddd, d'-'MMM'-'yy H:m:s 'GMT'", // RFC 850 + "dddd, d'-'MMM'-'yy H:m:s 'UTC'", // RFC 850, UTC + "dddd, d'-'MMM'-'yy H:m:s zzz", // RFC 850, offset + "dddd, d'-'MMM'-'yy H:m:s", // RFC 850 no zone + "ddd MMM d H:m:s yyyy", // ANSI C's asctime() format + + "ddd, d MMM yyyy H:m:s zzz", // RFC 5322 + "ddd, d MMM yyyy H:m:s", // RFC 5322 no zone + "d MMM yyyy H:m:s zzz", // RFC 5322 no day-of-week + "d MMM yyyy H:m:s", // RFC 5322 no day-of-week, no zone + }; + + /// + /// Attempts to parse a string containing a date and time, and possibly a time zone offset, + /// in one of the formats specified in RFC850, + /// RFC1123, + /// and RFC5322, + /// or ANSI C's asctime() format. + /// + /// The string to parse. + /// When this method returns , + /// a representing the parsed date, time, and time zone offset. + /// This parameter is passed uninitialized. + /// if was successfully parsed; + /// otherwise, . + public static bool TryParse(string str, out DateTimeOffset result) => + DateTimeOffset.TryParseExact( + str, + DateFormats, + DateTimeFormatInfo.InvariantInfo, + DateTimeStyles.AllowWhiteSpaces | DateTimeStyles.AssumeUniversal, + out result); + + /// + /// Formats the specified + /// according to RFC1123. + /// + /// The to format. + /// A string containing the formatted . + public static string Format(DateTimeOffset dateTimeOffset) + => dateTimeOffset.ToUniversalTime().ToString("r", DateTimeFormatInfo.InvariantInfo); + + /// + /// Formats the specified + /// according to RFC1123. + /// + /// The to format. + /// A string containing the formatted . + public static string Format(DateTime dateTime) + => dateTime.ToUniversalTime().ToString("r", DateTimeFormatInfo.InvariantInfo); + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Utilities/IComponentCollection`1.cs b/Vendor/EmbedIO-3.5.2/Utilities/IComponentCollection`1.cs new file mode 100644 index 0000000..8d60b7b --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Utilities/IComponentCollection`1.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; + +namespace EmbedIO.Utilities +{ + /// + /// Represents a collection of components. + /// Each component in the collection may be given a unique name for later retrieval. + /// + /// The type of components in the collection. + public interface IComponentCollection : IReadOnlyList + { + /// + /// Gets an interface representing the named components. + /// + /// + /// The named components. + /// + IReadOnlyDictionary Named { get; } + + /// + /// Gets an interface representing all components + /// associated with safe names. + /// The safe name of a component is never . + /// If a component's unique name if , its safe name + /// will be some non- string somehow identifying it. + /// Note that safe names are not necessarily unique. + /// + /// + /// A list of s, each containing a safe name and a component. + /// + IReadOnlyList<(string SafeName, T Component)> WithSafeNames { get; } + + /// + /// Gets the component with the specified name. + /// + /// + /// The component. + /// + /// The name. + /// The component with the specified . + /// is null. + /// The property is retrieved and is not found. + T this[string name] { get; } + + /// + /// Adds a component to the collection, + /// giving it the specified if it is not . + /// + /// The name given to the module, or . + /// The component. + void Add(string? name, T component); + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Utilities/IPParser.cs b/Vendor/EmbedIO-3.5.2/Utilities/IPParser.cs new file mode 100644 index 0000000..f0d9bf8 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Utilities/IPParser.cs @@ -0,0 +1,209 @@ +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Net; +using System.Net.Sockets; +using System.Threading.Tasks; +using Swan.Logging; + +namespace EmbedIO.Utilities +{ + /// + /// Provides standard methods to parse IP address strings. + /// + public static class IPParser + { + /// + /// Parses the specified IP address. + /// + /// The IP address. + /// A collection of parsed correctly from . + public static async Task> ParseAsync(string address) + { + if (address == null) + return Enumerable.Empty(); + + if (IPAddress.TryParse(address, out var ip)) + return new List { ip }; + + try + { + return await Dns.GetHostAddressesAsync(address).ConfigureAwait(false); + } + catch (SocketException socketEx) + { + socketEx.Log(nameof(IPParser)); + } + catch + { + // Ignore + } + + if (IsCidrNotation(address)) + return ParseCidrNotation(address); + + return IsSimpleIPRange(address) ? TryParseSimpleIPRange(address) : Enumerable.Empty(); + } + + /// + /// Determines whether the IP-range string is in CIDR notation. + /// + /// The IP-range string. + /// + /// true if the IP-range string is CIDR notation; otherwise, false. + /// + public static bool IsCidrNotation(string range) + { + if (string.IsNullOrWhiteSpace(range)) + return false; + + var parts = range.Split('/'); + if (parts.Length != 2) + return false; + + var prefix = parts[0]; + var prefixLen = parts[1]; + + var prefixParts = prefix.Split('.'); + if (prefixParts.Length != 4) + return false; + + return byte.TryParse(prefixLen, out var len) && len <= 32; + } + + /// + /// Parse IP-range string in CIDR notation. For example "12.15.0.0/16". + /// + /// The IP-range string. + /// A collection of parsed correctly from . + public static IEnumerable ParseCidrNotation(string range) + { + if (!IsCidrNotation(range)) + return Enumerable.Empty(); + + var parts = range.Split('/'); + var prefix = parts[0]; + + if (!byte.TryParse(parts[1], out var prefixLen)) + return Enumerable.Empty(); + + var prefixParts = prefix.Split('.'); + if (prefixParts.Select(x => byte.TryParse(x, out _)).Any(x => !x)) + return Enumerable.Empty(); + + uint ip = 0; + for (var i = 0; i < 4; i++) + { + ip <<= 8; + ip += uint.Parse(prefixParts[i], NumberFormatInfo.InvariantInfo); + } + + var shiftBits = (byte)(32 - prefixLen); + var ip1 = (ip >> shiftBits) << shiftBits; + + if ((ip1 & ip) != ip1) // Check correct subnet address + return Enumerable.Empty(); + + var ip2 = ip1 >> shiftBits; + for (var k = 0; k < shiftBits; k++) + { + ip2 = (ip2 << 1) + 1; + } + + var beginIP = new byte[4]; + var endIP = new byte[4]; + + for (var i = 0; i < 4; i++) + { + beginIP[i] = (byte)((ip1 >> ((3 - i) * 8)) & 255); + endIP[i] = (byte)((ip2 >> ((3 - i) * 8)) & 255); + } + + return GetAllIPAddresses(beginIP, endIP); + } + + /// + /// Determines whether the IP-range string is in simple IP range notation. + /// + /// The IP-range string. + /// + /// true if the IP-range string is in simple IP range notation; otherwise, false. + /// + public static bool IsSimpleIPRange(string range) + { + if (string.IsNullOrWhiteSpace(range)) + return false; + + var parts = range.Split('.'); + if (parts.Length != 4) + return false; + + foreach (var part in parts) + { + var rangeParts = part.Split('-'); + if (rangeParts.Length < 1 || rangeParts.Length > 2) + return false; + + if (!byte.TryParse(rangeParts[0], out _) || + (rangeParts.Length > 1 && !byte.TryParse(rangeParts[1], out _))) + return false; + } + + return true; + } + + /// + /// Tries to parse IP-range string "12.15-16.1-30.10-255" + /// + /// The IP-range string. + /// A collection of parsed correctly from . + public static IEnumerable TryParseSimpleIPRange(string range) + { + if (!IsSimpleIPRange(range)) + return Enumerable.Empty(); + + var beginIP = new byte[4]; + var endIP = new byte[4]; + + var parts = range.Split('.'); + for (var i = 0; i < 4; i++) + { + var rangeParts = parts[i].Split('-'); + beginIP[i] = byte.Parse(rangeParts[0], NumberFormatInfo.InvariantInfo); + endIP[i] = (rangeParts.Length == 1) ? beginIP[i] : byte.Parse(rangeParts[1], NumberFormatInfo.InvariantInfo); + } + + return GetAllIPAddresses(beginIP, endIP); + } + + private static IEnumerable GetAllIPAddresses(byte[] beginIP, byte[] endIP) + { + for (var i = 0; i < 4; i++) + { + if (endIP[i] < beginIP[i]) + return Enumerable.Empty(); + } + + var capacity = 1; + for (var i = 0; i < 4; i++) + capacity *= endIP[i] - beginIP[i] + 1; + + var ips = new List(capacity); + for (int i0 = beginIP[0]; i0 <= endIP[0]; i0++) + { + for (int i1 = beginIP[1]; i1 <= endIP[1]; i1++) + { + for (int i2 = beginIP[2]; i2 <= endIP[2]; i2++) + { + for (int i3 = beginIP[3]; i3 <= endIP[3]; i3++) + { + ips.Add(new IPAddress(new[] { (byte)i0, (byte)i1, (byte)i2, (byte)i3 })); + } + } + } + } + + return ips; + } + } +} diff --git a/Vendor/EmbedIO-3.5.2/Utilities/MimeTypeProviderStack.cs b/Vendor/EmbedIO-3.5.2/Utilities/MimeTypeProviderStack.cs new file mode 100644 index 0000000..d0cc444 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Utilities/MimeTypeProviderStack.cs @@ -0,0 +1,56 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace EmbedIO.Utilities +{ + /// + /// Manages a stack of MIME type providers. + /// This API supports the EmbedIO infrastructure and is not intended to be used directly from your code. + /// + /// + public sealed class MimeTypeProviderStack : IMimeTypeProvider + { + private readonly Stack _providers = new Stack(); + + /// + /// Pushes the specified MIME type provider on the stack. + /// This API supports the EmbedIO infrastructure and is not intended to be used directly from your code. + /// + /// The interface to push on the stack. + /// is . + public void Push(IMimeTypeProvider provider) + => _providers.Push(Validate.NotNull(nameof(provider), provider)); + + /// + /// Removes the most recently added MIME type provider from the stack. + /// This API supports the EmbedIO infrastructure and is not intended to be used directly from your code. + /// + public void Pop() => _providers.Pop(); + + /// + public string GetMimeType(string extension) + { + var result = _providers.Select(p => p.GetMimeType(extension)) + .FirstOrDefault(m => m != null); + + if (result == null) + _ = MimeType.Associations.TryGetValue(extension, out result); + + return result; + } + + /// + public bool TryDetermineCompression(string mimeType, out bool preferCompression) + { + foreach (var provider in _providers) + { + if (provider.TryDetermineCompression(mimeType, out preferCompression)) + return true; + } + + preferCompression = default; + return false; + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Utilities/NameValueCollectionExtensions.cs b/Vendor/EmbedIO-3.5.2/Utilities/NameValueCollectionExtensions.cs new file mode 100644 index 0000000..7596b88 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Utilities/NameValueCollectionExtensions.cs @@ -0,0 +1,110 @@ +using System; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.Linq; + +namespace EmbedIO.Utilities +{ + /// + /// Provides extension methods for . + /// + public static class NameValueCollectionExtensions + { + /// + /// Converts a to a dictionary of objects. + /// Values in the returned dictionary will wither be strings, or arrays of strings, + /// depending on the presence of multiple values for the same key in the collection. + /// + /// The on which this method is called. + /// A associating the collection's keys + /// with their values. + /// is . + public static Dictionary ToDictionary(this NameValueCollection @this) + => @this.Keys.Cast().ToDictionary(key => key, key => { + var values = @this.GetValues(key); + if (values == null) + return null; + + return values.Length switch { + 0 => null, + 1 => (object) values[0], + _ => (object) values + }; + }); + + /// + /// Converts a to a dictionary of strings. + /// + /// The on which this method is called. + /// A associating the collection's keys + /// with their values (or comma-separated lists in case of multiple values). + /// is . + public static Dictionary ToStringDictionary(this NameValueCollection @this) + => @this.Keys.Cast().ToDictionary(key => key, @this.Get); + + /// + /// Converts a to a dictionary of arrays of strings. + /// + /// The on which this method is called. + /// A associating the collection's keys + /// with arrays of their values. + /// is . + public static Dictionary ToArrayDictionary(this NameValueCollection @this) + => @this.Keys.Cast().ToDictionary(key => key, @this.GetValues); + + /// + /// Determines whether a contains one or more values + /// for the specified . + /// + /// The on which this method is called. + /// The key to look for. + /// if at least one value for + /// is present in the collection; otherwise, . + /// + /// is . + public static bool ContainsKey(this NameValueCollection @this, string key) + => @this.Keys.Cast().Contains(key); + + /// + /// Determines whether a contains one or more values + /// for the specified , at least one of which is equal to the specified + /// . Value comparisons are carried out using the + /// comparison type. + /// + /// The on which this method is called. + /// The name to look for. + /// The value to look for. + /// if at least one of the values for + /// in the collection is equal to ; otherwise, . + /// + /// is . + /// White space is trimmed from the start and end of each value before comparison. + /// + public static bool Contains(this NameValueCollection @this, string name, string value) + => Contains(@this, name, value, StringComparison.OrdinalIgnoreCase); + + /// + /// Determines whether a contains one or more values + /// for the specified , at least one of which is equal to the specified + /// . Value comparisons are carried out using the specified + /// . + /// + /// The on which this method is called. + /// The name to look for. + /// The value to look for. + /// One of the enumeration values + /// that specifies how the strings will be compared. + /// if at least one of the values for + /// in the collection is equal to ; otherwise, . + /// + /// is . + /// White space is trimmed from the start and end of each value before comparison. + /// + public static bool Contains(this NameValueCollection @this, string name, string? value, StringComparison comparisonType) + { + value = value?.Trim(); + return @this[name]?.SplitByComma() + .Any(val => string.Equals(val?.Trim(), value, comparisonType)) ?? false; + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Utilities/QValueList.cs b/Vendor/EmbedIO-3.5.2/Utilities/QValueList.cs new file mode 100644 index 0000000..5d43299 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Utilities/QValueList.cs @@ -0,0 +1,279 @@ +using System.Collections.Generic; +using System.Text.RegularExpressions; + +namespace EmbedIO.Utilities +{ + /// + /// Represents a list of names with associated quality values extracted from an HTTP header, + /// e.g. gzip; q=0.9, deflate. + /// See RFC7231, section 5.3. + /// This class ignores and discards extensions (accept-ext in RFC7231 terminology). + /// If a name has one or more parameters (e.g. text/html;level=1) it is not + /// further parsed: parameters will appear as part of the name. + /// + public sealed class QValueList + { + /// + /// A value signifying "anything will do" in request headers. + /// For example, a request header of + /// Accept-Encoding: *;q=0.8, gzip means "I prefer GZip compression; + /// if it is not available, any other compression (including no compression at all) + /// is OK for me". + /// + public const string Wildcard = "*"; + + // This will match a quality value between two semicolons + // or between a semicolon and the end of a string. + // Match groups will be: + // Groups[0] = The matching string + // Groups[1] = If group is successful, "0"; otherwise, the weight is 1.000 + // Groups[2] = If group is successful, the decimal digits after 0 + // The part of string before the match contains the value and parameters (if any). + // The part of string after the match contains the extensions (if any). + // If there is no match, the whole string is just value and parameters (if any). + private static readonly Regex QualityValueRegex = new Regex( + @";[ \t]*q=(?:(?:1(?:\.(?:0{1,3}))?)|(?:(0)(?:\.(\d{1,3}))?))[ \t]*(?:;|,|$)", + RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.Singleline); + + /// + /// Initializes a new instance of the class + /// by parsing comma-separated request header values. + /// + /// If set to , a value of * + /// will be treated as signifying "anything". + /// A list of comma-separated header values. + /// + public QValueList(bool useWildcard, string headerValues) + { + UseWildcard = useWildcard; + QValues = Parse(headerValues); + } + + /// + /// Initializes a new instance of the class + /// by parsing comma-separated request header values. + /// + /// If set to , a value of * + /// will be treated as signifying "anything". + /// An enumeration of header values. + /// Note that each element of the enumeration may in turn be + /// a comma-separated list. + /// + public QValueList(bool useWildcard, IEnumerable headerValues) + { + UseWildcard = useWildcard; + QValues = Parse(headerValues); + } + + /// + /// Initializes a new instance of the class + /// by parsing comma-separated request header values. + /// + /// If set to , a value of * + /// will be treated as signifying "anything". + /// An array of header values. + /// Note that each element of the array may in turn be + /// a comma-separated list. + /// + public QValueList(bool useWildcard, params string[] headerValues) + : this(useWildcard, headerValues as IEnumerable) + { + } + + /// + /// Gets a dictionary associating values with their relative weight + /// (an integer ranging from 0 to 1000) and their position in the + /// list of header values from which this instance has been constructed. + /// + /// + /// This property does not usually need to be used directly; + /// use the , , + /// , and + /// methods instead. + /// + /// + /// + /// + /// + public IReadOnlyDictionary QValues { get; } + + /// + /// Gets a value indicating whether * is treated as a special value + /// with the meaning of "anything". + /// + public bool UseWildcard { get; } + + /// + /// Determines whether the specified value is a possible candidate. + /// + /// The value. + /// if is a candidate; + /// otherwise, . + public bool IsCandidate(string value) + => TryGetCandidateValue(Validate.NotNull(nameof(value), value), out var candidate) && candidate.Weight > 0; + + /// + /// Attempts to determine whether the weight of a possible candidate. + /// + /// The value whose weight is to be determined. + /// When this method returns , + /// the weight of the candidate. + /// if is a candidate; + /// otherwise, . + public bool TryGetWeight(string value, out int weight) + { + var result = TryGetCandidateValue(Validate.NotNull(nameof(value), value), out var candidate); + weight = candidate.Weight; + return result; + } + + /// + /// Finds the value preferred by the client among an enumeration of values. + /// + /// The values. + /// The value preferred by the client, or + /// if none of the provided is accepted. + public string? FindPreferred(IEnumerable values) + => FindPreferredCore(values, out var result) >= 0 ? result : null; + + /// + /// Finds the index of the value preferred by the client in a list of values. + /// + /// The values. + /// The index of the value preferred by the client, or -1 + /// if none of the values in is accepted. + public int FindPreferredIndex(IEnumerable values) => FindPreferredCore(values, out _); + + /// + /// Finds the index of the value preferred by the client in an array of values. + /// + /// The values. + /// The index of the value preferred by the client, or -1 + /// if none of the values in is accepted. + public int FindPreferredIndex(params string[] values) => FindPreferredIndex(values as IReadOnlyList); + + private static IReadOnlyDictionary Parse(string headerValues) + { + var result = new Dictionary(); + ParseCore(headerValues, result); + return result; + } + + private static IReadOnlyDictionary Parse(IEnumerable headerValues) + { + var result = new Dictionary(); + + if (headerValues == null) return result; + + foreach (var headerValue in headerValues) + ParseCore(headerValue, result); + + return result; + } + + private static void ParseCore(string text, IDictionary dictionary) + { + if (string.IsNullOrEmpty(text)) + return; + + var length = text.Length; + var position = 0; + var ordinal = 0; + while (position < length) + { + var stop = text.IndexOf(',', position); + if (stop < 0) + stop = length; + + string name; + var weight = 1000; + var match = QualityValueRegex.Match(text, position, stop - position); + if (match.Success) + { + var groups = match.Groups; + var wholeMatch = groups[0]; + name = text.Substring(position, wholeMatch.Index - position).Trim(); + if (groups[1].Success) + { + weight = 0; + if (groups[2].Success) + { + var digits = groups[2].Value; + var n = 0; + while (n < digits.Length) + { + weight = (10 * weight) + (digits[n] - '0'); + n++; + } + + while (n < 3) + { + weight = 10 * weight; + n++; + } + } + } + } + else + { + name = text.Substring(position, stop - position).Trim(); + } + + if (!string.IsNullOrEmpty(name)) + dictionary[name] = (weight, ordinal); + + position = stop + 1; + ordinal++; + } + } + + private static int CompareQualities((int Weight, int Ordinal) a, (int Weight, int Ordinal) b) + { + if (a.Weight > b.Weight) + return 1; + + if (a.Weight < b.Weight) + return -1; + + if (a.Ordinal < b.Ordinal) + return 1; + + if (a.Ordinal > b.Ordinal) + return -1; + + return 0; + } + + private int FindPreferredCore(IEnumerable values, out string? result) + { + values = Validate.NotNull(nameof(values), values); + + result = null; + var best = -1; + + // Set initial values such as a weight of 0 can never win over them + (int Weight, int Ordinal) bestValue = (0, int.MinValue); + var i = 0; + foreach (var value in values) + { + if (value == null) + continue; + + if (TryGetCandidateValue(value, out var candidateValue) && CompareQualities(candidateValue, bestValue) > 0) + { + result = value; + best = i; + bestValue = candidateValue; + } + + i++; + } + + return best; + } + + private bool TryGetCandidateValue(string value, out (int Weight, int Ordinal) candidate) + => QValues.TryGetValue(value, out candidate) + || (UseWildcard && QValues.TryGetValue(Wildcard, out candidate)); + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Utilities/QValueListExtensions.cs b/Vendor/EmbedIO-3.5.2/Utilities/QValueListExtensions.cs new file mode 100644 index 0000000..fb19cbe --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Utilities/QValueListExtensions.cs @@ -0,0 +1,72 @@ +namespace EmbedIO.Utilities +{ + /// + /// Provides extension methods for . + /// + public static class QValueListExtensions + { + /// + /// Attempts to proactively negotiate a compression method for a response, + /// based on the contents of a . + /// + /// The on which this method is called. + /// if sending compressed data is preferred over + /// sending non-compressed data; otherwise, . + /// When this method returns, the compression method to use for the response, + /// if content negotiation is successful. This parameter is passed uninitialized. + /// When this method returns, the name of the compression method, + /// if content negotiation is successful. This parameter is passed uninitialized. + /// if content negotiation is successful; + /// otherwise, . + /// + /// If is empty, this method always returns , + /// setting to + /// and to . + /// + public static bool TryNegotiateContentEncoding( + this QValueList @this, + bool preferCompression, + out CompressionMethod compressionMethod, + out string? compressionMethodName) + { + if (@this.QValues.Count < 1) + { + compressionMethod = CompressionMethod.None; + compressionMethodName = CompressionMethodNames.None; + return true; + } + + // https://tools.ietf.org/html/rfc7231#section-5.3.4 + // RFC7231, Section 5.3.4, rule #2: + // If the representation has no content-coding, then it is + // acceptable by default unless specifically excluded by the + // Accept - Encoding field stating either "identity;q=0" or "*;q=0" + // without a more specific entry for "identity". + if (!preferCompression && (!@this.TryGetWeight(CompressionMethodNames.None, out var weight) || weight > 0)) + { + compressionMethod = CompressionMethod.None; + compressionMethodName = CompressionMethodNames.None; + return true; + } + + var acceptableMethods = preferCompression + ? new[] { CompressionMethod.Gzip, CompressionMethod.Deflate, CompressionMethod.None } + : new[] { CompressionMethod.None, CompressionMethod.Gzip, CompressionMethod.Deflate }; + var acceptableMethodNames = preferCompression + ? new[] { CompressionMethodNames.Gzip, CompressionMethodNames.Deflate, CompressionMethodNames.None } + : new[] { CompressionMethodNames.None, CompressionMethodNames.Gzip, CompressionMethodNames.Deflate }; + + var acceptableMethodIndex = @this.FindPreferredIndex(acceptableMethodNames); + if (acceptableMethodIndex < 0) + { + compressionMethod = default; + compressionMethodName = default; + return false; + } + + compressionMethod = acceptableMethods[acceptableMethodIndex]; + compressionMethodName = acceptableMethodNames[acceptableMethodIndex]; + return true; + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Utilities/StringExtensions.cs b/Vendor/EmbedIO-3.5.2/Utilities/StringExtensions.cs new file mode 100644 index 0000000..937430b --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Utilities/StringExtensions.cs @@ -0,0 +1,55 @@ +using System; + +namespace EmbedIO.Utilities +{ + /// + /// Provides extension methods for . + /// + public static class StringExtensions + { + private static readonly char[] CommaSplitChars = {','}; + + /// Splits a string into substrings based on the specified . + /// The returned array includes empty array elements if two or more consecutive delimiters are found + /// in . + /// The on which this method is called. + /// An array of s to use as delimiters. + /// An array whose elements contain the substrings in that are delimited + /// by one or more characters in . + /// is . + public static string[] SplitByAny(this string @this, params char[] delimiters) => @this.Split(delimiters); + + /// Splits a string into substrings, using the comma (,) character as a delimiter. + /// The returned array includes empty array elements if two or more commas are found in . + /// The on which this method is called. + /// An array whose elements contain the substrings in that are delimited by commas. + /// is . + /// + public static string[] SplitByComma(this string @this) => @this.Split(CommaSplitChars); + + /// Splits a string into substrings, using the comma (,) character as a delimiter. + /// You can specify whether the substrings include empty array elements. + /// The on which this method is called. + /// to omit empty array elements from the array returned; + /// or to include empty array elements in the array returned. + /// + /// An array whose elements contain the substrings in that are delimited by commas. + /// For more information, see the Remarks section of the method. + /// + /// is . + /// options is not one of the values. + /// + public static string[] SplitByComma(this string @this, StringSplitOptions options) => + @this.Split(CommaSplitChars, options); + + /// + /// Ensures that a is never empty, + /// by transforming empty strings into . + /// + /// The on which this method is called. + /// If is the empty string, ; + /// otherwise, + public static string? NullIfEmpty(this string @this) + => string.IsNullOrEmpty(@this) ? null : @this; + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Utilities/UniqueIdGenerator.cs b/Vendor/EmbedIO-3.5.2/Utilities/UniqueIdGenerator.cs new file mode 100644 index 0000000..66b5ba9 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Utilities/UniqueIdGenerator.cs @@ -0,0 +1,16 @@ +using System; + +namespace EmbedIO.Utilities +{ + /// + /// Generates locally unique string IDs, mainly for logging purposes. + /// + public static class UniqueIdGenerator + { + /// + /// Generates and returns a unique ID. + /// + /// The generated ID. + public static string GetNext() => Convert.ToBase64String(Guid.NewGuid().ToByteArray()).Substring(0, 22); + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Utilities/UrlEncodedDataParser.cs b/Vendor/EmbedIO-3.5.2/Utilities/UrlEncodedDataParser.cs new file mode 100644 index 0000000..1963cca --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Utilities/UrlEncodedDataParser.cs @@ -0,0 +1,127 @@ +using System; +using System.Collections.Specialized; +using System.Net; +using EmbedIO.Internal; + +namespace EmbedIO.Utilities +{ + /// + /// Parses URL queries or URL-encoded HTML forms. + /// + public static class UrlEncodedDataParser + { + /// + /// Parses a URL query or URL-encoded HTML form. + /// Unlike , the returned + /// will have bracketed indexes stripped away; + /// for example, a[0]=1&a[1]=2 will yield the same result as a=1&a=2, + /// i.e. a with one key (a) associated with + /// two values (1 and 2). + /// + /// The string to parse. + /// If this parameter is , + /// tokens not followed by an equal sign (e.g. this in a=1&this&b=2) + /// will be grouped as values of a null key. + /// This is the same behavior as the and + /// properties. + /// If this parameter is , tokens not followed by an equal sign + /// (e.g. this in a=1&this&b=2) will be considered keys with an empty + /// value. This is the same behavior as the + /// extension method. + /// (the default) to return + /// a mutable (non-read-only) collection; to return a read-only collection. + /// A containing the parsed data. + public static NameValueCollection Parse(string source, bool groupFlags, bool mutableResult = true) + { + var result = new LockableNameValueCollection(); + + // Verify there is data to parse; otherwise, return an empty collection. + if (string.IsNullOrEmpty(source)) + { + if (!mutableResult) + result.MakeReadOnly(); + + return result; + } + + void AddKeyValuePair(string? key, string value) + { + if (key != null) + { + // Decode the key. + key = WebUtility.UrlDecode(key); + + // Discard bracketed index (used e.g. by PHP) + var bracketPos = key.IndexOf("[", StringComparison.Ordinal); + if (bracketPos > 0) + key = key.Substring(0, bracketPos); + } + + // Decode the value. + value = WebUtility.UrlDecode(value); + + // Add the KVP to the collection. + result.Add(key, value); + } + + // Skip the initial question mark, + // in case source is the Query property of a Uri. + var kvpPos = source[0] == '?' ? 1 : 0; + var length = source.Length; + while (kvpPos < length) + { + var separatorPos = kvpPos; + var equalPos = -1; + + while (separatorPos < length) + { + var c = source[separatorPos]; + if (c == '&') + break; + + if (c == '=' && equalPos < 0) + equalPos = separatorPos; + + separatorPos++; + } + + // Split by the equals char into key and value. + // Some KVPS will have only their key, some will have both key and value + // Some other might be repeated which really means an array + if (equalPos < 0) + { + if (groupFlags) + { + AddKeyValuePair(null, source.Substring(kvpPos, separatorPos - kvpPos)); + } + else + { + AddKeyValuePair(source.Substring(kvpPos, separatorPos - kvpPos), string.Empty); + } + } + else + { + AddKeyValuePair( + source.Substring(kvpPos, equalPos - kvpPos), + source.Substring(equalPos + 1, separatorPos - equalPos - 1)); + } + + // Edge case: if the last character in source is '&', + // there's an empty KVP that we would otherwise skip. + if (separatorPos == length - 1) + { + AddKeyValuePair(groupFlags ? null : string.Empty, string.Empty); + break; + } + + // On to next KVP + kvpPos = separatorPos + 1; + } + + if (!mutableResult) + result.MakeReadOnly(); + + return result; + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Utilities/UrlPath.cs b/Vendor/EmbedIO-3.5.2/Utilities/UrlPath.cs new file mode 100644 index 0000000..82d6905 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Utilities/UrlPath.cs @@ -0,0 +1,315 @@ +using System; +using System.Collections.Generic; +using System.Text.RegularExpressions; + +namespace EmbedIO.Utilities +{ + /// + /// Provides utility methods to work with URL paths. + /// + public static class UrlPath + { + /// + /// The root URL path value, i.e. "/". + /// + public const string Root = "/"; + + private static readonly Regex MultipleSlashRegex = new Regex("//+", RegexOptions.Compiled | RegexOptions.CultureInvariant); + + /// + /// Determines whether a string is a valid URL path. + /// + /// The URL path. + /// + /// if the specified URL path is valid; otherwise, . + /// + /// + /// For a string to be a valid URL path, it must not be , + /// must not be empty, and must start with a slash (/) character. + /// To ensure that a method parameter is a valid URL path, use . + /// + /// + /// + /// + public static bool IsValid(string urlPath) => ValidateInternal(nameof(urlPath), urlPath) == null; + + /// + /// Normalizes the specified URL path. + /// + /// The URL path. + /// if set to , treat the URL path + /// as a base path, i.e. ensure it ends with a slash (/) character; + /// otherwise, ensure that it does NOT end with a slash character. + /// The normalized path. + /// + /// is not a valid URL path. + /// + /// + /// A normalized URL path is one where each run of two or more slash + /// (/) characters has been replaced with a single slash character. + /// This method does NOT try to decode URL-encoded characters. + /// If you are sure that is a valid URL path, + /// for example because you have called and it returned + /// , then you may call + /// instead of this method. is slightly faster because + /// it skips the initial validity check. + /// There is no need to call this method for a method parameter + /// for which you have already called . + /// + /// + /// + /// + public static string Normalize(string urlPath, bool isBasePath) + { + var exception = ValidateInternal(nameof(urlPath), urlPath); + if (exception != null) + throw exception; + + return UnsafeNormalize(urlPath, isBasePath); + } + + /// + /// Normalizes the specified URL path, assuming that it is valid. + /// + /// The URL path. + /// if set to , treat the URL path + /// as a base path, i.e. ensure it ends with a slash (/) character; + /// otherwise, ensure that it does NOT end with a slash character. + /// The normalized path. + /// + /// A normalized URL path is one where each run of two or more slash + /// (/) characters has been replaced with a single slash character. + /// This method does NOT try to decode URL-encoded characters. + /// If is not valid, the behavior of + /// this method is unspecified. You should call this method only after + /// has returned + /// for the same . + /// You should call instead of this method + /// if you are not sure that is valid. + /// There is no need to call this method for a method parameter + /// for which you have already called . + /// + /// + /// + /// + public static string UnsafeNormalize(string urlPath, bool isBasePath) + { + // Replace each run of multiple slashes with a single slash + urlPath = MultipleSlashRegex.Replace(urlPath, "/"); + + // The root path needs no further checking. + var length = urlPath.Length; + if (length == 1) + return urlPath; + + // Base URL paths must end with a slash; + // non-base URL paths must NOT end with a slash. + // The final slash is irrelevant for the URL itself + // (it has to map the same way with or without it) + // but makes comparing and mapping URLs a lot simpler. + var finalPosition = length - 1; + var endsWithSlash = urlPath[finalPosition] == '/'; + return isBasePath + ? (endsWithSlash ? urlPath : urlPath + "/") + : (endsWithSlash ? urlPath.Substring(0, finalPosition) : urlPath); + } + + /// + /// Determines whether the specified URL path is prefixed by the specified base URL path. + /// + /// The URL path. + /// The base URL path. + /// + /// if is prefixed by ; + /// otherwise, . + /// + /// + /// is not a valid URL path. + /// - or - + /// is not a valid base URL path. + /// + /// + /// This method returns even if the two URL paths are equivalent, + /// for example if both are "/", or if is "/download" and + /// is "/download/". + /// If you are sure that both and + /// are valid and normalized, for example because you have called , + /// then you may call instead of this method. + /// is slightly faster because it skips validity checks. + /// + /// + /// + /// + /// + public static bool HasPrefix(string urlPath, string baseUrlPath) + => UnsafeHasPrefix( + Validate.UrlPath(nameof(urlPath), urlPath, false), + Validate.UrlPath(nameof(baseUrlPath), baseUrlPath, true)); + + /// + /// Determines whether the specified URL path is prefixed by the specified base URL path, + /// assuming both paths are valid and normalized. + /// + /// The URL path. + /// The base URL path. + /// + /// if is prefixed by ; + /// otherwise, . + /// + /// + /// Unless both and are valid, + /// normalized URL paths, the behavior of this method is unspecified. You should call this method + /// only after calling either or + /// to check and normalize both parameters. + /// If you are not sure about the validity and/or normalization of parameters, + /// call instead of this method. + /// This method returns even if the two URL paths are equivalent, + /// for example if both are "/", or if is "/download" and + /// is "/download/". + /// + /// + /// + /// + /// + public static bool UnsafeHasPrefix(string urlPath, string baseUrlPath) + => urlPath.StartsWith(baseUrlPath, StringComparison.Ordinal) + || (urlPath.Length == baseUrlPath.Length - 1 && baseUrlPath.StartsWith(urlPath, StringComparison.Ordinal)); + + /// + /// Strips a base URL path fom a URL path, obtaining a relative path. + /// + /// The URL path. + /// The base URL path. + /// The relative path, or if + /// is not prefixed by . + /// + /// is not a valid URL path. + /// - or - + /// is not a valid base URL path. + /// + /// + /// The returned relative path is NOT prefixed by a slash (/) character. + /// If and are equivalent, + /// for example if both are "/", or if is "/download" + /// and is "/download/", this method returns an empty string. + /// If you are sure that both and + /// are valid and normalized, for example because you have called , + /// then you may call instead of this method. + /// is slightly faster because it skips validity checks. + /// + /// + /// + /// + /// + public static string? StripPrefix(string urlPath, string baseUrlPath) + => UnsafeStripPrefix( + Validate.UrlPath(nameof(urlPath), urlPath, false), + Validate.UrlPath(nameof(baseUrlPath), baseUrlPath, true)); + + /// + /// Strips a base URL path fom a URL path, obtaining a relative path, + /// assuming both paths are valid and normalized. + /// + /// The URL path. + /// The base URL path. + /// The relative path, or if + /// is not prefixed by . + /// + /// Unless both and are valid, + /// normalized URL paths, the behavior of this method is unspecified. You should call this method + /// only after calling either or + /// to check and normalize both parameters. + /// If you are not sure about the validity and/or normalization of parameters, + /// call instead of this method. + /// The returned relative path is NOT prefixed by a slash (/) character. + /// If and are equivalent, + /// for example if both are "/", or if is "/download" + /// and is "/download/", this method returns an empty string. + /// + /// + /// + /// + /// + public static string? UnsafeStripPrefix(string urlPath, string baseUrlPath) + { + if (!UnsafeHasPrefix(urlPath, baseUrlPath)) + return null; + + // The only case where UnsafeHasPrefix returns true for a urlPath shorter than baseUrlPath + // is urlPath == (baseUrlPath minus the final slash). + return urlPath.Length < baseUrlPath.Length + ? string.Empty + : urlPath.Substring(baseUrlPath.Length); + } + + /// + /// Splits the specified URL path into segments. + /// + /// The URL path. + /// An enumeration of path segments. + /// is not a valid URL path. + /// + /// A root URL path (/) will result in an empty enumeration. + /// The returned enumeration will be the same whether is a base URL path or not. + /// If you are sure that is valid and normalized, + /// for example because you have called , + /// then you may call instead of this method. + /// is slightly faster because it skips validity checks. + /// + /// + /// + /// + public static IEnumerable Split(string urlPath) + => UnsafeSplit(Validate.UrlPath(nameof(urlPath), urlPath, false)); + + /// + /// Splits the specified URL path into segments, assuming it is valid and normalized. + /// + /// The URL path. + /// An enumeration of path segments. + /// + /// Unless is a valid, normalized URL path, + /// the behavior of this method is unspecified. You should call this method + /// only after calling either or + /// to check and normalize both parameters. + /// If you are not sure about the validity and/or normalization of , + /// call instead of this method. + /// A root URL path (/) will result in an empty enumeration. + /// The returned enumeration will be the same whether is a base URL path or not. + /// + /// + /// + /// + public static IEnumerable UnsafeSplit(string urlPath) + { + var length = urlPath.Length; + var position = 1; // Skip initial slash + while (position < length) + { + var slashPosition = urlPath.IndexOf('/', position); + if (slashPosition < 0) + { + yield return urlPath.Substring(position); + break; + } + + yield return urlPath.Substring(position, slashPosition - position); + position = slashPosition + 1; + } + } + + internal static Exception? ValidateInternal(string argumentName, string value) + { + if (value == null) + return new ArgumentNullException(argumentName); + + if (value.Length == 0) + return new ArgumentException("URL path is empty.", argumentName); + + if (value[0] != '/') + return new ArgumentException("URL path does not start with a slash.", argumentName); + + return null; + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Utilities/Validate-MimeType.cs b/Vendor/EmbedIO-3.5.2/Utilities/Validate-MimeType.cs new file mode 100644 index 0000000..8f72f90 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Utilities/Validate-MimeType.cs @@ -0,0 +1,32 @@ +using System; + +namespace EmbedIO.Utilities +{ + partial class Validate + { + /// + /// Ensures that a argument is valid as MIME type or media range as defined by + /// RFC7231, Section 5,3.2. + /// + /// The name of the argument to validate. + /// The value to validate. + /// If , media ranges (i.e. strings of the form */* + /// and type/*) are considered valid; otherwise, they are rejected as invalid. + /// , if it is a valid MIME type or media range. + /// is . + /// + /// is the empty string. + /// - or - + /// is not a valid MIME type or media range. + /// + public static string MimeType(string argumentName, string value, bool acceptMediaRange) + { + value = NotNullOrEmpty(argumentName, value); + + if (!EmbedIO.MimeType.IsMimeType(value, acceptMediaRange)) + throw new ArgumentException("MIME type is not valid.", argumentName); + + return value; + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Utilities/Validate-Paths.cs b/Vendor/EmbedIO-3.5.2/Utilities/Validate-Paths.cs new file mode 100644 index 0000000..a875474 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Utilities/Validate-Paths.cs @@ -0,0 +1,95 @@ +using System; +using System.IO; +using System.Security; + +namespace EmbedIO.Utilities +{ + partial class Validate + { + private static readonly char[] InvalidLocalPathChars = GetInvalidLocalPathChars(); + + /// + /// Ensures that the value of an argument is a valid URL path + /// and normalizes it. + /// + /// The name of the argument to validate. + /// The value to validate. + /// If set to true, the returned path + /// is ensured to end in a slash (/) character; otherwise, the returned path is + /// ensured to not end in a slash character unless it is "/". + /// The normalized URL path. + /// is . + /// + /// is empty. + /// - or - + /// does not start with a slash (/) character. + /// + /// + public static string UrlPath(string argumentName, string value, bool isBasePath) + { + var exception = Utilities.UrlPath.ValidateInternal(argumentName, value); + if (exception != null) + throw exception; + + return Utilities.UrlPath.Normalize(value, isBasePath); + } + + /// + /// Ensures that the value of an argument is a valid local path + /// and, optionally, gets the corresponding full path. + /// + /// The name of the argument to validate. + /// The value to validate. + /// to get the full path, to leave the path as is.. + /// The local path, or the full path if is . + /// is . + /// + /// is empty. + /// - or - + /// contains only white space. + /// - or - + /// contains one or more invalid characters. + /// - or - + /// is and the full path could not be obtained. + /// + public static string LocalPath(string argumentName, string value, bool getFullPath) + { + if (value == null) + throw new ArgumentNullException(argumentName); + + if (value.Length == 0) + throw new ArgumentException("Local path is empty.", argumentName); + + if (string.IsNullOrWhiteSpace(value)) + throw new ArgumentException("Local path contains only white space.", argumentName); + + if (value.IndexOfAny(InvalidLocalPathChars) >= 0) + throw new ArgumentException("Local path contains one or more invalid characters.", argumentName); + + if (getFullPath) + { + try + { + value = Path.GetFullPath(value); + } + catch (Exception e) when (e is ArgumentException || e is SecurityException || e is NotSupportedException || e is PathTooLongException) + { + throw new ArgumentException("Could not get the full local path.", argumentName, e); + } + } + + return value; + } + + private static char[] GetInvalidLocalPathChars() + { + var systemChars = Path.GetInvalidPathChars(); + var p = systemChars.Length; + var result = new char[p + 2]; + Array.Copy(systemChars, result, p); + result[p++] = '*'; + result[p] = '?'; + return result; + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Utilities/Validate-Rfc2616.cs b/Vendor/EmbedIO-3.5.2/Utilities/Validate-Rfc2616.cs new file mode 100644 index 0000000..30f97a8 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Utilities/Validate-Rfc2616.cs @@ -0,0 +1,55 @@ +using System; +using System.Linq; + +namespace EmbedIO.Utilities +{ + partial class Validate + { + private static readonly char[] ValidRfc2616TokenChars = GetValidRfc2616TokenChars(); + + /// + /// Ensures that a argument is valid as a token as defined by + /// RFC2616, Section 2.2. + /// RFC2616 tokens are used, for example, as: + /// + /// cookie names, as stated in RFC6265, Section 4.1.1; + /// WebSocket protocol names, as stated in RFC6455, Section 4.3. + /// + /// Only a restricted set of characters are allowed in tokens, including: + /// + /// upper- and lower-case letters of the English alphabet; + /// decimal digits; + /// the following non-alphanumeric characters: + /// !, #, $, %, &, ', *, +, + /// -, ., ^, _, `, |, ~. + /// + /// + /// The name of the argument to validate. + /// The value to validate. + /// , if it is a valid token. + /// is . + /// + /// is the empty string. + /// - or - + /// contains one or more characters that are not allowed in a token. + /// + public static string Rfc2616Token(string argumentName, string value) + { + value = NotNullOrEmpty(argumentName, value); + + if (!IsRfc2616Token(value)) + throw new ArgumentException("Token contains one or more invalid characters.", argumentName); + + return value; + } + + internal static bool IsRfc2616Token(string value) + => !string.IsNullOrEmpty(value) + && !value.Any(c => c < '\x21' || c > '\x7E' || Array.BinarySearch(ValidRfc2616TokenChars, c) < 0); + + private static char[] GetValidRfc2616TokenChars() + => "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!#$%&'*+-.^_`|~" + .OrderBy(c => c) + .ToArray(); + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Utilities/Validate-Route.cs b/Vendor/EmbedIO-3.5.2/Utilities/Validate-Route.cs new file mode 100644 index 0000000..a007ca1 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Utilities/Validate-Route.cs @@ -0,0 +1,33 @@ +using System; + +namespace EmbedIO.Utilities +{ + partial class Validate + { + /// + /// Ensures that the value of an argument is a valid route. + /// + /// The name of the argument to validate. + /// The value to validate. + /// if the argument must be a base route; + /// if the argument must be a non-base route. + /// , if it is a valid route. + /// is . + /// + /// is empty. + /// - or - + /// does not start with a slash (/) character. + /// - or - + /// does not comply with route syntax. + /// + /// + public static string Route(string argumentName, string value, bool isBaseRoute) + { + var exception = Routing.Route.ValidateInternal(argumentName, value, isBaseRoute); + if (exception != null) + throw exception; + + return Utilities.UrlPath.UnsafeNormalize(value, isBaseRoute); + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/Utilities/Validate.cs b/Vendor/EmbedIO-3.5.2/Utilities/Validate.cs new file mode 100644 index 0000000..8fb57d7 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/Utilities/Validate.cs @@ -0,0 +1,125 @@ +using System; + +namespace EmbedIO.Utilities +{ + /// + /// Provides validation methods for method arguments. + /// + public static partial class Validate + { + /// + /// Ensures that an argument is not . + /// + /// The type of the argument to validate. + /// The name of the argument to validate. + /// The value to validate. + /// if not . + /// is . + public static T NotNull(string argumentName, T? value) + where T : class + => value ?? throw new ArgumentNullException(argumentName); + + /// + /// Ensures that a argument is neither nor the empty string. + /// + /// The name of the argument to validate. + /// The value to validate. + /// if neither nor the empty string. + /// is . + /// is the empty string. + public static string NotNullOrEmpty(string argumentName, string? value) + { + if (value == null) + throw new ArgumentNullException(argumentName); + + if (value.Length == 0) + throw new ArgumentException("String is empty.", argumentName); + + return value; + } + + /// + /// Ensures that a valid URL can be constructed from a argument. + /// + /// Name of the argument. + /// The value. + /// Specifies whether is a relative URL, absolute URL, or is indeterminate. + /// Ensure that, if is an absolute URL, its scheme is either http or https. + /// The string representation of the constructed URL. + /// is . + /// + /// is not a valid URL. + /// - or - + /// is , is an absolute URL, + /// and 's scheme is neither http nor https. + /// + /// + public static string Url( + string argumentName, + string value, + UriKind uriKind = UriKind.RelativeOrAbsolute, + bool enforceHttp = false) + { + Uri uri; + try + { + uri = new Uri(NotNull(argumentName, value), uriKind); + } + catch (UriFormatException e) + { + throw new ArgumentException("URL is not valid.", argumentName, e); + } + + if (enforceHttp && uri.IsAbsoluteUri && uri.Scheme != Uri.UriSchemeHttp && uri.Scheme != Uri.UriSchemeHttps) + throw new ArgumentException("URL scheme is neither HTTP nor HTTPS.", argumentName); + + return uri.ToString(); + } + + /// + /// Ensures that a valid URL, either absolute or relative to the given , + /// can be constructed from a argument and returns the absolute URL + /// obtained by combining and . + /// + /// Name of the argument. + /// The value. + /// The base URI for relative URLs. + /// Ensure that the resulting URL's scheme is either http or https. + /// The string representation of the constructed URL. + /// + /// is . + /// - or - + /// is . + /// + /// + /// is not an absolute URI. + /// - or - + /// is not a valid URL. + /// - or - + /// is , + /// and the combination of and has a scheme + /// that is neither http nor https. + /// + /// + public static string Url(string argumentName, string value, Uri baseUri, bool enforceHttp = false) + { + if (!NotNull(nameof(baseUri), baseUri).IsAbsoluteUri) + throw new ArgumentException("Base URI is not an absolute URI.", nameof(baseUri)); + + Uri uri; + try + { + uri = new Uri(baseUri, new Uri(NotNull(argumentName, value), UriKind.RelativeOrAbsolute)); + } + catch (UriFormatException e) + { + throw new ArgumentException("URL is not valid.", argumentName, e); + } + + if (enforceHttp && uri.IsAbsoluteUri && uri.Scheme != Uri.UriSchemeHttp && uri.Scheme != Uri.UriSchemeHttps) + throw new ArgumentException("URL scheme is neither HTTP nor HTTPS.", argumentName); + + return uri.ToString(); + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/WebApi/FormDataAttribute.cs b/Vendor/EmbedIO-3.5.2/WebApi/FormDataAttribute.cs new file mode 100644 index 0000000..b5e4a79 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/WebApi/FormDataAttribute.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Specialized; +using System.Threading.Tasks; + +namespace EmbedIO.WebApi +{ + /// + /// Specifies that a parameter of a controller method will receive a + /// of HTML form data, obtained by deserializing a request body with a content type + /// of application/x-www-form-urlencoded. + /// The received collection will be read-only. + /// This class cannot be inherited. + /// + /// + /// + [AttributeUsage(AttributeTargets.Parameter)] + public sealed class FormDataAttribute : Attribute, IRequestDataAttribute + { + /// + public Task GetRequestDataAsync(WebApiController controller, string parameterName) + => controller.HttpContext.GetRequestFormDataAsync(); + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/WebApi/FormFieldAttribute.cs b/Vendor/EmbedIO-3.5.2/WebApi/FormFieldAttribute.cs new file mode 100644 index 0000000..09bf398 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/WebApi/FormFieldAttribute.cs @@ -0,0 +1,172 @@ +using System; +using System.Linq; +using System.Threading.Tasks; +using EmbedIO.Utilities; +using Swan; + +namespace EmbedIO.WebApi +{ + /// + /// Specifies that a parameter of a controller method will receive the value(s) of a field in a HTML form, + /// obtained by deserializing a request body with a content type of application/x-www-form-urlencoded. + /// The parameter carrying this attribute can be either a simple type or a one-dimension array. + /// If multiple values are present for the field, a non-array parameter will receive the last specified value, + /// while an array parameter will receive an array of field values converted to the element type of the + /// parameter. + /// If a single value is present for the field, a non-array parameter will receive the value converted + /// to the type of the parameter, while an array parameter will receive an array of length 1, containing + /// the value converted to the element type of the parameter + /// If no values are present for the field and the property is + /// , a 400 Bad Request response will be sent to the client, with a message + /// specifying the name of the missing field. + /// If no values are present for the field and the property is + /// , a non-array parameter will receive the default value for its type, while + /// an array parameter will receive an array of length 0. + /// This class cannot be inherited. + /// + /// + /// + /// + [AttributeUsage(AttributeTargets.Parameter)] + public sealed class FormFieldAttribute : + Attribute, + IRequestDataAttribute, + IRequestDataAttribute, + IRequestDataAttribute + { + /// + /// Initializes a new instance of the class. + /// The name of the form field to extract will be equal to the name of the parameter + /// carrying this attribute. + /// + public FormFieldAttribute() + : this(false, null) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// The name of the form field to extract. + /// is . + /// is the empty string (""). + public FormFieldAttribute(string fieldName) + : this(false, Validate.NotNullOrEmpty(nameof(fieldName), fieldName)) + { + } + + /// + /// Initializes a new instance of the class. + /// The name of the form field to extract will be equal to the name of the parameter + /// carrying this attribute. + /// + /// If set to , a 400 Bad Request + /// response will be sent to the client if no values are found for the field; if set to + /// , a default value will be assumed. + public FormFieldAttribute(bool badRequestIfMissing) + : this(badRequestIfMissing, null) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// The name of the form field to extract. + /// is . + /// is the empty string (""). + /// If set to , a 400 Bad Request + /// response will be sent to the client if no values are found for the field; if set to + /// , a default value will be assumed. + public FormFieldAttribute(string fieldName, bool badRequestIfMissing) + : this(badRequestIfMissing, Validate.NotNullOrEmpty(nameof(fieldName), fieldName)) + { + } + + private FormFieldAttribute(bool badRequestIfMissing, string? fieldName) + { + BadRequestIfMissing = badRequestIfMissing; + FieldName = fieldName; + } + + /// + /// Gets the name of the form field that this attribute will extract, + /// or if the name of the parameter carrying this + /// attribute is to be used as field name. + /// + public string? FieldName { get; } + + /// + /// Gets or sets a value indicating whether to send a 400 Bad Request response + /// to the client if the submitted form contains no values for the field. + /// If this property is and the submitted form + /// contains no values for the field, the 400 Bad Request response sent + /// to the client will contain a reference to the missing field. + /// If this property is and the submitted form + /// contains no values for the field, the default value for the parameter + /// (or a zero-length array if the parameter is of an array type) + /// will be passed to the controller method. + /// + public bool BadRequestIfMissing { get; } + + async Task IRequestDataAttribute.GetRequestDataAsync( + WebApiController controller, + string parameterName) + { + var data = await controller.HttpContext.GetRequestFormDataAsync() + .ConfigureAwait(false); + + var fieldName = FieldName ?? parameterName; + if (!data.ContainsKey(fieldName) && BadRequestIfMissing) + throw HttpException.BadRequest($"Missing form field {fieldName}."); + + return data.GetValues(fieldName)?.LastOrDefault(); + } + + async Task IRequestDataAttribute.GetRequestDataAsync( + WebApiController controller, + string parameterName) + { + var data = await controller.HttpContext.GetRequestFormDataAsync() + .ConfigureAwait(false); + + var fieldName = FieldName ?? parameterName; + if (!data.ContainsKey(fieldName) && BadRequestIfMissing) + throw HttpException.BadRequest($"Missing form field {fieldName}."); + + return data.GetValues(fieldName) ?? Array.Empty(); + } + + async Task IRequestDataAttribute.GetRequestDataAsync( + WebApiController controller, + Type type, + string parameterName) + { + var data = await controller.HttpContext.GetRequestFormDataAsync() + .ConfigureAwait(false); + + var fieldName = FieldName ?? parameterName; + if (!data.ContainsKey(fieldName) && BadRequestIfMissing) + throw HttpException.BadRequest($"Missing form field {fieldName}."); + + if (type.IsArray) + { + var fieldValues = data.GetValues(fieldName) ?? Array.Empty(); + if (!FromString.TryConvertTo(type, fieldValues, out var result)) + throw HttpException.BadRequest($"Cannot convert field {fieldName} to an array of {type.GetElementType().Name}."); + + return result; + } + else + { + var fieldValue = data.GetValues(fieldName)?.LastOrDefault(); + if (fieldValue == null) + return type.IsValueType ? Activator.CreateInstance(type) : null; + + if (!FromString.TryConvertTo(type, fieldValue, out var result)) + throw HttpException.BadRequest($"Cannot convert field {fieldName} to {type.Name}."); + + return result; + } + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/WebApi/IRequestDataAttribute`1.cs b/Vendor/EmbedIO-3.5.2/WebApi/IRequestDataAttribute`1.cs new file mode 100644 index 0000000..369e3fe --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/WebApi/IRequestDataAttribute`1.cs @@ -0,0 +1,25 @@ +using System; +using System.Threading.Tasks; + +namespace EmbedIO.WebApi +{ + /// + /// Represents an attribute, applied to a parameter of a web API controller method, + /// that causes the parameter to be passed deserialized data from a request. + /// + /// The type of the controller. + /// + public interface IRequestDataAttribute + where TController : WebApiController + { + /// + /// Asynchronously obtains data from a controller's context. + /// + /// The controller. + /// The type of the parameter that has to receive the data. + /// The name of the parameter that has to receive the data. + /// a whose result will be the data + /// to pass as a parameter to a controller method. + Task GetRequestDataAsync(TController controller, Type type, string parameterName); + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/WebApi/IRequestDataAttribute`2.cs b/Vendor/EmbedIO-3.5.2/WebApi/IRequestDataAttribute`2.cs new file mode 100644 index 0000000..bbfff0e --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/WebApi/IRequestDataAttribute`2.cs @@ -0,0 +1,25 @@ +using System.Threading.Tasks; + +namespace EmbedIO.WebApi +{ + /// + /// Represents an attribute, applied to a parameter of a web API controller method, + /// that causes the parameter to be passed deserialized data from a request. + /// + /// The type of the controller. + /// The type of the data. + /// + public interface IRequestDataAttribute + where TController : WebApiController + where TData : class + { + /// + /// Asynchronously obtains data from a controller's context. + /// + /// The controller. + /// The name of the parameter that has to receive the data. + /// a whose result will be the data + /// to pass as a parameter to a controller method. + Task GetRequestDataAsync(TController controller, string parameterName); + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/WebApi/JsonDataAttribute.cs b/Vendor/EmbedIO-3.5.2/WebApi/JsonDataAttribute.cs new file mode 100644 index 0000000..9d31c44 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/WebApi/JsonDataAttribute.cs @@ -0,0 +1,40 @@ +using System; +using System.Threading.Tasks; + +namespace EmbedIO.WebApi +{ + /// + /// Specifies that a parameter of a controller method will receive + /// an object obtained by deserializing the request body as JSON. + /// The received object will be + /// only if the deserialized object is null. + /// If the request body is not valid JSON, + /// or if it cannot be deserialized to the type of the parameter, + /// a 400 Bad Request response will be sent to the client. + /// This class cannot be inherited. + /// + /// + /// + [AttributeUsage(AttributeTargets.Parameter)] + public class JsonDataAttribute : Attribute, IRequestDataAttribute + { + /// + public async Task GetRequestDataAsync(WebApiController controller, Type type, string parameterName) + { + string body; + using (var reader = controller.HttpContext.OpenRequestText()) + { + body = await reader.ReadToEndAsync().ConfigureAwait(false); + } + + try + { + return Swan.Formatters.Json.Deserialize(body, type); + } + catch (FormatException) + { + throw HttpException.BadRequest($"Expected request body to be deserializable to {type.FullName}."); + } + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/WebApi/QueryDataAttribute.cs b/Vendor/EmbedIO-3.5.2/WebApi/QueryDataAttribute.cs new file mode 100644 index 0000000..4990be9 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/WebApi/QueryDataAttribute.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Specialized; +using System.Threading.Tasks; + +namespace EmbedIO.WebApi +{ + /// + /// Specifies that a parameter of a controller method will receive a + /// of HTML form data, obtained by deserializing a request URL query. + /// The received collection will be read-only. + /// This class cannot be inherited. + /// + /// + /// + [AttributeUsage(AttributeTargets.Parameter)] + public sealed class QueryDataAttribute : Attribute, IRequestDataAttribute + { + /// + public Task GetRequestDataAsync(WebApiController controller, string parameterName) + => Task.FromResult(controller.HttpContext.GetRequestQueryData()); + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/WebApi/QueryFieldAttribute.cs b/Vendor/EmbedIO-3.5.2/WebApi/QueryFieldAttribute.cs new file mode 100644 index 0000000..efbd1cf --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/WebApi/QueryFieldAttribute.cs @@ -0,0 +1,169 @@ +using System; +using System.Linq; +using System.Threading.Tasks; +using EmbedIO.Utilities; +using Swan; + +namespace EmbedIO.WebApi +{ + /// + /// Specifies that a parameter of a controller method will receive the value of a field, + /// obtained by deserializing a request URL query. + /// The parameter carrying this attribute can be either a simple type or a one-dimension array. + /// If multiple values are present for the field, a non-array parameter will receive the last specified value, + /// while an array parameter will receive an array of field values converted to the element type of the + /// parameter. + /// If a single value is present for the field, a non-array parameter will receive the value converted + /// to the type of the parameter, while an array parameter will receive an array of length 1, containing + /// the value converted to the element type of the parameter + /// If no values are present for the field and the property is + /// , a 400 Bad Request response will be sent to the client, with a message + /// specifying the name of the missing field. + /// If no values are present for the field and the property is + /// , a non-array parameter will receive the default value for its type, while + /// an array parameter will receive an array of length 0. + /// This class cannot be inherited. + /// + /// + /// + /// + [AttributeUsage(AttributeTargets.Parameter)] + public sealed class QueryFieldAttribute : + Attribute, + IRequestDataAttribute, + IRequestDataAttribute, + IRequestDataAttribute + { + /// + /// Initializes a new instance of the class. + /// The name of the query field to extract will be equal to the name of the parameter + /// carrying this attribute. + /// + public QueryFieldAttribute() + : this(false, null) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// The name of the query field to extract. + /// is . + /// is the empty string (""). + public QueryFieldAttribute(string fieldName) + : this(false, Validate.NotNullOrEmpty(nameof(fieldName), fieldName)) + { + } + + /// + /// Initializes a new instance of the class. + /// The name of the query field to extract will be equal to the name of the parameter + /// carrying this attribute. + /// + /// If set to , a 400 Bad Request + /// response will be sent to the client if no values are found for the field; if set to + /// , a default value will be assumed. + public QueryFieldAttribute(bool badRequestIfMissing) + : this(badRequestIfMissing, null) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// The name of the query field to extract. + /// is . + /// is the empty string (""). + /// If set to , a 400 Bad Request + /// response will be sent to the client if no values are found for the field; if set to + /// , a default value will be assumed. + public QueryFieldAttribute(string fieldName, bool badRequestIfMissing) + : this(badRequestIfMissing, Validate.NotNullOrEmpty(nameof(fieldName), fieldName)) + { + } + + private QueryFieldAttribute(bool badRequestIfMissing, string? fieldName) + { + BadRequestIfMissing = badRequestIfMissing; + FieldName = fieldName; + } + + /// + /// Gets the name of the query field that this attribute will extract, + /// or if the name of the parameter carrying this + /// attribute is to be used as field name. + /// + public string? FieldName { get; } + + /// + /// Gets or sets a value indicating whether to send a 400 Bad Request response + /// to the client if the URL query contains no values for the field. + /// If this property is and the URL query + /// contains no values for the field, the 400 Bad Request response sent + /// to the client will contain a reference to the missing field. + /// If this property is and the URL query + /// contains no values for the field, the default value for the parameter + /// (or a zero-length array if the parameter is of an array type) + /// will be passed to the controller method. + /// + public bool BadRequestIfMissing { get; } + + Task IRequestDataAttribute.GetRequestDataAsync( + WebApiController controller, + string parameterName) + { + var data = controller.HttpContext.GetRequestQueryData(); + + var fieldName = FieldName ?? parameterName; + if (!data.ContainsKey(fieldName) && BadRequestIfMissing) + throw HttpException.BadRequest($"Missing query field {fieldName}."); + + return Task.FromResult(data.GetValues(fieldName)?.LastOrDefault()); + } + + Task IRequestDataAttribute.GetRequestDataAsync( + WebApiController controller, + string parameterName) + { + var data = controller.HttpContext.GetRequestQueryData(); + + var fieldName = FieldName ?? parameterName; + if (!data.ContainsKey(fieldName) && BadRequestIfMissing) + throw HttpException.BadRequest($"Missing query field {fieldName}."); + + return Task.FromResult(data.GetValues(fieldName) ?? Array.Empty()); + } + + Task IRequestDataAttribute.GetRequestDataAsync( + WebApiController controller, + Type type, + string parameterName) + { + var data = controller.HttpContext.GetRequestQueryData(); + + var fieldName = FieldName ?? parameterName; + if (!data.ContainsKey(fieldName) && BadRequestIfMissing) + throw HttpException.BadRequest($"Missing query field {fieldName}."); + + if (type.IsArray) + { + var fieldValues = data.GetValues(fieldName) ?? Array.Empty(); + if (!FromString.TryConvertTo(type, fieldValues, out var result)) + throw HttpException.BadRequest($"Cannot convert field {fieldName} to an array of {type.GetElementType().Name}."); + + return Task.FromResult(result); + } + else + { + var fieldValue = data.GetValues(fieldName)?.LastOrDefault(); + if (fieldValue == null) + return Task.FromResult(type.IsValueType ? Activator.CreateInstance(type) : null); + + if (!FromString.TryConvertTo(type, fieldValue, out var result)) + throw HttpException.BadRequest($"Cannot convert field {fieldName} to {type.Name}."); + + return Task.FromResult(result); + } + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/WebApi/WebApiController.cs b/Vendor/EmbedIO-3.5.2/WebApi/WebApiController.cs new file mode 100644 index 0000000..41a1331 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/WebApi/WebApiController.cs @@ -0,0 +1,73 @@ +using System.Security.Principal; +using System.Threading; +using EmbedIO.Routing; +using EmbedIO.Sessions; + +namespace EmbedIO.WebApi +{ + /// + /// Inherit from this class and define your own Web API methods + /// You must RegisterController in the Web API Module to make it active. + /// + public abstract class WebApiController + { +// The HttpContext and Route properties are always initialized to non-null values, +// but it's done after creation by a runtime-compiled lambda, +// which the compiler cannot know about, hence the warnings. +#pragma warning disable CS8618 // Non-nullable property is uninitialized. Consider declaring the property as nullable. + + /// + /// Gets the HTTP context. + /// This property is automatically initialized upon controller creation. + /// + public IHttpContext HttpContext { get; internal set; } + + /// + /// Gets the resolved route. + /// This property is automatically initialized upon controller creation. + /// + public RouteMatch Route { get; internal set; } + +#pragma warning restore CS8618 + + /// + /// Gets the used to cancel processing of the request. + /// + public CancellationToken CancellationToken => HttpContext.CancellationToken; + + /// + /// Gets the HTTP request. + /// + public IHttpRequest Request => HttpContext.Request; + + /// + /// Gets the HTTP response object. + /// + public IHttpResponse Response => HttpContext.Response; + + /// + /// Gets the user. + /// + public IPrincipal? User => HttpContext.User; + + /// + /// Gets the session proxy associated with the HTTP context. + /// + public ISessionProxy Session => HttpContext.Session; + + /// + /// This method is meant to be called internally by EmbedIO. + /// Derived classes can override the method + /// to perform common operations before any handler gets called. + /// + /// + public void PreProcessRequest() => OnBeforeHandler(); + + /// + /// Called before a handler to perform common operations. + /// The default behavior is to set response headers + /// in order to prevent caching of the response. + /// + protected virtual void OnBeforeHandler() => HttpContext.Response.DisableCaching(); + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/WebApi/WebApiModule.cs b/Vendor/EmbedIO-3.5.2/WebApi/WebApiModule.cs new file mode 100644 index 0000000..23d5c7d --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/WebApi/WebApiModule.cs @@ -0,0 +1,94 @@ +using System; +using System.Threading.Tasks; +using EmbedIO.Utilities; + +namespace EmbedIO.WebApi +{ + /// + /// A module using class methods as handlers. + /// Public instance methods that match the WebServerModule.ResponseHandler signature, and have the WebApi handler attribute + /// will be used to respond to web server requests. + /// + public class WebApiModule : WebApiModuleBase + { + /// + /// Initializes a new instance of the class, + /// using the default response serializer. + /// + /// The base URL path served by this module. + /// + /// + public WebApiModule(string baseRoute) + : base(baseRoute) + { + } + + /// + /// Initializes a new instance of the class, + /// using the specified response serializer. + /// + /// The base URL path served by this module. + /// A used to serialize + /// the result of controller methods returning + /// or Task<object>. + /// is . + /// + /// + public WebApiModule(string baseRoute, ResponseSerializerCallback serializer) + : base(baseRoute, serializer) + { + } + + /// + /// Registers a controller type using a constructor. + /// See + /// for further information. + /// + /// The type of the controller. + /// + /// + /// + public void RegisterController() + where TController : WebApiController, new() + => RegisterControllerType(typeof(TController)); + + /// + /// Registers a controller type using a factory method. + /// See + /// for further information. + /// + /// The type of the controller. + /// The factory method used to construct instances of . + /// + /// + /// + public void RegisterController(Func factory) + where TController : WebApiController + => RegisterControllerType(typeof(TController), factory); + + /// + /// Registers a controller type using a constructor. + /// See + /// for further information. + /// + /// The type of the controller. + /// + /// + /// + public void RegisterController(Type controllerType) + => RegisterControllerType(controllerType); + + /// + /// Registers a controller type using a factory method. + /// See + /// for further information. + /// + /// The type of the controller. + /// The factory method used to construct instances of . + /// + /// + /// + public void RegisterController(Type controllerType, Func factory) + => RegisterControllerType(controllerType, factory); + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/WebApi/WebApiModuleBase.cs b/Vendor/EmbedIO-3.5.2/WebApi/WebApiModuleBase.cs new file mode 100644 index 0000000..118dee7 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/WebApi/WebApiModuleBase.cs @@ -0,0 +1,600 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Reflection; +using System.Threading.Tasks; +using EmbedIO.Routing; +using EmbedIO.Utilities; +using Swan; + +namespace EmbedIO.WebApi +{ + /// + /// A module using objects derived from + /// as collections of handler methods. + /// + public abstract class WebApiModuleBase : RoutingModuleBase + { + private const string GetRequestDataAsyncMethodName = nameof(IRequestDataAttribute.GetRequestDataAsync); + + private static readonly MethodInfo PreProcessRequestMethod = typeof(WebApiController).GetMethod(nameof(WebApiController.PreProcessRequest)); + private static readonly MethodInfo HttpContextSetter = typeof(WebApiController).GetProperty(nameof(WebApiController.HttpContext)).GetSetMethod(true); + private static readonly MethodInfo RouteSetter = typeof(WebApiController).GetProperty(nameof(WebApiController.Route)).GetSetMethod(true); + private static readonly MethodInfo AwaitResultMethod = typeof(WebApiModuleBase).GetMethod(nameof(AwaitResult), BindingFlags.Static | BindingFlags.NonPublic); + private static readonly MethodInfo AwaitAndCastResultMethod = typeof(WebApiModuleBase).GetMethod(nameof(AwaitAndCastResult), BindingFlags.Static | BindingFlags.NonPublic); + private static readonly MethodInfo DisposeMethod = typeof(IDisposable).GetMethod(nameof(IDisposable.Dispose)); + private static readonly MethodInfo SerializeResultAsyncMethod = typeof(WebApiModuleBase).GetMethod(nameof(SerializeResultAsync), BindingFlags.Instance | BindingFlags.NonPublic); + + private readonly HashSet _controllerTypes = new HashSet(); + + /// + /// Initializes a new instance of the class, + /// using the default response serializer. + /// + /// The base route served by this module. + /// + /// + protected WebApiModuleBase(string baseRoute) + : this(baseRoute, ResponseSerializer.Default) + { + } + + /// + /// Initializes a new instance of the class, + /// using the specified response serializer. + /// + /// The base route served by this module. + /// A used to serialize + /// the result of controller methods returning + /// or Task<object>. + /// is . + /// + /// + protected WebApiModuleBase(string baseRoute, ResponseSerializerCallback serializer) + : base(baseRoute) + { + Serializer = Validate.NotNull(nameof(serializer), serializer); + } + + /// + /// A used to serialize + /// the result of controller methods returning values. + /// + public ResponseSerializerCallback Serializer { get; } + + /// + /// Gets the number of controller types registered in this module. + /// + public int ControllerCount => _controllerTypes.Count; + + /// + /// Registers a controller type using a constructor. + /// In order for registration to be successful, the specified controller type: + /// + /// must be a subclass of ; + /// must not be an abstract class; + /// must not be a generic type definition; + /// must have a public parameterless constructor. + /// + /// + /// The type of the controller. + /// The module's configuration is locked. + /// + /// is already registered in this module. + /// does not satisfy the prerequisites + /// listed in the Summary section. + /// + /// + /// A new instance of will be created + /// for each request to handle, and dereferenced immediately afterwards, + /// to be collected during next garbage collection cycle. + /// is not required to be thread-safe, + /// as it will be constructed and used in the same synchronization context. + /// However, since request handling is asynchronous, the actual execution thread + /// may vary during execution. Care must be exercised when using thread-sensitive + /// resources or thread-static data. + /// If implements , + /// its Dispose method will be called when it has + /// finished handling a request. + /// + /// + /// + protected void RegisterControllerType() + where TController : WebApiController, new() + => RegisterControllerType(typeof(TController)); + + /// + /// Registers a controller type using a factory method. + /// In order for registration to be successful: + /// + /// must be a subclass of ; + /// must not be a generic type definition; + /// 's return type must be either + /// or a subclass of . + /// + /// + /// The type of the controller. + /// The factory method used to construct instances of . + /// The module's configuration is locked. + /// is . + /// + /// is already registered in this module. + /// - or - + /// does not satisfy the prerequisites listed in the Summary section. + /// + /// + /// will be called once for each request to handle + /// in order to obtain an instance of . + /// The returned instance will be dereferenced immediately after handling the request. + /// is not required to be thread-safe, + /// as it will be constructed and used in the same synchronization context. + /// However, since request handling is asynchronous, the actual execution thread + /// may vary during execution. Care must be exercised when using thread-sensitive + /// resources or thread-static data. + /// If implements , + /// its Dispose method will be called when it has + /// finished handling a request. In this case it is recommended that + /// return a newly-constructed instance of + /// at each invocation. + /// If does not implement , + /// may employ techniques such as instance pooling to avoid + /// the overhead of constructing a new instance of + /// at each invocation. If so, resources such as file handles, database connections, etc. + /// should be freed before returning from each handler method to avoid + /// starvation. + /// + /// + /// + protected void RegisterControllerType(Func factory) + where TController : WebApiController + => RegisterControllerType(typeof(TController), factory); + + /// + /// Registers a controller type using a constructor. + /// In order for registration to be successful, the specified : + /// + /// must be a subclass of ; + /// must not be an abstract class; + /// must not be a generic type definition; + /// must have a public parameterless constructor. + /// + /// + /// The type of the controller. + /// The module's configuration is locked. + /// is . + /// + /// is already registered in this module. + /// - or - + /// does not satisfy the prerequisites + /// listed in the Summary section. + /// + /// + /// A new instance of will be created + /// for each request to handle, and dereferenced immediately afterwards, + /// to be collected during next garbage collection cycle. + /// is not required to be thread-safe, + /// as it will be constructed and used in the same synchronization context. + /// However, since request handling is asynchronous, the actual execution thread + /// may vary during execution. Care must be exercised when using thread-sensitive + /// resources or thread-static data. + /// If implements , + /// its Dispose method will be called when it has + /// finished handling a request. + /// + /// + /// + protected void RegisterControllerType(Type controllerType) + { + EnsureConfigurationNotLocked(); + + controllerType = ValidateControllerType(nameof(controllerType), controllerType, false); + + var constructor = controllerType.GetConstructors().FirstOrDefault(c => c.GetParameters().Length == 0); + if (constructor == null) + { + throw new ArgumentException( + "Controller type must have a public parameterless constructor.", + nameof(controllerType)); + } + + if (!TryRegisterControllerTypeCore(controllerType, Expression.New(constructor))) + throw new ArgumentException($"Type {controllerType.Name} contains no controller methods."); + } + + /// + /// Registers a controller type using a factory method. + /// In order for registration to be successful: + /// + /// must be a subclass of ; + /// must not be a generic type definition; + /// 's return type must be either + /// or a subclass of . + /// + /// + /// The type of the controller. + /// The factory method used to construct instances of . + /// The module's configuration is locked. + /// + /// is . + /// - or - + /// is . + /// + /// + /// is already registered in this module. + /// - or - + /// One or more parameters do not satisfy the prerequisites listed in the Summary section. + /// + /// + /// will be called once for each request to handle + /// in order to obtain an instance of . + /// The returned instance will be dereferenced immediately after handling the request. + /// is not required to be thread-safe, + /// as it will be constructed and used in the same synchronization context. + /// However, since request handling is asynchronous, the actual execution thread + /// may vary during execution. Care must be exercised when using thread-sensitive + /// resources or thread-static data. + /// If implements , + /// its Dispose method will be called when it has + /// finished handling a request. In this case it is recommended that + /// return a newly-constructed instance of + /// at each invocation. + /// If does not implement , + /// may employ techniques such as instance pooling to avoid + /// the overhead of constructing a new instance of + /// at each invocation. If so, resources such as file handles, database connections, etc. + /// should be freed before returning from each handler method to avoid + /// starvation. + /// + /// + /// + protected void RegisterControllerType(Type controllerType, Func factory) + { + EnsureConfigurationNotLocked(); + + controllerType = ValidateControllerType(nameof(controllerType), controllerType, true); + factory = Validate.NotNull(nameof(factory), factory); + if (!controllerType.IsAssignableFrom(factory.Method.ReturnType)) + throw new ArgumentException("Factory method has an incorrect return type.", nameof(factory)); + + var expression = Expression.Call( + factory.Target == null ? null : Expression.Constant(factory.Target), + factory.Method); + + if (!TryRegisterControllerTypeCore(controllerType, expression)) + throw new ArgumentException($"Type {controllerType.Name} contains no controller methods."); + } + + private static int IndexOfRouteParameter(RouteMatcher matcher, string name) + { + var names = matcher.ParameterNames; + for (var i = 0; i < names.Count; i++) + { + if (names[i] == name) + return i; + } + + return -1; + } + + private static T AwaitResult(Task task) => task.ConfigureAwait(false).GetAwaiter().GetResult(); + + private static T AwaitAndCastResult(string parameterName, Task task) + { + var result = task.ConfigureAwait(false).GetAwaiter().GetResult(); + + return result switch { + null when typeof(T).IsValueType && Nullable.GetUnderlyingType(typeof(T)) == null => throw new InvalidCastException($"Cannot cast null to {typeof(T).FullName} for parameter \"{parameterName}\"."), + null => default, + T castResult => castResult, + _ => throw new InvalidCastException($"Cannot cast {result.GetType().FullName} to {typeof(T).FullName} for parameter \"{parameterName}\".") + }; + } + + private static bool IsGenericTaskType(Type type, out Type? resultType) + { + resultType = null; + + if (!type.IsConstructedGenericType) + return false; + + if (type.GetGenericTypeDefinition() != typeof(Task<>)) + return false; + + resultType = type.GetGenericArguments()[0]; + return true; + } + + // Compile a handler. + // + // Parameters: + // - factoryExpression is an Expression that builds a controller; + // - method is a MethodInfo for a public instance method of the controller; + // - route is the route to which the controller method is associated. + // + // This method builds a lambda, with the same signature as a RouteHandlerCallback, that: + // - uses factoryExpression to build a controller; + // - calls the controller method, passing converted route parameters for method parameters with matching names + // and default values for other parameters; + // - serializes the returned object (or the result of the returned task), + // unless the return type of the controller method is void or Task; + // - if the controller implements IDisposable, disposes it. + private RouteHandlerCallback CompileHandler(Expression factoryExpression, MethodInfo method, RouteMatcher matcher) + { + // Lambda parameters + var contextInLambda = Expression.Parameter(typeof(IHttpContext), "context"); + var routeInLambda = Expression.Parameter(typeof(RouteMatch), "route"); + + // Local variables + var locals = new List(); + + // Local variable for controller + var controllerType = method.ReflectedType; + var controller = Expression.Variable(controllerType, "controller"); + locals.Add(controller); + + // Label for return statement + var returnTarget = Expression.Label(typeof(Task)); + + // Contents of lambda body + var bodyContents = new List(); + + // Build lambda arguments + var parameters = method.GetParameters(); + var parameterCount = parameters.Length; + var handlerArguments = new List(); + for (var i = 0; i < parameterCount; i++) + { + var parameter = parameters[i]; + var parameterType = parameter.ParameterType; + var failedToUseRequestDataAttributes = false; + + // First, check for generic request data interfaces in attributes + var requestDataInterfaces = parameter.GetCustomAttributes() + .Aggregate(new List<(Attribute Attr, Type Intf)>(), (list, attr) => { + list.AddRange(attr.GetType().GetInterfaces() + .Where(x => x.IsConstructedGenericType + && x.GetGenericTypeDefinition() == typeof(IRequestDataAttribute<,>)) + .Select(x => (attr, x))); + + return list; + }); + + // If there are any... + if (requestDataInterfaces.Count > 0) + { + // Take the first that applies to both controller and parameter type + var (attr, intf) = requestDataInterfaces.FirstOrDefault( + x => x.Intf.GenericTypeArguments[0].IsAssignableFrom(controllerType) + && parameterType.IsAssignableFrom(x.Intf.GenericTypeArguments[1])); + + if (attr != null) + { + // Use the request data interface to get a value for the parameter. + Expression useRequestDataInterface = Expression.Call( + Expression.Constant(attr), + intf.GetMethod(GetRequestDataAsyncMethodName), + controller, + Expression.Constant(parameter.Name)); + + // We should await the call to GetRequestDataAsync. + // For lack of a better way, call AwaitResult with an appropriate type argument. + useRequestDataInterface = Expression.Call( + AwaitResultMethod.MakeGenericMethod(intf.GenericTypeArguments[1]), + useRequestDataInterface); + + handlerArguments.Add(useRequestDataInterface); + continue; + } + + // If there is no interface to use, the user expects data to be injected + // but provided no way of injecting the right data type. + failedToUseRequestDataAttributes = true; + } + + // Check for non-generic request data interfaces in attributes + requestDataInterfaces = parameter.GetCustomAttributes() + .Aggregate(new List<(Attribute Attr, Type Intf)>(), (list, attr) => { + list.AddRange(attr.GetType().GetInterfaces() + .Where(x => x.IsConstructedGenericType + && x.GetGenericTypeDefinition() == typeof(IRequestDataAttribute<>)) + .Select(x => (attr, x))); + + return list; + }); + + // If there are any... + if (requestDataInterfaces.Count > 0) + { + // Take the first that applies to the controller + var (attr, intf) = requestDataInterfaces.FirstOrDefault( + x => x.Intf.GenericTypeArguments[0].IsAssignableFrom(controllerType)); + + if (attr != null) + { + // Use the request data interface to get a value for the parameter. + Expression useRequestDataInterface = Expression.Call( + Expression.Constant(attr), + intf.GetMethod(GetRequestDataAsyncMethodName), + controller, + Expression.Constant(parameterType), + Expression.Constant(parameter.Name)); + + // We should await the call to GetRequestDataAsync, + // then cast the result to the parameter type. + // For lack of a better way to do the former, + // and to save one function call, + // just call AwaitAndCastResult with an appropriate type argument. + useRequestDataInterface = Expression.Call( + AwaitAndCastResultMethod.MakeGenericMethod(parameterType), + Expression.Constant(parameter.Name), + useRequestDataInterface); + + handlerArguments.Add(useRequestDataInterface); + continue; + } + + // If there is no interface to use, the user expects data to be injected + // but provided no way of injecting the right data type. + failedToUseRequestDataAttributes = true; + } + + // There are request data attributes, but none is suitable + // for the type of the parameter. + if (failedToUseRequestDataAttributes) + throw new InvalidOperationException($"No request data attribute for parameter {parameter.Name} of method {controllerType.Name}.{method.Name} can provide the expected data type."); + + // Check whether the name of the handler parameter matches the name of a route parameter. + var index = IndexOfRouteParameter(matcher, parameter.Name); + if (index >= 0) + { + // Convert the parameter to the handler's parameter type. + var convertFromRoute = FromString.ConvertExpressionTo( + parameterType, + Expression.Property(routeInLambda, "Item", Expression.Constant(index))); + + handlerArguments.Add(convertFromRoute ?? throw SelfCheck.Failure($"{nameof(convertFromRoute)} is null.")); + continue; + } + + // No route parameter has the same name as a handler parameter. + // Pass the default for the parameter type. + handlerArguments.Add(parameter.HasDefaultValue + ? (Expression)Expression.Constant(parameter.DefaultValue) + : Expression.Default(parameterType)); + } + + // Create the controller and initialize its properties + bodyContents.Add(Expression.Assign(controller,factoryExpression)); + bodyContents.Add(Expression.Call(controller, HttpContextSetter, contextInLambda)); + bodyContents.Add(Expression.Call(controller, RouteSetter, routeInLambda)); + + // Build the handler method call + Expression callMethod = Expression.Call(controller, method, handlerArguments); + var methodReturnType = method.ReturnType; + if (methodReturnType == typeof(Task)) + { + // Nothing to do + } + else if (methodReturnType == typeof(void)) + { + // Convert void to Task by evaluating Task.CompletedTask + callMethod = Expression.Block(typeof(Task), callMethod, Expression.Constant(Task.CompletedTask)); + } + else if (IsGenericTaskType(methodReturnType, out var resultType)) + { + // Return a Task that serializes the result of a Task + callMethod = Expression.Call( + Expression.Constant(this), + SerializeResultAsyncMethod.MakeGenericMethod(resultType), + contextInLambda, + callMethod); + } + else + { + // Return a Task that serializes a result obtained synchronously + callMethod = Expression.Call( + Serializer.Target == null ? null : Expression.Constant(Serializer.Target), + Serializer.Method, + contextInLambda, + Expression.Convert(callMethod, typeof(object))); + } + + // Operations to perform on the controller. + // Pseudocode: + // controller.PreProcessRequest(); + // return controller.method(handlerArguments); + Expression workWithController = Expression.Block( + Expression.Call(controller, PreProcessRequestMethod), + Expression.Return(returnTarget, callMethod)); + + // If the controller type implements IDisposable, + // wrap operations in a simulated using block. + if (typeof(IDisposable).IsAssignableFrom(controllerType)) + { + // Pseudocode: + // try + // { + // body(); + // } + // finally + // { + // (controller as IDisposable).Dispose(); + // } + workWithController = Expression.TryFinally( + workWithController, + Expression.Call(Expression.TypeAs(controller, typeof(IDisposable)), DisposeMethod)); + } + + bodyContents.Add(workWithController); + + // At the end of the lambda body is the target of return statements. + bodyContents.Add(Expression.Label(returnTarget, Expression.Constant(Task.FromResult(false)))); + + // Build and compile the lambda. + return Expression.Lambda( + Expression.Block(locals, bodyContents), + contextInLambda, + routeInLambda) + .Compile(); + } + + private async Task SerializeResultAsync(IHttpContext context, Task task) + { + await Serializer( + context, + await task.ConfigureAwait(false)).ConfigureAwait(false); + } + + private Type ValidateControllerType(string argumentName, Type value, bool canBeAbstract) + { + value = Validate.NotNull(argumentName, value); + if (canBeAbstract) + { + if (value.IsGenericTypeDefinition + || !value.IsSubclassOf(typeof(WebApiController))) + throw new ArgumentException($"Controller type must be a subclass of {nameof(WebApiController)}.", argumentName); + } + else + { + if (value.IsAbstract + || value.IsGenericTypeDefinition + || !value.IsSubclassOf(typeof(WebApiController))) + throw new ArgumentException($"Controller type must be a non-abstract subclass of {nameof(WebApiController)}.", argumentName); + } + + if (_controllerTypes.Contains(value)) + throw new ArgumentException("Controller type is already registered in this module.", argumentName); + + return value; + } + + private bool TryRegisterControllerTypeCore(Type controllerType, Expression factoryExpression) + { + var handlerCount = 0; + var methods = controllerType.GetMethods(BindingFlags.Instance | BindingFlags.Public) + .Where(m => !m.ContainsGenericParameters); + + foreach (var method in methods) + { + var attributes = method.GetCustomAttributes() + .OfType() + .ToArray(); + if (attributes.Length < 1) + continue; + + foreach (var attribute in attributes) + { + AddHandler(attribute.Verb, attribute.Matcher, CompileHandler(factoryExpression, method, attribute.Matcher)); + handlerCount++; + } + } + + if (handlerCount < 1) + return false; + + _controllerTypes.Add(controllerType); + return true; + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/WebApi/WebApiModuleExtensions.cs b/Vendor/EmbedIO-3.5.2/WebApi/WebApiModuleExtensions.cs new file mode 100644 index 0000000..c63b3b8 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/WebApi/WebApiModuleExtensions.cs @@ -0,0 +1,82 @@ +using System; + +namespace EmbedIO.WebApi +{ + /// + /// Provides extension methods for . + /// + public static class WebApiModuleExtensions + { + /// + /// Registers a controller type using a constructor. + /// See + /// for further information. + /// + /// The type of the controller. + /// The on which this method is called. + /// with the controller type registered. + /// + /// + /// + public static WebApiModule WithController(this WebApiModule @this) + where TController : WebApiController, new() + { + @this.RegisterController(); + return @this; + } + + /// + /// Registers a controller type using a factory method. + /// See + /// for further information. + /// + /// The type of the controller. + /// The on which this method is called. + /// The factory method used to construct instances of . + /// with the controller type registered. + /// + /// + /// + public static WebApiModule WithController(this WebApiModule @this, Func factory) + where TController : WebApiController + { + @this.RegisterController(factory); + return @this; + } + + /// + /// Registers a controller type using a constructor. + /// See + /// for further information. + /// + /// The on which this method is called. + /// The type of the controller. + /// with the controller type registered. + /// + /// + /// + public static WebApiModule WithController(this WebApiModule @this, Type controllerType) + { + @this.RegisterController(controllerType); + return @this; + } + + /// + /// Registers a controller type using a factory method. + /// See + /// for further information. + /// + /// The on which this method is called. + /// The type of the controller. + /// The factory method used to construct instances of . + /// with the controller type registered. + /// + /// + /// + public static WebApiModule WithController(this WebApiModule @this, Type controllerType, Func factory) + { + @this.RegisterController(controllerType, factory); + return @this; + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/WebModuleBase.cs b/Vendor/EmbedIO-3.5.2/WebModuleBase.cs new file mode 100644 index 0000000..ccfefbd --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/WebModuleBase.cs @@ -0,0 +1,153 @@ +using System; +using System.Net; +using System.Threading; +using System.Threading.Tasks; +using EmbedIO.Internal; +using EmbedIO.Routing; +using EmbedIO.Utilities; +using Swan.Configuration; + +namespace EmbedIO +{ + /// + /// Base class to define web modules. + /// Although it is not required that a module inherits from this class, + /// it provides some useful features: + /// + /// validation and immutability of the property, + /// which are of paramount importance for the correct functioning of a web server; + /// support for configuration locking upon web server startup + /// (see the property + /// and the method); + /// a basic implementation of the method + /// for modules that do not need to do anything upon web server startup; + /// implementation of the callback property. + /// + /// + public abstract class WebModuleBase : ConfiguredObject, IWebModule + { + private readonly RouteMatcher _routeMatcher; + + private ExceptionHandlerCallback? _onUnhandledException; + private HttpExceptionHandlerCallback? _onHttpException; + + /// + /// Initializes a new instance of the class. + /// + /// The base route served by this module. + /// is . + /// is not a valid base route. + /// + /// + protected WebModuleBase(string baseRoute) + { + BaseRoute = Validate.Route(nameof(baseRoute), baseRoute, true); + _routeMatcher = RouteMatcher.Parse(baseRoute, true); + LogSource = GetType().Name; + } + + /// + public string BaseRoute { get; } + + /// + /// The module's configuration is locked. + public ExceptionHandlerCallback? OnUnhandledException + { + get => _onUnhandledException; + set + { + EnsureConfigurationNotLocked(); + _onUnhandledException = value; + } + } + + /// + /// The module's configuration is locked. + public HttpExceptionHandlerCallback? OnHttpException + { + get => _onHttpException; + set + { + EnsureConfigurationNotLocked(); + _onHttpException = value; + } + } + + /// + public abstract bool IsFinalHandler { get; } + + /// + /// Gets a string to use as a source for log messages. + /// + protected string LogSource { get; } + + /// + /// + /// The module's configuration is locked before returning from this method. + /// + public void Start(CancellationToken cancellationToken) + { + OnStart(cancellationToken); + LockConfiguration(); + } + + /// + public RouteMatch? MatchUrlPath(string urlPath) => _routeMatcher.Match(urlPath); + + /// + public async Task HandleRequestAsync(IHttpContext context) + { + var contextImpl = context.GetImplementation(); + var mimeTypeProvider = this as IMimeTypeProvider; + if (mimeTypeProvider != null) + contextImpl?.MimeTypeProviders.Push(mimeTypeProvider); + + try + { + await OnRequestAsync(context).ConfigureAwait(false); + if (IsFinalHandler) + context.SetHandled(); + } + catch (RequestHandlerPassThroughException) + { } + catch (OperationCanceledException) when (context.CancellationToken.IsCancellationRequested) + { + throw; // Let the web server handle it + } + catch (HttpListenerException) + { + throw; // Let the web server handle it + } + catch (Exception exception) when (exception is IHttpException) + { + await HttpExceptionHandler.Handle(LogSource, context, exception, _onHttpException) + .ConfigureAwait(false); + } + catch (Exception exception) + { + await ExceptionHandler.Handle(LogSource, context, exception, _onUnhandledException, _onHttpException) + .ConfigureAwait(false); + } + finally + { + if (mimeTypeProvider != null) + contextImpl?.MimeTypeProviders.Pop(); + } + } + + /// + /// Called to handle a request from a client. + /// + /// The context of the request being handled. + /// A representing the ongoing operation. + protected abstract Task OnRequestAsync(IHttpContext context); + + /// + /// Called when a module is started, immediately before locking the module's configuration. + /// + /// A used to stop the web server. + protected virtual void OnStart(CancellationToken cancellationToken) + { + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/WebModuleContainer.cs b/Vendor/EmbedIO-3.5.2/WebModuleContainer.cs new file mode 100644 index 0000000..16bdabc --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/WebModuleContainer.cs @@ -0,0 +1,18 @@ +using EmbedIO.Internal; + +namespace EmbedIO +{ + /// + /// Provides useful constants for dealing with module containers. + /// + public static class WebModuleContainer + { + /// + /// Gets an interface that does not and cannot contain + /// any module. + /// This field is useful to initialize non-nullable fields or properties + /// of type . + /// + public static readonly IWebModuleContainer None = DummyWebModuleContainer.Instance; + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/WebModuleContainerExtensions-Actions.cs b/Vendor/EmbedIO-3.5.2/WebModuleContainerExtensions-Actions.cs new file mode 100644 index 0000000..e1295dd --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/WebModuleContainerExtensions-Actions.cs @@ -0,0 +1,311 @@ +using System; +using EmbedIO.Actions; +using EmbedIO.Utilities; +using Swan; + +namespace EmbedIO +{ + partial class WebModuleContainerExtensions + { + /// + /// Creates an instance of and adds it to a module container. + /// + /// The type of the module container. + /// The on which this method is called. + /// The base route of the module. + /// The HTTP verb that will be served by . + /// The callback used to handle requests. + /// with a added. + /// is . + /// + /// + /// + public static TContainer WithAction(this TContainer @this, string baseRoute, HttpVerbs verb, RequestHandlerCallback handler) + where TContainer : class, IWebModuleContainer + { + @this.Modules.Add(new ActionModule(baseRoute, verb, handler)); + return @this; + } + + /// + /// Creates an instance of with a base URL path of "/" + /// and adds it to a module container. + /// + /// The type of the module container. + /// The on which this method is called. + /// The HTTP verb that will be served by . + /// The callback used to handle requests. + /// with a added. + /// is . + /// + /// + /// + public static TContainer WithAction(this TContainer @this, HttpVerbs verb, RequestHandlerCallback handler) + where TContainer : class, IWebModuleContainer + => WithAction(@this, UrlPath.Root, verb, handler); + + /// + /// Creates an instance of that intercepts all requests + /// under the specified and adds it to a module container. + /// + /// The type of the module container. + /// The on which this method is called. + /// The base route of the module. + /// The callback used to handle requests. + /// with a added. + /// is . + /// + /// + /// + public static TContainer OnAny(this TContainer @this, string baseRoute, RequestHandlerCallback handler) + where TContainer : class, IWebModuleContainer + => WithAction(@this, baseRoute, HttpVerbs.Any, handler); + + /// + /// Creates an instance of that intercepts all requests + /// and adds it to a module container. + /// + /// The type of the module container. + /// The on which this method is called. + /// The callback used to handle requests. + /// with a added. + /// is . + /// + /// + /// + public static TContainer OnAny(this TContainer @this, RequestHandlerCallback handler) + where TContainer : class, IWebModuleContainer + => WithAction(@this, UrlPath.Root, HttpVerbs.Any, handler); + + /// + /// Creates an instance of that intercepts all DELETErequests + /// under the specified and adds it to a module container. + /// + /// The type of the module container. + /// The on which this method is called. + /// The base route of the module. + /// The callback used to handle requests. + /// with a added. + /// is . + /// + /// + /// + public static TContainer OnDelete(this TContainer @this, string baseRoute, RequestHandlerCallback handler) + where TContainer : class, IWebModuleContainer + => WithAction(@this, baseRoute, HttpVerbs.Delete, handler); + + /// + /// Creates an instance of that intercepts all DELETErequests + /// and adds it to a module container. + /// + /// The type of the module container. + /// The on which this method is called. + /// The callback used to handle requests. + /// with a added. + /// is . + /// + /// + /// + public static TContainer OnDelete(this TContainer @this, RequestHandlerCallback handler) + where TContainer : class, IWebModuleContainer + => WithAction(@this, UrlPath.Root, HttpVerbs.Delete, handler); + + /// + /// Creates an instance of that intercepts all GETrequests + /// under the specified and adds it to a module container. + /// + /// The type of the module container. + /// The on which this method is called. + /// The base route of the module. + /// The callback used to handle requests. + /// with a added. + /// is . + /// + /// + /// + public static TContainer OnGet(this TContainer @this, string baseRoute, RequestHandlerCallback handler) + where TContainer : class, IWebModuleContainer + => WithAction(@this, baseRoute, HttpVerbs.Get, handler); + + /// + /// Creates an instance of that intercepts all GETrequests + /// and adds it to a module container. + /// + /// The type of the module container. + /// The on which this method is called. + /// The callback used to handle requests. + /// with a added. + /// is . + /// + /// + /// + public static TContainer OnGet(this TContainer @this, RequestHandlerCallback handler) + where TContainer : class, IWebModuleContainer + => WithAction(@this, UrlPath.Root, HttpVerbs.Get, handler); + + /// + /// Creates an instance of that intercepts all HEADrequests + /// under the specified and adds it to a module container. + /// + /// The type of the module container. + /// The on which this method is called. + /// The base route of the module. + /// The callback used to handle requests. + /// with a added. + /// is . + /// + /// + /// + public static TContainer OnHead(this TContainer @this, string baseRoute, RequestHandlerCallback handler) + where TContainer : class, IWebModuleContainer + => WithAction(@this, baseRoute, HttpVerbs.Head, handler); + + /// + /// Creates an instance of that intercepts all HEADrequests + /// and adds it to a module container. + /// + /// The type of the module container. + /// The on which this method is called. + /// The callback used to handle requests. + /// with a added. + /// is . + /// + /// + /// + public static TContainer OnHead(this TContainer @this, RequestHandlerCallback handler) + where TContainer : class, IWebModuleContainer + => WithAction(@this, UrlPath.Root, HttpVerbs.Head, handler); + + /// + /// Creates an instance of that intercepts all OPTIONSrequests + /// under the specified and adds it to a module container. + /// + /// The type of the module container. + /// The on which this method is called. + /// The base route of the module. + /// The callback used to handle requests. + /// with a added. + /// is . + /// + /// + /// + public static TContainer OnOptions(this TContainer @this, string baseRoute, RequestHandlerCallback handler) + where TContainer : class, IWebModuleContainer + => WithAction(@this, baseRoute, HttpVerbs.Options, handler); + + /// + /// Creates an instance of that intercepts all OPTIONSrequests + /// and adds it to a module container. + /// + /// The type of the module container. + /// The on which this method is called. + /// The callback used to handle requests. + /// with a added. + /// is . + /// + /// + /// + public static TContainer OnOptions(this TContainer @this, RequestHandlerCallback handler) + where TContainer : class, IWebModuleContainer + => WithAction(@this, UrlPath.Root, HttpVerbs.Options, handler); + + /// + /// Creates an instance of that intercepts all PATCHrequests + /// under the specified and adds it to a module container. + /// + /// The type of the module container. + /// The on which this method is called. + /// The base route of the module. + /// The callback used to handle requests. + /// with a added. + /// is . + /// + /// + /// + public static TContainer OnPatch(this TContainer @this, string baseRoute, RequestHandlerCallback handler) + where TContainer : class, IWebModuleContainer + => WithAction(@this, baseRoute, HttpVerbs.Patch, handler); + + /// + /// Creates an instance of that intercepts all PATCHrequests + /// and adds it to a module container. + /// + /// The type of the module container. + /// The on which this method is called. + /// The callback used to handle requests. + /// with a added. + /// is . + /// + /// + /// + public static TContainer OnPatch(this TContainer @this, RequestHandlerCallback handler) + where TContainer : class, IWebModuleContainer + => WithAction(@this, UrlPath.Root, HttpVerbs.Patch, handler); + + /// + /// Creates an instance of that intercepts all POSTrequests + /// under the specified and adds it to a module container. + /// + /// The type of the module container. + /// The on which this method is called. + /// The base route of the module. + /// The callback used to handle requests. + /// with a added. + /// is . + /// + /// + /// + public static TContainer OnPost(this TContainer @this, string baseRoute, RequestHandlerCallback handler) + where TContainer : class, IWebModuleContainer + => WithAction(@this, baseRoute, HttpVerbs.Post, handler); + + /// + /// Creates an instance of that intercepts all POSTrequests + /// and adds it to a module container. + /// + /// The type of the module container. + /// The on which this method is called. + /// The callback used to handle requests. + /// with a added. + /// is . + /// + /// + /// + public static TContainer OnPost(this TContainer @this, RequestHandlerCallback handler) + where TContainer : class, IWebModuleContainer + => WithAction(@this, UrlPath.Root, HttpVerbs.Post, handler); + + /// + /// Creates an instance of that intercepts all PUTrequests + /// under the specified and adds it to a module container. + /// + /// The type of the module container. + /// The on which this method is called. + /// The base route of the module. + /// The callback used to handle requests. + /// with a added. + /// is . + /// + /// + /// + public static TContainer OnPut(this TContainer @this, string baseRoute, RequestHandlerCallback handler) + where TContainer : class, IWebModuleContainer + => WithAction(@this, baseRoute, HttpVerbs.Put, handler); + + /// + /// Creates an instance of that intercepts all PUTrequests + /// and adds it to a module container. + /// + /// The type of the module container. + /// The on which this method is called. + /// The callback used to handle requests. + /// with a added. + /// is . + /// + /// + /// + public static TContainer OnPut(this TContainer @this, RequestHandlerCallback handler) + where TContainer : class, IWebModuleContainer + => WithAction(@this, UrlPath.Root, HttpVerbs.Put, handler); + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/WebModuleContainerExtensions-Cors.cs b/Vendor/EmbedIO-3.5.2/WebModuleContainerExtensions-Cors.cs new file mode 100644 index 0000000..f684892 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/WebModuleContainerExtensions-Cors.cs @@ -0,0 +1,53 @@ +using System; +using EmbedIO.Cors; +using EmbedIO.Utilities; +using Swan; + +namespace EmbedIO +{ + partial class WebModuleContainerExtensions + { + /// + /// Creates an instance of and adds it to a module container. + /// + /// The type of the module container. + /// The on which this method is called. + /// The base route of the module. + /// The valid origins. Default is "*", meaning all origins. + /// The valid headers. Default is "*", meaning all headers. + /// The valid method. Default is "*", meaning all methods. + /// with a added. + /// is . + /// + public static TContainer WithCors( + this TContainer @this, + string baseRoute, + string origins, + string headers, + string methods) + where TContainer : class, IWebModuleContainer + { + @this.Modules.Add(new CorsModule(baseRoute, origins, headers, methods)); + return @this; + } + + /// + /// Creates an instance of and adds it to a module container. + /// + /// The type of the module container. + /// The on which this method is called. + /// The valid origins. Default is "*", meaning all origins. + /// The valid headers. Default is "*", meaning all headers. + /// The valid method. Default is "*", meaning all methods. + /// with a added. + /// is . + /// + public static TContainer WithCors( + this TContainer @this, + string origins = CorsModule.All, + string headers = CorsModule.All, + string methods = CorsModule.All) + where TContainer : class, IWebModuleContainer + => WithCors(@this, UrlPath.Root, origins, headers, methods); + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/WebModuleContainerExtensions-Files.cs b/Vendor/EmbedIO-3.5.2/WebModuleContainerExtensions-Files.cs new file mode 100644 index 0000000..ce506ad --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/WebModuleContainerExtensions-Files.cs @@ -0,0 +1,275 @@ +using System; +using System.IO; +using System.Reflection; +using EmbedIO.Files; +using EmbedIO.Utilities; + +namespace EmbedIO +{ + partial class WebModuleContainerExtensions + { + /// + /// Creates an instance of , uses it to initialize + /// a , and adds the latter to a module container. + /// + /// The type of the module container. + /// The on which this method is called. + /// The base route of the module. + /// The path of the directory to serve. + /// if files and directories in + /// are not expected to change during a web server's + /// lifetime; otherwise. + /// A callback used to configure the module. + /// with a added. + /// is . + /// is . + /// is not a valid local path. + /// + /// + /// + /// + public static TContainer WithStaticFolder( + this TContainer @this, + string baseRoute, + string fileSystemPath, + bool isImmutable, + Action? configure = null) + where TContainer : class, IWebModuleContainer + => WithStaticFolder(@this, null, baseRoute, fileSystemPath, isImmutable, configure); + + /// + /// Creates an instance of , uses it to initialize + /// a , and adds the latter to a module container, + /// giving it the specified if not . + /// + /// + /// OSX doesn't support , the parameter will be always . + /// + /// The type of the module container. + /// The on which this method is called. + /// The name. + /// The base route of the module. + /// The path of the directory to serve. + /// if files and directories in + /// are not expected to change during a web server's + /// lifetime; otherwise. + /// A callback used to configure the module. + /// with a added. + /// is . + /// is . + /// is not a valid local path. + /// + /// + /// + /// + public static TContainer WithStaticFolder( + this TContainer @this, + string? name, + string baseRoute, + string fileSystemPath, + bool isImmutable, + Action? configure = null) + where TContainer : class, IWebModuleContainer + { +#pragma warning disable CA2000 // Call Dispose on disposable - Ownership of provider is transferred to module + var provider = new FileSystemProvider(fileSystemPath, isImmutable); +#pragma warning restore CA2000 + try + { + var module = new FileModule(baseRoute, provider); + return WithModule(@this, name, module, configure); + } + catch + { + provider.Dispose(); + throw; + } + } + + /// + /// Creates an instance of , uses it to initialize + /// a , and adds the latter to a module container. + /// + /// The type of the module container. + /// The on which this method is called. + /// The base route of the module. + /// The assembly where served files are contained as embedded resources. + /// A string to prepend to provider-specific paths + /// to form the name of a manifest resource in . + /// A callback used to configure the module. + /// with a added. + /// is . + /// is . + /// + /// + /// + /// + public static TContainer WithEmbeddedResources( + this TContainer @this, + string baseRoute, + Assembly assembly, + string pathPrefix, + Action? configure = null) + where TContainer : class, IWebModuleContainer + => WithEmbeddedResources(@this, null, baseRoute, assembly, pathPrefix, configure); + + /// + /// Creates an instance of , uses it to initialize + /// a , and adds the latter to a module container, + /// giving it the specified if not . + /// + /// The type of the module container. + /// The on which this method is called. + /// The name. + /// The base route of the module. + /// The assembly where served files are contained as embedded resources. + /// A string to prepend to provider-specific paths + /// to form the name of a manifest resource in . + /// A callback used to configure the module. + /// with a added. + /// is . + /// is . + /// + /// + /// + /// + public static TContainer WithEmbeddedResources( + this TContainer @this, + string? name, + string baseRoute, + Assembly assembly, + string pathPrefix, + Action? configure = null) + where TContainer : class, IWebModuleContainer + { + var module = new FileModule(baseRoute, new ResourceFileProvider(assembly, pathPrefix)); + return WithModule(@this, name, module, configure); + } + + /// + /// Creates an instance of using a file-system path, uses it to initialize + /// a , and adds the latter to a module container. + /// + /// The type of the module container. + /// The on which this method is called. + /// The base route of the module. + /// The local path of the Zip file. + /// A callback used to configure the module. + /// with a added. + /// is . + /// + /// + /// + /// + public static TContainer WithZipFile( + this TContainer @this, + string baseRoute, + string zipFilePath, + Action? configure = null) + where TContainer : class, IWebModuleContainer + => WithZipFile(@this, null, baseRoute, zipFilePath, configure); + + /// + /// Creates an instance of using a file-system path, uses it to initialize + /// a , and adds the latter to a module container, + /// giving it the specified if not . + /// + /// The type of the module container. + /// The on which this method is called. + /// The name. + /// The base route of the module. + /// The zip file-system path. + /// A callback used to configure the module. + /// with a added. + /// is . + /// + /// + /// + /// + public static TContainer WithZipFile( + this TContainer @this, + string? name, + string baseRoute, + string zipFilePath, + Action? configure = null) + where TContainer : class, IWebModuleContainer + { +#pragma warning disable CA2000 // Call Dispose on disposable - Ownership of provider is transferred to module + var provider = new ZipFileProvider(zipFilePath); +#pragma warning restore CA2000 + try + { + var module = new FileModule(baseRoute, provider); + return WithModule(@this, name, module, configure); + } + catch + { + provider.Dispose(); + throw; + } + } + + /// + /// Creates an instance of using a zip file as stream, uses it to initialize + /// a , and adds the latter to a module container. + /// + /// The type of the module container. + /// The on which this method is called. + /// The base route of the module. + /// The zip file as stream. + /// A callback used to configure the module. + /// with a added. + /// is . + /// + /// + /// + /// + public static TContainer WithZipFileStream( + this TContainer @this, + string baseRoute, + Stream zipFileStream, + Action? configure = null) + where TContainer : class, IWebModuleContainer + => WithZipFileStream(@this, null, baseRoute, zipFileStream, configure); + + /// + /// Creates an instance of using a zip file as stream, uses it to initialize + /// a , and adds the latter to a module container, + /// giving it the specified if not . + /// + /// The type of the module container. + /// The on which this method is called. + /// The name. + /// The base route of the module. + /// The zip file as stream. + /// A callback used to configure the module. + /// with a added. + /// is . + /// + /// + /// + /// + public static TContainer WithZipFileStream( + this TContainer @this, + string? name, + string baseRoute, + Stream zipFileStream, + Action? configure = null) + where TContainer : class, IWebModuleContainer + { +#pragma warning disable CA2000 // Call Dispose on disposable - Ownership of provider is transferred to module + var provider = new ZipFileProvider(zipFileStream); +#pragma warning restore CA2000 + try + { + var module = new FileModule(baseRoute, provider); + return WithModule(@this, name, module, configure); + } + catch + { + provider.Dispose(); + throw; + } + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/WebModuleContainerExtensions-Routing.cs b/Vendor/EmbedIO-3.5.2/WebModuleContainerExtensions-Routing.cs new file mode 100644 index 0000000..0be9d59 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/WebModuleContainerExtensions-Routing.cs @@ -0,0 +1,51 @@ +using EmbedIO.Routing; +using EmbedIO.Utilities; +using System; + +namespace EmbedIO +{ + partial class WebModuleContainerExtensions + { + /// + /// Creates an instance of and adds it to a module container. + /// + /// The type of the module container. + /// The on which this method is called. + /// The base route of the module. + /// A callback used to configure the newly-created . + /// with a added. + /// is . + /// is . + /// + /// + /// + /// + public static TContainer WithRouting(this TContainer @this, string baseRoute, Action configure) + where TContainer : class, IWebModuleContainer + => WithRouting(@this, null, baseRoute, configure); + + /// + /// Creates an instance of and adds it to a module container, + /// giving it the specified if not . + /// + /// The type of the module container. + /// The on which this method is called. + /// The name. + /// The base route of the module. + /// A callback used to configure the newly-created . + /// with a added. + /// is . + /// is . + /// + /// + /// + /// + public static TContainer WithRouting(this TContainer @this, string? name, string baseRoute, Action configure) + where TContainer : class, IWebModuleContainer + { + configure = Validate.NotNull(nameof(configure), configure); + var module = new RoutingModule(baseRoute); + return WithModule(@this, name, module, configure); + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/WebModuleContainerExtensions-Security.cs b/Vendor/EmbedIO-3.5.2/WebModuleContainerExtensions-Security.cs new file mode 100644 index 0000000..03cde8c --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/WebModuleContainerExtensions-Security.cs @@ -0,0 +1,43 @@ +using EmbedIO.Security; +using System; +using System.Collections.Generic; + +namespace EmbedIO +{ + partial class WebModuleContainerExtensions + { + /// + /// Creates an instance of and adds it to a module container. + /// + /// The type of the module container. + /// The on which this method is called. + /// A collection of valid IPs that never will be banned. + /// Minutes that an IP will remain banned. + /// + /// with an added. + /// + public static TContainer WithIPBanning(this TContainer @this, + IEnumerable? whiteList = null, + int banMinutes = IPBanningModule.DefaultBanMinutes) + where TContainer : class, IWebModuleContainer => + WithIPBanning(@this, null, whiteList, banMinutes); + + /// + /// Creates an instance of and adds it to a module container. + /// + /// The type of the module container. + /// The on which this method is called. + /// The configure. + /// A collection of valid IPs that never will be banned. + /// Minutes that an IP will remain banned. + /// + /// with an added. + /// + public static TContainer WithIPBanning(this TContainer @this, + Action? configure, + IEnumerable? whiteList = null, + int banMinutes = IPBanningModule.DefaultBanMinutes) + where TContainer : class, IWebModuleContainer => + WithModule(@this, new IPBanningModule("/", whiteList, banMinutes), configure); + } +} diff --git a/Vendor/EmbedIO-3.5.2/WebModuleContainerExtensions-WebApi.cs b/Vendor/EmbedIO-3.5.2/WebModuleContainerExtensions-WebApi.cs new file mode 100644 index 0000000..a56a44d --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/WebModuleContainerExtensions-WebApi.cs @@ -0,0 +1,126 @@ +using System; +using System.Threading.Tasks; +using EmbedIO.Routing; +using EmbedIO.Utilities; +using EmbedIO.WebApi; + +namespace EmbedIO +{ + partial class WebModuleContainerExtensions + { + /// + /// Creates an instance of using the default response serializer + /// and adds it to a module container without giving it a name. + /// + /// The type of the module container. + /// The on which this method is called. + /// The base route of the module. + /// A callback used to configure the newly-created . + /// with a added. + /// is . + /// is . + /// + /// + /// + /// + public static TContainer WithWebApi(this TContainer @this, string baseRoute, Action configure) + where TContainer : class, IWebModuleContainer + => WithWebApi(@this, null, baseRoute, configure); + + /// + /// Creates an instance of using the specified response serializer + /// and adds it to a module container without giving it a name. + /// + /// The type of the module container. + /// The on which this method is called. + /// The base route of the module. + /// A used to serialize + /// the result of controller methods returning + /// or Task<object>. + /// A callback used to configure the newly-created . + /// with a added. + /// is . + /// + /// is . + /// - or - + /// is . + /// + /// + /// + /// + /// + public static TContainer WithWebApi( + this TContainer @this, + string baseRoute, + ResponseSerializerCallback serializer, + Action configure) + where TContainer : class, IWebModuleContainer + => WithWebApi(@this, null, baseRoute, serializer, configure); + + /// + /// Creates an instance of using the default response serializer + /// and adds it to a module container, giving it the specified + /// if not + /// + /// The type of the module container. + /// The on which this method is called. + /// The name. + /// The base route of the module. + /// A callback used to configure the newly-created . + /// with a added. + /// is . + /// is . + /// + /// + /// + /// + public static TContainer WithWebApi( + this TContainer @this, + string? name, + string baseRoute, + Action configure) + where TContainer : class, IWebModuleContainer + { + configure = Validate.NotNull(nameof(configure), configure); + var module = new WebApiModule(baseRoute); + return WithModule(@this, name, module, configure); + } + + /// + /// Creates an instance of , using the specified response serializer + /// and adds it to a module container, giving it the specified + /// if not + /// + /// The type of the module container. + /// The on which this method is called. + /// The name. + /// The base route of the module. + /// A used to serialize + /// the result of controller methods returning + /// or Task<object>. + /// A callback used to configure the newly-created . + /// with a added. + /// is . + /// + /// is . + /// - or - + /// is . + /// + /// + /// + /// + /// + public static TContainer WithWebApi( + this TContainer @this, + string? name, + string baseRoute, + ResponseSerializerCallback serializer, + Action configure) + where TContainer : class, IWebModuleContainer + { + configure = Validate.NotNull(nameof(configure), configure); + var module = new WebApiModule(baseRoute, serializer); + return WithModule(@this, name, module, configure); + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/WebModuleContainerExtensions.cs b/Vendor/EmbedIO-3.5.2/WebModuleContainerExtensions.cs new file mode 100644 index 0000000..57323e7 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/WebModuleContainerExtensions.cs @@ -0,0 +1,84 @@ +using System; +using EmbedIO.Utilities; + +namespace EmbedIO +{ + /// + /// Contains extension methods for types implementing . + /// + public static partial class WebModuleContainerExtensions + { + /// + /// Adds the specified to a module container, without giving it a name. + /// + /// The type of the module container. + /// The on which this method is called. + /// The module. + /// with added. + /// is . + /// + /// + public static TContainer WithModule(this TContainer @this, IWebModule module) + where TContainer : class, IWebModuleContainer + => WithModule(@this, null, module); + + /// + /// Adds the specified to a module container, + /// giving it the specified if not . + /// + /// The type of the module container. + /// The on which this method is called. + /// The name. + /// The module. + /// with added. + /// is . + /// + /// + public static TContainer WithModule(this TContainer @this, string? name, IWebModule module) + where TContainer : class, IWebModuleContainer + { + @this.Modules.Add(name, module); + return @this; + } + + /// + /// Adds the specified to a module container, without giving it a name. + /// + /// The type of the module container. + /// The type of the . + /// The on which this method is called. + /// The module. + /// A callback used to configure the . + /// with added. + /// is . + /// + /// + public static TContainer WithModule(this TContainer @this, TWebModule module, Action? configure) + where TContainer : class, IWebModuleContainer + where TWebModule : IWebModule + => WithModule(@this, null, module, configure); + + /// + /// Adds the specified to a module container, + /// giving it the specified if not . + /// + /// The type of the module container. + /// The type of the . + /// The on which this method is called. + /// The name. + /// The module. + /// A callback used to configure the . + /// with added. + /// is . + /// + /// + public static TContainer WithModule(this TContainer @this, string? name, TWebModule module, Action? configure) + where TContainer : class, IWebModuleContainer + where TWebModule : IWebModule + { + configure?.Invoke(module); + @this.Modules.Add(name, module); + return @this; + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/WebModuleExtensions-ExceptionHandlers.cs b/Vendor/EmbedIO-3.5.2/WebModuleExtensions-ExceptionHandlers.cs new file mode 100644 index 0000000..2d4f49d --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/WebModuleExtensions-ExceptionHandlers.cs @@ -0,0 +1,45 @@ +using System; + +namespace EmbedIO +{ + partial class WebModuleExtensions + { + /// + /// Sets the HTTP exception handler on an . + /// + /// The type of the web server. + /// The on which this method is called. + /// The HTTP exception handler. + /// with the OnHttpException + /// property set to . + /// is . + /// The module's configuration is locked. + /// + /// + public static TWebModule HandleHttpException(this TWebModule @this, HttpExceptionHandlerCallback handler) + where TWebModule : IWebModule + { + @this.OnHttpException = handler; + return @this; + } + + /// + /// Sets the unhandled exception handler on an . + /// + /// The type of the web server. + /// The on which this method is called. + /// The unhandled exception handler. + /// with the OnUnhandledException + /// property set to . + /// is . + /// The module's configuration is locked. + /// + /// + public static TWebModule HandleUnhandledException(this TWebModule @this, ExceptionHandlerCallback handler) + where TWebModule : IWebModule + { + @this.OnUnhandledException = handler; + return @this; + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/WebModuleExtensions.cs b/Vendor/EmbedIO-3.5.2/WebModuleExtensions.cs new file mode 100644 index 0000000..b691abb --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/WebModuleExtensions.cs @@ -0,0 +1,9 @@ +namespace EmbedIO +{ + /// + /// Provides extension methods for types implementing . + /// + public static partial class WebModuleExtensions + { + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/WebServer-Constants.cs b/Vendor/EmbedIO-3.5.2/WebServer-Constants.cs new file mode 100644 index 0000000..78e47d3 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/WebServer-Constants.cs @@ -0,0 +1,49 @@ +using System; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text; + +namespace EmbedIO +{ + partial class WebServer + { + /// + /// The size, in bytes,of buffers used to transfer contents between streams. + /// The value of this constant is the same as the default used by the + /// method. For the reasons why this value was chosen, see + /// .NET Framework reference source. + /// + public const int StreamCopyBufferSize = 81920; + + /// + /// The scheme of . + /// + public const string UriSchemeNull = "null"; + + /// + /// The signature string included in Server response headers. + /// + public static readonly string Signature = "com.thequux.Stationeers.RemoteControl"; + + /// + /// An that can be used to send UTF-8 responses without a byte order mark (BOM). + /// This is the default encoding used by and should be used instead of + /// when specifying an encoding for . + /// + public static readonly Encoding Utf8NoBomEncoding = new UTF8Encoding(false); + + /// + /// The default encoding that is both assumed for requests that do not specify an encoding, + /// and used for responses when an encoding is not specified. + /// This is the same as . + /// + public static readonly Encoding DefaultEncoding = Utf8NoBomEncoding; + + /// + /// An which cannot be equal to any HTTP / HTTP URI. + /// Used as the default value for non-nullable properties of type . + /// + public static readonly Uri NullUri = new ("null:"); + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/WebServer.cs b/Vendor/EmbedIO-3.5.2/WebServer.cs new file mode 100644 index 0000000..f68382d --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/WebServer.cs @@ -0,0 +1,191 @@ +using System; +using System.Security.Cryptography.X509Certificates; +using System.Threading; +using System.Threading.Tasks; +using EmbedIO.Net.Internal; +using EmbedIO.Routing; +using EmbedIO.Utilities; +using Swan.Logging; + +namespace EmbedIO +{ + /// + /// EmbedIO's web server. This is the default implementation of . + /// This class also contains some useful constants related to EmbedIO's internal working. + /// + public partial class WebServer : WebServerBase + { + /// + /// Initializes a new instance of the class, + /// that will respond on HTTP port 80 on all network interfaces. + /// + public WebServer() + : this(80) + { + } + + /// + /// Initializes a new instance of the class, + /// that will respond on the specified HTTP port on all network interfaces. + /// + /// The port. + public WebServer(int port) + : this($"http://*:{port}/") + { + } + + /// + /// Initializes a new instance of the class + /// with the specified URL prefixes. + /// + /// The URL prefixes to configure. + /// is . + /// + /// One or more of the elements of is the empty string. + /// - or - + /// One or more of the elements of is already registered. + /// + public WebServer(params string[] urlPrefixes) + : this(new WebServerOptions().WithUrlPrefixes(urlPrefixes)) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// The type of HTTP listener to configure. + /// The URL prefixes to configure. + /// is . + /// + /// One or more of the elements of is the empty string. + /// - or - + /// One or more of the elements of is already registered. + /// + public WebServer(HttpListenerMode mode, params string[] urlPrefixes) + : this(new WebServerOptions().WithMode(mode).WithUrlPrefixes(urlPrefixes)) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// The type of HTTP listener to configure. + /// The X.509 certificate to use for SSL connections. + /// The URL prefixes to configure. + /// is . + /// + /// One or more of the elements of is the empty string. + /// - or - + /// One or more of the elements of is already registered. + /// + public WebServer(HttpListenerMode mode, X509Certificate2 certificate, params string[] urlPrefixes) + : this(new WebServerOptions() + .WithMode(mode) + .WithCertificate(certificate) + .WithUrlPrefixes(urlPrefixes)) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// A object used to configure this instance. + /// is . + public WebServer(WebServerOptions options) + : base(options) + { + Listener = CreateHttpListener(); + } + + /// + /// Initializes a new instance of the class. + /// + /// A callback that will be used to configure + /// the server's options. + /// is . + public WebServer(Action configure) + : base(configure) + { + Listener = CreateHttpListener(); + } + + /// + /// Gets the underlying HTTP listener. + /// + public IHttpListener Listener { get; } + + /// + protected override void Dispose(bool disposing) + { + if (disposing) + { + try + { + Listener.Dispose(); + } + catch (Exception ex) + { + ex.Log(LogSource, "Exception thrown while disposing HTTP listener."); + } + + "Listener closed.".Info(LogSource); + } + + base.Dispose(disposing); + } + + /// + protected override void Prepare(CancellationToken cancellationToken) + { + Listener.Start(); + "Started HTTP Listener".Info(LogSource); + + // close port when the cancellation token is cancelled + _ = cancellationToken.Register(() => Listener?.Stop()); + } + + /// + protected override async Task ProcessRequestsAsync(CancellationToken cancellationToken) + { + while (!cancellationToken.IsCancellationRequested && (Listener?.IsListening ?? false)) + { + var context = await Listener.GetContextAsync(cancellationToken).ConfigureAwait(false); + context.CancellationToken = cancellationToken; + context.Route = RouteMatch.UnsafeFromRoot(UrlPath.Normalize(context.Request.Url.AbsolutePath, false)); + +#pragma warning disable CS4014 // Call is not awaited - of course, it has to run in parallel. + _ = Task.Run(() => DoHandleContextAsync(context), cancellationToken); +#pragma warning restore CS4014 + } + } + + /// + protected override void OnFatalException() => Listener?.Dispose(); + + private IHttpListener CreateHttpListener() + { + IHttpListener DoCreate() => Options.Mode switch { + HttpListenerMode.Microsoft => System.Net.HttpListener.IsSupported + ? new SystemHttpListener(new System.Net.HttpListener()) as IHttpListener + : new Net.HttpListener(Options.Certificate), + _ => new Net.HttpListener(Options.Certificate) + }; + + var listener = DoCreate(); + $"Running HTTPListener: {listener.Name}".Info(LogSource); + + foreach (var prefix in Options.UrlPrefixes) + { + var urlPrefix = new string(prefix?.ToCharArray()); + + if (!urlPrefix.EndsWith("/")) urlPrefix += "/"; + urlPrefix = urlPrefix.ToLowerInvariant(); + + listener.AddPrefix(urlPrefix); + $"Web server prefix '{urlPrefix}' added.".Info(LogSource); + } + + return listener; + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/WebServerBase`1.cs b/Vendor/EmbedIO-3.5.2/WebServerBase`1.cs new file mode 100644 index 0000000..6230bc6 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/WebServerBase`1.cs @@ -0,0 +1,349 @@ +using System; +using System.Globalization; +using System.Linq; +using System.Net; +using System.Threading; +using System.Threading.Tasks; +using EmbedIO.Internal; +using EmbedIO.Sessions; +using EmbedIO.Utilities; +using Swan.Configuration; +using Swan.Logging; + +namespace EmbedIO +{ + /// + /// Base class for implementations. + /// + /// The type of the options object used to configure an instance. + /// + /// + public abstract class WebServerBase : ConfiguredObject, IWebServer, IHttpContextHandler + where TOptions : WebServerOptionsBase, new() + { + private readonly WebModuleCollection _modules; + + private readonly MimeTypeCustomizer _mimeTypeCustomizer = new MimeTypeCustomizer(); + + private ExceptionHandlerCallback _onUnhandledException = ExceptionHandler.Default; + private HttpExceptionHandlerCallback _onHttpException = HttpExceptionHandler.Default; + + private WebServerState _state = WebServerState.Created; + + private ISessionManager? _sessionManager; + + /// + /// Initializes a new instance of the class. + /// + protected WebServerBase() + : this(new TOptions(), null) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// A instance that will be used + /// to configure the server. + /// is . + protected WebServerBase(TOptions options) + : this(Validate.NotNull(nameof(options), options), null) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// A callback that will be used to configure + /// the server's options. + /// is . + protected WebServerBase(Action configure) + : this(new TOptions(), Validate.NotNull(nameof(configure), configure)) + { + } + + private WebServerBase(TOptions options, Action? configure) + { + Options = options; + LogSource = GetType().Name; + _modules = new WebModuleCollection(LogSource); + + configure?.Invoke(Options); + Options.Lock(); + } + + /// + /// Finalizes an instance of the class. + /// + ~WebServerBase() + { + Dispose(false); + } + + /// + public event WebServerStateChangedEventHandler? StateChanged; + + /// + public IComponentCollection Modules => _modules; + + /// + /// Gets the options object used to configure this instance. + /// + public TOptions Options { get; } + + /// + /// The server's configuration is locked. + /// this property is being set to . + /// + /// The default value for this property is . + /// + /// + public ExceptionHandlerCallback OnUnhandledException + { + get => _onUnhandledException; + set + { + EnsureConfigurationNotLocked(); + _onUnhandledException = Validate.NotNull(nameof(value), value); + } + } + + /// + /// The server's configuration is locked. + /// this property is being set to . + /// + /// The default value for this property is . + /// + /// + public HttpExceptionHandlerCallback OnHttpException + { + get => _onHttpException; + set + { + EnsureConfigurationNotLocked(); + _onHttpException = Validate.NotNull(nameof(value), value); + } + } + + /// + public ISessionManager? SessionManager + { + get => _sessionManager; + set + { + EnsureConfigurationNotLocked(); + _sessionManager = value; + } + } + + /// + public WebServerState State + { + get => _state; + private set + { + if (value == _state) return; + + var oldState = _state; + _state = value; + + if (_state != WebServerState.Created) + { + LockConfiguration(); + } + + StateChanged?.Invoke(this, new WebServerStateChangedEventArgs(oldState, value)); + } + } + + /// + /// Gets a string to use as a source for log messages. + /// + protected string LogSource { get; } + + /// + public Task HandleContextAsync(IHttpContextImpl context) + { + if (State > WebServerState.Listening) + throw new InvalidOperationException("The web server has already been stopped."); + + if (State < WebServerState.Listening) + throw new InvalidOperationException("The web server has not been started yet."); + + return DoHandleContextAsync(context); + } + + string IMimeTypeProvider.GetMimeType(string extension) + => _mimeTypeCustomizer.GetMimeType(extension); + + bool IMimeTypeProvider.TryDetermineCompression(string mimeType, out bool preferCompression) + => _mimeTypeCustomizer.TryDetermineCompression(mimeType, out preferCompression); + + /// + public void AddCustomMimeType(string extension, string mimeType) + => _mimeTypeCustomizer.AddCustomMimeType(extension, mimeType); + + /// + public void PreferCompression(string mimeType, bool preferCompression) + => _mimeTypeCustomizer.PreferCompression(mimeType, preferCompression); + + /// + /// The method was already called. + /// Cancellation was requested. + public async Task RunAsync(CancellationToken cancellationToken = default) + { + try + { + State = WebServerState.Loading; + Prepare(cancellationToken); + + _sessionManager?.Start(cancellationToken); + _modules.StartAll(cancellationToken); + + State = WebServerState.Listening; + await ProcessRequestsAsync(cancellationToken).ConfigureAwait(false); + } + catch (OperationCanceledException) when (cancellationToken.IsCancellationRequested) + { + "Operation canceled.".Debug(LogSource); + } + finally + { + "Cleaning up".Info(LogSource); + State = WebServerState.Stopped; + } + } + + /// + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + /// + /// Asynchronously handles a received request. + /// + /// The context of the request. + /// A representing the ongoing operation. + protected async Task DoHandleContextAsync(IHttpContextImpl context) + { + context.SupportCompressedRequests = Options.SupportCompressedRequests; + context.MimeTypeProviders.Push(this); + + try + { + $"[{context.Id}] {context.Request.SafeGetRemoteEndpointStr()}: {context.Request.HttpMethod} {context.Request.Url.PathAndQuery} - {context.Request.UserAgent}" + .Debug(LogSource); + + if (SessionManager != null) + context.Session = new SessionProxy(context, SessionManager); + + try + { + if (context.CancellationToken.IsCancellationRequested) + return; + + try + { + // Return a 404 (Not Found) response if no module handled the response. + await _modules.DispatchRequestAsync(context).ConfigureAwait(false); + if (!context.IsHandled) + { + $"[{context.Id}] No module generated a response. Sending 404 - Not Found".Error(LogSource); + throw HttpException.NotFound("No module was able to serve the requested path."); + } + } + catch (OperationCanceledException) when (context.CancellationToken.IsCancellationRequested) + { + throw; // Let outer catch block handle it + } + catch (HttpListenerException) + { + throw; // Let outer catch block handle it + } + catch (Exception exception) when (exception is IHttpException) + { + await HttpExceptionHandler.Handle(LogSource, context, exception, _onHttpException) + .ConfigureAwait(false); + } + catch (Exception exception) + { + await ExceptionHandler.Handle(LogSource, context, exception, _onUnhandledException, _onHttpException) + .ConfigureAwait(false); + } + } + finally + { + await context.Response.OutputStream.FlushAsync(context.CancellationToken) + .ConfigureAwait(false); + + var statusCode = context.Response.StatusCode; + var statusDescription = context.Response.StatusDescription; + var sendChunked = context.Response.SendChunked; + var contentLength = context.Response.ContentLength64; + context.Close(); + $"[{context.Id}] {context.Request.HttpMethod} {context.Request.Url.AbsolutePath}: \"{statusCode} {statusDescription}\" sent in {context.Age}ms ({(sendChunked ? "chunked" : contentLength.ToString(CultureInfo.InvariantCulture) + " bytes")})" + .Info(LogSource); + } + } + catch (OperationCanceledException) when (context.CancellationToken.IsCancellationRequested) + { + $"[{context.Id}] Operation canceled.".Debug(LogSource); + } + catch (HttpListenerException ex) + { + ex.Log(LogSource, $"[{context.Id}] Listener exception."); + } + catch (Exception ex) + { + ex.Log(LogSource, $"[{context.Id}] Fatal exception."); + OnFatalException(); + } + } + + /// + protected override void OnBeforeLockConfiguration() + { + base.OnBeforeLockConfiguration(); + + _mimeTypeCustomizer.Lock(); + _modules.Lock(); + } + + /// + /// Releases unmanaged and - optionally - managed resources. + /// + /// + /// true to release both managed and unmanaged resources; false to release only unmanaged resources. + /// + protected virtual void Dispose(bool disposing) + { + if (!disposing) + return; + + _modules.Dispose(); + } + + /// + /// Prepares a web server for running. + /// + /// A used to stop the web server. + protected virtual void Prepare(CancellationToken cancellationToken) + { + } + + /// + /// Asynchronously receives requests and processes them. + /// + /// A used to stop the web server. + /// A representing the ongoing operation. + protected abstract Task ProcessRequestsAsync(CancellationToken cancellationToken); + + /// + /// Called when an exception is caught in the web server's request processing loop. + /// This method should tell the server socket to stop accepting further requests. + /// + protected abstract void OnFatalException(); + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/WebServerExtensions-ExceptionHandliers.cs b/Vendor/EmbedIO-3.5.2/WebServerExtensions-ExceptionHandliers.cs new file mode 100644 index 0000000..fd716b8 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/WebServerExtensions-ExceptionHandliers.cs @@ -0,0 +1,47 @@ +using System; + +namespace EmbedIO +{ + partial class WebServerExtensions + { + /// + /// Sets the HTTP exception handler on an . + /// + /// The type of the web server. + /// The on which this method is called. + /// The HTTP exception handler. + /// with the OnHttpException + /// property set to . + /// is . + /// The web server has already been started. + /// is . + /// + /// + public static TWebServer HandleHttpException(this TWebServer @this, HttpExceptionHandlerCallback handler) + where TWebServer : IWebServer + { + @this.OnHttpException = handler; + return @this; + } + + /// + /// Sets the unhandled exception handler on an . + /// + /// The type of the web server. + /// The on which this method is called. + /// The unhandled exception handler. + /// with the OnUnhandledException + /// property set to . + /// is . + /// The web server has already been started. + /// is . + /// + /// + public static TWebServer HandleUnhandledException(this TWebServer @this, ExceptionHandlerCallback handler) + where TWebServer : IWebServer + { + @this.OnUnhandledException = handler; + return @this; + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/WebServerExtensions-SessionManager.cs b/Vendor/EmbedIO-3.5.2/WebServerExtensions-SessionManager.cs new file mode 100644 index 0000000..65844a8 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/WebServerExtensions-SessionManager.cs @@ -0,0 +1,43 @@ +using System; +using EmbedIO.Sessions; + +namespace EmbedIO +{ + partial class WebServerExtensions + { + /// + /// Sets the session manager on an . + /// + /// The type of the web server. + /// The on which this method is called. + /// The session manager. + /// with the session manager set. + /// is . + /// The web server has already been started. + public static TWebServer WithSessionManager(this TWebServer @this, ISessionManager sessionManager) + where TWebServer : IWebServer + { + @this.SessionManager = sessionManager; + return @this; + } + + /// + /// Creates a with all properties set to their default values + /// and sets it as session manager on an . + /// + /// The type of the web server. + /// The on which this method is called. + /// A callback used to configure the session manager. + /// with the session manager set. + /// is . + /// The web server has already been started. + public static TWebServer WithLocalSessionManager(this TWebServer @this, Action? configure = null) + where TWebServer : IWebServer + { + var sessionManager = new LocalSessionManager(); + configure?.Invoke(sessionManager); + @this.SessionManager = sessionManager; + return @this; + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/WebServerExtensions.cs b/Vendor/EmbedIO-3.5.2/WebServerExtensions.cs new file mode 100644 index 0000000..43aaec2 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/WebServerExtensions.cs @@ -0,0 +1,30 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using Swan; + +namespace EmbedIO +{ + /// + /// Provides extension methods for types implementing . + /// + public static partial class WebServerExtensions + { + /// + /// Starts a web server by calling + /// in another thread. + /// + /// The on which this method is called. + /// A used to stop the web server. + /// is . + /// The web server has already been started. + public static void Start(this IWebServer @this, CancellationToken cancellationToken = default) + { +#pragma warning disable CS4014 // The call is not awaited - it is expected to run in parallel. + Task.Run(() => @this.RunAsync(cancellationToken)); +#pragma warning restore CS4014 + while (@this.State < WebServerState.Listening) + Task.Delay(1, cancellationToken).Await(); + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/WebServerOptions.cs b/Vendor/EmbedIO-3.5.2/WebServerOptions.cs new file mode 100644 index 0000000..2700a9f --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/WebServerOptions.cs @@ -0,0 +1,330 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Globalization; +using System.Linq; +using System.Security.Cryptography.X509Certificates; +using System.Text; +using System.Text.RegularExpressions; +using EmbedIO.Utilities; +using Swan; +using Swan.Logging; + +namespace EmbedIO +{ + /// + /// Contains options for configuring an instance of . + /// + public sealed class WebServerOptions : WebServerOptionsBase + { + private const string NetShLogSource = "NetSh"; + + private readonly List _urlPrefixes = new List(); + + private HttpListenerMode _mode = HttpListenerMode.EmbedIO; + + private X509Certificate2? _certificate; + + private string? _certificateThumbprint; + + private bool _autoLoadCertificate; + + private bool _autoRegisterCertificate; + + private StoreName _storeName = StoreName.My; + + private StoreLocation _storeLocation = StoreLocation.LocalMachine; + + /// + /// Gets the URL prefixes. + /// + public IReadOnlyList UrlPrefixes => _urlPrefixes; + + /// + /// Gets or sets the type of HTTP listener. + /// + /// This property is being set, + /// and this instance's configuration is locked. + /// + public HttpListenerMode Mode + { + get => _mode; + set + { + EnsureConfigurationNotLocked(); + _mode = value; + } + } + + /// + /// Gets or sets the X.509 certificate to use for SSL connections. + /// + /// This property is being set, + /// and this instance's configuration is locked. + public X509Certificate2? Certificate + { + get + { + if (AutoRegisterCertificate) + return TryRegisterCertificate() ? _certificate : null; + + return _certificate ?? (AutoLoadCertificate ? LoadCertificate() : null); + } + set + { + EnsureConfigurationNotLocked(); + _certificate = value; + } + } + + /// + /// Gets or sets the thumbprint of the X.509 certificate to use for SSL connections. + /// + /// This property is being set, + /// and this instance's configuration is locked. + public string? CertificateThumbprint + { + get => _certificateThumbprint; + set + { + EnsureConfigurationNotLocked(); + + // strip any non-hexadecimal values and make uppercase + _certificateThumbprint = value == null + ? null + : Regex.Replace(value, @"[^\da-fA-F]", string.Empty).ToUpper(CultureInfo.InvariantCulture); + } + } + + /// + /// Gets or sets a value indicating whether to automatically load the X.509 certificate. + /// + /// This property is being set, + /// and this instance's configuration is locked. + /// This property is being set to + /// and the underlying operating system is not Windows. + public bool AutoLoadCertificate + { + get => _autoLoadCertificate; + set + { + EnsureConfigurationNotLocked(); + if (value && SwanRuntime.OS != Swan.OperatingSystem.Windows) + throw new PlatformNotSupportedException("AutoLoadCertificate functionality is only available under Windows."); + + _autoLoadCertificate = value; + } + } + + /// + /// Gets or sets a value indicating whether to automatically bind the X.509 certificate + /// to the port used for HTTPS. + /// + /// This property is being set, + /// and this instance's configuration is locked. + /// This property is being set to + /// and the underlying operating system is not Windows. + public bool AutoRegisterCertificate + { + get => _autoRegisterCertificate; + set + { + EnsureConfigurationNotLocked(); + if (value && SwanRuntime.OS != Swan.OperatingSystem.Windows) + throw new PlatformNotSupportedException("AutoRegisterCertificate functionality is only available under Windows."); + + _autoRegisterCertificate = value; + } + } + + /// + /// Gets or sets a value indicating the X.509 certificate store where to load the certificate from. + /// + /// This property is being set, + /// and this instance's configuration is locked. + /// + public StoreName StoreName + { + get => _storeName; + set + { + EnsureConfigurationNotLocked(); + _storeName = value; + } + } + + /// + /// Gets or sets a value indicating the location of the X.509 certificate store where to load the certificate from. + /// + /// This property is being set, + /// and this instance's configuration is locked. + /// + public StoreLocation StoreLocation + { + get => _storeLocation; + set + { + EnsureConfigurationNotLocked(); + _storeLocation = value; + } + } + + /// + /// Adds a URL prefix. + /// + /// The URL prefix. + /// This instance's configuration is locked. + /// is . + /// + /// is the empty string. + /// - or - + /// is already registered. + /// + public void AddUrlPrefix(string urlPrefix) + { + EnsureConfigurationNotLocked(); + + urlPrefix = Validate.NotNullOrEmpty(nameof(urlPrefix), urlPrefix); + if (_urlPrefixes.Contains(urlPrefix)) + throw new ArgumentException("URL prefix is already registered.", nameof(urlPrefix)); + + _urlPrefixes.Add(urlPrefix); + } + + private X509Certificate2? LoadCertificate() + { + if (SwanRuntime.OS != Swan.OperatingSystem.Windows) + return null; + + if (!string.IsNullOrWhiteSpace(_certificateThumbprint)) return GetCertificate(_certificateThumbprint); + + using var netsh = GetNetsh("show"); + + string? thumbprint = null; + + netsh.ErrorDataReceived += (s, e) => + { + if (string.IsNullOrWhiteSpace(e.Data)) return; + + e.Data.Error(NetShLogSource); + }; + + netsh.OutputDataReceived += (s, e) => + { + if (string.IsNullOrWhiteSpace(e.Data)) return; + + e.Data.Debug(NetShLogSource); + + var line = e.Data.Trim(); + + if (line.StartsWith("Certificate Hash") && line.IndexOf(":", StringComparison.Ordinal) > -1) + thumbprint = line.Split(':')[1].Trim(); + }; + + if (!netsh.Start()) + return null; + + netsh.BeginOutputReadLine(); + netsh.BeginErrorReadLine(); + netsh.WaitForExit(); + + return netsh.ExitCode == 0 && !string.IsNullOrEmpty(thumbprint) + ? GetCertificate(thumbprint) + : null; + } + + private X509Certificate2? GetCertificate(string? thumbprint = null) + { + using var store = new X509Store(StoreName, StoreLocation); + store.Open(OpenFlags.ReadOnly); + var signingCert = store.Certificates.Find( + X509FindType.FindByThumbprint, + thumbprint ?? _certificateThumbprint, + false); + return signingCert.Count == 0 ? null : signingCert[0]; + } + + private bool AddCertificateToStore() + { + using var store = new X509Store(StoreName, StoreLocation); + try + { + store.Open(OpenFlags.ReadWrite); + store.Add(_certificate); + return true; + } + catch + { + return false; + } + } + + private bool TryRegisterCertificate() + { + if (SwanRuntime.OS != Swan.OperatingSystem.Windows) + return false; + + if (_certificate == null) + throw new InvalidOperationException("A certificate is required to AutoRegister"); + + if (GetCertificate(_certificate.Thumbprint) == null && !AddCertificateToStore()) + { + throw new InvalidOperationException( + "The provided certificate cannot be added to the default store, add it manually"); + } + + using var netsh = GetNetsh("add", $"certhash={_certificate.Thumbprint} appid={{adaa04bb-8b63-4073-a12f-d6f8c0b4383f}}"); + + var sb = new StringBuilder(); + + void PushLine(object sender, DataReceivedEventArgs e) + { + if (string.IsNullOrWhiteSpace(e.Data)) return; + + sb.AppendLine(e.Data); + e.Data.Error(NetShLogSource); + } + + netsh.OutputDataReceived += PushLine; + + netsh.ErrorDataReceived += PushLine; + + if (!netsh.Start()) return false; + + netsh.BeginOutputReadLine(); + netsh.BeginErrorReadLine(); + netsh.WaitForExit(); + + return netsh.ExitCode == 0 ? true : throw new InvalidOperationException($"NetSh error: {sb}"); + } + + private int GetSslPort() + { + var port = 443; + + foreach (var url in UrlPrefixes.Where(x => + x.StartsWith("https:", StringComparison.OrdinalIgnoreCase))) + { + var match = Regex.Match(url, @":(\d+)"); + + if (match.Success && int.TryParse(match.Groups[1].Value, out port)) + break; + } + + return port; + } + + private Process GetNetsh(string verb, string options = "") => new Process + { + StartInfo = new ProcessStartInfo + { + FileName = "netsh", + CreateNoWindow = true, + RedirectStandardError = true, + RedirectStandardOutput = true, + UseShellExecute = false, + Arguments = $"http {verb} sslcert ipport=0.0.0.0:{GetSslPort()} {options}", + }, + }; + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/WebServerOptionsBase.cs b/Vendor/EmbedIO-3.5.2/WebServerOptionsBase.cs new file mode 100644 index 0000000..dd4790a --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/WebServerOptionsBase.cs @@ -0,0 +1,35 @@ +using System; +using Swan.Configuration; + +namespace EmbedIO +{ + /// + /// Base class for web server options. + /// + public abstract class WebServerOptionsBase : ConfiguredObject + { + private bool _supportCompressedRequests; + + /// + /// Gets or sets a value indicating whether compressed request bodies are supported. + /// The default value is , because of the security risk + /// posed by decompression bombs. + /// + /// This property is being set and this instance's + /// configuration is locked. + public bool SupportCompressedRequests + { + get => _supportCompressedRequests; + set + { + EnsureConfigurationNotLocked(); + _supportCompressedRequests = value; + } + } + + /// + /// Locks this instance, preventing further configuration. + /// + public void Lock() => LockConfiguration(); + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/WebServerOptionsBaseExtensions.cs b/Vendor/EmbedIO-3.5.2/WebServerOptionsBaseExtensions.cs new file mode 100644 index 0000000..a100306 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/WebServerOptionsBaseExtensions.cs @@ -0,0 +1,27 @@ +using System; + +namespace EmbedIO +{ + /// + /// Provides extension methods for classes derived from . + /// + public static class WebServerOptionsBaseExtensions + { + /// + /// Adds a URL prefix. + /// + /// The type of the object on which this method is called. + /// The object on which this method is called. + /// If , enable support for compressed request bodies. + /// with its SupportCompressedRequests + /// property set to . + /// is . + /// The configuration of is locked. + public static TOptions WithSupportCompressedRequests(this TOptions @this, bool value) + where TOptions : WebServerOptionsBase + { + @this.SupportCompressedRequests = value; + return @this; + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/WebServerOptionsExtensions.cs b/Vendor/EmbedIO-3.5.2/WebServerOptionsExtensions.cs new file mode 100644 index 0000000..b68b28d --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/WebServerOptionsExtensions.cs @@ -0,0 +1,294 @@ +using System; +using System.Collections.Generic; +using System.Security.Cryptography.X509Certificates; +using EmbedIO.Utilities; + +namespace EmbedIO +{ + /// + /// Provides extension methods for . + /// + public static class WebServerOptionsExtensions + { + /// + /// Adds a URL prefix. + /// + /// The on which this method is called. + /// The URL prefix. + /// with added. + /// is . + /// The configuration of is locked. + /// is . + /// + /// is the empty string. + /// - or - + /// is already registered. + /// + public static WebServerOptions WithUrlPrefix(this WebServerOptions @this, string urlPrefix) + { + @this.AddUrlPrefix(urlPrefix); + return @this; + } + + /// + /// Adds zero or more URL prefixes. + /// + /// The on which this method is called. + /// An enumeration of URL prefixes to add. + /// with every non- element + /// of added. + /// is . + /// The configuration of is locked. + /// is . + /// + /// One or more of the elements of is the empty string. + /// - or - + /// One or more of the elements of is already registered. + /// + public static WebServerOptions WithUrlPrefixes(this WebServerOptions @this, IEnumerable urlPrefixes) + { + foreach (var urlPrefix in Validate.NotNull(nameof(urlPrefixes), urlPrefixes)) + @this.AddUrlPrefix(urlPrefix); + + return @this; + } + + /// + /// Adds zero or more URL prefixes. + /// + /// The on which this method is called. + /// An array of URL prefixes to add. + /// with every non- element + /// of added. + /// is . + /// The configuration of is locked. + /// is . + /// + /// One or more of the elements of is the empty string. + /// - or - + /// One or more of the elements of is already registered. + /// + public static WebServerOptions WithUrlPrefixes(this WebServerOptions @this, params string[] urlPrefixes) + => WithUrlPrefixes(@this, urlPrefixes as IEnumerable); + + /// + /// Sets the type of HTTP listener. + /// + /// The on which this method is called. + /// The type of HTTP listener. + /// with its Mode property + /// set to . + /// is . + /// The configuration of is locked. + public static WebServerOptions WithMode(this WebServerOptions @this, HttpListenerMode value) + { + @this.Mode = value; + return @this; + } + + /// + /// Sets the type of HTTP listener to . + /// + /// The on which this method is called. + /// with its Mode property + /// set to . + /// is . + /// The configuration of is locked. + public static WebServerOptions WithEmbedIOHttpListener(this WebServerOptions @this) + { + @this.Mode = HttpListenerMode.EmbedIO; + return @this; + } + + /// + /// Sets the type of HTTP listener to . + /// + /// The on which this method is called. + /// with its Mode property + /// set to . + /// is . + /// The configuration of is locked. + public static WebServerOptions WithMicrosoftHttpListener(this WebServerOptions @this) + { + @this.Mode = HttpListenerMode.Microsoft; + return @this; + } + + /// + /// Sets the X.509 certificate to use for SSL connections. + /// + /// The on which this method is called. + /// The X.509 certificate to use for SSL connections. + /// with its Certificate property + /// set to . + /// is . + /// The configuration of is locked. + public static WebServerOptions WithCertificate(this WebServerOptions @this, X509Certificate2 value) + { + @this.Certificate = value; + return @this; + } + + /// + /// Sets the thumbprint of the X.509 certificate to use for SSL connections. + /// + /// The on which this method is called. + /// The thumbprint of the X.509 certificate to use for SSL connections. + /// with its CertificateThumbprint property + /// set to . + /// is . + /// The configuration of is locked. + public static WebServerOptions WithCertificateThumbprint(this WebServerOptions @this, string value) + { + @this.CertificateThumbprint = value; + return @this; + } + + /// + /// Sets a value indicating whether to automatically load the X.509 certificate. + /// + /// The on which this method is called. + /// If , automatically load the X.509 certificate. + /// with its AutoLoadCertificate property + /// set to . + /// is . + /// The configuration of is locked. + /// is + /// and the underlying operating system is not Windows. + public static WebServerOptions WithAutoLoadCertificate(this WebServerOptions @this, bool value) + { + @this.AutoLoadCertificate = value; + return @this; + } + + /// + /// Instructs a instance to automatically load the X.509 certificate. + /// + /// The on which this method is called. + /// with its AutoLoadCertificate property + /// set to . + /// is . + /// The configuration of is locked. + /// The underlying operating system is not Windows. + public static WebServerOptions WithAutoLoadCertificate(this WebServerOptions @this) + { + @this.AutoLoadCertificate = true; + return @this; + } + + /// + /// Instructs a instance to not load the X.509 certificate automatically . + /// + /// The on which this method is called. + /// with its AutoLoadCertificate property + /// set to . + /// is . + /// The configuration of is locked. + public static WebServerOptions WithoutAutoLoadCertificate(this WebServerOptions @this) + { + @this.AutoLoadCertificate = false; + return @this; + } + + /// + /// Sets a value indicating whether to automatically bind the X.509 certificate + /// to the port used for HTTPS. + /// + /// The on which this method is called. + /// If , automatically bind the X.509 certificate + /// to the port used for HTTPS. + /// with its AutoRegisterCertificate property + /// set to . + /// is . + /// The configuration of is locked. + /// is + /// and the underlying operating system is not Windows. + public static WebServerOptions WithAutoRegisterCertificate(this WebServerOptions @this, bool value) + { + @this.AutoRegisterCertificate = value; + return @this; + } + + /// + /// Instructs a instance to automatically bind the X.509 certificate + /// to the port used for HTTPS. + /// + /// The on which this method is called. + /// with its AutoRegisterCertificate property + /// set to . + /// is . + /// The configuration of is locked. + /// The underlying operating system is not Windows. + public static WebServerOptions WithAutoRegisterCertificate(this WebServerOptions @this) + { + @this.AutoRegisterCertificate = true; + return @this; + } + + /// + /// Instructs a instance to not bind the X.509 certificate automatically. + /// + /// The on which this method is called. + /// with its AutoRegisterCertificate property + /// set to . + /// is . + /// The configuration of is locked. + public static WebServerOptions WithoutAutoRegisterCertificate(this WebServerOptions @this) + { + @this.AutoRegisterCertificate = false; + return @this; + } + + /// + /// Sets a value indicating the X.509 certificate store where to load the certificate from. + /// + /// The on which this method is called. + /// One of the constants. + /// with its StoreName property + /// set to . + /// is . + /// The configuration of is locked. + /// + public static WebServerOptions WithStoreName(this WebServerOptions @this, StoreName value) + { + @this.StoreName = value; + return @this; + } + + /// + /// Sets a value indicating the location of the X.509 certificate store where to load the certificate from. + /// + /// The on which this method is called. + /// One of the constants. + /// with its StoreLocation property + /// set to . + /// is . + /// The configuration of is locked. + /// + public static WebServerOptions WithStoreLocation(this WebServerOptions @this, StoreLocation value) + { + @this.StoreLocation = value; + return @this; + } + + /// + /// Sets the name and location of the X.509 certificate store where to load the certificate from. + /// + /// The on which this method is called. + /// One of the constants. + /// One of the constants. + /// with its StoreName property + /// set to and its StoreLocation property + /// set to . + /// is . + /// The configuration of is locked. + /// + /// + public static WebServerOptions WithStore(this WebServerOptions @this, StoreName name, StoreLocation location) + { + @this.StoreName = name; + @this.StoreLocation = location; + return @this; + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/WebServerState.cs b/Vendor/EmbedIO-3.5.2/WebServerState.cs new file mode 100644 index 0000000..5f05481 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/WebServerState.cs @@ -0,0 +1,36 @@ +namespace EmbedIO +{ + // NOTE TO CONTRIBUTORS: + // ===================== + // Do not reorder fields or change their values. + // It is important that WebServerState values represent, + // in ascending order, the stages of a web server's lifetime, + // so that comparisons can be made; for example, + // State < WebServerState.Listening means "not yet ready to accept requests". + + /// + /// Represents the state of a web server. + /// + public enum WebServerState + { + /// + /// The web server has not been started yet. + /// + Created, + + /// + /// The web server has been started but it is still initializing. + /// + Loading, + + /// + /// The web server is ready to accept incoming requests. + /// + Listening, + + /// + /// The web server has been stopped. + /// + Stopped, + } +} diff --git a/Vendor/EmbedIO-3.5.2/WebServerStateChangedEventArgs.cs b/Vendor/EmbedIO-3.5.2/WebServerStateChangedEventArgs.cs new file mode 100644 index 0000000..45382b1 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/WebServerStateChangedEventArgs.cs @@ -0,0 +1,31 @@ +using System; + +namespace EmbedIO +{ + /// + /// Represents event arguments whenever the state of a web server changes. + /// + public class WebServerStateChangedEventArgs : EventArgs + { + /// + /// Initializes a new instance of the class. + /// + /// The old state. + /// The new state. + public WebServerStateChangedEventArgs(WebServerState oldState, WebServerState newState) + { + OldState = oldState; + NewState = newState; + } + + /// + /// Gets the state to which the application service changed. + /// + public WebServerState NewState { get; } + + /// + /// Gets the old state. + /// + public WebServerState OldState { get; } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/WebServerStateChangedEventHandler.cs b/Vendor/EmbedIO-3.5.2/WebServerStateChangedEventHandler.cs new file mode 100644 index 0000000..43b5429 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/WebServerStateChangedEventHandler.cs @@ -0,0 +1,9 @@ +namespace EmbedIO +{ + /// + /// An event handler that is called whenever the state of a web server is changed. + /// + /// The sender. + /// The instance containing the event data. + public delegate void WebServerStateChangedEventHandler(object sender, WebServerStateChangedEventArgs e); +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/WebSockets/CloseStatusCode.cs b/Vendor/EmbedIO-3.5.2/WebSockets/CloseStatusCode.cs new file mode 100644 index 0000000..e04e579 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/WebSockets/CloseStatusCode.cs @@ -0,0 +1,97 @@ +namespace EmbedIO.WebSockets +{ + /// + /// Indicates the status code for the WebSocket connection close. + /// + /// + /// + /// The values of this enumeration are defined in + /// Section 7.4 of RFC 6455. + /// + /// + /// "Reserved value" must not be set as a status code in a connection close frame by + /// an endpoint. It's designated for use in applications expecting a status code to + /// indicate that the connection was closed due to the system grounds. + /// + /// + public enum CloseStatusCode : ushort + { + /// + /// Equivalent to close status 1000. Indicates normal close. + /// + Normal = 1000, + + /// + /// Equivalent to close status 1001. Indicates that an endpoint is going away. + /// + Away = 1001, + + /// + /// Equivalent to close status 1002. Indicates that an endpoint is terminating + /// the connection due to a protocol error. + /// + ProtocolError = 1002, + + /// + /// Equivalent to close status 1003. Indicates that an endpoint is terminating + /// the connection because it has received a type of data that it cannot accept. + /// + UnsupportedData = 1003, + + /// + /// Equivalent to close status 1004. Still undefined. A Reserved value. + /// + Undefined = 1004, + + /// + /// Equivalent to close status 1005. Indicates that no status code was actually present. + /// A Reserved value. + /// + NoStatus = 1005, + + /// + /// Equivalent to close status 1006. Indicates that the connection was closed abnormally. + /// A Reserved value. + /// + Abnormal = 1006, + + /// + /// Equivalent to close status 1007. Indicates that an endpoint is terminating + /// the connection because it has received a message that contains data that + /// isn't consistent with the type of the message. + /// + InvalidData = 1007, + + /// + /// Equivalent to close status 1008. Indicates that an endpoint is terminating + /// the connection because it has received a message that violates its policy. + /// + PolicyViolation = 1008, + + /// + /// Equivalent to close status 1009. Indicates that an endpoint is terminating + /// the connection because it has received a message that is too big to process. + /// + TooBig = 1009, + + /// + /// Equivalent to close status 1010. Indicates that a client is terminating + /// the connection because it has expected the server to negotiate one or more extension, + /// but the server didn't return them in the handshake response. + /// + MandatoryExtension = 1010, + + /// + /// Equivalent to close status 1011. Indicates that a server is terminating + /// the connection because it has encountered an unexpected condition that + /// prevented it from fulfilling the request. + /// + ServerError = 1011, + + /// + /// Equivalent to close status 1015. Indicates that the connection was closed + /// due to a failure to perform a TLS handshake. A Reserved value. + /// + TlsHandshakeFailure = 1015, + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/WebSockets/IWebSocket.cs b/Vendor/EmbedIO-3.5.2/WebSockets/IWebSocket.cs new file mode 100644 index 0000000..789c012 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/WebSockets/IWebSocket.cs @@ -0,0 +1,54 @@ +using System; +using System.Net.WebSockets; +using System.Threading; +using System.Threading.Tasks; + +namespace EmbedIO.WebSockets +{ + /// + /// + /// Interface to create a WebSocket implementation. + /// + /// + public interface IWebSocket : IDisposable + { + /// + /// Gets the state. + /// + /// + /// The state. + /// + WebSocketState State { get; } + + /// + /// Sends the buffer to the web socket asynchronously. + /// + /// The buffer. + /// if set to true [is text]. + /// The cancellation token. + /// + /// A task that represents the asynchronous of send data using websocket. + /// + Task SendAsync(byte[] buffer, bool isText, CancellationToken cancellationToken = default); + + /// + /// Closes the web socket asynchronously. + /// + /// The cancellation token. + /// + /// The task object representing the asynchronous operation. + /// + Task CloseAsync(CancellationToken cancellationToken = default); + + /// + /// Closes the web socket asynchronously. + /// + /// The code. + /// The comment. + /// The cancellation token. + /// + /// The task object representing the asynchronous operation. + /// + Task CloseAsync(CloseStatusCode code, string? comment = null, CancellationToken cancellationToken = default); + } +} diff --git a/Vendor/EmbedIO-3.5.2/WebSockets/IWebSocketContext.cs b/Vendor/EmbedIO-3.5.2/WebSockets/IWebSocketContext.cs new file mode 100644 index 0000000..2de842e --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/WebSockets/IWebSocketContext.cs @@ -0,0 +1,87 @@ +using System; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.Net; +using System.Security.Principal; +using System.Threading; +using EmbedIO.Sessions; + +namespace EmbedIO.WebSockets +{ + /// + /// Represents the context of a WebSocket connection. + /// + public interface IWebSocketContext + { + /// + /// Gets a unique identifier for a WebSocket context. + /// + string Id { get; } + + /// + /// Gets the used to cancel operations. + /// + CancellationToken CancellationToken { get; } + + /// + /// Gets the unique identifier of the opening handshake HTTP context. + /// + string HttpContextId { get; } + + /// + /// Gets the session proxy associated with the opening handshake HTTP context. + /// + ISessionProxy Session { get; } + + /// + /// Gets the dictionary of data associated with the opening handshake HTTP context. + /// + IDictionary Items { get; } + + /// + /// Gets the server IP address and port number to which the opening handshake request is directed. + /// + IPEndPoint LocalEndPoint { get; } + + /// + /// Gets the client IP address and port number from which the opening handshake request originated. + /// + IPEndPoint RemoteEndPoint { get; } + + /// The URI requested by the WebSocket client. + Uri RequestUri { get; } + + /// The HTTP headers that were sent to the server during the opening handshake. + NameValueCollection Headers { get; } + + /// The value of the Origin HTTP header included in the opening handshake. + string Origin { get; } + + /// The value of the SecWebSocketKey HTTP header included in the opening handshake. + string WebSocketVersion { get; } + + /// The list of subprotocols requested by the WebSocket client. + IEnumerable RequestedProtocols { get; } + + /// The accepted subprotocol. + string AcceptedProtocol { get; } + + /// The cookies that were passed to the server during the opening handshake. + ICookieCollection Cookies { get; } + + /// An object used to obtain identity, authentication information, and security roles for the WebSocket client. + IPrincipal User { get; } + + /// Whether the WebSocket client is authenticated. + bool IsAuthenticated { get; } + + /// Whether the WebSocket client connected from the local machine. + bool IsLocal { get; } + + /// Whether the WebSocket connection is secured using Secure Sockets Layer (SSL). + bool IsSecureConnection { get; } + + /// The interface used to interact with the WebSocket connection. + IWebSocket WebSocket { get; } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/WebSockets/IWebSocketReceiveResult.cs b/Vendor/EmbedIO-3.5.2/WebSockets/IWebSocketReceiveResult.cs new file mode 100644 index 0000000..af0cf31 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/WebSockets/IWebSocketReceiveResult.cs @@ -0,0 +1,32 @@ +namespace EmbedIO.WebSockets +{ + /// + /// Interface for WebSocket Receive Result object. + /// + public interface IWebSocketReceiveResult + { + /// + /// Gets the count. + /// + /// + /// The count. + /// + int Count { get; } + + /// + /// Gets a value indicating whether [end of message]. + /// + /// + /// true if [end of message]; otherwise, false. + /// + bool EndOfMessage { get; } + + /// + /// Gets the type of the message. + /// + /// + /// The type of the message. + /// + int MessageType { get; } + } +} diff --git a/Vendor/EmbedIO-3.5.2/WebSockets/Internal/Fin.cs b/Vendor/EmbedIO-3.5.2/WebSockets/Internal/Fin.cs new file mode 100644 index 0000000..920d0f2 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/WebSockets/Internal/Fin.cs @@ -0,0 +1,22 @@ +namespace EmbedIO.WebSockets.Internal +{ + /// + /// Indicates whether a WebSocket frame is the final frame of a message. + /// + /// + /// The values of this enumeration are defined in + /// Section 5.2 of RFC 6455. + /// + internal enum Fin : byte + { + /// + /// Equivalent to numeric value 0. Indicates more frames of a message follow. + /// + More = 0x0, + + /// + /// Equivalent to numeric value 1. Indicates the final frame of a message. + /// + Final = 0x1, + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/WebSockets/Internal/FragmentBuffer.cs b/Vendor/EmbedIO-3.5.2/WebSockets/Internal/FragmentBuffer.cs new file mode 100644 index 0000000..574b047 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/WebSockets/Internal/FragmentBuffer.cs @@ -0,0 +1,29 @@ +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +namespace EmbedIO.WebSockets.Internal +{ + internal class FragmentBuffer : MemoryStream + { + private readonly bool _fragmentsCompressed; + private readonly Opcode _fragmentsOpcode; + + public FragmentBuffer(Opcode frameOpcode, bool frameIsCompressed) + { + _fragmentsOpcode = frameOpcode; + _fragmentsCompressed = frameIsCompressed; + } + + public void AddPayload(MemoryStream data) => data.CopyTo(this, 1024); + + public async Task GetMessage(CompressionMethod compression) + { + var data = _fragmentsCompressed + ? await this.CompressAsync(compression, false, CancellationToken.None).ConfigureAwait(false) + : this; + + return new MessageEventArgs(_fragmentsOpcode, data.ToArray()); + } + } +} diff --git a/Vendor/EmbedIO-3.5.2/WebSockets/Internal/Mask.cs b/Vendor/EmbedIO-3.5.2/WebSockets/Internal/Mask.cs new file mode 100644 index 0000000..c6e4b11 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/WebSockets/Internal/Mask.cs @@ -0,0 +1,22 @@ +namespace EmbedIO.WebSockets.Internal +{ + /// + /// Indicates whether the payload data of a WebSocket frame is masked. + /// + /// + /// The values of this enumeration are defined in + /// Section 5.2 of RFC 6455. + /// + internal enum Mask : byte + { + /// + /// Equivalent to numeric value 0. Indicates not masked. + /// + Off = 0x0, + + /// + /// Equivalent to numeric value 1. Indicates masked. + /// + On = 0x1, + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/WebSockets/Internal/MessageEventArgs.cs b/Vendor/EmbedIO-3.5.2/WebSockets/Internal/MessageEventArgs.cs new file mode 100644 index 0000000..9fb383c --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/WebSockets/Internal/MessageEventArgs.cs @@ -0,0 +1,114 @@ +using System; +using Swan; + +namespace EmbedIO.WebSockets.Internal +{ + /// + /// Represents the event data for the event. + /// + /// + /// + /// That event occurs when the receives + /// a message or a ping if the + /// property is set to true. + /// + /// + /// If you would like to get the message data, you should access + /// the or property. + /// + /// + internal class MessageEventArgs : EventArgs + { + private readonly byte[] _rawData; + private string? _data; + private bool _dataSet; + + internal MessageEventArgs(WebSocketFrame frame) + { + Opcode = frame.Opcode; + _rawData = frame.PayloadData.ApplicationData.ToArray(); + } + + internal MessageEventArgs(Opcode opcode, byte[] rawData) + { + if ((ulong)rawData.Length > PayloadData.MaxLength) + throw new WebSocketException(CloseStatusCode.TooBig); + + Opcode = opcode; + _rawData = rawData; + } + + /// + /// Gets the message data as a . + /// + /// + /// A that represents the message data if its type is + /// text or ping and if decoding it to a string has successfully done; + /// otherwise, . + /// + public string? Data + { + get + { + SetData(); + return _data; + } + } + + /// + /// Gets a value indicating whether the message type is binary. + /// + /// + /// true if the message type is binary; otherwise, false. + /// + public bool IsBinary => Opcode == Opcode.Binary; + + /// + /// Gets a value indicating whether the message type is ping. + /// + /// + /// true if the message type is ping; otherwise, false. + /// + public bool IsPing => Opcode == Opcode.Ping; + + /// + /// Gets a value indicating whether the message type is text. + /// + /// + /// true if the message type is text; otherwise, false. + /// + public bool IsText => Opcode == Opcode.Text; + + /// + /// Gets the message data as an array of . + /// + /// + /// An array of that represents the message data. + /// + public byte[] RawData + { + get + { + SetData(); + return _rawData; + } + } + + internal Opcode Opcode { get; } + + private void SetData() + { + if (_dataSet) + return; + + if (Opcode == Opcode.Binary) + { + _dataSet = true; + return; + } + + _data = _rawData.ToText(); + _dataSet = true; + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/WebSockets/Internal/PayloadData.cs b/Vendor/EmbedIO-3.5.2/WebSockets/Internal/PayloadData.cs new file mode 100644 index 0000000..271c005 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/WebSockets/Internal/PayloadData.cs @@ -0,0 +1,74 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using Swan; +using EmbedIO.Net.Internal; + +namespace EmbedIO.WebSockets.Internal +{ + internal class PayloadData + { + public const ulong MaxLength = long.MaxValue; + + private readonly byte[] _data; + private ushort? _code; + + internal PayloadData(byte[] data) + { + _data = data; + } + + internal PayloadData(ushort code = 1005, string? reason = null) + { + _code = code; + _data = code == 1005 ? Array.Empty() : Append(code, reason); + } + + internal MemoryStream ApplicationData => new MemoryStream(_data); + + internal ulong Length => (ulong)_data.Length; + + internal ushort Code + { + get + { + if (!_code.HasValue) + { + _code = _data.Length > 1 + ? BitConverter.ToUInt16(_data.Take(2).ToArray().ToHostOrder(Endianness.Big), 0) + : (ushort)1005; + } + + return _code.Value; + } + } + + internal bool HasReservedCode => _data.Length > 1 && (Code == (ushort)CloseStatusCode.Undefined || + Code == (ushort)CloseStatusCode.NoStatus || + Code == (ushort)CloseStatusCode.Abnormal || + Code == (ushort)CloseStatusCode.TlsHandshakeFailure); + + public override string ToString() => BitConverter.ToString(_data); + + internal static byte[] Append(ushort code, string? reason) + { + var ret = code.ToByteArray(Endianness.Big); + if (string.IsNullOrEmpty(reason)) return ret; + + var buff = new List(ret); + buff.AddRange(Encoding.UTF8.GetBytes(reason)); + + return buff.ToArray(); + } + + internal void Mask(byte[] key) + { + for (long i = 0; i < _data.Length; i++) + _data[i] = (byte)(_data[i] ^ key[i % 4]); + } + + internal byte[] ToArray() => _data; + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/WebSockets/Internal/Rsv.cs b/Vendor/EmbedIO-3.5.2/WebSockets/Internal/Rsv.cs new file mode 100644 index 0000000..f953c60 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/WebSockets/Internal/Rsv.cs @@ -0,0 +1,22 @@ +namespace EmbedIO.WebSockets.Internal +{ + /// + /// Indicates whether each RSV (RSV1, RSV2, and RSV3) of a WebSocket frame is non-zero. + /// + /// + /// The values of this enumeration are defined in + /// Section 5.2 of RFC 6455. + /// + internal enum Rsv : byte + { + /// + /// Equivalent to numeric value 0. Indicates zero. + /// + Off = 0x0, + + /// + /// Equivalent to numeric value 1. Indicates non-zero. + /// + On = 0x1, + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/WebSockets/Internal/StreamExtensions.cs b/Vendor/EmbedIO-3.5.2/WebSockets/Internal/StreamExtensions.cs new file mode 100644 index 0000000..83c6a43 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/WebSockets/Internal/StreamExtensions.cs @@ -0,0 +1,66 @@ +using System; +using System.IO; +using System.IO.Compression; +using System.Threading; +using System.Threading.Tasks; + +namespace EmbedIO.WebSockets.Internal +{ + internal static class StreamExtensions + { + private static readonly byte[] LastByte = { 0x00 }; + + // Compresses or decompresses a stream using the specified compression method. + public static async Task CompressAsync( + this Stream @this, + CompressionMethod method, + bool compress, + CancellationToken cancellationToken) + { + @this.Position = 0; + var targetStream = new MemoryStream(); + + switch (method) + { + case CompressionMethod.Deflate: + if (compress) + { + using var compressor = new DeflateStream(targetStream, CompressionMode.Compress, true); + await @this.CopyToAsync(compressor, 1024, cancellationToken).ConfigureAwait(false); + await @this.CopyToAsync(compressor).ConfigureAwait(false); + + // WebSocket use this + targetStream.Write(LastByte, 0, 1); + targetStream.Position = 0; + } + else + { + using var compressor = new DeflateStream(@this, CompressionMode.Decompress); + await compressor.CopyToAsync(targetStream).ConfigureAwait(false); + } + + break; + case CompressionMethod.Gzip: + if (compress) + { + using var compressor = new GZipStream(targetStream, CompressionMode.Compress, true); + await @this.CopyToAsync(compressor).ConfigureAwait(false); + } + else + { + using var compressor = new GZipStream(@this, CompressionMode.Decompress); + await compressor.CopyToAsync(targetStream).ConfigureAwait(false); + } + + break; + case CompressionMethod.None: + await @this.CopyToAsync(targetStream).ConfigureAwait(false); + break; + default: + throw new ArgumentOutOfRangeException(nameof(method), method, null); + } + + return targetStream; + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/WebSockets/Internal/SystemWebSocket.cs b/Vendor/EmbedIO-3.5.2/WebSockets/Internal/SystemWebSocket.cs new file mode 100644 index 0000000..8f56594 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/WebSockets/Internal/SystemWebSocket.cs @@ -0,0 +1,66 @@ +using System; +using System.Net.WebSockets; +using System.Threading; +using System.Threading.Tasks; + +namespace EmbedIO.WebSockets.Internal +{ + internal sealed class SystemWebSocket : IWebSocket + { + public SystemWebSocket(System.Net.WebSockets.WebSocket webSocket) + { + UnderlyingWebSocket = webSocket; + } + + ~SystemWebSocket() + { + Dispose(false); + } + + public System.Net.WebSockets.WebSocket UnderlyingWebSocket { get; } + + public WebSocketState State => UnderlyingWebSocket.State; + + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + /// + public Task SendAsync(byte[] buffer, bool isText, CancellationToken cancellationToken = default) + => UnderlyingWebSocket.SendAsync( + new ArraySegment(buffer), + isText ? WebSocketMessageType.Text : WebSocketMessageType.Binary, + true, + cancellationToken); + + /// + public Task CloseAsync(CancellationToken cancellationToken = default) => + UnderlyingWebSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, cancellationToken); + + /// + public Task CloseAsync(CloseStatusCode code, string? comment = null, CancellationToken cancellationToken = default)=> + UnderlyingWebSocket.CloseAsync(MapCloseStatus(code), comment ?? string.Empty, cancellationToken); + + private void Dispose(bool disposing) + { + if (!disposing) + return; + + UnderlyingWebSocket.Dispose(); + } + + private WebSocketCloseStatus MapCloseStatus(CloseStatusCode code) => code switch { + CloseStatusCode.Normal => WebSocketCloseStatus.NormalClosure, + CloseStatusCode.ProtocolError => WebSocketCloseStatus.ProtocolError, + CloseStatusCode.InvalidData => WebSocketCloseStatus.InvalidPayloadData, + CloseStatusCode.UnsupportedData => WebSocketCloseStatus.InvalidPayloadData, + CloseStatusCode.PolicyViolation => WebSocketCloseStatus.PolicyViolation, + CloseStatusCode.TooBig => WebSocketCloseStatus.MessageTooBig, + CloseStatusCode.MandatoryExtension => WebSocketCloseStatus.MandatoryExtension, + CloseStatusCode.ServerError => WebSocketCloseStatus.InternalServerError, + _ => throw new ArgumentOutOfRangeException(nameof(code), code, null) + }; + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/WebSockets/Internal/SystemWebSocketReceiveResult.cs b/Vendor/EmbedIO-3.5.2/WebSockets/Internal/SystemWebSocketReceiveResult.cs new file mode 100644 index 0000000..98ce67f --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/WebSockets/Internal/SystemWebSocketReceiveResult.cs @@ -0,0 +1,29 @@ +namespace EmbedIO.WebSockets.Internal +{ + /// + /// Represents a wrapper around a regular WebSocketContext. + /// + /// + internal sealed class SystemWebSocketReceiveResult : IWebSocketReceiveResult + { + private readonly System.Net.WebSockets.WebSocketReceiveResult _results; + + /// + /// Initializes a new instance of the class. + /// + /// The results. + public SystemWebSocketReceiveResult(System.Net.WebSockets.WebSocketReceiveResult results) + { + _results = results; + } + + /// + public int Count => _results.Count; + + /// + public bool EndOfMessage=> _results.EndOfMessage; + + /// + public int MessageType => (int) _results.MessageType; + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/WebSockets/Internal/WebSocket.cs b/Vendor/EmbedIO-3.5.2/WebSockets/Internal/WebSocket.cs new file mode 100644 index 0000000..6595c5f --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/WebSockets/Internal/WebSocket.cs @@ -0,0 +1,561 @@ +using System; +using System.Collections.Concurrent; +using System.IO; +using System.Net.WebSockets; +using System.Security.Cryptography; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using EmbedIO.Net.Internal; +using Swan; +using Swan.Logging; + +namespace EmbedIO.WebSockets.Internal +{ + /// + /// Implements the WebSocket interface. + /// + /// + /// The WebSocket class provides a set of methods and properties for two-way communication using + /// the WebSocket protocol (RFC 6455). + /// + internal sealed class WebSocket : IWebSocket + { + public const string SupportedVersion = "13"; + + private readonly object _stateSyncRoot = new (); + private readonly ConcurrentQueue _messageEventQueue = new (); + private readonly Action _closeConnection; + private readonly TimeSpan _waitTime = TimeSpan.FromSeconds(1); + + private volatile WebSocketState _readyState; + private AutoResetEvent? _exitReceiving; + private FragmentBuffer? _fragmentsBuffer; + private volatile bool _inMessage; + private AutoResetEvent? _receivePong; + private Stream? _stream; + + private WebSocket(HttpConnection connection) + { + _closeConnection = connection.ForceClose; + _stream = connection.Stream; + _readyState = WebSocketState.Open; + } + + ~WebSocket() + { + Dispose(false); + } + + /// + /// Occurs when the receives a message. + /// + public event EventHandler? OnMessage; + + /// + public WebSocketState State => _readyState; + + internal CompressionMethod Compression { get; } = CompressionMethod.None; + + internal bool EmitOnPing { get; set; } + + internal bool InContinuation { get; private set; } + + /// + public Task SendAsync(byte[] buffer, bool isText, CancellationToken cancellationToken) => SendAsync(buffer, isText ? Opcode.Text : Opcode.Binary, cancellationToken); + + /// + public Task CloseAsync(CancellationToken cancellationToken = default) => CloseAsync(CloseStatusCode.Normal, cancellationToken: cancellationToken); + + /// + public Task CloseAsync( + CloseStatusCode code = CloseStatusCode.Undefined, + string? reason = null, + CancellationToken cancellationToken = default) + { + bool CheckParametersForClose() + { + if (code == CloseStatusCode.NoStatus && !string.IsNullOrEmpty(reason)) + { + "'code' cannot have a reason.".Trace(nameof(WebSocket)); + return false; + } + + if (code == CloseStatusCode.MandatoryExtension) + { + "'code' cannot be used by a server.".Trace(nameof(WebSocket)); + return false; + } + + if (!string.IsNullOrEmpty(reason) && Encoding.UTF8.GetBytes(reason).Length > 123) + { + "The size of 'reason' is greater than the allowable max size.".Trace(nameof(WebSocket)); + return false; + } + + return true; + } + + if (_readyState != WebSocketState.Open) + { + return Task.CompletedTask; + } + + if (code != CloseStatusCode.Undefined && !CheckParametersForClose()) + { + return Task.CompletedTask; + } + + if (code == CloseStatusCode.NoStatus) + { + return InternalCloseAsync(cancellationToken: cancellationToken); + } + + var send = !IsOpcodeReserved(code); + return InternalCloseAsync(new PayloadData((ushort)code, reason), send, send, cancellationToken); + } + + /// + /// Sends a ping using the WebSocket connection. + /// + /// + /// true if the receives a pong to this ping in a time; + /// otherwise, false. + /// + public Task PingAsync() => PingAsync(WebSocketFrame.EmptyPingBytes, _waitTime); + + /// + /// Sends a ping with the specified using the WebSocket connection. + /// + /// + /// true if the receives a pong to this ping in a time; + /// otherwise, false. + /// + /// + /// A that represents the message to send. + /// + public Task PingAsync(string message) + { + if (string.IsNullOrEmpty(message)) + { + return PingAsync(); + } + + var data = Encoding.UTF8.GetBytes(message); + + if (data.Length <= 125) + { + return PingAsync(WebSocketFrame.CreatePingFrame(data).ToArray(), _waitTime); + } + + "A message has greater than the allowable max size.".Error(nameof(PingAsync)); + + return Task.FromResult(false); + } + + /// + /// Sends binary using the WebSocket connection. + /// + /// An array of that represents the binary data to send. + /// The opcode. + /// The cancellation token. + /// + /// A task that represents the asynchronous of send + /// binary data using websocket. + /// +#pragma warning disable CA1801 // Unused parameter + public async Task SendAsync(byte[] data, Opcode opcode, CancellationToken cancellationToken = default) +#pragma warning restore CA1801 + { + if (_readyState != WebSocketState.Open) + { + throw new WebSocketException(CloseStatusCode.Normal, $"This operation isn\'t available in: {_readyState}"); + } + + using var stream = new WebSocketStream(data, opcode, Compression); + foreach (var frame in stream.GetFrames()) + { + await Send(frame).ConfigureAwait(false); + } + } + + /// + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + internal static async Task AcceptAsync(HttpListenerContext httpContext, string acceptedProtocol) + { + static string CreateResponseKey(string clientKey) + { + const string Guid = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; + + var buff = new StringBuilder(clientKey, 64).Append(Guid); +#pragma warning disable CA5350 // Do Not Use Weak Cryptographic Algorithms + using var sha1 = SHA1.Create(); + return Convert.ToBase64String(sha1.ComputeHash(Encoding.UTF8.GetBytes(buff.ToString()))); +#pragma warning restore CA5350 // Do Not Use Weak Cryptographic Algorithms + } + + var requestHeaders = httpContext.Request.Headers; + + var webSocketKey = requestHeaders[HttpHeaderNames.SecWebSocketKey]; + + if (string.IsNullOrEmpty(webSocketKey)) + { + throw new WebSocketException(CloseStatusCode.ProtocolError, $"Includes no {HttpHeaderNames.SecWebSocketKey} header, or it has an invalid value."); + } + + var webSocketVersion = requestHeaders[HttpHeaderNames.SecWebSocketVersion]; + + if (webSocketVersion == null || webSocketVersion != SupportedVersion) + { + throw new WebSocketException(CloseStatusCode.ProtocolError, $"Includes no {HttpHeaderNames.SecWebSocketVersion} header, or it has an invalid value."); + } + + var handshakeResponse = new WebSocketHandshakeResponse(httpContext); + + handshakeResponse.Headers[HttpHeaderNames.SecWebSocketAccept] = CreateResponseKey(webSocketKey); + + if (acceptedProtocol.Length > 0) + { + handshakeResponse.Headers[HttpHeaderNames.SecWebSocketProtocol] = acceptedProtocol; + } + + var bytes = Encoding.UTF8.GetBytes(handshakeResponse.ToString()); + await httpContext.Connection.Stream.WriteAsync(bytes, 0, bytes.Length).ConfigureAwait(false); + + // Signal the original response that headers have been sent. + httpContext.HttpListenerResponse.HeadersSent = true; + + var socket = new WebSocket(httpContext.Connection); + socket.Open(); + return socket; + } + + internal async Task PingAsync(byte[] frameAsBytes, TimeSpan timeout) + { + if (_readyState != WebSocketState.Open) + { + return false; + } + + await _stream.WriteAsync(frameAsBytes, 0, frameAsBytes.Length).ConfigureAwait(false); + + return _receivePong != null && _receivePong.WaitOne(timeout); + } + + private static bool IsOpcodeReserved(CloseStatusCode code) + => code == CloseStatusCode.Undefined + || code == CloseStatusCode.NoStatus + || code == CloseStatusCode.Abnormal + || code == CloseStatusCode.TlsHandshakeFailure; + +#pragma warning disable CA1801 // Unused parameter + private void Dispose(bool disposing) +#pragma warning restore CA1801 + { + try + { + InternalCloseAsync(new PayloadData((ushort)CloseStatusCode.Away)).Await(); + } + catch + { + // Ignored + } + } + + private async Task InternalCloseAsync( + PayloadData? payloadData = null, + bool send = true, + bool receive = true, + CancellationToken cancellationToken = default) + { + lock (_stateSyncRoot) + { + if (_readyState == WebSocketState.CloseReceived || _readyState == WebSocketState.CloseSent) + { + "The closing is already in progress.".Trace(nameof(InternalCloseAsync)); + return; + } + + if (_readyState == WebSocketState.Closed) + { + "The connection has been closed.".Trace(nameof(InternalCloseAsync)); + return; + } + + send = send && _readyState == WebSocketState.Open; + receive = receive && send; + + _readyState = WebSocketState.CloseSent; + } + + "Begin closing the connection.".Trace(nameof(InternalCloseAsync)); + + var bytes = send ? WebSocketFrame.CreateCloseFrame(payloadData).ToArray() : null; + await CloseHandshakeAsync(bytes, receive, cancellationToken).ConfigureAwait(false); + ReleaseResources(); + + "End closing the connection.".Trace(nameof(InternalCloseAsync)); + + lock (_stateSyncRoot) + { + _readyState = WebSocketState.Closed; + } + } + + private async Task CloseHandshakeAsync( + byte[]? frameAsBytes, + bool receive, + CancellationToken cancellationToken) + { + var sent = frameAsBytes != null; + + if (sent) + { + await _stream.WriteAsync(frameAsBytes, 0, frameAsBytes.Length, cancellationToken).ConfigureAwait(false); + } + + if (receive && sent) + { + _ = _exitReceiving?.WaitOne(_waitTime); + } + } + + private void Fatal(string message, Exception? exception = null) + => Fatal(message, (exception as WebSocketException)?.Code ?? CloseStatusCode.Abnormal); + + private void Fatal(string message, CloseStatusCode code) + => InternalCloseAsync(new PayloadData((ushort)code, message), !IsOpcodeReserved(code), false).Await(); + + private void Message() + { + if (_inMessage || _messageEventQueue.IsEmpty || _readyState != WebSocketState.Open) + { + return; + } + + _inMessage = true; + + if (_messageEventQueue.TryDequeue(out var e)) + { + Messages(e); + } + } + + private void Messages(MessageEventArgs e) + { + try + { + OnMessage?.Invoke(this, e); + } + catch (Exception ex) + { + ex.Log(nameof(WebSocket)); + } + + if (!_messageEventQueue.TryDequeue(out e) || _readyState != WebSocketState.Open) + { + _inMessage = false; + return; + } + + _ = Task.Run(() => Messages(e)); + } + + private void Open() + { + _inMessage = true; + StartReceiving(); + + if (!_messageEventQueue.TryDequeue(out var e) || _readyState != WebSocketState.Open) + { + _inMessage = false; + return; + } + + Messages(e); + } + + private Task ProcessCloseFrame(WebSocketFrame frame) => InternalCloseAsync(frame.PayloadData, !frame.PayloadData.HasReservedCode, false); + + private async Task ProcessDataFrame(WebSocketFrame frame) + { + if (frame.IsCompressed) + { + using var ms = await frame.PayloadData.ApplicationData.CompressAsync(Compression, false, CancellationToken.None).ConfigureAwait(false); + + _messageEventQueue.Enqueue(new MessageEventArgs(frame.Opcode, ms.ToArray())); + } + else + { + _messageEventQueue.Enqueue(new MessageEventArgs(frame)); + } + } + + private async Task ProcessFragmentFrame(WebSocketFrame frame) + { + if (!InContinuation) + { + // Must process first fragment. + if (frame.Opcode == Opcode.Cont) + { + return; + } + + _fragmentsBuffer = new FragmentBuffer(frame.Opcode, frame.IsCompressed); + InContinuation = true; + } + + _fragmentsBuffer.AddPayload(frame.PayloadData.ApplicationData); + + if (frame.Fin == Fin.Final) + { + using (_fragmentsBuffer) + { + _messageEventQueue.Enqueue(await _fragmentsBuffer.GetMessage(Compression).ConfigureAwait(false)); + } + + _fragmentsBuffer = null; + InContinuation = false; + } + } + + private Task ProcessPingFrame(WebSocketFrame frame) + { + if (EmitOnPing) + { + _messageEventQueue.Enqueue(new MessageEventArgs(frame)); + } + + return Send(new WebSocketFrame(Opcode.Pong, frame.PayloadData)); + } + + private void ProcessPongFrame() + { + _ = _receivePong?.Set(); + "Received a pong.".Trace(nameof(ProcessPongFrame)); + } + + private async Task ProcessReceivedFrame(WebSocketFrame frame) + { + if (frame.IsFragment) + { + await ProcessFragmentFrame(frame).ConfigureAwait(false); + } + else + { + switch (frame.Opcode) + { + case Opcode.Text: + case Opcode.Binary: + await ProcessDataFrame(frame).ConfigureAwait(false); + break; + case Opcode.Ping: + await ProcessPingFrame(frame).ConfigureAwait(false); + break; + case Opcode.Pong: + ProcessPongFrame(); + break; + case Opcode.Close: + await ProcessCloseFrame(frame).ConfigureAwait(false); + break; + default: + Fatal($"Unsupported frame received: {frame.PrintToString()}", CloseStatusCode.PolicyViolation); + return false; + } + } + + return true; + } + + private void ReleaseResources() + { + _closeConnection(); + _stream = null; + + if (_fragmentsBuffer != null) + { + _fragmentsBuffer.Dispose(); + _fragmentsBuffer = null; + InContinuation = false; + } + + if (_receivePong != null) + { + _receivePong.Dispose(); + _receivePong = null; + } + + if (_exitReceiving == null) + { + return; + } + + _exitReceiving.Dispose(); + _exitReceiving = null; + } + + private Task Send(WebSocketFrame frame) + { + lock (_stateSyncRoot) + { + if (_readyState != WebSocketState.Open) + { + "The sending has been interrupted.".Error(nameof(Send)); + return Task.Delay(0); + } + } + + var frameAsBytes = frame.ToArray(); + return _stream.WriteAsync(frameAsBytes, 0, frameAsBytes.Length); + } + + private void StartReceiving() + { + while (_messageEventQueue.TryDequeue(out _)) + { + // do nothing + } + + _exitReceiving = new AutoResetEvent(false); + _receivePong = new AutoResetEvent(false); + + var frameStream = new WebSocketFrameStream(_stream); + + _ = Task.Run(async () => + { + while (_readyState == WebSocketState.Open) + { + try + { + var frame = await frameStream.ReadFrameAsync(this).ConfigureAwait(false); + + if (frame == null) + { + return; + } + + var result = await ProcessReceivedFrame(frame).ConfigureAwait(false); + + if (!result || _readyState == WebSocketState.Closed) + { + _ = _exitReceiving?.Set(); + + return; + } + + _ = Task.Run(Message); + } + catch (Exception ex) + { + Fatal("An exception has occurred while receiving.", ex); + } + } + }); + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/WebSockets/Internal/WebSocketContext.cs b/Vendor/EmbedIO-3.5.2/WebSockets/Internal/WebSocketContext.cs new file mode 100644 index 0000000..14f6b20 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/WebSockets/Internal/WebSocketContext.cs @@ -0,0 +1,100 @@ +using System; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.Net; +using System.Security.Principal; +using System.Threading; +using EmbedIO.Sessions; +using EmbedIO.Utilities; + +namespace EmbedIO.WebSockets.Internal +{ + internal sealed class WebSocketContext : IWebSocketContext + { + internal WebSocketContext( + IHttpContextImpl httpContext, + string webSocketVersion, + IEnumerable requestedProtocols, + string acceptedProtocol, + IWebSocket webSocket, + CancellationToken cancellationToken) + { + Id = UniqueIdGenerator.GetNext(); + CancellationToken = cancellationToken; + HttpContextId = httpContext.Id; + Session = httpContext.Session; + Items = httpContext.Items; + LocalEndPoint = httpContext.LocalEndPoint; + RemoteEndPoint = httpContext.RemoteEndPoint; + RequestUri = httpContext.Request.Url; + Headers = httpContext.Request.Headers; + Origin = Headers[HttpHeaderNames.Origin]; + RequestedProtocols = requestedProtocols; + AcceptedProtocol = acceptedProtocol; + WebSocketVersion = webSocketVersion; + Cookies = httpContext.Request.Cookies; + User = httpContext.User; + IsAuthenticated = httpContext.User.Identity.IsAuthenticated; + IsLocal = httpContext.Request.IsLocal; + IsSecureConnection = httpContext.Request.IsSecureConnection; + WebSocket = webSocket; + } + + /// + public string Id { get; } + + /// + public CancellationToken CancellationToken { get; } + + /// + public string HttpContextId { get; } + + /// + public ISessionProxy Session { get; } + + /// + public IDictionary Items { get; } + + /// + public IPEndPoint LocalEndPoint { get; } + + /// + public IPEndPoint RemoteEndPoint { get; } + + /// + public Uri RequestUri { get; } + + /// + public NameValueCollection Headers { get; } + + /// + public string Origin { get; } + + /// + public IEnumerable RequestedProtocols { get; } + + /// + public string AcceptedProtocol { get; } + + /// + public string WebSocketVersion { get; } + + /// + public ICookieCollection Cookies { get; } + + /// + public IPrincipal User { get; } + + /// + public bool IsAuthenticated { get; } + + /// + public bool IsLocal { get; } + + /// + public bool IsSecureConnection { get; } + + /// + public IWebSocket WebSocket { get; } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/WebSockets/Internal/WebSocketFrame.cs b/Vendor/EmbedIO-3.5.2/WebSockets/Internal/WebSocketFrame.cs new file mode 100644 index 0000000..c63adcc --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/WebSockets/Internal/WebSocketFrame.cs @@ -0,0 +1,239 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using EmbedIO.Net.Internal; +using Swan; + +namespace EmbedIO.WebSockets.Internal +{ + internal class WebSocketFrame + { + internal static readonly byte[] EmptyPingBytes = CreatePingFrame().ToArray(); + + internal WebSocketFrame(Opcode opcode, PayloadData payloadData) + : this(Fin.Final, opcode, payloadData) + { + } + + internal WebSocketFrame(Fin fin, Opcode opcode, byte[] data, bool compressed) + : this(fin, opcode, new PayloadData(data), compressed) + { + } + + internal WebSocketFrame( + Fin fin, + Opcode opcode, + PayloadData payloadData, + bool compressed = false) + { + Fin = fin; + Rsv1 = IsOpcodeData(opcode) && compressed ? Rsv.On : Rsv.Off; + Rsv2 = Rsv.Off; + Rsv3 = Rsv.Off; + Opcode = opcode; + + var len = payloadData.Length; + if (len < 126) + { + PayloadLength = (byte)len; + ExtendedPayloadLength = Array.Empty(); + } + else if (len < 0x010000) + { + PayloadLength = 126; + ExtendedPayloadLength = ((ushort)len).ToByteArray(Endianness.Big); + } + else + { + PayloadLength = 127; + ExtendedPayloadLength = len.ToByteArray(Endianness.Big); + } + + Mask = Mask.Off; + MaskingKey = Array.Empty(); + PayloadData = payloadData; + } + + internal WebSocketFrame( + Fin fin, + Rsv rsv1, + Rsv rsv2, + Rsv rsv3, + Opcode opcode, + Mask mask, + byte payloadLength) + { + Fin = fin; + Rsv1 = rsv1; + Rsv2 = rsv2; + Rsv3 = rsv3; + Opcode = opcode; + Mask = mask; + PayloadLength = payloadLength; + } + + public byte[]? ExtendedPayloadLength { get; internal set; } + + public Fin Fin { get; internal set; } + + public bool IsCompressed => Rsv1 == Rsv.On; + + public bool IsFragment => Fin == Fin.More || Opcode == Opcode.Cont; + + public bool IsMasked => Mask == Mask.On; + + public Mask Mask { get; internal set; } + + public byte[] MaskingKey { get; internal set; } + + public Opcode Opcode { get; internal set; } + + public PayloadData PayloadData { get; internal set; } + + public byte PayloadLength { get; internal set; } + + public Rsv Rsv1 { get; internal set; } + + public Rsv Rsv2 { get; internal set; } + + public Rsv Rsv3 { get; internal set; } + + internal int ExtendedPayloadLengthCount => PayloadLength < 126 ? 0 : (PayloadLength == 126 ? 2 : 8); + + internal ulong FullPayloadLength => PayloadLength < 126 + ? PayloadLength + : PayloadLength == 126 + ? BitConverter.ToUInt16(ExtendedPayloadLength.ToHostOrder(Endianness.Big), 0) + : BitConverter.ToUInt64(ExtendedPayloadLength.ToHostOrder(Endianness.Big), 0); + + public IEnumerator GetEnumerator() => ((IEnumerable)ToArray()).GetEnumerator(); + + public string PrintToString() + { + // Payload Length + var payloadLen = PayloadLength; + + // Extended Payload Length + var extPayloadLen = payloadLen > 125 ? FullPayloadLength.ToString(CultureInfo.InvariantCulture) : string.Empty; + + // Masking Key + var maskingKey = BitConverter.ToString(MaskingKey); + + // Payload Data + var payload = payloadLen == 0 + ? string.Empty + : payloadLen > 125 + ? "---" + : Opcode == Opcode.Text && !(IsFragment || IsMasked || IsCompressed) + ? PayloadData.ApplicationData.ToArray().ToText() + : PayloadData.ToString(); + + return $@" + FIN: {Fin} + RSV1: {Rsv1} + RSV2: {Rsv2} + RSV3: {Rsv3} + Opcode: {Opcode} + MASK: {Mask} + Payload Length: {payloadLen} +Extended Payload Length: {extPayloadLen} + Masking Key: {maskingKey} + Payload Data: {payload}"; + } + + public byte[] ToArray() + { + using var buff = new MemoryStream(); + var header = (int)Fin; + + header = (header << 1) + (int)Rsv1; + header = (header << 1) + (int)Rsv2; + header = (header << 1) + (int)Rsv3; + header = (header << 4) + (int)Opcode; + header = (header << 1) + (int)Mask; + header = (header << 7) + PayloadLength; + buff.Write(((ushort)header).ToByteArray(Endianness.Big), 0, 2); + + if (PayloadLength > 125) + { + buff.Write(ExtendedPayloadLength, 0, PayloadLength == 126 ? 2 : 8); + } + + if (Mask == Mask.On) + { + buff.Write(MaskingKey, 0, 4); + } + + if (PayloadLength > 0) + { + var bytes = PayloadData.ToArray(); + if (PayloadLength < 127) + { + buff.Write(bytes, 0, bytes.Length); + } + else + { + using var input = new MemoryStream(bytes); + input.CopyTo(buff, 1024); + } + } + + return buff.ToArray(); + } + + public override string ToString() => BitConverter.ToString(ToArray()); + + internal static WebSocketFrame CreateCloseFrame(PayloadData? payloadData) => new (Fin.Final, Opcode.Close, payloadData ?? new PayloadData()); + + internal static WebSocketFrame CreatePingFrame() => new (Fin.Final, Opcode.Ping, new PayloadData()); + + internal static WebSocketFrame CreatePingFrame(byte[] data) => new (Fin.Final, Opcode.Ping, new PayloadData(data)); + + internal void Validate(WebSocket webSocket) + { + if (!IsMasked) + { + throw new WebSocketException(CloseStatusCode.ProtocolError, "A frame from a client isn't masked."); + } + + if (webSocket.InContinuation && (Opcode == Opcode.Text || Opcode == Opcode.Binary)) + { + throw new WebSocketException(CloseStatusCode.ProtocolError, + "A data frame has been received while receiving continuation frames."); + } + + if (IsCompressed && webSocket.Compression == CompressionMethod.None) + { + throw new WebSocketException(CloseStatusCode.ProtocolError, + "A compressed frame has been received without any agreement for it."); + } + + if (Rsv2 == Rsv.On) + { + throw new WebSocketException(CloseStatusCode.ProtocolError, + "The RSV2 of a frame is non-zero without any negotiation for it."); + } + + if (Rsv3 == Rsv.On) + { + throw new WebSocketException(CloseStatusCode.ProtocolError, + "The RSV3 of a frame is non-zero without any negotiation for it."); + } + } + + internal void Unmask() + { + if (Mask == Mask.Off) + { + return; + } + + Mask = Mask.Off; + PayloadData.Mask(MaskingKey); + MaskingKey = Array.Empty(); + } + + private static bool IsOpcodeData(Opcode opcode) => opcode == Opcode.Text || opcode == Opcode.Binary; + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/WebSockets/Internal/WebSocketFrameStream.cs b/Vendor/EmbedIO-3.5.2/WebSockets/Internal/WebSocketFrameStream.cs new file mode 100644 index 0000000..a5b58b3 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/WebSockets/Internal/WebSocketFrameStream.cs @@ -0,0 +1,148 @@ +using System; +using System.IO; +using System.Threading.Tasks; +using Swan; + +namespace EmbedIO.WebSockets.Internal +{ + internal class WebSocketFrameStream + { + private readonly bool _unmask; + private readonly Stream? _stream; + + public WebSocketFrameStream(Stream? stream, bool unmask = false) + { + _stream = stream; + _unmask = unmask; + } + + internal async Task ReadFrameAsync(WebSocket webSocket) + { + if (_stream == null) return null; + + var frame = ProcessHeader(await _stream.ReadBytesAsync(2).ConfigureAwait(false)); + + await ReadExtendedPayloadLengthAsync(frame).ConfigureAwait(false); + await ReadMaskingKeyAsync(frame).ConfigureAwait(false); + await ReadPayloadDataAsync(frame).ConfigureAwait(false); + + if (_unmask) + frame.Unmask(); + + frame.Validate(webSocket); + + frame.Unmask(); + + return frame; + } + + private static bool IsOpcodeData(byte opcode) => opcode == 0x1 || opcode == 0x2; + + private static bool IsOpcodeControl(byte opcode) => opcode > 0x7 && opcode < 0x10; + + private static WebSocketFrame ProcessHeader(byte[] header) + { + if (header.Length != 2) + throw new WebSocketException("The header of a frame cannot be read from the stream."); + + // FIN + var fin = (header[0] & 0x80) == 0x80 ? Fin.Final : Fin.More; + + // RSV1 + var rsv1 = (header[0] & 0x40) == 0x40 ? Rsv.On : Rsv.Off; + + // RSV2 + var rsv2 = (header[0] & 0x20) == 0x20 ? Rsv.On : Rsv.Off; + + // RSV3 + var rsv3 = (header[0] & 0x10) == 0x10 ? Rsv.On : Rsv.Off; + + // Opcode + var opcode = (byte)(header[0] & 0x0f); + + // MASK + var mask = (header[1] & 0x80) == 0x80 ? Mask.On : Mask.Off; + + // Payload Length + var payloadLen = (byte)(header[1] & 0x7f); + + var err = !Enum.IsDefined(typeof(Opcode), opcode) ? "An unsupported opcode." + : !IsOpcodeData(opcode) && rsv1 == Rsv.On ? "A non data frame is compressed." + : IsOpcodeControl(opcode) && fin == Fin.More ? "A control frame is fragmented." + : IsOpcodeControl(opcode) && payloadLen > 125 ? "A control frame has a long payload length." + : null; + + if (err != null) + throw new WebSocketException(CloseStatusCode.ProtocolError, err); + + return new WebSocketFrame(fin, rsv1, rsv2, rsv3, (Opcode)opcode, mask, payloadLen); + } + + private async Task ReadExtendedPayloadLengthAsync(WebSocketFrame frame) + { + var len = frame.ExtendedPayloadLengthCount; + + if (len == 0) + { + frame.ExtendedPayloadLength = Array.Empty(); + return; + } + + var bytes = await _stream.ReadBytesAsync(len).ConfigureAwait(false); + + if (bytes.Length != len) + { + throw new WebSocketException( + "The extended payload length of a frame cannot be read from the stream."); + } + + frame.ExtendedPayloadLength = bytes; + } + + private async Task ReadMaskingKeyAsync(WebSocketFrame frame) + { + var len = frame.IsMasked ? 4 : 0; + + if (len == 0) + { + frame.MaskingKey = Array.Empty(); + return; + } + + var bytes = await _stream.ReadBytesAsync(len).ConfigureAwait(false); + if (bytes.Length != len) + { + throw new WebSocketException( + "The masking key of a frame cannot be read from the stream."); + } + + frame.MaskingKey = bytes; + } + + private async Task ReadPayloadDataAsync(WebSocketFrame frame) + { + var len = frame.FullPayloadLength; + if (len == 0) + { + frame.PayloadData = new PayloadData(); + + return; + } + + if (len > PayloadData.MaxLength) + throw new WebSocketException(CloseStatusCode.TooBig, "A frame has a long payload length."); + + var bytes = frame.PayloadLength < 127 + ? await _stream.ReadBytesAsync((int)len).ConfigureAwait(false) + : await _stream.ReadBytesAsync((int)len, 1024).ConfigureAwait(false); + + if (bytes.Length != (int)len) + { + throw new WebSocketException( + "The payload data of a frame cannot be read from the stream."); + } + + frame.PayloadData = new PayloadData(bytes); + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/WebSockets/Internal/WebSocketReceiveResult.cs b/Vendor/EmbedIO-3.5.2/WebSockets/Internal/WebSocketReceiveResult.cs new file mode 100644 index 0000000..07d1b94 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/WebSockets/Internal/WebSocketReceiveResult.cs @@ -0,0 +1,29 @@ +using System; + +namespace EmbedIO.WebSockets.Internal +{ + /// + /// Represents a WS Receive result. + /// + internal sealed class WebSocketReceiveResult : IWebSocketReceiveResult + { + internal WebSocketReceiveResult(int count, Opcode code) + { + if (count < 0) + throw new ArgumentOutOfRangeException(nameof(count)); + + Count = count; + EndOfMessage = code == Opcode.Close; + MessageType = code == Opcode.Text ? 0 : 1; + } + + /// + public int Count { get; } + + /// + public bool EndOfMessage { get; } + + /// + public int MessageType { get; } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/WebSockets/Internal/WebSocketStream.cs b/Vendor/EmbedIO-3.5.2/WebSockets/Internal/WebSocketStream.cs new file mode 100644 index 0000000..322ee9a --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/WebSockets/Internal/WebSocketStream.cs @@ -0,0 +1,91 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Threading; +using Swan; + +namespace EmbedIO.WebSockets.Internal +{ + internal class WebSocketStream : MemoryStream + { + internal const int FragmentLength = 1016; + + private readonly CompressionMethod _compression; + private readonly Opcode _opcode; + + public WebSocketStream(byte[] data, Opcode opcode, CompressionMethod compression) + : base(data) + { + _compression = compression; + _opcode = opcode; + } + + public IEnumerable GetFrames() + { + var compressed = _compression != CompressionMethod.None; + var stream = compressed + ? this.CompressAsync(_compression, true, CancellationToken.None).Await() + : this; + + var len = stream.Length; + + /* Not fragmented */ + + if (len == 0) + { + yield return new WebSocketFrame(Fin.Final, _opcode, Array.Empty(), compressed); + yield break; + } + + var quo = len / FragmentLength; + var rem = (int)(len % FragmentLength); + + byte[] buff; + + if (quo == 0) + { + buff = new byte[rem]; + + if (stream.Read(buff, 0, rem) == rem) + yield return new WebSocketFrame(Fin.Final, _opcode, buff, compressed); + + yield break; + } + + buff = new byte[FragmentLength]; + if (quo == 1 && rem == 0) + { + if (stream.Read(buff, 0, FragmentLength) == FragmentLength) + yield return new WebSocketFrame(Fin.Final, _opcode, buff, compressed); + + yield break; + } + + /* Send fragmented */ + + // Begin + if (stream.Read(buff, 0, FragmentLength) != FragmentLength) + yield break; + + yield return new WebSocketFrame(Fin.More, _opcode, buff, compressed); + + var n = rem == 0 ? quo - 2 : quo - 1; + for (var i = 0; i < n; i++) + { + if (stream.Read(buff, 0, FragmentLength) != FragmentLength) + yield break; + + yield return new WebSocketFrame(Fin.More, Opcode.Cont, buff, compressed); + } + + // End + if (rem == 0) + rem = FragmentLength; + else + buff = new byte[rem]; + + if (stream.Read(buff, 0, rem) == rem) + yield return new WebSocketFrame(Fin.Final, Opcode.Cont, buff, compressed); + } + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/WebSockets/Opcode.cs b/Vendor/EmbedIO-3.5.2/WebSockets/Opcode.cs new file mode 100644 index 0000000..195cf53 --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/WebSockets/Opcode.cs @@ -0,0 +1,43 @@ +namespace EmbedIO.WebSockets +{ + /// + /// Indicates the WebSocket frame type. + /// + /// + /// The values of this enumeration are defined in + /// + /// Section 5.2 of RFC 6455. + /// + public enum Opcode : byte + { + /// + /// Equivalent to numeric value 0. Indicates continuation frame. + /// + Cont = 0x0, + + /// + /// Equivalent to numeric value 1. Indicates text frame. + /// + Text = 0x1, + + /// + /// Equivalent to numeric value 2. Indicates binary frame. + /// + Binary = 0x2, + + /// + /// Equivalent to numeric value 8. Indicates connection close frame. + /// + Close = 0x8, + + /// + /// Equivalent to numeric value 9. Indicates ping frame. + /// + Ping = 0x9, + + /// + /// Equivalent to numeric value 10. Indicates pong frame. + /// + Pong = 0xa, + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/WebSockets/WebSocketException.cs b/Vendor/EmbedIO-3.5.2/WebSockets/WebSocketException.cs new file mode 100644 index 0000000..d7303bf --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/WebSockets/WebSocketException.cs @@ -0,0 +1,51 @@ +using System; + +namespace EmbedIO.WebSockets +{ + /// + /// The exception that is thrown when a WebSocket gets a fatal error. + /// +#pragma warning disable CA1032 // Implement standard exception constructors - this class doesn't need public constructors. + public class WebSocketException : Exception +#pragma warning restore CA1032 + { + internal WebSocketException(string? message = null) + : this(CloseStatusCode.Abnormal, message) + { + // Ignore + } + + internal WebSocketException(CloseStatusCode code, Exception? innerException = null) + : this(code, null, innerException) + { + } + + internal WebSocketException(CloseStatusCode code, string? message, Exception? innerException = null) + : base(message ?? GetMessage(code), innerException) + { + Code = code; + } + + /// + /// Gets the status code indicating the cause of the exception. + /// + /// + /// One of the enum values, represents the status code + /// indicating the cause of the exception. + /// + public CloseStatusCode Code { get; } + + internal static string GetMessage(CloseStatusCode code) => code switch { + CloseStatusCode.ProtocolError => "A WebSocket protocol error has occurred.", + CloseStatusCode.UnsupportedData => "Unsupported data has been received.", + CloseStatusCode.Abnormal => "An exception has occurred.", + CloseStatusCode.InvalidData => "Invalid data has been received.", + CloseStatusCode.PolicyViolation => "A policy violation has occurred.", + CloseStatusCode.TooBig => "A too big message has been received.", + CloseStatusCode.MandatoryExtension => "WebSocket client didn't receive expected extension(s).", + CloseStatusCode.ServerError => "WebSocket server got an internal error.", + CloseStatusCode.TlsHandshakeFailure => "An error has occurred during a TLS handshake.", + _ => string.Empty + }; + } +} \ No newline at end of file diff --git a/Vendor/EmbedIO-3.5.2/WebSockets/WebSocketModule.cs b/Vendor/EmbedIO-3.5.2/WebSockets/WebSocketModule.cs new file mode 100644 index 0000000..a4cef0a --- /dev/null +++ b/Vendor/EmbedIO-3.5.2/WebSockets/WebSocketModule.cs @@ -0,0 +1,640 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Net.WebSockets; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using EmbedIO.Utilities; +using EmbedIO.WebSockets.Internal; +using Swan; +using Swan.Logging; +using Swan.Threading; + +namespace EmbedIO.WebSockets +{ + /// + /// A base class for modules that handle WebSocket connections. + /// + /// + /// Each WebSocket server has a list of WebSocket subprotocols it can accept. + /// When a client initiates a WebSocket opening handshake: + /// + /// if the list of accepted subprotocols is empty, + /// the connection is accepted only if no SecWebSocketProtocol + /// header is present in the request; + /// if the list of accepted subprotocols is not empty, + /// the connection is accepted only if one or more SecWebSocketProtocol + /// headers are present in the request and one of them specifies one + /// of the subprotocols in the list. The first subprotocol specified by the client + /// that is also present in the module's list is then specified in the + /// handshake response. + /// + /// If a connection is not accepted because of a subprotocol mismatch, + /// a 400 Bad Request response is sent back to the client. The response + /// contains one or more SecWebSocketProtocol headers that specify + /// the list of accepted subprotocols (if any). + /// + public abstract class WebSocketModule : WebModuleBase, IDisposable + { + private const int ReceiveBufferSize = 2048; + + private readonly bool _enableConnectionWatchdog; + private readonly List _protocols = new List(); + private readonly ConcurrentDictionary _contexts = new ConcurrentDictionary(); + private bool _isDisposing; + private int _maxMessageSize; + private TimeSpan _keepAliveInterval; + private Encoding _encoding; + private PeriodicTask? _connectionWatchdog; + + /// + /// Initializes a new instance of the class. + /// + /// The URL path of the WebSocket endpoint to serve. + /// If set to , + /// contexts representing closed connections will automatically be purged + /// from every 30 seconds.. + protected WebSocketModule(string urlPath, bool enableConnectionWatchdog) + : base(urlPath) + { + _enableConnectionWatchdog = enableConnectionWatchdog; + _maxMessageSize = 0; + _keepAliveInterval = TimeSpan.FromSeconds(30); + _encoding = Encoding.UTF8; + } + + /// + public sealed override bool IsFinalHandler => true; + + /// + /// Gets or sets the maximum size of a received message. + /// If a message exceeding the maximum size is received from a client, + /// the connection is closed automatically. + /// The default value is 0, which disables message size checking. + /// + protected int MaxMessageSize + { + get => _maxMessageSize; + set + { + EnsureConfigurationNotLocked(); + _maxMessageSize = Math.Max(value, 0); + } + } + + /// + /// Gets or sets the keep-alive interval for the WebSocket connection. + /// The default is 30 seconds. + /// + /// This property is being set to a value + /// that is too small to be acceptable. + protected TimeSpan KeepAliveInterval + { + get => _keepAliveInterval; + set + { + EnsureConfigurationNotLocked(); + if (value != Timeout.InfiniteTimeSpan && value < TimeSpan.Zero) + throw new ArgumentOutOfRangeException(nameof(value), "The specified keep-alive interval is too small."); + + _keepAliveInterval = value; + } + } + + /// + /// Gets the used by the method + /// to send a string. The default is per the WebSocket specification. + /// + /// This property is being set to . + protected Encoding Encoding + { + get => _encoding; + set + { + EnsureConfigurationNotLocked(); + _encoding = Validate.NotNull(nameof(value), value); + } + } + + /// + /// Gets a list of interfaces + /// representing the currently connected clients. + /// + protected IReadOnlyList ActiveContexts + { + get + { + // ConcurrentDictionary.Values, although declared as ICollection, + // will probably return a ReadOnlyCollection, which implements IReadOnlyList: + // https://referencesource.microsoft.com/#mscorlib/system/Collections/Concurrent/ConcurrentDictionary.cs,fe55c11912af21d2 + // https://github.com/dotnet/corefx/blob/master/src/System.Collections.Concurrent/src/System/Collections/Concurrent/ConcurrentDictionary.cs#L1990 + // https://github.com/mono/mono/blob/master/mcs/class/referencesource/mscorlib/system/collections/Concurrent/ConcurrentDictionary.cs#L1961 + // However there is no formal guarantee, so be ready to convert to a list, just in case. + var values = _contexts.Values; + return values is IReadOnlyList list + ? list + : values.ToList(); + } + } + + /// + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + /// + protected sealed override async Task OnRequestAsync(IHttpContext context) + { + // The WebSocket endpoint must match exactly, giving a RequestedPath of "/". + // In all other cases the path is longer, so there's no need to compare strings here. + if (context.RequestedPath.Length > 1) + return; + + var requestedProtocols = context.Request.Headers.GetValues(HttpHeaderNames.SecWebSocketProtocol) + ?.Select(s => s.Trim()) + .Where(s => s.Length > 0) + .ToArray() + ?? Array.Empty(); + string acceptedProtocol; + bool acceptConnection; + if (_protocols.Count > 0) + { + acceptedProtocol = requestedProtocols.FirstOrDefault(p => _protocols.Contains(p)) ?? string.Empty; + acceptConnection = acceptedProtocol.Length > 0; + } + else + { + acceptedProtocol = string.Empty; + acceptConnection = requestedProtocols.Length == 0; + } + + if (!acceptConnection) + { + $"{BaseRoute} - Rejecting WebSocket connection: no subprotocol was accepted.".Debug(nameof(WebSocketModule)); + foreach (var protocol in _protocols) + context.Response.Headers.Add(HttpHeaderNames.SecWebSocketProtocol, protocol); + + // Not throwing a HTTP exception here because a WebSocket client + // does not care about nice, formatted messages. + context.Response.SetEmptyResponse((int)HttpStatusCode.BadRequest); + return; + } + + var contextImpl = context.GetImplementation(); + $"{BaseRoute} - Accepting WebSocket connection with subprotocol \"{acceptedProtocol}\"".Debug(nameof(WebSocketModule)); + var webSocketContext = await contextImpl.AcceptWebSocketAsync( + requestedProtocols, + acceptedProtocol, + ReceiveBufferSize, + KeepAliveInterval, + context.CancellationToken).ConfigureAwait(false); + + PurgeDisconnectedContexts(); + _ = _contexts.TryAdd(webSocketContext.Id, webSocketContext); + + $"{BaseRoute} - WebSocket connection accepted - There are now {_contexts.Count} sockets connected." + .Debug(nameof(WebSocketModule)); + + await OnClientConnectedAsync(webSocketContext).ConfigureAwait(false); + + try + { + if (webSocketContext.WebSocket is SystemWebSocket systemWebSocket) + { + await ProcessSystemContext( + webSocketContext, + systemWebSocket.UnderlyingWebSocket, + context.CancellationToken).ConfigureAwait(false); + } + else + { + await ProcessEmbedIOContext(webSocketContext, context.CancellationToken) + .ConfigureAwait(false); + } + } + catch (TaskCanceledException) + { + // ignore + } + catch (Exception ex) + { + ex.Log(nameof(WebSocketModule)); + } + finally + { + // once the loop is completed or connection aborted, remove the WebSocket + RemoveWebSocket(webSocketContext); + } + } + + /// + protected override void OnStart(CancellationToken cancellationToken) + { + if (_enableConnectionWatchdog) + { + _connectionWatchdog = new PeriodicTask( + TimeSpan.FromSeconds(30), + ct => { + PurgeDisconnectedContexts(); + return Task.CompletedTask; + }, + cancellationToken); + } + } + + /// + /// Adds a WebSocket subprotocol to the list of protocols supported by a . + /// + /// The protocol name to add to the list. + /// is . + /// + /// contains one or more invalid characters, as defined + /// in RFC6455, Section 4.3. + /// - or - + /// is already in the list of supported protocols. + /// + /// The has already been started. + /// + /// + /// + protected void AddProtocol(string protocol) + { + protocol = Validate.Rfc2616Token(nameof(protocol), protocol); + + EnsureConfigurationNotLocked(); + + if (_protocols.Contains(protocol)) + throw new ArgumentException("Duplicate WebSocket protocol name.", nameof(protocol)); + + _protocols.Add(protocol); + } + + /// + /// Adds one or more WebSocket subprotocols to the list of protocols supported by a . + /// + /// The protocol names to add to the list. + /// + /// is . + /// - or - + /// One or more of the strings in is . + /// + /// + /// One or more of the strings in + /// contains one or more invalid characters, as defined + /// in RFC6455, Section 4.3. + /// - or - + /// One or more of the strings in + /// is already in the list of supported protocols. + /// + /// The has already been started. + /// + /// This method enumerates just once; hence, if an exception is thrown + /// because one of the specified protocols is or contains invalid characters, + /// any preceding protocol is added to the list of supported protocols. + /// + /// + /// + /// + protected void AddProtocols(IEnumerable protocols) + { + protocols = Validate.NotNull(nameof(protocols), protocols); + + EnsureConfigurationNotLocked(); + + foreach (var protocol in protocols.Select(p => Validate.Rfc2616Token(nameof(protocols), p))) + { + if (_protocols.Contains(protocol)) + throw new ArgumentException("Duplicate WebSocket protocol name.", nameof(protocols)); + + _protocols.Add(protocol); + } + } + + /// + /// Adds one or more WebSocket subprotocols to the list of protocols supported by a . + /// + /// The protocol names to add to the list. + /// + /// is . + /// - or - + /// One or more of the strings in is . + /// + /// + /// One or more of the strings in + /// contains one or more invalid characters, as defined + /// in RFC6455, Section 4.3. + /// - or - + /// One or more of the strings in + /// is already in the list of supported protocols. + /// + /// The has already been started. + /// + /// This method performs validation checks on all specified before adding them + /// to the list of supported protocols; hence, if an exception is thrown + /// because one of the specified protocols is or contains invalid characters, + /// none of the specified protocol names are added to the list. + /// + /// + /// + /// + protected void AddProtocols(params string[] protocols) + { + protocols = Validate.NotNull(nameof(protocols), protocols); + + if (protocols.Select(p => Validate.Rfc2616Token(nameof(protocols), p)).Any(protocol => _protocols.Contains(protocol))) + throw new ArgumentException("Duplicate WebSocket protocol name.", nameof(protocols)); + + EnsureConfigurationNotLocked(); + + _protocols.AddRange(protocols); + } + + /// + /// Sends a text payload. + /// + /// The web socket. + /// The payload. + /// A representing the ongoing operation. + protected async Task SendAsync(IWebSocketContext context, string payload) + { + try + { + var buffer = _encoding.GetBytes(payload ?? string.Empty); + + await context.WebSocket.SendAsync(buffer, true, context.CancellationToken).ConfigureAwait(false); + } + catch (Exception ex) + { + ex.Log(nameof(WebSocketModule)); + } + } + +#pragma warning disable CA1822 // Member can be declared as static - It is an instance method for API consistency. + /// + /// Sends a binary payload. + /// + /// The web socket. + /// The payload. + /// A representing the ongoing operation. + protected async Task SendAsync(IWebSocketContext context, byte[] payload) + { + try + { + await context.WebSocket.SendAsync(payload ?? Array.Empty(), false, context.CancellationToken) + .ConfigureAwait(false); + } + catch (Exception ex) + { + ex.Log(nameof(WebSocketModule)); + } + } +#pragma warning restore CA1822 + + /// + /// Broadcasts the specified payload to all connected WebSocket clients. + /// + /// The payload. + /// A representing the ongoing operation. + protected Task BroadcastAsync(byte[] payload) + => Task.WhenAll(_contexts.Values.Select(c => SendAsync(c, payload))); + + /// + /// Broadcasts the specified payload to selected WebSocket clients. + /// + /// The payload. + /// A callback function that must return + /// for each context to be included in the broadcast. + /// A representing the ongoing operation. + protected Task BroadcastAsync(byte[] payload, Func selector) + => Task.WhenAll(_contexts.Values.Where(Validate.NotNull(nameof(selector), selector)).Select(c => SendAsync(c, payload))); + + /// + /// Broadcasts the specified payload to all connected WebSocket clients. + /// + /// The payload. + /// A representing the ongoing operation. + protected Task BroadcastAsync(string payload) + => Task.WhenAll(_contexts.Values.Select(c => SendAsync(c, payload))); + + /// + /// Broadcasts the specified payload to selected WebSocket clients. + /// + /// The payload. + /// A callback function that must return + /// for each context to be included in the broadcast. + /// A representing the ongoing operation. + protected Task BroadcastAsync(string payload, Func selector) + => Task.WhenAll(_contexts.Values.Where(Validate.NotNull(nameof(selector), selector)).Select(c => SendAsync(c, payload))); + + /// + /// Closes the specified web socket, removes it and disposes it. + /// + /// The web socket. + /// A representing the ongoing operation. + protected async Task CloseAsync(IWebSocketContext context) + { + if (context == null) + return; + + try + { + await context.WebSocket.CloseAsync(context.CancellationToken).ConfigureAwait(false); + } + catch (Exception ex) + { + ex.Log(nameof(WebSocketModule)); + } + finally + { + RemoveWebSocket(context); + } + } + + /// + /// Called when this WebSocket server receives a full message (EndOfMessage) from a client. + /// + /// The context. + /// The buffer. + /// The result. + /// A representing the ongoing operation. + protected abstract Task OnMessageReceivedAsync(IWebSocketContext context, byte[] buffer, IWebSocketReceiveResult result); + + /// + /// Called when this WebSocket server receives a message frame regardless if the frame represents the EndOfMessage. + /// + /// The context. + /// The buffer. + /// The result. + /// A representing the ongoing operation. + protected virtual Task OnFrameReceivedAsync( + IWebSocketContext context, + byte[] buffer, + IWebSocketReceiveResult result) + => Task.CompletedTask; + + /// + /// Called when this WebSocket server accepts a new client. + /// + /// The context. + /// A representing the ongoing operation. + protected virtual Task OnClientConnectedAsync(IWebSocketContext context) => Task.CompletedTask; + + /// + /// Called when the server has removed a connected client for any reason. + /// + /// The context. + /// A representing the ongoing operation. + protected virtual Task OnClientDisconnectedAsync(IWebSocketContext context) => Task.CompletedTask; + + /// + /// Releases unmanaged and - optionally - managed resources. + /// + /// true to release both managed and unmanaged resources; false to release only unmanaged resources. + protected virtual void Dispose(bool disposing) + { + if (_isDisposing) + return; + + _isDisposing = true; + + if (disposing) + { + _connectionWatchdog?.Dispose(); + Task.WhenAll(_contexts.Values.Select(CloseAsync)).Await(false); + PurgeDisconnectedContexts(); + } + } + + private void RemoveWebSocket(IWebSocketContext context) + { + if (!_contexts.TryRemove(context.Id, out _)) + { + return; + } + + context.WebSocket?.Dispose(); + + // OnClientDisconnectedAsync is better called in its own task, + // so it may call methods that require a lock on _contextsAccess. + // Otherwise, calling e.g. Broadcast would result in a deadlock. +#pragma warning disable CS4014 // Call is not awaited - it is intentionally forked. + _ = Task.Run(async () => { + try + { + await OnClientDisconnectedAsync(context).ConfigureAwait(false); + } + catch (OperationCanceledException) + { + $"[{context.Id}] OnClientDisconnectedAsync was canceled.".Debug(nameof(WebSocketModule)); + } + catch (Exception e) + { + e.Log(nameof(WebSocketModule), $"[{context.Id}] Exception in OnClientDisconnectedAsync."); + } + }); +#pragma warning restore CS4014 + } + + private void PurgeDisconnectedContexts() + { + var contexts = _contexts.Values; + var totalCount = _contexts.Count; + var purgedCount = 0; + foreach (var context in contexts) + { + if (context.WebSocket == null || context.WebSocket.State == WebSocketState.Open) + continue; + + RemoveWebSocket(context); + purgedCount++; + } + + $"{BaseRoute} - Purged {purgedCount} of {totalCount} sockets." + .Debug(nameof(WebSocketModule)); + } + + private async Task ProcessEmbedIOContext(IWebSocketContext context, CancellationToken cancellationToken) + { + ((Internal.WebSocket)context.WebSocket).OnMessage += async (s, e) => + { + if (e.Opcode == Opcode.Close) + { + await context.WebSocket.CloseAsync(context.CancellationToken).ConfigureAwait(false); + } + else + { + await OnMessageReceivedAsync( + context, + e.RawData, + new Internal.WebSocketReceiveResult(e.RawData.Length, e.Opcode)) + .ConfigureAwait(false); + } + }; + + while (context.WebSocket.State == WebSocketState.Open + || context.WebSocket.State == WebSocketState.CloseReceived + || context.WebSocket.State == WebSocketState.CloseSent) + { + await Task.Delay(500, cancellationToken).ConfigureAwait(false); + } + } + + private async Task ProcessSystemContext(IWebSocketContext context, System.Net.WebSockets.WebSocket webSocket, CancellationToken cancellationToken) + { + // define a receive buffer + var receiveBuffer = new byte[ReceiveBufferSize]; + + // define a dynamic buffer that holds multi-part receptions + var receivedMessage = new List(receiveBuffer.Length * 2); + + // poll the WebSocket connections for reception + while (webSocket.State == WebSocketState.Open) + { + // retrieve the result (blocking) + var receiveResult = new SystemWebSocketReceiveResult( + await webSocket.ReceiveAsync(new ArraySegment(receiveBuffer), cancellationToken) + .ConfigureAwait(false)); + + if (receiveResult.MessageType == (int)WebSocketMessageType.Close) + { + // close the connection if requested by the client + await webSocket + .CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, cancellationToken) + .ConfigureAwait(false); + return; + } + + var frameBytes = new byte[receiveResult.Count]; + Array.Copy(receiveBuffer, frameBytes, frameBytes.Length); + await OnFrameReceivedAsync(context, frameBytes, receiveResult).ConfigureAwait(false); + + // add the response to the multi-part response + receivedMessage.AddRange(frameBytes); + + if (_maxMessageSize > 0 && receivedMessage.Count > _maxMessageSize) + { + // close the connection if message exceeds max length + await webSocket.CloseAsync( + WebSocketCloseStatus.MessageTooBig, + $"Message too big. Maximum is {_maxMessageSize} bytes.", + cancellationToken).ConfigureAwait(false); + + // exit the loop; we're done + return; + } + + // if we're at the end of the message, process the message + if (!receiveResult.EndOfMessage) continue; + + await OnMessageReceivedAsync(context, receivedMessage.ToArray(), receiveResult) + .ConfigureAwait(false); + receivedMessage.Clear(); + } + } + } +} \ No newline at end of file diff --git a/Vendor/Swan.Lite-3.1.0/Collections/CollectionCacheRepository.cs b/Vendor/Swan.Lite-3.1.0/Collections/CollectionCacheRepository.cs new file mode 100644 index 0000000..bf6a54b --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Collections/CollectionCacheRepository.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; + +namespace Swan.Collections +{ + /// + /// A thread-safe collection cache repository for types. + /// + /// The type of member to cache. + public class CollectionCacheRepository + { + private readonly Lazy>> _data = + new Lazy>>(() => + new ConcurrentDictionary>(), true); + + /// + /// Determines whether the cache contains the specified key. + /// + /// The key. + /// true if the cache contains the key, otherwise false. + public bool ContainsKey(Type key) => _data.Value.ContainsKey(key); + + /// + /// Retrieves the properties stored for the specified type. + /// If the properties are not available, it calls the factory method to retrieve them + /// and returns them as an array of PropertyInfo. + /// + /// The key. + /// The factory. + /// + /// An array of the properties stored for the specified type. + /// + /// + /// key + /// or + /// factory. + /// + public IEnumerable Retrieve(Type key, Func> factory) + { + if (key == null) + throw new ArgumentNullException(nameof(key)); + + if (factory == null) + throw new ArgumentNullException(nameof(factory)); + + return _data.Value.GetOrAdd(key, k => factory.Invoke(k).Where(item => item != null)); + } + } +} diff --git a/Vendor/Swan.Lite-3.1.0/CompositeHashCode.cs b/Vendor/Swan.Lite-3.1.0/CompositeHashCode.cs new file mode 100644 index 0000000..b11e858 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/CompositeHashCode.cs @@ -0,0 +1,100 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace Swan +{ + /// + /// Provides a way for types that override + /// to correctly generate a hash code from the actual status of an instance. + /// CompositeHashCode must be used ONLY as a helper when implementing + /// IEquatable<T> in a STANDARD way, i.e. when: + /// + /// two instances having the same hash code are actually + /// interchangeable, i.e. they represent exactly the same object (for instance, + /// they should not coexist in a + /// SortedSet); + /// GetHashCode and + /// Equals are BOTH overridden, and the Equals + /// override either calls to the IEquatable<T>.Equals + /// (recommended) or performs exactly the same equality checks; + /// only "standard" equality checks are performed, i.e. by means of the + /// == operator, IEquatable<T> interfaces, and + /// the Equals method (for instance, this excludes case-insensitive + /// and/or culture-dependent string comparisons); + /// + /// the hash code is constructed (via Using calls) from the very same + /// fields and / or properties that are checked for equality. + /// + /// For hashing to work correctly, all fields and/or properties involved in hashing must either + /// be immutable, or at least not change while an object is referenced in a hashtable. + /// This does not refer just to System.Collections.Hashtable; the .NET + /// Framework makes a fairly extensive use of hashing, for example in + /// SortedSet<T> + /// and in various parts of LINQ. As a thumb rule, an object must stay the same during the execution of a + /// LINQ query on an IEnumerable + /// in which it is contained, as well as all the time it is referenced in a Hashtable or SortedSet. + /// + /// + /// The following code constitutes a minimal use case for CompositeHashCode, as well + /// as a reference for standard IEquatable<T> implementation. + /// Notice that all relevant properties are immutable; this is not, as stated in the summary, + /// an absolute requirement, but it surely helps and should be done every time it makes sense. + /// using System; + /// using Swan; + /// + /// namespace Example + /// { + /// public class Person : IEquatable<Person> + /// { + /// public string Name { get; private set; } + /// + /// public int Age { get; private set; } + /// + /// public Person(string name, int age) + /// { + /// Name = name; + /// Age = age; + /// } + /// + /// public override int GetHashCode() => CompositeHashCode.Using(Name, Age); + /// + /// public override bool Equals(object obj) => obj is Person other && Equals(other); + /// + /// public bool Equals(Person other) + /// => other != null + /// && other.Name == Name + /// && other.Age == Age; + /// } + /// } + /// + public static class CompositeHashCode + { + #region Private constants + + private const int InitialSeed = 17; + private const int Multiplier = 29; + + #endregion + + #region Public API + + /// + /// Computes a hash code, taking into consideration the values of the specified + /// fields and/oror properties as part of an object's state. See the + /// example. + /// + /// The values of the fields and/or properties. + /// The computed has code. + public static int Using(params object[] fields) + { + unchecked + { + return fields.Where(f => !(f is null)) + .Aggregate(InitialSeed, (current, field) => (Multiplier * current) + field.GetHashCode()); + } + } + + #endregion + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Configuration/ConfiguredObject.cs b/Vendor/Swan.Lite-3.1.0/Configuration/ConfiguredObject.cs new file mode 100644 index 0000000..1855c81 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Configuration/ConfiguredObject.cs @@ -0,0 +1,77 @@ +using System; + +namespace Swan.Configuration +{ + /// + /// Base class for objects whose configuration may be locked, + /// thus becoming read-only, at a certain moment in their lifetime. + /// + public abstract class ConfiguredObject + { + private readonly object _syncRoot = new object(); + private bool _configurationLocked; + + /// + /// Gets a value indicating whether s configuration has already been locked + /// and has therefore become read-only. + /// + /// + /// if the configuration is locked; otherwise, . + /// + /// + protected bool ConfigurationLocked + { + get + { + lock (_syncRoot) + { + return _configurationLocked; + } + } + } + + /// + /// Locks this instance's configuration, preventing further modifications. + /// + /// + /// Configuration locking must be enforced by derived classes + /// by calling at the start + /// of methods and property setters that could change the object's + /// configuration. + /// Immediately before locking the configuration, this method calls + /// as a last chance to validate configuration data, and to lock the configuration of contained objects. + /// + /// + protected void LockConfiguration() + { + lock (_syncRoot) + { + if (_configurationLocked) + return; + + OnBeforeLockConfiguration(); + _configurationLocked = true; + } + } + + /// + /// Called immediately before locking the configuration. + /// + /// + protected virtual void OnBeforeLockConfiguration() + { + } + + /// + /// Checks whether a module's configuration has become read-only + /// and, if so, throws an . + /// + /// The configuration is locked. + /// + protected void EnsureConfigurationNotLocked() + { + if (ConfigurationLocked) + throw new InvalidOperationException($"Configuration of this {GetType().Name} instance is locked."); + } + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Configuration/SettingsProvider.cs b/Vendor/Swan.Lite-3.1.0/Configuration/SettingsProvider.cs new file mode 100644 index 0000000..3b403db --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Configuration/SettingsProvider.cs @@ -0,0 +1,107 @@ +using Swan.Formatters; +using System; +using System.IO; + +namespace Swan.Configuration +{ + /// + /// Represents a provider to save and load settings using a plain JSON file. + /// + /// + /// The following example shows how to save and load settings. + /// + /// using Swan.Configuration; + /// + /// public class Example + /// { + /// public static void Main() + /// { + /// // get user from settings + /// var user = SettingsProvider<Settings>.Instance.Global.User; + /// + /// // modify the port + /// SettingsProvider<Settings>.Instance.Global.Port = 20; + /// + /// // if we want these settings to persist + /// SettingsProvider<Settings>.Instance.PersistGlobalSettings(); + /// } + /// + /// public class Settings + /// { + /// public int Port { get; set; } = 9696; + /// + /// public string User { get; set; } = "User"; + /// } + /// } + /// + /// + /// The type of settings model. + public sealed class SettingsProvider + : SingletonBase> + { + private readonly object _syncRoot = new object(); + + private T _global; + + /// + /// Gets or sets the configuration file path. By default the entry assembly directory is used + /// and the filename is 'appsettings.json'. + /// + /// + /// The configuration file path. + /// + public string ConfigurationFilePath { get; set; } = + Path.Combine(SwanRuntime.EntryAssemblyDirectory, "appsettings.json"); + + /// + /// Gets the global settings object. + /// + /// + /// The global settings object. + /// + public T Global + { + get + { + lock (_syncRoot) + { + if (Equals(_global, default(T))) + ReloadGlobalSettings(); + + return _global; + } + } + } + + /// + /// Reloads the global settings. + /// + public void ReloadGlobalSettings() + { + if (File.Exists(ConfigurationFilePath) == false || File.ReadAllText(ConfigurationFilePath).Length == 0) + { + ResetGlobalSettings(); + return; + } + + lock (_syncRoot) + _global = Json.Deserialize(File.ReadAllText(ConfigurationFilePath)); + } + + /// + /// Persists the global settings. + /// + public void PersistGlobalSettings() => File.WriteAllText(ConfigurationFilePath, Json.Serialize(Global, true)); + + /// + /// Resets the global settings. + /// + public void ResetGlobalSettings() + { + lock (_syncRoot) + _global = Activator.CreateInstance(); + + PersistGlobalSettings(); + } + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Cryptography/Hasher.cs b/Vendor/Swan.Lite-3.1.0/Cryptography/Hasher.cs new file mode 100644 index 0000000..4f49718 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Cryptography/Hasher.cs @@ -0,0 +1,124 @@ +using System; +using System.IO; +using System.Security.Cryptography; +using System.Text; + +namespace Swan.Cryptography +{ + /// + /// Use this class to compute a hash in MD4, SHA1, SHA256 or SHA512. + /// + public static class Hasher + { + private static readonly Lazy Md5Hasher = new Lazy(MD5.Create, true); + private static readonly Lazy SHA1Hasher = new Lazy(SHA1.Create, true); + private static readonly Lazy SHA256Hasher = new Lazy(SHA256.Create, true); + private static readonly Lazy SHA512Hasher = new Lazy(SHA512.Create, true); + + /// + /// Computes the MD5 hash of the given stream. + /// Do not use for large streams as this reads ALL bytes at once. + /// + /// The stream. + /// if set to true [create hasher]. + /// + /// The computed hash code. + /// + /// stream. + [Obsolete("Use a better hasher.")] + public static byte[] ComputeMD5(Stream @this, bool createHasher = false) + { + if (@this == null) + throw new ArgumentNullException(nameof(@this)); + + using var md5 = MD5.Create(); + const int bufferSize = 4096; + + var readAheadBuffer = new byte[bufferSize]; + var readAheadBytesRead = @this.Read(readAheadBuffer, 0, readAheadBuffer.Length); + + do + { + var bytesRead = readAheadBytesRead; + var buffer = readAheadBuffer; + + readAheadBuffer = new byte[bufferSize]; + readAheadBytesRead = @this.Read(readAheadBuffer, 0, readAheadBuffer.Length); + + if (readAheadBytesRead == 0) + md5.TransformFinalBlock(buffer, 0, bytesRead); + else + md5.TransformBlock(buffer, 0, bytesRead, buffer, 0); + } + while (readAheadBytesRead != 0); + + return md5.Hash; + } + + /// + /// Computes the MD5 hash of the given string using UTF8 byte encoding. + /// + /// The input string. + /// if set to true [create hasher]. + /// The computed hash code. + [Obsolete("Use a better hasher.")] + public static byte[] ComputeMD5(string value, bool createHasher = false) => + ComputeMD5(Encoding.UTF8.GetBytes(value), createHasher); + + /// + /// Computes the MD5 hash of the given byte array. + /// + /// The data. + /// if set to true [create hasher]. + /// The computed hash code. + [Obsolete("Use a better hasher.")] + public static byte[] ComputeMD5(byte[] data, bool createHasher = false) => + (createHasher ? MD5.Create() : Md5Hasher.Value).ComputeHash(data); + + /// + /// Computes the SHA-1 hash of the given string using UTF8 byte encoding. + /// + /// The input string. + /// if set to true [create hasher]. + /// + /// The computes a Hash-based Message Authentication Code (HMAC) + /// using the SHA1 hash function. + /// + [Obsolete("Use a better hasher.")] + public static byte[] ComputeSha1(string @this, bool createHasher = false) + { + var inputBytes = Encoding.UTF8.GetBytes(@this); + return (createHasher ? SHA1.Create() : SHA1Hasher.Value).ComputeHash(inputBytes); + } + + /// + /// Computes the SHA-256 hash of the given string using UTF8 byte encoding. + /// + /// The input string. + /// if set to true [create hasher]. + /// + /// The computes a Hash-based Message Authentication Code (HMAC) + /// by using the SHA256 hash function. + /// + public static byte[] ComputeSha256(string value, bool createHasher = false) + { + var inputBytes = Encoding.UTF8.GetBytes(value); + return (createHasher ? SHA256.Create() : SHA256Hasher.Value).ComputeHash(inputBytes); + } + + /// + /// Computes the SHA-512 hash of the given string using UTF8 byte encoding. + /// + /// The input string. + /// if set to true [create hasher]. + /// + /// The computes a Hash-based Message Authentication Code (HMAC) + /// using the SHA512 hash function. + /// + public static byte[] ComputeSha512(string value, bool createHasher = false) + { + var inputBytes = Encoding.UTF8.GetBytes(value); + return (createHasher ? SHA512.Create() : SHA512Hasher.Value).ComputeHash(inputBytes); + } + } +} diff --git a/Vendor/Swan.Lite-3.1.0/DateTimeSpan.cs b/Vendor/Swan.Lite-3.1.0/DateTimeSpan.cs new file mode 100644 index 0000000..f512d9c --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/DateTimeSpan.cs @@ -0,0 +1,174 @@ +using System; + +namespace Swan +{ + /// + /// Represents a struct of DateTimeSpan to compare dates and get in + /// separate fields the amount of time between those dates. + /// + /// Based on https://stackoverflow.com/a/9216404/1096693. + /// + public struct DateTimeSpan + { + /// + /// Initializes a new instance of the struct. + /// + /// The years. + /// The months. + /// The days. + /// The hours. + /// The minutes. + /// The seconds. + /// The milliseconds. + public DateTimeSpan(int years, int months, int days, int hours, int minutes, int seconds, int milliseconds) + { + Years = years; + Months = months; + Days = days; + Hours = hours; + Minutes = minutes; + Seconds = seconds; + Milliseconds = milliseconds; + } + + /// + /// Gets the years. + /// + /// + /// The years. + /// + public int Years { get; } + + /// + /// Gets the months. + /// + /// + /// The months. + /// + public int Months { get; } + + /// + /// Gets the days. + /// + /// + /// The days. + /// + public int Days { get; } + + /// + /// Gets the hours. + /// + /// + /// The hours. + /// + public int Hours { get; } + + /// + /// Gets the minutes. + /// + /// + /// The minutes. + /// + public int Minutes { get; } + + /// + /// Gets the seconds. + /// + /// + /// The seconds. + /// + public int Seconds { get; } + + /// + /// Gets the milliseconds. + /// + /// + /// The milliseconds. + /// + public int Milliseconds { get; } + + internal static DateTimeSpan CompareDates(DateTime date1, DateTime date2) + { + if (date2 < date1) + { + var sub = date1; + date1 = date2; + date2 = sub; + } + + var current = date1; + var years = 0; + var months = 0; + var days = 0; + + var phase = Phase.Years; + var span = new DateTimeSpan(); + var officialDay = current.Day; + + while (phase != Phase.Done) + { + switch (phase) + { + case Phase.Years: + if (current.AddYears(years + 1) > date2) + { + phase = Phase.Months; + current = current.AddYears(years); + } + else + { + years++; + } + + break; + case Phase.Months: + if (current.AddMonths(months + 1) > date2) + { + phase = Phase.Days; + current = current.AddMonths(months); + if (current.Day < officialDay && + officialDay <= DateTime.DaysInMonth(current.Year, current.Month)) + current = current.AddDays(officialDay - current.Day); + } + else + { + months++; + } + + break; + case Phase.Days: + if (current.AddDays(days + 1) > date2) + { + current = current.AddDays(days); + var timespan = date2 - current; + span = new DateTimeSpan( + years, + months, + days, + timespan.Hours, + timespan.Minutes, + timespan.Seconds, + timespan.Milliseconds); + phase = Phase.Done; + } + else + { + days++; + } + + break; + } + } + + return span; + } + + private enum Phase + { + Years, + Months, + Days, + Done, + } + } +} \ No newline at end of file diff --git a/Vendor/Swan.Lite-3.1.0/Definitions.Types.cs b/Vendor/Swan.Lite-3.1.0/Definitions.Types.cs new file mode 100644 index 0000000..68895e9 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Definitions.Types.cs @@ -0,0 +1,138 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Net; +using Swan.Reflection; + +namespace Swan +{ + /// + /// Contains useful constants and definitions. + /// + public static partial class Definitions + { + #region Main Dictionary Definition + + /// + /// The basic types information. + /// + public static readonly Lazy> BasicTypesInfo = new Lazy>(() => + new Dictionary + { + // Non-Nullables + {typeof(DateTime), new ExtendedTypeInfo()}, + {typeof(byte), new ExtendedTypeInfo()}, + {typeof(sbyte), new ExtendedTypeInfo()}, + {typeof(int), new ExtendedTypeInfo()}, + {typeof(uint), new ExtendedTypeInfo()}, + {typeof(short), new ExtendedTypeInfo()}, + {typeof(ushort), new ExtendedTypeInfo()}, + {typeof(long), new ExtendedTypeInfo()}, + {typeof(ulong), new ExtendedTypeInfo()}, + {typeof(float), new ExtendedTypeInfo()}, + {typeof(double), new ExtendedTypeInfo()}, + {typeof(char), new ExtendedTypeInfo()}, + {typeof(bool), new ExtendedTypeInfo()}, + {typeof(decimal), new ExtendedTypeInfo()}, + {typeof(Guid), new ExtendedTypeInfo()}, + + // Strings is also considered a basic type (it's the only basic reference type) + {typeof(string), new ExtendedTypeInfo()}, + + // Nullables + {typeof(DateTime?), new ExtendedTypeInfo()}, + {typeof(byte?), new ExtendedTypeInfo()}, + {typeof(sbyte?), new ExtendedTypeInfo()}, + {typeof(int?), new ExtendedTypeInfo()}, + {typeof(uint?), new ExtendedTypeInfo()}, + {typeof(short?), new ExtendedTypeInfo()}, + {typeof(ushort?), new ExtendedTypeInfo()}, + {typeof(long?), new ExtendedTypeInfo()}, + {typeof(ulong?), new ExtendedTypeInfo()}, + {typeof(float?), new ExtendedTypeInfo()}, + {typeof(double?), new ExtendedTypeInfo()}, + {typeof(char?), new ExtendedTypeInfo()}, + {typeof(bool?), new ExtendedTypeInfo()}, + {typeof(decimal?), new ExtendedTypeInfo()}, + {typeof(Guid?), new ExtendedTypeInfo()}, + + // Additional Types + {typeof(TimeSpan), new ExtendedTypeInfo()}, + {typeof(TimeSpan?), new ExtendedTypeInfo()}, + {typeof(IPAddress), new ExtendedTypeInfo()}, + }); + + #endregion + + /// + /// Contains all basic types, including string, date time, and all of their nullable counterparts. + /// + /// + /// All basic types. + /// + public static IReadOnlyCollection AllBasicTypes { get; } = new ReadOnlyCollection(BasicTypesInfo.Value.Keys.ToArray()); + + /// + /// Gets all numeric types including their nullable counterparts. + /// Note that Booleans and Guids are not considered numeric types. + /// + /// + /// All numeric types. + /// + public static IReadOnlyCollection AllNumericTypes { get; } = new ReadOnlyCollection( + BasicTypesInfo + .Value + .Where(kvp => kvp.Value.IsNumeric) + .Select(kvp => kvp.Key).ToArray()); + + /// + /// Gets all numeric types without their nullable counterparts. + /// Note that Booleans and Guids are not considered numeric types. + /// + /// + /// All numeric value types. + /// + public static IReadOnlyCollection AllNumericValueTypes { get; } = new ReadOnlyCollection( + BasicTypesInfo + .Value + .Where(kvp => kvp.Value.IsNumeric && !kvp.Value.IsNullableValueType) + .Select(kvp => kvp.Key).ToArray()); + + /// + /// Contains all basic value types. i.e. excludes string and nullables. + /// + /// + /// All basic value types. + /// + public static IReadOnlyCollection AllBasicValueTypes { get; } = new ReadOnlyCollection( + BasicTypesInfo + .Value + .Where(kvp => kvp.Value.IsValueType) + .Select(kvp => kvp.Key).ToArray()); + + /// + /// Contains all basic value types including the string type. i.e. excludes nullables. + /// + /// + /// All basic value and string types. + /// + public static IReadOnlyCollection AllBasicValueAndStringTypes { get; } = new ReadOnlyCollection( + BasicTypesInfo + .Value + .Where(kvp => kvp.Value.IsValueType || kvp.Key == typeof(string)) + .Select(kvp => kvp.Key).ToArray()); + + /// + /// Gets all nullable value types. i.e. excludes string and all basic value types. + /// + /// + /// All basic nullable value types. + /// + public static IReadOnlyCollection AllBasicNullableValueTypes { get; } = new ReadOnlyCollection( + BasicTypesInfo + .Value + .Where(kvp => kvp.Value.IsNullableValueType) + .Select(kvp => kvp.Key).ToArray()); + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Definitions.cs b/Vendor/Swan.Lite-3.1.0/Definitions.cs new file mode 100644 index 0000000..3c4e97a --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Definitions.cs @@ -0,0 +1,39 @@ +using System.Text; + +namespace Swan +{ + /// + /// Contains useful constants and definitions. + /// + public static partial class Definitions + { + /// + /// The MS Windows codepage 1252 encoding used in some legacy scenarios + /// such as default CSV text encoding from Excel. + /// + public static readonly Encoding Windows1252Encoding; + + /// + /// The encoding associated with the default ANSI code page in the operating + /// system's regional and language settings. + /// + public static readonly Encoding CurrentAnsiEncoding; + + /// + /// Initializes the class. + /// + static Definitions() + { + CurrentAnsiEncoding = Encoding.GetEncoding(default(int)); + try + { + Windows1252Encoding = Encoding.GetEncoding(1252); + } + catch + { + // ignore, the codepage is not available use default + Windows1252Encoding = CurrentAnsiEncoding; + } + } + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Diagnostics/Benchmark.cs b/Vendor/Swan.Lite-3.1.0/Diagnostics/Benchmark.cs new file mode 100644 index 0000000..d79f98b --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Diagnostics/Benchmark.cs @@ -0,0 +1,121 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; + +namespace Swan.Diagnostics +{ + /// + /// A simple benchmarking class. + /// + /// + /// The following code demonstrates how to create a simple benchmark. + /// + /// namespace Examples.Benchmark.Simple + /// { + /// using Swan.Diagnostics; + /// + /// public class SimpleBenchmark + /// { + /// public static void Main() + /// { + /// using (Benchmark.Start("Test")) + /// { + /// // do some logic in here + /// } + /// + /// // dump results into a string + /// var results = Benchmark.Dump(); + /// } + /// } + /// + /// } + /// + /// + public static partial class Benchmark + { + private static readonly object SyncLock = new object(); + private static readonly Dictionary> Measures = new Dictionary>(); + + /// + /// Starts measuring with the given identifier. + /// + /// The identifier. + /// A disposable object that when disposed, adds a benchmark result. + public static IDisposable Start(string identifier) => new BenchmarkUnit(identifier); + + /// + /// Outputs the benchmark statistics. + /// + /// A string containing human-readable statistics. + public static string Dump() + { + var builder = new StringBuilder(); + + lock (SyncLock) + { + foreach (var kvp in Measures) + { + builder.Append($"BID: {kvp.Key,-30} | ") + .Append($"CNT: {kvp.Value.Count,6} | ") + .Append($"AVG: {kvp.Value.Average(t => t.TotalMilliseconds),8:0.000} ms. | ") + .Append($"MAX: {kvp.Value.Max(t => t.TotalMilliseconds),8:0.000} ms. | ") + .Append($"MIN: {kvp.Value.Min(t => t.TotalMilliseconds),8:0.000} ms. | ") + .Append(Environment.NewLine); + } + } + + return builder.ToString().TrimEnd(); + } + + /// + /// Measures the elapsed time of the given action as a TimeSpan + /// This method uses a high precision Stopwatch if it is available. + /// + /// The target. + /// + /// A time interval that represents a specified time, where the specification is in units of ticks. + /// + /// target. + public static TimeSpan BenchmarkAction(Action target) + { + if (target == null) + throw new ArgumentNullException(nameof(target)); + + var sw = Stopwatch.IsHighResolution ? new HighResolutionTimer() : new Stopwatch(); + + try + { + sw.Start(); + target.Invoke(); + } + catch + { + // swallow + } + finally + { + sw.Stop(); + } + + return TimeSpan.FromTicks(sw.ElapsedTicks); + } + + /// + /// Adds the specified result to the given identifier. + /// + /// The identifier. + /// The elapsed. + private static void Add(string identifier, TimeSpan elapsed) + { + lock (SyncLock) + { + if (Measures.ContainsKey(identifier) == false) + Measures[identifier] = new List(1024 * 1024); + + Measures[identifier].Add(elapsed); + } + } + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Diagnostics/BenchmarkUnit.cs b/Vendor/Swan.Lite-3.1.0/Diagnostics/BenchmarkUnit.cs new file mode 100644 index 0000000..e896995 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Diagnostics/BenchmarkUnit.cs @@ -0,0 +1,50 @@ +using System; +using System.Diagnostics; + +namespace Swan.Diagnostics +{ + public static partial class Benchmark + { + /// + /// Represents a disposable benchmark unit. + /// + /// + private sealed class BenchmarkUnit : IDisposable + { + private readonly string _identifier; + private bool _isDisposed; // To detect redundant calls + private Stopwatch? _stopwatch = new Stopwatch(); + + /// + /// Initializes a new instance of the class. + /// + /// The identifier. + public BenchmarkUnit(string identifier) + { + _identifier = identifier; + _stopwatch?.Start(); + } + + /// + public void Dispose() => Dispose(true); + + /// + /// Releases unmanaged and - optionally - managed resources. + /// + /// true to release both managed and unmanaged resources; false to release only unmanaged resources. + private void Dispose(bool alsoManaged) + { + if (_isDisposed) return; + + if (alsoManaged) + { + Add(_identifier, _stopwatch?.Elapsed ?? default); + _stopwatch?.Stop(); + } + + _stopwatch = null; + _isDisposed = true; + } + } + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Diagnostics/HighResolutionTimer.cs b/Vendor/Swan.Lite-3.1.0/Diagnostics/HighResolutionTimer.cs new file mode 100644 index 0000000..b419d09 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Diagnostics/HighResolutionTimer.cs @@ -0,0 +1,32 @@ +namespace Swan.Diagnostics +{ + using System; + using System.Diagnostics; + + /// + /// Provides access to a high-resolution, time measuring device. + /// + /// + public class HighResolutionTimer : Stopwatch + { + /// + /// Initializes a new instance of the class. + /// + /// High-resolution timer not available. + public HighResolutionTimer() + { + if (!IsHighResolution) + throw new NotSupportedException("High-resolution timer not available"); + } + + /// + /// Gets the number of microseconds per timer tick. + /// + public static double MicrosecondsPerTick { get; } = 1000000d / Frequency; + + /// + /// Gets the elapsed microseconds. + /// + public long ElapsedMicroseconds => (long)(ElapsedTicks * MicrosecondsPerTick); + } +} diff --git a/Vendor/Swan.Lite-3.1.0/EnumHelper.cs b/Vendor/Swan.Lite-3.1.0/EnumHelper.cs new file mode 100644 index 0000000..cf49ec0 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/EnumHelper.cs @@ -0,0 +1,171 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Swan.Collections; + +namespace Swan +{ + /// + /// Provide Enumerations helpers with internal cache. + /// + public class EnumHelper + : SingletonBase>> + { + /// + /// Gets all the names and enumerators from a specific Enum type. + /// + /// The type of the attribute to be retrieved. + /// A tuple of enumerator names and their value stored for the specified type. + public static IEnumerable> Retrieve() + where T : struct, IConvertible + { + return Instance.Retrieve(typeof(T), t => Enum.GetValues(t) + .Cast() + .Select(item => Tuple.Create(Enum.GetName(t, item), item))); + } + + /// + /// Gets the cached items with the enum item value. + /// + /// The type of enumeration. + /// if set to true [humanize]. + /// + /// A collection of Type/Tuple pairs + /// that represents items with the enum item value. + /// + public static IEnumerable> GetItemsWithValue(bool humanize = true) + where T : struct, IConvertible + { + return Retrieve() + .Select(x => Tuple.Create((int) x.Item2, humanize ? x.Item1.Humanize() : x.Item1)); + } + + /// + /// Gets the flag values. + /// + /// The type of the enum. + /// The value. + /// if set to true [ignore zero]. + /// + /// A list of values in the flag. + /// + public static IEnumerable GetFlagValues(int value, bool ignoreZero = false) + where TEnum : struct, IConvertible + { + return Retrieve() + .Select(x => (int) x.Item2) + .When(() => ignoreZero, q => q.Where(f => f != 0)) + .Where(x => (x & value) == x); + } + + /// + /// Gets the flag values. + /// + /// The type of the enum. + /// The value. + /// if set to true [ignore zero]. + /// + /// A list of values in the flag. + /// + public static IEnumerable GetFlagValues(long value, bool ignoreZero = false) + where TEnum : struct, IConvertible + { + return Retrieve() + .Select(x => (long) x.Item2) + .When(() => ignoreZero, q => q.Where(f => f != 0)) + .Where(x => (x & value) == x); + } + + /// + /// Gets the flag values. + /// + /// The type of the enum. + /// The value. + /// if set to true [ignore zero]. + /// + /// A list of values in the flag. + /// + public static IEnumerable GetFlagValues(byte value, bool ignoreZero = false) + where TEnum : struct, IConvertible + { + return Retrieve() + .Select(x => (byte) x.Item2) + .When(() => ignoreZero, q => q.Where(f => f != 0)) + .Where(x => (x & value) == x); + } + + /// + /// Gets the flag names. + /// + /// The type of the enum. + /// the value. + /// if set to true [ignore zero]. + /// if set to true [humanize]. + /// + /// A list of flag names. + /// + public static IEnumerable GetFlagNames(int value, bool ignoreZero = false, bool humanize = true) + where TEnum : struct, IConvertible + { + return Retrieve() + .When(() => ignoreZero, q => q.Where(f => (int) f.Item2 != 0)) + .Where(x => ((int) x.Item2 & value) == (int) x.Item2) + .Select(x => humanize ? x.Item1.Humanize() : x.Item1); + } + + /// + /// Gets the flag names. + /// + /// The type of the enum. + /// The value. + /// if set to true [ignore zero]. + /// if set to true [humanize]. + /// + /// A list of flag names. + /// + public static IEnumerable GetFlagNames(long value, bool ignoreZero = false, bool humanize = true) + where TEnum : struct, IConvertible + { + return Retrieve() + .When(() => ignoreZero, q => q.Where(f => (long) f.Item2 != 0)) + .Where(x => ((long) x.Item2 & value) == (long) x.Item2) + .Select(x => humanize ? x.Item1.Humanize() : x.Item1); + } + + /// + /// Gets the flag names. + /// + /// The type of the enum. + /// The value. + /// if set to true [ignore zero]. + /// if set to true [humanize]. + /// + /// A list of flag names. + /// + public static IEnumerable GetFlagNames(byte value, bool ignoreZero = false, bool humanize = true) + where TEnum : struct, IConvertible + { + return Retrieve() + .When(() => ignoreZero, q => q.Where(f => (byte) f.Item2 != 0)) + .Where(x => ((byte) x.Item2 & value) == (byte) x.Item2) + .Select(x => humanize ? x.Item1.Humanize() : x.Item1); + } + + /// + /// Gets the cached items with the enum item index. + /// + /// The type of enumeration. + /// if set to true [humanize]. + /// + /// A collection of Type/Tuple pairs that represents items with the enum item value. + /// + public static IEnumerable> GetItemsWithIndex(bool humanize = true) + where T : struct, IConvertible + { + var i = 0; + + return Retrieve() + .Select(x => Tuple.Create(i++, humanize ? x.Item1.Humanize() : x.Item1)); + } + } +} \ No newline at end of file diff --git a/Vendor/Swan.Lite-3.1.0/Enums.cs b/Vendor/Swan.Lite-3.1.0/Enums.cs new file mode 100644 index 0000000..f3dc604 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Enums.cs @@ -0,0 +1,44 @@ +namespace Swan +{ + /// + /// Enumeration of Operating Systems. + /// + public enum OperatingSystem + { + /// + /// Unknown OS + /// + Unknown, + + /// + /// Windows + /// + Windows, + + /// + /// UNIX/Linux + /// + Unix, + + /// + /// macOS (OSX) + /// + Osx, + } + + /// + /// Defines Endianness, big or little. + /// + public enum Endianness + { + /// + /// In big endian, you store the most significant byte in the smallest address. + /// + Big, + + /// + /// In little endian, you store the least significant byte in the smallest address. + /// + Little, + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Extensions.ByteArrays.cs b/Vendor/Swan.Lite-3.1.0/Extensions.ByteArrays.cs new file mode 100644 index 0000000..bd025ce --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Extensions.ByteArrays.cs @@ -0,0 +1,511 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace Swan +{ + /// + /// Provides various extension methods for byte arrays and streams. + /// + public static class ByteArrayExtensions + { + /// + /// Converts an array of bytes to its lower-case, hexadecimal representation. + /// + /// The bytes. + /// if set to true add the 0x prefix tot he output. + /// + /// The specified string instance; no actual conversion is performed. + /// + /// bytes. + public static string ToLowerHex(this byte[] bytes, bool addPrefix = false) + => ToHex(bytes, addPrefix, "x2"); + + /// + /// Converts an array of bytes to its upper-case, hexadecimal representation. + /// + /// The bytes. + /// if set to true [add prefix]. + /// + /// The specified string instance; no actual conversion is performed. + /// + /// bytes. + public static string ToUpperHex(this byte[] bytes, bool addPrefix = false) + => ToHex(bytes, addPrefix, "X2"); + + /// + /// Converts an array of bytes to a sequence of dash-separated, hexadecimal, + /// uppercase characters. + /// + /// The bytes. + /// + /// A string of hexadecimal pairs separated by hyphens, where each pair represents + /// the corresponding element in value; for example, "7F-2C-4A-00". + /// + public static string ToDashedHex(this byte[] bytes) => BitConverter.ToString(bytes); + + /// + /// Converts an array of bytes to a base-64 encoded string. + /// + /// The bytes. + /// A converted from an array of bytes. + public static string ToBase64(this byte[] bytes) => Convert.ToBase64String(bytes); + + /// + /// Converts a set of hexadecimal characters (uppercase or lowercase) + /// to a byte array. String length must be a multiple of 2 and + /// any prefix (such as 0x) has to be avoided for this to work properly. + /// + /// The hexadecimal. + /// + /// A byte array containing the results of encoding the specified set of characters. + /// + /// hex. + public static byte[] ConvertHexadecimalToBytes(this string @this) + { + if (string.IsNullOrWhiteSpace(@this)) + throw new ArgumentNullException(nameof(@this)); + + return Enumerable + .Range(0, @this.Length / 2) + .Select(x => Convert.ToByte(@this.Substring(x * 2, 2), 16)) + .ToArray(); + } + + /// + /// Gets the bit value at the given offset. + /// + /// The b. + /// The offset. + /// The length. + /// + /// Bit value at the given offset. + /// + public static byte GetBitValueAt(this byte @this, byte offset, byte length = 1) => (byte)((@this >> offset) & ~(0xff << length)); + + /// + /// Sets the bit value at the given offset. + /// + /// The b. + /// The offset. + /// The length. + /// The value. + /// Bit value at the given offset. + public static byte SetBitValueAt(this byte @this, byte offset, byte length, byte value) + { + var mask = ~(0xff << length); + var valueAt = (byte)(value & mask); + + return (byte)((valueAt << offset) | (@this & ~(mask << offset))); + } + + /// + /// Sets the bit value at the given offset. + /// + /// The b. + /// The offset. + /// The value. + /// Bit value at the given offset. + public static byte SetBitValueAt(this byte @this, byte offset, byte value) => @this.SetBitValueAt(offset, 1, value); + + /// + /// Splits a byte array delimited by the specified sequence of bytes. + /// Each individual element in the result will contain the split sequence terminator if it is found to be delimited by it. + /// For example if you split [1,2,3,4] by a sequence of [2,3] this method will return a list with 2 byte arrays, one containing [1,2,3] and the + /// second one containing 4. Use the Trim extension methods to remove terminator sequences. + /// + /// The buffer. + /// The offset at which to start splitting bytes. Any bytes before this will be discarded. + /// The sequence. + /// + /// A byte array containing the results the specified sequence of bytes. + /// + /// + /// buffer + /// or + /// sequence. + /// + public static List Split(this byte[] @this, int offset, params byte[] sequence) + { + if (@this == null) + throw new ArgumentNullException(nameof(@this)); + + if (sequence == null) + throw new ArgumentNullException(nameof(sequence)); + + var seqOffset = offset.Clamp(0, @this.Length - 1); + + var result = new List(); + + while (seqOffset < @this.Length) + { + var separatorStartIndex = @this.GetIndexOf(sequence, seqOffset); + + if (separatorStartIndex >= 0) + { + var item = new byte[separatorStartIndex - seqOffset + sequence.Length]; + Array.Copy(@this, seqOffset, item, 0, item.Length); + result.Add(item); + seqOffset += item.Length; + } + else + { + var item = new byte[@this.Length - seqOffset]; + Array.Copy(@this, seqOffset, item, 0, item.Length); + result.Add(item); + break; + } + } + + return result; + } + + /// + /// Clones the specified buffer, byte by byte. + /// + /// The buffer. + /// + /// A byte array containing the results of encoding the specified set of characters. + /// + /// this + public static byte[] DeepClone(this byte[] @this) + { + if (@this == null) + throw new ArgumentNullException(nameof(@this)); + + var result = new byte[@this.Length]; + Array.Copy(@this, result, @this.Length); + return result; + } + + /// + /// Removes the specified sequence from the start of the buffer if the buffer begins with such sequence. + /// + /// The buffer. + /// The sequence. + /// + /// A new trimmed byte array. + /// + /// buffer. + public static byte[] TrimStart(this byte[] buffer, params byte[] sequence) + { + if (buffer == null) + throw new ArgumentNullException(nameof(buffer)); + + if (buffer.StartsWith(sequence) == false) + return buffer.DeepClone(); + + var result = new byte[buffer.Length - sequence.Length]; + Array.Copy(buffer, sequence.Length, result, 0, result.Length); + return result; + } + + /// + /// Removes the specified sequence from the end of the buffer if the buffer ends with such sequence. + /// + /// The buffer. + /// The sequence. + /// + /// A byte array containing the results of encoding the specified set of characters. + /// + /// buffer. + public static byte[] TrimEnd(this byte[] buffer, params byte[] sequence) + { + if (buffer == null) + throw new ArgumentNullException(nameof(buffer)); + + if (buffer.EndsWith(sequence) == false) + return buffer.DeepClone(); + + var result = new byte[buffer.Length - sequence.Length]; + Array.Copy(buffer, 0, result, 0, result.Length); + return result; + } + + /// + /// Removes the specified sequence from the end and the start of the buffer + /// if the buffer ends and/or starts with such sequence. + /// + /// The buffer. + /// The sequence. + /// A byte array containing the results of encoding the specified set of characters. + public static byte[] Trim(this byte[] buffer, params byte[] sequence) + { + var trimStart = buffer.TrimStart(sequence); + return trimStart.TrimEnd(sequence); + } + + /// + /// Determines if the specified buffer ends with the given sequence of bytes. + /// + /// The buffer. + /// The sequence. + /// + /// True if the specified buffer is ends; otherwise, false. + /// + /// buffer. + public static bool EndsWith(this byte[] buffer, params byte[] sequence) + { + if (buffer == null) + throw new ArgumentNullException(nameof(buffer)); + + var startIndex = buffer.Length - sequence.Length; + return buffer.GetIndexOf(sequence, startIndex) == startIndex; + } + + /// + /// Determines if the specified buffer starts with the given sequence of bytes. + /// + /// The buffer. + /// The sequence. + /// true if the specified buffer starts; otherwise, false. + public static bool StartsWith(this byte[] buffer, params byte[] sequence) => buffer.GetIndexOf(sequence) == 0; + + /// + /// Determines whether the buffer contains the specified sequence. + /// + /// The buffer. + /// The sequence. + /// + /// true if [contains] [the specified sequence]; otherwise, false. + /// + public static bool Contains(this byte[] buffer, params byte[] sequence) => buffer.GetIndexOf(sequence) >= 0; + + /// + /// Determines whether the buffer exactly matches, byte by byte the specified sequence. + /// + /// The buffer. + /// The sequence. + /// + /// true if [is equal to] [the specified sequence]; otherwise, false. + /// + /// buffer. + public static bool IsEqualTo(this byte[] buffer, params byte[] sequence) + { + if (ReferenceEquals(buffer, sequence)) + return true; + + if (buffer == null) + throw new ArgumentNullException(nameof(buffer)); + + return buffer.Length == sequence.Length && buffer.GetIndexOf(sequence) == 0; + } + + /// + /// Returns the first instance of the matched sequence based on the given offset. + /// If no matches are found then this method returns -1. + /// + /// The buffer. + /// The sequence. + /// The offset. + /// The index of the sequence. + /// + /// buffer + /// or + /// sequence. + /// + public static int GetIndexOf(this byte[] buffer, byte[] sequence, int offset = 0) + { + if (buffer == null) + throw new ArgumentNullException(nameof(buffer)); + if (sequence == null) + throw new ArgumentNullException(nameof(sequence)); + if (sequence.Length == 0) + return -1; + if (sequence.Length > buffer.Length) + return -1; + + var seqOffset = offset < 0 ? 0 : offset; + + var matchedCount = 0; + for (var i = seqOffset; i < buffer.Length; i++) + { + if (buffer[i] == sequence[matchedCount]) + matchedCount++; + else + matchedCount = 0; + + if (matchedCount == sequence.Length) + return i - (matchedCount - 1); + } + + return -1; + } + + /// + /// Appends the Memory Stream with the specified buffer. + /// + /// The stream. + /// The buffer. + /// + /// The same MemoryStream instance. + /// + /// + /// stream + /// or + /// buffer. + /// + public static MemoryStream Append(this MemoryStream stream, byte[] buffer) + { + if (stream == null) + throw new ArgumentNullException(nameof(stream)); + + if (buffer == null) + throw new ArgumentNullException(nameof(buffer)); + + stream.Write(buffer, 0, buffer.Length); + return stream; + } + + /// + /// Appends the Memory Stream with the specified buffer. + /// + /// The stream. + /// The buffer. + /// + /// Block of bytes to the current stream using data read from a buffer. + /// + /// buffer. + public static MemoryStream Append(this MemoryStream stream, IEnumerable buffer) => Append(stream, buffer?.ToArray()); + + /// + /// Appends the Memory Stream with the specified set of buffers. + /// + /// The stream. + /// The buffers. + /// + /// Block of bytes to the current stream using data read from a buffer. + /// + /// buffers. + public static MemoryStream Append(this MemoryStream stream, IEnumerable buffers) + { + if (buffers == null) + throw new ArgumentNullException(nameof(buffers)); + + foreach (var buffer in buffers) + Append(stream, buffer); + + return stream; + } + + /// + /// Converts an array of bytes into text with the specified encoding. + /// + /// The buffer. + /// The encoding. + /// A that contains the results of decoding the specified sequence of bytes. + public static string ToText(this IEnumerable buffer, Encoding encoding) => + encoding == null + ? throw new ArgumentNullException(nameof(encoding)) + : encoding.GetString(buffer.ToArray()); + + /// + /// Converts an array of bytes into text with UTF8 encoding. + /// + /// The buffer. + /// A that contains the results of decoding the specified sequence of bytes. + public static string ToText(this IEnumerable buffer) => buffer.ToText(Encoding.UTF8); + + /// + /// Reads the bytes asynchronous. + /// + /// The stream. + /// The length. + /// Length of the buffer. + /// The cancellation token. + /// + /// A byte array containing the results of encoding the specified set of characters. + /// + /// stream. + public static async Task ReadBytesAsync(this Stream stream, long length, int bufferLength, CancellationToken cancellationToken = default) + { + if (stream == null) + throw new ArgumentNullException(nameof(stream)); + + using var dest = new MemoryStream(); + + try + { + var buff = new byte[bufferLength]; + while (length > 0) + { + if (length < bufferLength) + bufferLength = (int)length; + + var read = await stream.ReadAsync(buff, 0, bufferLength, cancellationToken).ConfigureAwait(false); + if (read == 0) + break; + + dest.Write(buff, 0, read); + length -= read; + } + } +#pragma warning disable CA1031 // Do not catch general exception types + catch +#pragma warning restore CA1031 // Do not catch general exception types + { + // ignored + } + + return dest.ToArray(); + } + + /// + /// Reads the bytes asynchronous. + /// + /// The stream. + /// The length. + /// The cancellation token. + /// + /// A byte array containing the results of encoding the specified set of characters. + /// + /// stream. + public static async Task ReadBytesAsync(this Stream stream, int length, CancellationToken cancellationToken = default) + { + if (stream == null) + throw new ArgumentNullException(nameof(stream)); + + var buff = new byte[length]; + var offset = 0; + + try + { + while (length > 0) + { + var read = await stream.ReadAsync(buff, offset, length, cancellationToken).ConfigureAwait(false); + if (read == 0) + break; + + offset += read; + length -= read; + } + } +#pragma warning disable CA1031 // Do not catch general exception types + catch +#pragma warning restore CA1031 // Do not catch general exception types + { + // ignored + } + + return new ArraySegment(buff, 0, offset).ToArray(); + } + + private static string ToHex(byte[] bytes, bool addPrefix, string format) + { + if (bytes == null) + throw new ArgumentNullException(nameof(bytes)); + + var sb = new StringBuilder(bytes.Length * 2); + + foreach (var item in bytes) + sb.Append(item.ToString(format, CultureInfo.InvariantCulture)); + + return $"{(addPrefix ? "0x" : string.Empty)}{sb}"; + } + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Extensions.Dates.cs b/Vendor/Swan.Lite-3.1.0/Extensions.Dates.cs new file mode 100644 index 0000000..811df20 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Extensions.Dates.cs @@ -0,0 +1,234 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; + +namespace Swan +{ + /// + /// Provides extension methods for . + /// + public static class DateExtensions + { + private static readonly Dictionary DateRanges = new Dictionary() + { + { "minute", 59}, + { "hour", 23}, + { "dayOfMonth", 31}, + { "month", 12}, + { "dayOfWeek", 6}, + }; + + /// + /// Converts the date to a YYYY-MM-DD string. + /// + /// The on which this method is called. + /// The concatenation of date.Year, date.Month and date.Day. + public static string ToSortableDate(this DateTime @this) + => $"{@this.Year:0000}-{@this.Month:00}-{@this.Day:00}"; + + /// + /// Converts the date to a YYYY-MM-DD HH:II:SS string. + /// + /// The on which this method is called. + /// The concatenation of date.Year, date.Month, date.Day, date.Hour, date.Minute and date.Second. + public static string ToSortableDateTime(this DateTime @this) + => $"{@this.Year:0000}-{@this.Month:00}-{@this.Day:00} {@this.Hour:00}:{@this.Minute:00}:{@this.Second:00}"; + + /// + /// Parses a YYYY-MM-DD and optionally it time part, HH:II:SS into a DateTime. + /// + /// The sortable date. + /// + /// A new instance of the DateTime structure to + /// the specified year, month, day, hour, minute and second. + /// + /// sortableDate. + /// + /// Represents errors that occur during application execution. + /// + /// + /// Unable to parse sortable date and time. - sortableDate. + /// + public static DateTime ToDateTime(this string @this) + { + if (string.IsNullOrWhiteSpace(@this)) + throw new ArgumentNullException(nameof(@this)); + + var hour = 0; + var minute = 0; + var second = 0; + + var dateTimeParts = @this.Split(' '); + + try + { + if (dateTimeParts.Length != 1 && dateTimeParts.Length != 2) + throw new Exception(); + + var dateParts = dateTimeParts[0].Split('-'); + if (dateParts.Length != 3) throw new Exception(); + + var year = int.Parse(dateParts[0]); + var month = int.Parse(dateParts[1]); + var day = int.Parse(dateParts[2]); + + if (dateTimeParts.Length > 1) + { + var timeParts = dateTimeParts[1].Split(':'); + if (timeParts.Length != 3) throw new Exception(); + + hour = int.Parse(timeParts[0]); + minute = int.Parse(timeParts[1]); + second = int.Parse(timeParts[2]); + } + + return new DateTime(year, month, day, hour, minute, second); + } + catch (Exception) + { + throw new ArgumentException("Unable to parse sortable date and time.", nameof(@this)); + } + } + + /// + /// Creates a date range. + /// + /// The start date. + /// The end date. + /// + /// A sequence of integral numbers within a specified date's range. + /// + public static IEnumerable DateRange(this DateTime startDate, DateTime endDate) + => Enumerable.Range(0, (endDate - startDate).Days + 1).Select(d => startDate.AddDays(d)); + + /// + /// Rounds up a date to match a timespan. + /// + /// The datetime. + /// The timespan to match. + /// + /// A new instance of the DateTime structure to the specified datetime and timespan ticks. + /// + public static DateTime RoundUp(this DateTime date, TimeSpan timeSpan) + => new DateTime(((date.Ticks + timeSpan.Ticks - 1) / timeSpan.Ticks) * timeSpan.Ticks); + + /// + /// Get this datetime as a Unix epoch timestamp (seconds since Jan 1, 1970, midnight UTC). + /// + /// The on which this method is called. + /// Seconds since Unix epoch. + public static long ToUnixEpochDate(this DateTime @this) => new DateTimeOffset(@this).ToUniversalTime().ToUnixTimeSeconds(); + + /// + /// Compares a Date to another and returns a DateTimeSpan. + /// + /// The date start. + /// The date end. + /// A DateTimeSpan with the Years, Months, Days, Hours, Minutes, Seconds and Milliseconds between the dates. + public static DateTimeSpan GetDateTimeSpan(this DateTime dateStart, DateTime dateEnd) + => DateTimeSpan.CompareDates(dateStart, dateEnd); + + /// + /// Compare the Date elements(Months, Days, Hours, Minutes). + /// + /// The on which this method is called. + /// The minute (0-59). + /// The hour. (0-23). + /// The day of month. (1-31). + /// The month. (1-12). + /// The day of week. (0-6)(Sunday = 0). + /// Returns true if Months, Days, Hours and Minutes match, otherwise false. + public static bool AsCronCanRun(this DateTime @this, int? minute = null, int? hour = null, int? dayOfMonth = null, int? month = null, int? dayOfWeek = null) + { + var results = new List + { + GetElementParts(minute, @this.Minute), + GetElementParts(hour, @this.Hour), + GetElementParts(dayOfMonth, @this.Day), + GetElementParts(month, @this.Month), + GetElementParts(dayOfWeek, (int) @this.DayOfWeek), + }; + + return results.Any(x => x != false); + } + + /// + /// Compare the Date elements(Months, Days, Hours, Minutes). + /// + /// The on which this method is called. + /// The minute (0-59). + /// The hour. (0-23). + /// The day of month. (1-31). + /// The month. (1-12). + /// The day of week. (0-6)(Sunday = 0). + /// Returns true if Months, Days, Hours and Minutes match, otherwise false. + public static bool AsCronCanRun(this DateTime @this, string minute = "*", string hour = "*", string dayOfMonth = "*", string month = "*", string dayOfWeek = "*") + { + var results = new List + { + GetElementParts(minute, nameof(minute), @this.Minute), + GetElementParts(hour, nameof(hour), @this.Hour), + GetElementParts(dayOfMonth, nameof(dayOfMonth), @this.Day), + GetElementParts(month, nameof(month), @this.Month), + GetElementParts(dayOfWeek, nameof(dayOfWeek), (int) @this.DayOfWeek), + }; + + return results.Any(x => x != false); + } + + /// + /// Converts a to the RFC1123 format. + /// + /// The on which this method is called. + /// The string representation of according to RFC1123. + /// + /// If is not a UTC date / time, its UTC equivalent is converted, leaving unchanged. + /// + public static string ToRfc1123String(this DateTime @this) + => @this.ToUniversalTime().ToString("R", CultureInfo.InvariantCulture); + + private static bool? GetElementParts(int? status, int value) => status.HasValue ? status.Value == value : (bool?) null; + + private static bool? GetElementParts(string parts, string type, int value) + { + if (string.IsNullOrWhiteSpace(parts) || parts == "*") + return null; + + if (parts.Contains(",")) + { + return parts.Split(',').Select(int.Parse).Contains(value); + } + + var stop = DateRanges[type]; + + if (parts.Contains("/")) + { + var multiple = int.Parse(parts.Split('/').Last()); + var start = type == "dayOfMonth" || type == "month" ? 1 : 0; + + for (var i = start; i <= stop; i += multiple) + if (i == value) return true; + + return false; + } + + if (parts.Contains("-")) + { + var range = parts.Split('-'); + var start = int.Parse(range.First()); + stop = Math.Max(stop, int.Parse(range.Last())); + + if ((type == "dayOfMonth" || type == "month") && start == 0) + start = 1; + + for (var i = start; i <= stop; i++) + if (i == value) return true; + + return false; + } + + return int.Parse(parts) == value; + } + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Extensions.Dictionaries.cs b/Vendor/Swan.Lite-3.1.0/Extensions.Dictionaries.cs new file mode 100644 index 0000000..bb830cf --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Extensions.Dictionaries.cs @@ -0,0 +1,86 @@ +using System; +using System.Collections.Generic; + +namespace Swan +{ + /// + /// Extension methods. + /// + public static partial class Extensions + { + /// + /// Gets the value if exists or default. + /// + /// The type of the key. + /// The type of the value. + /// The dictionary. + /// The key. + /// The default value. + /// + /// The value of the provided key or default. + /// + /// dict. + public static TValue GetValueOrDefault(this IDictionary dict, TKey key, TValue defaultValue = default) + { + if (dict == null) + throw new ArgumentNullException(nameof(dict)); + + return dict.ContainsKey(key) ? dict[key] : defaultValue; + } + + /// + /// Adds a key/value pair to the Dictionary if the key does not already exist. + /// If the value is null, the key will not be updated. + /// Based on ConcurrentDictionary.GetOrAdd method. + /// + /// The type of the key. + /// The type of the value. + /// The dictionary. + /// The key. + /// The value factory. + /// + /// The value for the key. + /// + /// + /// dict + /// or + /// valueFactory. + /// + public static TValue GetOrAdd(this IDictionary dict, TKey key, Func valueFactory) + { + if (dict == null) + throw new ArgumentNullException(nameof(dict)); + + if (valueFactory == null) + throw new ArgumentNullException(nameof(valueFactory)); + + if (!dict.ContainsKey(key)) + { + var value = valueFactory(key); + if (Equals(value, default)) return default; + dict[key] = value; + } + + return dict[key]; + } + + /// + /// Executes the item action for each element in the Dictionary. + /// + /// The type of the key. + /// The type of the value. + /// The dictionary. + /// The item action. + /// dict. + public static void ForEach(this IDictionary dict, Action itemAction) + { + if (dict == null) + throw new ArgumentNullException(nameof(dict)); + + foreach (var kvp in dict) + { + itemAction(kvp.Key, kvp.Value); + } + } + } +} \ No newline at end of file diff --git a/Vendor/Swan.Lite-3.1.0/Extensions.Enumerable.cs b/Vendor/Swan.Lite-3.1.0/Extensions.Enumerable.cs new file mode 100644 index 0000000..e7a60b7 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Extensions.Enumerable.cs @@ -0,0 +1,43 @@ +using System.Collections.Generic; +using System.Linq; + +namespace Swan +{ + /// + /// This class contains extension methods for types implementing IEnumerable<TSource> + /// + public static class EnumerableExtensions + { + /// + /// This method returns the Union + /// of all non-null parameters. + /// + /// The type of the elements of the input sequences. + /// An IEnumerable<TSource> whose distinct elements forms the first set of the union. + /// An IEnumerable<TSource> whose distinct elements forms the second set of the union. + /// + /// An that contains the elements from non-null input sequences, excluding duplicates. + /// + public static IEnumerable UnionExcludingNulls(this IEnumerable @this, IEnumerable second) + => Enumerable.Union( + @this ?? Enumerable.Empty(), + second ?? Enumerable.Empty()); + + /// + /// This method returns the Union + /// of all non-null parameters. + /// + /// The type of the elements of the input sequences. + /// An IEnumerable<TSource> whose distinct elements forms the first set of the union. + /// An IEnumerable<TSource> whose distinct elements forms the second set of the union. + /// The IEqualityComparer<TSource> to compare values. + /// + /// An that contains the elements from non-null input sequences, excluding duplicates. + /// + public static IEnumerable UnionExcludingNulls(this IEnumerable @this, IEnumerable second, IEqualityComparer comparer) + => Enumerable.Union( + @this ?? Enumerable.Empty(), + second ?? Enumerable.Empty(), + comparer); + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Extensions.Exceptions.cs b/Vendor/Swan.Lite-3.1.0/Extensions.Exceptions.cs new file mode 100644 index 0000000..02b7d06 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Extensions.Exceptions.cs @@ -0,0 +1,66 @@ +using System; +using System.Linq; +using System.Runtime.ExceptionServices; +using System.Threading; + +namespace Swan +{ + /// + /// Provides extension methods for . + /// + public static class ExceptionExtensions + { + /// + /// Returns a value that tells whether an is of a type that + /// we better not catch and ignore. + /// + /// The exception being thrown. + /// if is a critical exception; + /// otherwise, . + public static bool IsCriticalException(this Exception @this) + => @this.IsCriticalExceptionCore() + || (@this.InnerException?.IsCriticalException() ?? false) + || (@this is AggregateException aggregateException && aggregateException.InnerExceptions.Any(e => e.IsCriticalException())); + + /// + /// Returns a value that tells whether an is of a type that + /// will likely cause application failure. + /// + /// The exception being thrown. + /// if is a fatal exception; + /// otherwise, . + public static bool IsFatalException(this Exception @this) + => @this.IsFatalExceptionCore() + || (@this.InnerException?.IsFatalException() ?? false) + || (@this is AggregateException aggregateException && aggregateException.InnerExceptions.Any(e => e.IsFatalException())); + + /// + /// Rethrows an already-thrown exception, preserving the stack trace of the original throw. + /// This method does not return; its return type is an exception type so it can be used + /// with throw semantics, e.g.: throw ex.RethrowPreservingStackTrace();, + /// to let static code analysis tools that it throws instead of returning. + /// + /// The exception to rethrow. + /// This method should never return; if it does, it is an indication of an internal error, + /// so it returns an instance of . + public static InternalErrorException RethrowPreservingStackTrace(this Exception @this) + { + ExceptionDispatchInfo.Capture(@this).Throw(); + return SelfCheck.Failure("Reached unreachable code."); + } + + private static bool IsCriticalExceptionCore(this Exception @this) + => IsFatalExceptionCore(@this) + || @this is AppDomainUnloadedException + || @this is BadImageFormatException + || @this is CannotUnloadAppDomainException + || @this is InvalidProgramException + || @this is NullReferenceException; + + private static bool IsFatalExceptionCore(this Exception @this) + => @this is StackOverflowException + || @this is OutOfMemoryException + || @this is ThreadAbortException + || @this is AccessViolationException; + } +} \ No newline at end of file diff --git a/Vendor/Swan.Lite-3.1.0/Extensions.Functional.cs b/Vendor/Swan.Lite-3.1.0/Extensions.Functional.cs new file mode 100644 index 0000000..dcbcbf9 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Extensions.Functional.cs @@ -0,0 +1,179 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace Swan +{ + /// + /// Functional programming extension methods. + /// + public static class FunctionalExtensions + { + /// + /// Whens the specified condition. + /// + /// The type of IQueryable. + /// The list. + /// The condition. + /// The function. + /// + /// The IQueryable. + /// + /// + /// this + /// or + /// condition + /// or + /// fn. + /// + public static IQueryable When( + this IQueryable list, + Func condition, + Func, IQueryable> fn) + { + if (list == null) + throw new ArgumentNullException(nameof(list)); + + if (condition == null) + throw new ArgumentNullException(nameof(condition)); + + if (fn == null) + throw new ArgumentNullException(nameof(fn)); + + return condition() ? fn(list) : list; + } + + /// + /// Whens the specified condition. + /// + /// The type of IEnumerable. + /// The list. + /// The condition. + /// The function. + /// + /// The IEnumerable. + /// + /// + /// this + /// or + /// condition + /// or + /// fn. + /// + public static IEnumerable When( + this IEnumerable list, + Func condition, + Func, IEnumerable> fn) + { + if (list == null) + throw new ArgumentNullException(nameof(list)); + + if (condition == null) + throw new ArgumentNullException(nameof(condition)); + + if (fn == null) + throw new ArgumentNullException(nameof(fn)); + + return condition() ? fn(list) : list; + } + + /// + /// Adds the value when the condition is true. + /// + /// The type of IList element. + /// The list. + /// The condition. + /// The value. + /// + /// The IList. + /// + /// + /// this + /// or + /// condition + /// or + /// value. + /// + public static IList AddWhen( + this IList list, + Func condition, + Func value) + { + if (list == null) + throw new ArgumentNullException(nameof(list)); + + if (condition == null) + throw new ArgumentNullException(nameof(condition)); + + if (value == null) + throw new ArgumentNullException(nameof(value)); + + if (condition()) + list.Add(value()); + + return list; + } + + /// + /// Adds the value when the condition is true. + /// + /// The type of IList element. + /// The list. + /// if set to true [condition]. + /// The value. + /// + /// The IList. + /// + /// list. + public static IList AddWhen( + this IList list, + bool condition, + T value) + { + if (list == null) + throw new ArgumentNullException(nameof(list)); + + if (condition) + list.Add(value); + + return list; + } + + /// + /// Adds the range when the condition is true. + /// + /// The type of List element. + /// The list. + /// The condition. + /// The value. + /// + /// The List. + /// + /// + /// this + /// or + /// condition + /// or + /// value. + /// + public static List AddRangeWhen( + this List list, + Func condition, + Func> value) + { + if (list == null) + throw new ArgumentNullException(nameof(list)); + + if (condition == null) + throw new ArgumentNullException(nameof(condition)); + + if (value == null) + throw new ArgumentNullException(nameof(value)); + + if (condition()) + list.AddRange(value()); + + return list; + } + } +} \ No newline at end of file diff --git a/Vendor/Swan.Lite-3.1.0/Extensions.IEnumerable.cs b/Vendor/Swan.Lite-3.1.0/Extensions.IEnumerable.cs new file mode 100644 index 0000000..ed36a70 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Extensions.IEnumerable.cs @@ -0,0 +1,25 @@ +using System.Collections.Generic; +using System.Linq; + +namespace Swan +{ + /// + /// This class contains extensions methods for IEnumerable + /// + public static class IEnumerableExtensions + { + /// + /// This method make an union of two IEnumerables + /// validation when some of them is null. + /// + /// T + /// The this. + /// The second. + /// The Union + public static IEnumerable UnionNull(this IEnumerable @this, IEnumerable second) + { + if (@this == null) return second; + return second == null ? @this : @this.Union(second); + } + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Extensions.IPropertyProxy.cs b/Vendor/Swan.Lite-3.1.0/Extensions.IPropertyProxy.cs new file mode 100644 index 0000000..7b48136 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Extensions.IPropertyProxy.cs @@ -0,0 +1,175 @@ +using System; +using System.Collections.Generic; +using System.Linq.Expressions; +using System.Reflection; +using Swan.Reflection; + +namespace Swan +{ + /// + /// Provides functionality to access objects + /// associated with types. Getters and setters are stored as delegates compiled + /// from constructed lambda expressions for fast access. + /// + public static class PropertyProxyExtensions + { + private static readonly object SyncLock = new object(); + private static readonly Dictionary> ProxyCache = + new Dictionary>(32); + + /// + /// Gets the property proxies associated with a given type. + /// + /// The type to retrieve property proxies from. + /// A dictionary with property names as keys and objects as values. + public static Dictionary PropertyProxies(this Type t) + { + if (t == null) + throw new ArgumentNullException(nameof(t)); + + lock (SyncLock) + { + if (ProxyCache.ContainsKey(t)) + return ProxyCache[t]; + + var properties = t.GetProperties(BindingFlags.Instance | BindingFlags.Public); + var result = new Dictionary(properties.Length, StringComparer.InvariantCultureIgnoreCase); + foreach (var propertyInfo in properties) + result[propertyInfo.Name] = new PropertyInfoProxy(t, propertyInfo); + + ProxyCache[t] = result; + return result; + } + } + + /// + /// Gets the property proxies associated with the provided instance type. + /// + /// The instance type. + /// The instance. + /// A dictionary with property names as keys and objects as values. + public static Dictionary PropertyProxies(this T obj) => + (obj?.GetType() ?? typeof(T)).PropertyProxies(); + + /// + /// Gets the property proxy given the property name. + /// + /// The associated type. + /// Name of the property. + /// The associated + public static IPropertyProxy PropertyProxy(this Type t, string propertyName) + { + var proxies = t.PropertyProxies(); + return proxies.ContainsKey(propertyName) ? proxies[propertyName] : null; + } + + /// + /// Gets the property proxy given the property name. + /// + /// The type of instance to extract proxies from. + /// The instance to extract proxies from. + /// Name of the property. + /// The associated + public static IPropertyProxy PropertyProxy(this T obj, string propertyName) + { + if (propertyName == null) + throw new ArgumentNullException(nameof(propertyName)); + var proxies = (obj?.GetType() ?? typeof(T)).PropertyProxies(); + + return proxies?.ContainsKey(propertyName) == true ? proxies[propertyName] : null; + } + + /// + /// Gets the property proxy given the property name as an expression. + /// + /// The instance type. + /// The property value type. + /// The object. + /// The property expression. + /// The associated + public static IPropertyProxy PropertyProxy(this T obj, Expression> propertyExpression) + { + if (propertyExpression == null) + throw new ArgumentNullException(nameof(propertyExpression)); + + var proxies = (obj?.GetType() ?? typeof(T)).PropertyProxies(); + var propertyName = propertyExpression.PropertyName(); + return proxies?.ContainsKey(propertyName) == true ? proxies[propertyName] : null; + } + + /// + /// Reads the property value. + /// + /// The type to get property proxies from. + /// The type of the property. + /// The instance. + /// The property expression. + /// + /// The value obtained from the associated + /// + /// obj. + public static V ReadProperty(this T obj, Expression> propertyExpression) + { + if (obj == null) + throw new ArgumentNullException(nameof(obj)); + + var proxy = obj.PropertyProxy(propertyExpression); + return (V)(proxy?.GetValue(obj)); + } + + /// + /// Reads the property value. + /// + /// The type to get property proxies from. + /// The instance. + /// Name of the property. + /// + /// The value obtained from the associated + /// + /// obj. + public static object? ReadProperty(this T obj, string propertyName) + { + if (obj == null) + throw new ArgumentNullException(nameof(obj)); + + var proxy = obj.PropertyProxy(propertyName); + return proxy?.GetValue(obj); + } + + /// + /// Writes the property value. + /// + /// The type to get property proxies from. + /// The type of the property. + /// The instance. + /// The property expression. + /// The value. + public static void WriteProperty(this T obj, Expression> propertyExpression, TV value) + { + var proxy = obj.PropertyProxy(propertyExpression); + proxy?.SetValue(obj, value); + } + + /// + /// Writes the property value using the property proxy. + /// + /// The type to get property proxies from. + /// The instance. + /// Name of the property. + /// The value. + public static void WriteProperty(this T obj, string propertyName, object? value) + { + var proxy = obj.PropertyProxy(propertyName); + proxy?.SetValue(obj, value); + } + + private static string PropertyName(this Expression> propertyExpression) + { + var memberExpression = !(propertyExpression.Body is MemberExpression) + ? (propertyExpression.Body as UnaryExpression).Operand as MemberExpression + : propertyExpression.Body as MemberExpression; + + return memberExpression.Member.Name; + } + } +} \ No newline at end of file diff --git a/Vendor/Swan.Lite-3.1.0/Extensions.Reflection.cs b/Vendor/Swan.Lite-3.1.0/Extensions.Reflection.cs new file mode 100644 index 0000000..18c1b41 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Extensions.Reflection.cs @@ -0,0 +1,335 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; + +namespace Swan +{ + /// + /// Provides various extension methods for Reflection and Types. + /// + public static class ReflectionExtensions + { + /// + /// Gets all types within an assembly in a safe manner. + /// + /// The assembly. + /// + /// Array of Type objects representing the types specified by an assembly. + /// + /// assembly. + public static IEnumerable GetAllTypes(this Assembly assembly) + { + if (assembly == null) + throw new ArgumentNullException(nameof(assembly)); + + try + { + return assembly.GetTypes(); + } + catch (ReflectionTypeLoadException e) + { + return e.Types.Where(t => t != null); + } + } + + #region Type Extensions + + /// + /// The closest programmatic equivalent of default(T). + /// + /// The type. + /// + /// Default value of this type. + /// + /// type. + public static object? GetDefault(this Type type) + { + if (type == null) + throw new ArgumentNullException(nameof(type)); + + return type.IsValueType ? Activator.CreateInstance(type) : default; + } + + /// + /// Determines whether this type is compatible with ICollection. + /// + /// The type. + /// + /// true if the specified source type is collection; otherwise, false. + /// + /// sourceType. + public static bool IsCollection(this Type sourceType) + { + if (sourceType == null) + throw new ArgumentNullException(nameof(sourceType)); + + return sourceType != typeof(string) && + typeof(IEnumerable).IsAssignableFrom(sourceType); + } + + /// + /// Gets a method from a type given the method name, binding flags, generic types and parameter types. + /// + /// Type of the source. + /// The binding flags. + /// Name of the method. + /// The generic types. + /// The parameter types. + /// + /// An object that represents the method with the specified name. + /// + /// + /// The exception that is thrown when binding to a member results in more than one member matching the + /// binding criteria. This class cannot be inherited. + /// + public static MethodInfo GetMethod( + this Type type, + BindingFlags bindingFlags, + string methodName, + Type[] genericTypes, + Type[] parameterTypes) + { + if (type == null) + throw new ArgumentNullException(nameof(type)); + + if (methodName == null) + throw new ArgumentNullException(nameof(methodName)); + + if (genericTypes == null) + throw new ArgumentNullException(nameof(genericTypes)); + + if (parameterTypes == null) + throw new ArgumentNullException(nameof(parameterTypes)); + + var methods = type + .GetMethods(bindingFlags) + .Where(mi => string.Equals(methodName, mi.Name, StringComparison.Ordinal)) + .Where(mi => mi.ContainsGenericParameters) + .Where(mi => mi.GetGenericArguments().Length == genericTypes.Length) + .Where(mi => mi.GetParameters().Length == parameterTypes.Length) + .Select(mi => mi.MakeGenericMethod(genericTypes)) + .Where(mi => mi.GetParameters().Select(pi => pi.ParameterType).SequenceEqual(parameterTypes)) + .ToList(); + + return methods.Count > 1 ? throw new AmbiguousMatchException() : methods.FirstOrDefault(); + } + + /// + /// Determines whether [is i enumerable request]. + /// + /// The type. + /// + /// true if [is i enumerable request] [the specified type]; otherwise, false. + /// + /// type. + public static bool IsIEnumerable(this Type type) + => type == null + ? throw new ArgumentNullException(nameof(type)) + : type.IsGenericType && type.GetGenericTypeDefinition() == typeof(IEnumerable<>); + + #endregion + + /// + /// Tries to parse using the basic types. + /// + /// The type. + /// The value. + /// The result. + /// + /// true if parsing was successful; otherwise, false. + /// + /// type + public static bool TryParseBasicType(this Type type, object value, out object? result) + { + if (type == null) + throw new ArgumentNullException(nameof(type)); + + if (type != typeof(bool)) + return TryParseBasicType(type, value.ToStringInvariant(), out result); + + result = value.ToBoolean(); + return true; + } + + /// + /// Tries to parse using the basic types. + /// + /// The type. + /// The value. + /// The result. + /// + /// true if parsing was successful; otherwise, false. + /// + /// type + public static bool TryParseBasicType(this Type type, string value, out object? result) + { + if (type == null) + throw new ArgumentNullException(nameof(type)); + + result = null; + + return Definitions.BasicTypesInfo.Value.ContainsKey(type) && Definitions.BasicTypesInfo.Value[type].TryParse(value, out result); + } + + /// + /// Tries the type of the set basic value to a property. + /// + /// The property information. + /// The value. + /// The object. + /// + /// true if parsing was successful; otherwise, false. + /// + /// propertyInfo. + public static bool TrySetBasicType(this PropertyInfo propertyInfo, object value, object target) + { + if (propertyInfo == null) + throw new ArgumentNullException(nameof(propertyInfo)); + + try + { + if (propertyInfo.PropertyType.TryParseBasicType(value, out var propertyValue)) + { + propertyInfo.SetValue(target, propertyValue); + return true; + } + } +#pragma warning disable CA1031 // Do not catch general exception types + catch +#pragma warning restore CA1031 // Do not catch general exception types + { + // swallow + } + + return false; + } + + /// + /// Tries the type of the set to an array a basic type. + /// + /// The type. + /// The value. + /// The array. + /// The index. + /// + /// true if parsing was successful; otherwise, false. + /// + /// type + public static bool TrySetArrayBasicType(this Type type, object value, Array target, int index) + { + if (type == null) + throw new ArgumentNullException(nameof(type)); + + if (target == null) + return false; + + try + { + if (value == null) + { + target.SetValue(null, index); + return true; + } + + if (type.TryParseBasicType(value, out var propertyValue)) + { + target.SetValue(propertyValue, index); + return true; + } + + if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) + { + target.SetValue(null, index); + return true; + } + } +#pragma warning disable CA1031 // Do not catch general exception types + catch +#pragma warning restore CA1031 // Do not catch general exception types + { + // swallow + } + + return false; + } + + /// + /// Tries to set a property array with another array. + /// + /// The property. + /// The value. + /// The object. + /// + /// true if parsing was successful; otherwise, false. + /// + /// propertyInfo. + public static bool TrySetArray(this PropertyInfo propertyInfo, IEnumerable? value, object obj) + { + if (propertyInfo == null) + throw new ArgumentNullException(nameof(propertyInfo)); + + var elementType = propertyInfo.PropertyType.GetElementType(); + + if (elementType == null || value == null) + return false; + + var targetArray = Array.CreateInstance(elementType, value.Count()); + + var i = 0; + + foreach (var sourceElement in value) + { + var result = elementType.TrySetArrayBasicType(sourceElement, targetArray, i++); + + if (!result) return false; + } + + propertyInfo.SetValue(obj, targetArray); + + return true; + } + + /// + /// Convert a string to a boolean. + /// + /// The string. + /// + /// true if the string represents a valid truly value, otherwise false. + /// + public static bool ToBoolean(this string str) + { + try + { + return Convert.ToBoolean(str); + } + catch (FormatException) + { + // ignored + } + + try + { + return Convert.ToBoolean(Convert.ToInt32(str)); + } +#pragma warning disable CA1031 // Do not catch general exception types + catch +#pragma warning restore CA1031 // Do not catch general exception types + { + // ignored + } + + return false; + } + + /// + /// Convert a object to a boolean. + /// + /// The value. + /// + /// true if the string represents a valid truly value, otherwise false. + /// + public static bool ToBoolean(this object value) => value.ToStringInvariant().ToBoolean(); + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Extensions.Strings.cs b/Vendor/Swan.Lite-3.1.0/Extensions.Strings.cs new file mode 100644 index 0000000..b765f4d --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Extensions.Strings.cs @@ -0,0 +1,400 @@ +using System; +using System.IO; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using Swan.Formatters; + +namespace Swan +{ + /// + /// String related extension methods. + /// + public static class StringExtensions + { + #region Private Declarations + + private const RegexOptions StandardRegexOptions = + RegexOptions.Multiline | RegexOptions.Compiled | RegexOptions.CultureInvariant; + + private static readonly string[] ByteSuffixes = { "B", "KB", "MB", "GB", "TB" }; + + private static readonly Lazy SplitLinesRegex = + new Lazy(() => new Regex("\r\n|\r|\n", StandardRegexOptions)); + + private static readonly Lazy UnderscoreRegex = + new Lazy(() => new Regex(@"_", StandardRegexOptions)); + + private static readonly Lazy CamelCaseRegEx = + new Lazy(() => new Regex(@"[a-z][A-Z]", StandardRegexOptions)); + + private static readonly Lazy SplitCamelCaseString = new Lazy(() => m => + { + var x = m.ToString(); + return x[0] + " " + x.Substring(1, x.Length - 1); + }); + + private static readonly Lazy InvalidFilenameChars = + new Lazy(() => Path.GetInvalidFileNameChars().Select(c => c.ToStringInvariant()).ToArray()); + + #endregion + + /// + /// Returns a string that represents the given item + /// It tries to use InvariantCulture if the ToString(IFormatProvider) + /// overload exists. + /// + /// The item. + /// A that represents the current object. + public static string ToStringInvariant(this object? @this) + { + if (@this == null) + return string.Empty; + + var itemType = @this.GetType(); + + if (itemType == typeof(string)) + return @this as string ?? string.Empty; + + return Definitions.BasicTypesInfo.Value.ContainsKey(itemType) + ? Definitions.BasicTypesInfo.Value[itemType].ToStringInvariant(@this) + : @this.ToString(); + } + + /// + /// Returns a string that represents the given item + /// It tries to use InvariantCulture if the ToString(IFormatProvider) + /// overload exists. + /// + /// The type to get the string. + /// The item. + /// A that represents the current object. + public static string ToStringInvariant(this T item) + => typeof(string) == typeof(T) ? item as string ?? string.Empty : ToStringInvariant(item as object); + + /// + /// Removes the control characters from a string except for those specified. + /// + /// The input. + /// When specified, these characters will not be removed. + /// + /// A string that represents the current object. + /// + /// input. + public static string RemoveControlChars(this string value, params char[]? excludeChars) + { + if (value == null) + throw new ArgumentNullException(nameof(value)); + + if (excludeChars == null) + excludeChars = Array.Empty(); + + return new string(value + .Where(c => char.IsControl(c) == false || excludeChars.Contains(c)) + .ToArray()); + } + + /// + /// Outputs JSON string representing this object. + /// + /// The object. + /// if set to true format the output. + /// A that represents the current object. + public static string ToJson(this object @this, bool format = true) => + @this == null ? string.Empty : Json.Serialize(@this, format); + + /// + /// Returns text representing the properties of the specified object in a human-readable format. + /// While this method is fairly expensive computationally speaking, it provides an easy way to + /// examine objects. + /// + /// The object. + /// A that represents the current object. + public static string Stringify(this object @this) + { + if (@this == null) + return "(null)"; + + try + { + var jsonText = Json.Serialize(@this, false, "$type"); + var jsonData = Json.Deserialize(jsonText); + + return new HumanizeJson(jsonData, 0).GetResult(); + } +#pragma warning disable CA1031 // Do not catch general exception types + catch +#pragma warning restore CA1031 // Do not catch general exception types + { + return @this.ToStringInvariant(); + } + } + + /// + /// Retrieves a section of the string, inclusive of both, the start and end indexes. + /// This behavior is unlike JavaScript's Slice behavior where the end index is non-inclusive + /// If the string is null it returns an empty string. + /// + /// The string. + /// The start index. + /// The end index. + /// Retrieves a substring from this instance. + public static string Slice(this string @this, int startIndex, int endIndex) + { + if (@this == null) + return string.Empty; + + var end = endIndex.Clamp(startIndex, @this.Length - 1); + + return startIndex >= end ? string.Empty : @this.Substring(startIndex, (end - startIndex) + 1); + } + + /// + /// Gets a part of the string clamping the length and startIndex parameters to safe values. + /// If the string is null it returns an empty string. This is basically just a safe version + /// of string.Substring. + /// + /// The string. + /// The start index. + /// The length. + /// Retrieves a substring from this instance. + public static string SliceLength(this string @this, int startIndex, int length) + { + if (@this == null) + return string.Empty; + + var start = startIndex.Clamp(0, @this.Length - 1); + var len = length.Clamp(0, @this.Length - start); + + return len == 0 ? string.Empty : @this.Substring(start, len); + } + + /// + /// Splits the specified text into r, n or rn separated lines. + /// + /// The text. + /// + /// An array whose elements contain the substrings from this instance + /// that are delimited by one or more characters in separator. + /// + public static string[] ToLines(this string @this) => + @this == null ? Array.Empty() : SplitLinesRegex.Value.Split(@this); + + /// + /// Humanizes (make more human-readable) an identifier-style string + /// in either camel case or snake case. For example, CamelCase will be converted to + /// Camel Case and Snake_Case will be converted to Snake Case. + /// + /// The identifier-style string. + /// A humanized. + public static string Humanize(this string value) + { + if (value == null) + return string.Empty; + + var returnValue = UnderscoreRegex.Value.Replace(value, " "); + returnValue = CamelCaseRegEx.Value.Replace(returnValue, SplitCamelCaseString.Value); + return returnValue; + } + + /// + /// Humanizes (make more human-readable) an boolean. + /// + /// if set to true [value]. + /// A that represents the current boolean. + public static string Humanize(this bool value) => value ? "Yes" : "No"; + + /// + /// Humanizes (make more human-readable) the specified value. + /// + /// The value. + /// A that represents the current object. + public static string Humanize(this object value) => + value switch + { + string stringValue => stringValue.Humanize(), + bool boolValue => boolValue.Humanize(), + _ => value.Stringify() + }; + + /// + /// Indents the specified multi-line text with the given amount of leading spaces + /// per line. + /// + /// The text. + /// The spaces. + /// A that represents the current object. + public static string Indent(this string value, int spaces = 4) + { + if (value == null) value = string.Empty; + if (spaces <= 0) return value; + + var lines = value.ToLines(); + var builder = new StringBuilder(); + var indentStr = new string(' ', spaces); + + foreach (var line in lines) + { + builder.AppendLine($"{indentStr}{line}"); + } + + return builder.ToString().TrimEnd(); + } + + /// + /// Gets the line and column number (i.e. not index) of the + /// specified character index. Useful to locate text in a multi-line + /// string the same way a text editor does. + /// Please not that the tuple contains first the line number and then the + /// column number. + /// + /// The string. + /// Index of the character. + /// A 2-tuple whose value is (item1, item2). + public static Tuple TextPositionAt(this string value, int charIndex) + { + if (value == null) + return Tuple.Create(0, 0); + + var index = charIndex.Clamp(0, value.Length - 1); + + var lineIndex = 0; + var colNumber = 0; + + for (var i = 0; i <= index; i++) + { + if (value[i] == '\n') + { + lineIndex++; + colNumber = 0; + continue; + } + + if (value[i] != '\r') + colNumber++; + } + + return Tuple.Create(lineIndex + 1, colNumber); + } + + /// + /// Makes the file name system safe. + /// + /// The s. + /// + /// A string with a safe file name. + /// + /// s. + public static string ToSafeFilename(this string value) => + value == null + ? throw new ArgumentNullException(nameof(value)) + : InvalidFilenameChars.Value + .Aggregate(value, (current, c) => current.Replace(c, string.Empty)) + .Slice(0, 220); + + /// + /// Formats a long into the closest bytes string. + /// + /// The bytes length. + /// + /// The string representation of the current Byte object, formatted as specified by the format parameter. + /// + public static string FormatBytes(this long bytes) => ((ulong)bytes).FormatBytes(); + + /// + /// Formats a long into the closest bytes string. + /// + /// The bytes length. + /// + /// A copy of format in which the format items have been replaced by the string + /// representations of the corresponding arguments. + /// + public static string FormatBytes(this ulong bytes) + { + int i; + double dblSByte = bytes; + + for (i = 0; i < ByteSuffixes.Length && bytes >= 1024; i++, bytes /= 1024) + { + dblSByte = bytes / 1024.0; + } + + return $"{dblSByte:0.##} {ByteSuffixes[i]}"; + } + + /// + /// Truncates the specified value. + /// + /// The value. + /// The maximum length. + /// + /// Retrieves a substring from this instance. + /// The substring starts at a specified character position and has a specified length. + /// + public static string? Truncate(this string value, int maximumLength) => + Truncate(value, maximumLength, string.Empty); + + /// + /// Truncates the specified value and append the omission last. + /// + /// The value. + /// The maximum length. + /// The omission. + /// + /// Retrieves a substring from this instance. + /// The substring starts at a specified character position and has a specified length. + /// + public static string? Truncate(this string value, int maximumLength, string omission) + { + if (value == null) + return null; + + return value.Length > maximumLength + ? value.Substring(0, maximumLength) + (omission ?? string.Empty) + : value; + } + + /// + /// Determines whether the specified contains any of characters in + /// the specified array of . + /// + /// + /// true if contains any of ; + /// otherwise, false. + /// + /// + /// A to test. + /// + /// + /// An array of that contains characters to find. + /// + public static bool Contains(this string value, params char[] chars) => + chars != null && + (chars.Length == 0 || (!string.IsNullOrEmpty(value) && value.IndexOfAny(chars) > -1)); + + /// + /// Replaces all chars in a string. + /// + /// The value. + /// The replace value. + /// The chars. + /// The string with the characters replaced. + public static string ReplaceAll(this string value, string replaceValue, params char[] chars) => + chars.Aggregate(value, (current, c) => current.Replace(new string(new[] { c }), replaceValue)); + + /// + /// Convert hex character to an integer. Return -1 if char is something + /// other than a hex char. + /// + /// The c. + /// Converted integer. + public static int Hex2Int(this char value) => + value >= '0' && value <= '9' + ? value - '0' + : value >= 'A' && value <= 'F' + ? value - 'A' + 10 + : value >= 'a' && value <= 'f' + ? value - 'a' + 10 + : -1; + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Extensions.Tasks.cs b/Vendor/Swan.Lite-3.1.0/Extensions.Tasks.cs new file mode 100644 index 0000000..10391c2 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Extensions.Tasks.cs @@ -0,0 +1,85 @@ +using System; +using System.Threading.Tasks; + +namespace Swan +{ + /// + /// Provides extension methods for and . + /// + public static class TaskExtensions + { + /// + /// Suspends execution until the specified is completed. + /// This method operates similarly to the C# operator, + /// but is meant to be called from a non- method. + /// + /// The on which this method is called. + /// is . + public static void Await(this Task @this) + { + if (@this == null) + throw new ArgumentNullException(nameof(@this)); + + @this.GetAwaiter().GetResult(); + } + + /// + /// Suspends execution until the specified is completed + /// and returns its result. + /// This method operates similarly to the C# operator, + /// but is meant to be called from a non- method. + /// + /// The type of the task's result. + /// The on which this method is called. + /// The result of . + /// is . + public static TResult Await(this Task @this) + { + if (@this == null) + throw new ArgumentNullException(nameof(@this)); + + return @this.GetAwaiter().GetResult(); + } + + /// + /// Suspends execution until the specified is completed. + /// This method operates similarly to the C# operator, + /// but is meant to be called from a non- method. + /// + /// The on which this method is called. + /// If set to , + /// attempts to marshal the continuation back to the original context captured. + /// This parameter has the same effect as calling the + /// method. + /// is . + public static void Await(this Task @this, bool continueOnCapturedContext) + { + if (@this == null) + throw new ArgumentNullException(nameof(@this)); + + @this.ConfigureAwait(continueOnCapturedContext).GetAwaiter().GetResult(); + } + + /// + /// Suspends execution until the specified is completed + /// and returns its result. + /// This method operates similarly to the C# operator, + /// but is meant to be called from a non- method. + /// + /// The type of the task's result. + /// The on which this method is called. + /// If set to , + /// attempts to marshal the continuation back to the original context captured. + /// This parameter has the same effect as calling the + /// method. + /// The result of . + /// is . + public static TResult Await(this Task @this, bool continueOnCapturedContext) + { + if (@this == null) + throw new ArgumentNullException(nameof(@this)); + + return @this.ConfigureAwait(continueOnCapturedContext).GetAwaiter().GetResult(); + } + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Extensions.ValueTypes.cs b/Vendor/Swan.Lite-3.1.0/Extensions.ValueTypes.cs new file mode 100644 index 0000000..91051f7 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Extensions.ValueTypes.cs @@ -0,0 +1,165 @@ +using System; +using System.Reflection; +using System.Runtime.InteropServices; +using Swan.Reflection; + +namespace Swan +{ + /// + /// Provides various extension methods for value types and structs. + /// + public static class ValueTypeExtensions + { + /// + /// Clamps the specified value between the minimum and the maximum. + /// + /// The type of value to clamp. + /// The value. + /// The minimum. + /// The maximum. + /// A value that indicates the relative order of the objects being compared. + public static T Clamp(this T @this, T min, T max) + where T : struct, IComparable + { + if (@this.CompareTo(min) < 0) return min; + + return @this.CompareTo(max) > 0 ? max : @this; + } + + /// + /// Clamps the specified value between the minimum and the maximum. + /// + /// The value. + /// The minimum. + /// The maximum. + /// A value that indicates the relative order of the objects being compared. + public static int Clamp(this int @this, int min, int max) + => @this < min ? min : (@this > max ? max : @this); + + /// + /// Determines whether the specified value is between a minimum and a maximum value. + /// + /// The type of value to check. + /// The value. + /// The minimum. + /// The maximum. + /// + /// true if the specified minimum is between; otherwise, false. + /// + public static bool IsBetween(this T @this, T min, T max) + where T : struct, IComparable + { + return @this.CompareTo(min) >= 0 && @this.CompareTo(max) <= 0; + } + + /// + /// Converts an array of bytes into the given struct type. + /// + /// The type of structure to convert. + /// The data. + /// a struct type derived from convert an array of bytes ref=ToStruct". + public static T ToStruct(this byte[] @this) + where T : struct + { + return @this == null ? throw new ArgumentNullException(nameof(@this)) : ToStruct(@this, 0, @this.Length); + } + + /// + /// Converts an array of bytes into the given struct type. + /// + /// The type of structure to convert. + /// The data. + /// The offset. + /// The length. + /// + /// A managed object containing the data pointed to by the ptr parameter. + /// + /// data. + public static T ToStruct(this byte[] @this, int offset, int length) + where T : struct + { + if (@this == null) + throw new ArgumentNullException(nameof(@this)); + + var buffer = new byte[length]; + Array.Copy(@this, offset, buffer, 0, buffer.Length); + var handle = GCHandle.Alloc(GetStructBytes(buffer), GCHandleType.Pinned); + + try + { + return Marshal.PtrToStructure(handle.AddrOfPinnedObject()); + } + finally + { + handle.Free(); + } + } + + /// + /// Converts a struct to an array of bytes. + /// + /// The type of structure to convert. + /// The object. + /// A byte array containing the results of encoding the specified set of characters. + public static byte[] ToBytes(this T @this) + where T : struct + { + var data = new byte[Marshal.SizeOf(@this)]; + var handle = GCHandle.Alloc(data, GCHandleType.Pinned); + + try + { + Marshal.StructureToPtr(@this, handle.AddrOfPinnedObject(), false); + return GetStructBytes(data); + } + finally + { + handle.Free(); + } + } + + /// + /// Swaps the endianness of an unsigned long to an unsigned integer. + /// + /// The bytes contained in a long. + /// + /// A 32-bit unsigned integer equivalent to the ulong + /// contained in longBytes. + /// + public static uint SwapEndianness(this ulong @this) + => (uint)(((@this & 0x000000ff) << 24) + + ((@this & 0x0000ff00) << 8) + + ((@this & 0x00ff0000) >> 8) + + ((@this & 0xff000000) >> 24)); + + private static byte[] GetStructBytes(byte[] data) + { + if (data == null) + throw new ArgumentNullException(nameof(data)); + + var fields = typeof(T).GetTypeInfo() + .GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); + + var endian = AttributeCache.DefaultCache.Value.RetrieveOne(); + + foreach (var field in fields) + { + if (endian == null && !field.IsDefined(typeof(StructEndiannessAttribute), false)) + continue; + + var offset = Marshal.OffsetOf(field.Name).ToInt32(); + var length = Marshal.SizeOf(field.FieldType); + + endian ??= AttributeCache.DefaultCache.Value.RetrieveOne(field); + + if (endian != null && (endian.Endianness == Endianness.Big && BitConverter.IsLittleEndian || + endian.Endianness == Endianness.Little && !BitConverter.IsLittleEndian)) + { + Array.Reverse(data, offset, length); + } + } + + return data; + } + } +} \ No newline at end of file diff --git a/Vendor/Swan.Lite-3.1.0/Extensions.cs b/Vendor/Swan.Lite-3.1.0/Extensions.cs new file mode 100644 index 0000000..1bc2a33 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Extensions.cs @@ -0,0 +1,279 @@ +using Swan.Formatters; +using Swan.Mappers; +using Swan.Reflection; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace Swan +{ + /// + /// Extension methods. + /// + public static partial class Extensions + { + /// + /// Iterates over the public, instance, readable properties of the source and + /// tries to write a compatible value to a public, instance, writable property in the destination. + /// + /// The type of the source. + /// The source. + /// The target. + /// The ignore properties. + /// + /// Number of properties that was copied successful. + /// + public static int CopyPropertiesTo(this T source, object target, params string[]? ignoreProperties) + where T : class => + ObjectMapper.Copy(source, target, GetCopyableProperties(target), ignoreProperties); + + /// + /// Iterates over the public, instance, readable properties of the source and + /// tries to write a compatible value to a public, instance, writable property in the destination. + /// + /// The source. + /// The destination. + /// Properties to copy. + /// + /// Number of properties that were successfully copied. + /// + public static int CopyOnlyPropertiesTo(this object source, object target, params string[]? propertiesToCopy) + => ObjectMapper.Copy(source, target, propertiesToCopy); + + /// + /// Copies the properties to new instance of T. + /// + /// The new object type. + /// The source. + /// The ignore properties. + /// + /// The specified type with properties copied. + /// + /// source. + public static T CopyPropertiesToNew(this object source, string[]? ignoreProperties = null) + where T : class + { + if (source == null) + throw new ArgumentNullException(nameof(source)); + + var target = Activator.CreateInstance(); + ObjectMapper.Copy(source, target, GetCopyableProperties(target), ignoreProperties); + + return target; + } + + /// + /// Copies the only properties to new instance of T. + /// + /// Object Type. + /// The source. + /// The properties to copy. + /// + /// The specified type with properties copied. + /// + /// source. + public static T CopyOnlyPropertiesToNew(this object source, params string[] propertiesToCopy) + where T : class + { + if (source == null) + throw new ArgumentNullException(nameof(source)); + + var target = Activator.CreateInstance(); + ObjectMapper.Copy(source, target, propertiesToCopy); + + return target; + } + + /// + /// Iterates over the keys of the source and tries to write a compatible value to a public, + /// instance, writable property in the destination. + /// + /// The source. + /// The target. + /// The ignore keys. + /// Number of properties that was copied successful. + public static int CopyKeyValuePairTo( + this IDictionary source, + object? target, + params string[] ignoreKeys) => + source == null + ? throw new ArgumentNullException(nameof(source)) + : ObjectMapper.Copy(source, target, null, ignoreKeys); + + /// + /// Iterates over the keys of the source and tries to write a compatible value to a public, + /// instance, writable property in the destination. + /// + /// Object Type. + /// The source. + /// The ignore keys. + /// + /// The specified type with properties copied. + /// + public static T CopyKeyValuePairToNew( + this IDictionary source, + params string[] ignoreKeys) + { + if (source == null) + throw new ArgumentNullException(nameof(source)); + + var target = Activator.CreateInstance(); + source.CopyKeyValuePairTo(target, ignoreKeys); + return target; + } + + /// + /// Does the specified action. + /// + /// The action. + /// The retry interval. + /// The retry count. + public static void Retry( + this Action action, + TimeSpan retryInterval = default, + int retryCount = 3) + { + if (action == null) + throw new ArgumentNullException(nameof(action)); + + Retry(() => + { + action(); + return null; + }, + retryInterval, + retryCount); + } + + /// + /// Does the specified action. + /// + /// The type of the source. + /// The action. + /// The retry interval. + /// The retry count. + /// + /// The return value of the method that this delegate encapsulates. + /// + /// action. + /// Represents one or many errors that occur during application execution. + public static T Retry( + this Func action, + TimeSpan retryInterval = default, + int retryCount = 3) + { + if (action == null) + throw new ArgumentNullException(nameof(action)); + + if (retryInterval == default) + retryInterval = TimeSpan.FromSeconds(1); + + var exceptions = new List(); + + for (var retry = 0; retry < retryCount; retry++) + { + try + { + if (retry > 0) + Task.Delay(retryInterval).Wait(); + + return action(); + } +#pragma warning disable CA1031 // Do not catch general exception types + catch (Exception ex) +#pragma warning restore CA1031 // Do not catch general exception types + { + exceptions.Add(ex); + } + } + + throw new AggregateException(exceptions); + } + + /// + /// Gets the copyable properties. + /// + /// If there is no properties with the attribute AttributeCache returns all the properties. + /// + /// The object. + /// + /// Array of properties. + /// + /// model. + /// + public static IEnumerable GetCopyableProperties(this object @this) + { + if (@this == null) + throw new ArgumentNullException(nameof(@this)); + + var collection = PropertyTypeCache.DefaultCache.Value + .RetrieveAllProperties(@this.GetType(), true); + + var properties = collection + .Select(x => new + { + x.Name, + HasAttribute = AttributeCache.DefaultCache.Value.RetrieveOne(x) != null, + }) + .Where(x => x.HasAttribute) + .Select(x => x.Name); + + return properties.Any() + ? properties + : collection.Select(x => x.Name); + } + + internal static void CreateTarget( + this object source, + Type targetType, + bool includeNonPublic, + ref object? target) + { + switch (source) + { + // do nothing. Simply skip creation + case string _: + break; + + // When using arrays, there is no default constructor, attempt to build a compatible array + case IList sourceObjectList when targetType.IsArray: + var elementType = targetType.GetElementType(); + + if (elementType != null) + target = Array.CreateInstance(elementType, sourceObjectList.Count); + break; + default: + var constructors = ConstructorTypeCache.DefaultCache.Value + .RetrieveAllConstructors(targetType, includeNonPublic); + + // Try to check if empty constructor is available + if (constructors.Any(x => x.Item2.Length == 0)) + { + target = Activator.CreateInstance(targetType, includeNonPublic); + } + else + { + var firstCtor = constructors + .OrderBy(x => x.Item2.Length) + .FirstOrDefault(); + + target = Activator.CreateInstance(targetType, + firstCtor?.Item2.Select(arg => arg.GetType().GetDefault()).ToArray()); + } + + break; + } + } + + internal static string GetNameWithCase(this string name, JsonSerializerCase jsonSerializerCase) => + jsonSerializerCase switch + { + JsonSerializerCase.PascalCase => char.ToUpperInvariant(name[0]) + name.Substring(1), + JsonSerializerCase.CamelCase => char.ToLowerInvariant(name[0]) + name.Substring(1), + JsonSerializerCase.None => name, + _ => throw new ArgumentOutOfRangeException(nameof(jsonSerializerCase), jsonSerializerCase, null) + }; + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Formatters/CsvReader.cs b/Vendor/Swan.Lite-3.1.0/Formatters/CsvReader.cs new file mode 100644 index 0000000..b272337 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Formatters/CsvReader.cs @@ -0,0 +1,647 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using Swan.Reflection; + +namespace Swan.Formatters +{ + /// + /// Represents a reader designed for CSV text. + /// It is capable of deserializing objects from individual lines of CSV text, + /// transforming CSV lines of text into objects, + /// or simply reading the lines of CSV as an array of strings. + /// + /// + /// + /// The following example describes how to load a list of objects from a CSV file. + /// + /// using Swan.Formatters; + /// + /// class Example + /// { + /// class Person + /// { + /// public string Name { get; set; } + /// public int Age { get; set; } + /// } + /// + /// static void Main() + /// { + /// // load records from a CSV file + /// var loadedRecords = + /// CsvReader.LoadRecords<Person>("C:\\Users\\user\\Documents\\file.csv"); + /// + /// // loadedRecords = + /// // [ + /// // { Age = 20, Name = "George" } + /// // { Age = 18, Name = "Juan" } + /// // ] + /// } + /// } + /// + /// The following code explains how to read a CSV formatted string. + /// + /// using Swan.Formatters; + /// using System.Text; + /// using Swan.Formatters; + /// + /// class Example + /// { + /// static void Main() + /// { + /// // data to be read + /// var data = @"Company,OpenPositions,MainTechnology,Revenue + /// Co,2,""C#, MySQL, JavaScript, HTML5 and CSS3"",500 + /// Ca,2,""C#, MySQL, JavaScript, HTML5 and CSS3"",600"; + /// + /// using(var stream = new MemoryStream(Encoding.UTF8.GetBytes(data))) + /// { + /// // create a CSV reader + /// var reader = new CsvReader(stream, false, Encoding.UTF8); + /// } + /// } + /// } + /// + /// + public class CsvReader : IDisposable + { + private static readonly PropertyTypeCache TypeCache = new PropertyTypeCache(); + + private readonly object _syncLock = new object(); + + private ulong _count; + private char _escapeCharacter = '"'; + private char _separatorCharacter = ','; + + private bool _hasDisposed; // To detect redundant calls + private string[]? _headings; + private Dictionary? _defaultMap; + private StreamReader? _reader; + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + /// The stream. + /// if set to true leaves the input stream open. + /// The text encoding. + public CsvReader(Stream inputStream, bool leaveOpen, Encoding textEncoding) + { + if (inputStream == null) + throw new ArgumentNullException(nameof(inputStream)); + + if (textEncoding == null) + throw new ArgumentNullException(nameof(textEncoding)); + + _reader = new StreamReader(inputStream, textEncoding, true, 2048, leaveOpen); + } + + /// + /// Initializes a new instance of the class. + /// It will automatically close the stream upon disposing. + /// + /// The stream. + /// The text encoding. + public CsvReader(Stream stream, Encoding textEncoding) + : this(stream, false, textEncoding) + { + // placeholder + } + + /// + /// Initializes a new instance of the class. + /// It automatically closes the stream when disposing this reader + /// and uses the Windows 1253 encoding. + /// + /// The stream. + public CsvReader(Stream stream) + : this(stream, false, Definitions.Windows1252Encoding) + { + } + + /// + /// Initializes a new instance of the class. + /// It uses the Windows 1252 Encoding by default and it automatically closes the file + /// when this reader is disposed of. + /// + /// The filename. + public CsvReader(string filename) + : this(File.OpenRead(filename), false, Definitions.Windows1252Encoding) + { + // placeholder + } + + /// + /// Initializes a new instance of the class. + /// It automatically closes the file when disposing this reader. + /// + /// The filename. + /// The encoding. + public CsvReader(string filename, Encoding encoding) + : this(File.OpenRead(filename), false, encoding) + { + // placeholder + } + + #endregion + + #region Properties + + /// + /// Gets number of lines that have been read, including the headings. + /// + /// + /// The count. + /// + public ulong Count + { + get + { + lock (_syncLock) + { + return _count; + } + } + } + + /// + /// Gets or sets the escape character. + /// By default it is the double quote '"'. + /// + /// + /// The escape character. + /// + public char EscapeCharacter + { + get => _escapeCharacter; + set + { + lock (_syncLock) + { + _escapeCharacter = value; + } + } + } + + /// + /// Gets or sets the separator character. + /// By default it is the comma character ','. + /// + /// + /// The separator character. + /// + public char SeparatorCharacter + { + get => _separatorCharacter; + set + { + lock (_syncLock) + { + _separatorCharacter = value; + } + } + } + + /// + /// Gets a value indicating whether the stream reader is at the end of the stream + /// In other words, if no more data can be read, this will be set to true. + /// + /// + /// true if [end of stream]; otherwise, false. + /// + public bool EndOfStream + { + get + { + lock (_syncLock) + { + return _reader?.EndOfStream ?? true; + } + } + } + + #endregion + + #region Generic, Main ReadLine method + + /// + /// Reads a line of CSV text into an array of strings. + /// + /// An array of the specified element type containing copies of the elements of the ArrayList. + /// Cannot read past the end of the stream. + public string[] ReadLine() + { + if (EndOfStream) + throw new EndOfStreamException("Cannot read past the end of the stream"); + + lock (_syncLock) + { + var values = ParseRecord(_reader!, _escapeCharacter, _separatorCharacter); + _count++; + return values; + } + } + + #endregion + + #region Read Methods + + /// + /// Skips a line of CSV text. + /// This operation does not increment the Count property and it is useful when you need to read the headings + /// skipping over a few lines as Reading headings is only supported + /// as the first read operation (i.e. while count is still 0). + /// + /// Cannot read past the end of the stream. + public void SkipRecord() + { + if (EndOfStream) + throw new EndOfStreamException("Cannot read past the end of the stream"); + + lock (_syncLock) + { + ParseRecord(_reader!, _escapeCharacter, _separatorCharacter); + } + } + + /// + /// Reads a line of CSV text and stores the values read as a representation of the column names + /// to be used for parsing objects. You have to call this method before calling ReadObject methods. + /// + /// An array of the specified element type containing copies of the elements of the ArrayList. + /// + /// Reading headings is only supported as the first read operation. + /// or + /// ReadHeadings. + /// + /// Cannot read past the end of the stream. + public string[] ReadHeadings() + { + lock (_syncLock) + { + if (_headings != null) + throw new InvalidOperationException($"The {nameof(ReadHeadings)} method had already been called."); + + if (_count != 0) + throw new InvalidOperationException("Reading headings is only supported as the first read operation."); + + _headings = ReadLine(); + _defaultMap = _headings.ToDictionary(x => x, x => x); + + return _headings.ToArray(); + } + } + + /// + /// Reads a line of CSV text, converting it into a dynamic object in which properties correspond to the names of the headings. + /// + /// The mappings between CSV headings (keys) and object properties (values). + /// Object of the type of the elements in the collection of key/value pairs. + /// ReadHeadings. + /// Cannot read past the end of the stream. + /// map. + public IDictionary ReadObject(IDictionary map) + { + lock (_syncLock) + { + if (_headings == null) + throw new InvalidOperationException($"Call the {nameof(ReadHeadings)} method before reading as an object."); + + if (map == null) + throw new ArgumentNullException(nameof(map)); + + var result = new Dictionary(); + var values = ReadLine(); + + for (var i = 0; i < _headings.Length; i++) + { + if (i > values.Length - 1) + break; + + result[_headings[i]] = values[i]; + } + + return result; + } + } + + /// + /// Reads a line of CSV text, converting it into a dynamic object + /// The property names correspond to the names of the CSV headings. + /// + /// Object of the type of the elements in the collection of key/value pairs. + public IDictionary ReadObject() => ReadObject(_defaultMap); + + /// + /// Reads a line of CSV text converting it into an object of the given type, using a map (or Dictionary) + /// where the keys are the names of the headings and the values are the names of the instance properties + /// in the given Type. The result object must be already instantiated. + /// + /// The type of object to map. + /// The map. + /// The result. + /// map + /// or + /// result. + /// ReadHeadings. + /// Cannot read past the end of the stream. + public void ReadObject(IDictionary map, ref T result) + { + lock (_syncLock) + { + // Check arguments + { + if (map == null) + throw new ArgumentNullException(nameof(map)); + + if (_reader.EndOfStream) + throw new EndOfStreamException("Cannot read past the end of the stream"); + + if (_headings == null) + throw new InvalidOperationException($"Call the {nameof(ReadHeadings)} method before reading as an object."); + + if (Equals(result, default(T))) + throw new ArgumentNullException(nameof(result)); + } + + // Read line and extract values + var values = ReadLine(); + + // Extract properties from cache + var properties = TypeCache + .RetrieveFilteredProperties(typeof(T), true, x => x.CanWrite && Definitions.BasicTypesInfo.Value.ContainsKey(x.PropertyType)); + + // Assign property values for each heading + for (var i = 0; i < _headings.Length; i++) + { + // break if no more headings are matched + if (i > values.Length - 1) + break; + + // skip if no heading is available or the heading is empty + if (map.ContainsKey(_headings[i]) == false && + string.IsNullOrWhiteSpace(map[_headings[i]]) == false) + continue; + + // Prepare the target property + var propertyName = map[_headings[i]]; + + // Parse and assign the basic type value to the property if exists + properties + .FirstOrDefault(p => p.Name == propertyName)? + .TrySetBasicType(values[i], result); + } + } + } + + /// + /// Reads a line of CSV text converting it into an object of the given type, using a map (or Dictionary) + /// where the keys are the names of the headings and the values are the names of the instance properties + /// in the given Type. + /// + /// The type of object to map. + /// The map of CSV headings (keys) and Type property names (values). + /// The conversion of specific type of object. + /// map. + /// ReadHeadings. + /// Cannot read past the end of the stream. + public T ReadObject(IDictionary map) + where T : new() + { + if (map == null) + throw new ArgumentNullException(nameof(map)); + + var result = Activator.CreateInstance(); + ReadObject(map, ref result); + return result; + } + + /// + /// Reads a line of CSV text converting it into an object of the given type, and assuming + /// the property names of the target type match the heading names of the file. + /// + /// The type of object. + /// The conversion of specific type of object. + public T ReadObject() + where T : new() => + ReadObject(_defaultMap); + + #endregion + + #region Support Methods + + /// + /// Parses a line of standard CSV text into an array of strings. + /// Note that quoted values might have new line sequences in them. Field values will contain such sequences. + /// + /// The reader. + /// The escape character. + /// The separator character. + /// An array of the specified element type containing copies of the elements of the ArrayList. + private static string[] ParseRecord(StreamReader reader, char escapeCharacter = '"', char separatorCharacter = ',') + { + var values = new List(); + var currentValue = new StringBuilder(1024); + var currentState = ReadState.WaitingForNewField; + string line; + + while ((line = reader.ReadLine()) != null) + { + for (var charIndex = 0; charIndex < line.Length; charIndex++) + { + // Get the current and next character + var currentChar = line[charIndex]; + var nextChar = charIndex < line.Length - 1 ? line[charIndex + 1] : default(char?); + + // Perform logic based on state and decide on next state + switch (currentState) + { + case ReadState.WaitingForNewField: + { + currentValue.Clear(); + + if (currentChar == escapeCharacter) + { + currentState = ReadState.PushingQuoted; + continue; + } + + if (currentChar == separatorCharacter) + { + values.Add(currentValue.ToString()); + currentState = ReadState.WaitingForNewField; + continue; + } + + currentValue.Append(currentChar); + currentState = ReadState.PushingNormal; + continue; + } + + case ReadState.PushingNormal: + { + // Handle field content delimiter by comma + if (currentChar == separatorCharacter) + { + currentState = ReadState.WaitingForNewField; + values.Add(currentValue.ToString()); + currentValue.Clear(); + continue; + } + + // Handle double quote escaping + if (currentChar == escapeCharacter && nextChar.HasValue && nextChar == escapeCharacter) + { + // advance 1 character now. The loop will advance one more. + currentValue.Append(currentChar); + charIndex++; + continue; + } + + currentValue.Append(currentChar); + break; + } + + case ReadState.PushingQuoted: + { + // Handle field content delimiter by ending double quotes + if (currentChar == escapeCharacter && (nextChar.HasValue == false || nextChar != escapeCharacter)) + { + currentState = ReadState.PushingNormal; + continue; + } + + // Handle double quote escaping + if (currentChar == escapeCharacter && nextChar.HasValue && nextChar == escapeCharacter) + { + // advance 1 character now. The loop will advance one more. + currentValue.Append(currentChar); + charIndex++; + continue; + } + + currentValue.Append(currentChar); + break; + } + } + } + + // determine if we need to continue reading a new line if it is part of the quoted + // field value + if (currentState == ReadState.PushingQuoted) + { + // we need to add the new line sequence to the output of the field + // because we were pushing a quoted value + currentValue.Append(Environment.NewLine); + } + else + { + // push anything that has not been pushed (flush) into a last value + values.Add(currentValue.ToString()); + currentValue.Clear(); + + // stop reading more lines we have reached the end of the CSV record + break; + } + } + + // If we ended up pushing quoted and no closing quotes we might + // have additional text in yt + if (currentValue.Length > 0) + { + values.Add(currentValue.ToString()); + } + + return values.ToArray(); + } + + #endregion + + #region Helpers + + /// + /// Loads the records from the stream + /// This method uses Windows 1252 encoding. + /// + /// The type of IList items to load. + /// The stream. + /// A generic collection of objects that can be individually accessed by index. + public static IList LoadRecords(Stream stream) + where T : new() + { + var result = new List(); + + using (var reader = new CsvReader(stream)) + { + reader.ReadHeadings(); + while (!reader.EndOfStream) + { + result.Add(reader.ReadObject()); + } + } + + return result; + } + + /// + /// Loads the records from the give file path. + /// This method uses Windows 1252 encoding. + /// + /// The type of IList items to load. + /// The file path. + /// A generic collection of objects that can be individually accessed by index. + public static IList LoadRecords(string filePath) + where T : new() => + LoadRecords(File.OpenRead(filePath)); + + #endregion + + #region IDisposable Support + + /// + /// Releases unmanaged and - optionally - managed resources. + /// + /// true to release both managed and unmanaged resources; false to release only unmanaged resources. + protected virtual void Dispose(bool disposing) + { + if (_hasDisposed) return; + + if (disposing) + { + try + { + _reader?.Dispose(); + } + finally + { + _reader = null; + } + } + + _hasDisposed = true; + } + + /// + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + #endregion + + /// + /// Defines the 3 different read states + /// for the parsing state machine. + /// + private enum ReadState + { + WaitingForNewField, + PushingNormal, + PushingQuoted, + } + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Formatters/CsvWriter.cs b/Vendor/Swan.Lite-3.1.0/Formatters/CsvWriter.cs new file mode 100644 index 0000000..d2bbe94 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Formatters/CsvWriter.cs @@ -0,0 +1,460 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text; +using Swan.Reflection; + +namespace Swan.Formatters +{ + /// + /// A CSV writer useful for exporting a set of objects. + /// + /// + /// The following code describes how to save a list of objects into a CSV file. + /// + /// using System.Collections.Generic; + /// using Swan.Formatters; + /// + /// class Example + /// { + /// class Person + /// { + /// public string Name { get; set; } + /// public int Age { get; set; } + /// } + /// + /// static void Main() + /// { + /// // create a list of people + /// var people = new List<Person> + /// { + /// new Person { Name = "Artyom", Age = 20 }, + /// new Person { Name = "Aloy", Age = 18 } + /// } + /// + /// // write items inside file.csv + /// CsvWriter.SaveRecords(people, "C:\\Users\\user\\Documents\\file.csv"); + /// + /// // output + /// // | Name | Age | + /// // | Artyom | 20 | + /// // | Aloy | 18 | + /// } + /// } + /// + /// + public class CsvWriter : IDisposable + { + private static readonly PropertyTypeCache TypeCache = new PropertyTypeCache(); + + private readonly object _syncLock = new object(); + private readonly Stream _outputStream; + private readonly Encoding _encoding; + private readonly bool _leaveStreamOpen; + private bool _isDisposing; + private ulong _mCount; + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + /// The output stream. + /// if set to true [leave open]. + /// The encoding. + public CsvWriter(Stream outputStream, bool leaveOpen, Encoding encoding) + { + _outputStream = outputStream; + _encoding = encoding; + _leaveStreamOpen = leaveOpen; + } + + /// + /// Initializes a new instance of the class. + /// It automatically closes the stream when disposing this writer. + /// + /// The output stream. + /// The encoding. + public CsvWriter(Stream outputStream, Encoding encoding) + : this(outputStream, false, encoding) + { + // placeholder + } + + /// + /// Initializes a new instance of the class. + /// It uses the Windows 1252 encoding and automatically closes + /// the stream upon disposing this writer. + /// + /// The output stream. + public CsvWriter(Stream outputStream) + : this(outputStream, false, Definitions.Windows1252Encoding) + { + // placeholder + } + + /// + /// Initializes a new instance of the class. + /// It opens the file given file, automatically closes the stream upon + /// disposing of this writer, and uses the Windows 1252 encoding. + /// + /// The filename. + public CsvWriter(string filename) + : this(File.OpenWrite(filename), false, Definitions.Windows1252Encoding) + { + // placeholder + } + + /// + /// Initializes a new instance of the class. + /// It opens the file given file, automatically closes the stream upon + /// disposing of this writer, and uses the given text encoding for output. + /// + /// The filename. + /// The encoding. + public CsvWriter(string filename, Encoding encoding) + : this(File.OpenWrite(filename), false, encoding) + { + // placeholder + } + + #endregion + + #region Properties + + /// + /// Gets or sets the field separator character. + /// + /// + /// The separator character. + /// + public char SeparatorCharacter { get; set; } = ','; + + /// + /// Gets or sets the escape character to use to escape field values. + /// + /// + /// The escape character. + /// + public char EscapeCharacter { get; set; } = '"'; + + /// + /// Gets or sets the new line character sequence to use when writing a line. + /// + /// + /// The new line sequence. + /// + public string NewLineSequence { get; set; } = Environment.NewLine; + + /// + /// Defines a list of properties to ignore when outputting CSV lines. + /// + /// + /// The ignore property names. + /// + public List IgnorePropertyNames { get; } = new List(); + + /// + /// Gets number of lines that have been written, including the headings line. + /// + /// + /// The count. + /// + public ulong Count + { + get + { + lock (_syncLock) + { + return _mCount; + } + } + } + + #endregion + + #region Helpers + + /// + /// Saves the items to a stream. + /// It uses the Windows 1252 text encoding for output. + /// + /// The type of enumeration. + /// The items. + /// The stream. + /// true if stream is truncated, default false. + /// Number of item saved. + public static int SaveRecords(IEnumerable items, Stream stream, bool truncateData = false) + { + // truncate the file if it had data + if (truncateData && stream.Length > 0) + stream.SetLength(0); + + using var writer = new CsvWriter(stream); + writer.WriteHeadings(); + writer.WriteObjects(items); + return (int)writer.Count; + } + + /// + /// Saves the items to a CSV file. + /// If the file exits, it overwrites it. If it does not, it creates it. + /// It uses the Windows 1252 text encoding for output. + /// + /// The type of enumeration. + /// The items. + /// The file path. + /// Number of item saved. + public static int SaveRecords(IEnumerable items, string filePath) => SaveRecords(items, File.OpenWrite(filePath), true); + + #endregion + + #region Generic, main Write Line Method + + /// + /// Writes a line of CSV text. Items are converted to strings. + /// If items are found to be null, empty strings are written out. + /// If items are not string, the ToStringInvariant() method is called on them. + /// + /// The items. + public void WriteLine(params object[] items) + => WriteLine(items.Select(x => x == null ? string.Empty : x.ToStringInvariant())); + + /// + /// Writes a line of CSV text. Items are converted to strings. + /// If items are found to be null, empty strings are written out. + /// If items are not string, the ToStringInvariant() method is called on them. + /// + /// The items. + public void WriteLine(IEnumerable items) + => WriteLine(items.Select(x => x == null ? string.Empty : x.ToStringInvariant())); + + /// + /// Writes a line of CSV text. + /// If items are found to be null, empty strings are written out. + /// + /// The items. + public void WriteLine(params string[] items) => WriteLine((IEnumerable) items); + + /// + /// Writes a line of CSV text. + /// If items are found to be null, empty strings are written out. + /// + /// The items. + public void WriteLine(IEnumerable items) + { + lock (_syncLock) + { + var length = items.Count(); + var separatorBytes = _encoding.GetBytes(new[] { SeparatorCharacter }); + var endOfLineBytes = _encoding.GetBytes(NewLineSequence); + + // Declare state variables here to avoid recreation, allocation and + // reassignment in every loop + bool needsEnclosing; + string textValue; + byte[] output; + + for (var i = 0; i < length; i++) + { + textValue = items.ElementAt(i); + + // Determine if we need the string to be enclosed + // (it either contains an escape, new line, or separator char) + needsEnclosing = textValue.IndexOf(SeparatorCharacter) >= 0 + || textValue.IndexOf(EscapeCharacter) >= 0 + || textValue.IndexOf('\r') >= 0 + || textValue.IndexOf('\n') >= 0; + + // Escape the escape characters by repeating them twice for every instance + textValue = textValue.Replace($"{EscapeCharacter}", + $"{EscapeCharacter}{EscapeCharacter}"); + + // Enclose the text value if we need to + if (needsEnclosing) + textValue = string.Format($"{EscapeCharacter}{textValue}{EscapeCharacter}", textValue); + + // Get the bytes to write to the stream and write them + output = _encoding.GetBytes(textValue); + _outputStream.Write(output, 0, output.Length); + + // only write a separator if we are moving in between values. + // the last value should not be written. + if (i < length - 1) + _outputStream.Write(separatorBytes, 0, separatorBytes.Length); + } + + // output the newline sequence + _outputStream.Write(endOfLineBytes, 0, endOfLineBytes.Length); + _mCount += 1; + } + } + + #endregion + + #region Write Object Method + + /// + /// Writes a row of CSV text. It handles the special cases where the object is + /// a dynamic object or and array. It also handles non-collection objects fine. + /// If you do not like the way the output is handled, you can simply write an extension + /// method of this class and use the WriteLine method instead. + /// + /// The item. + /// item. + public void WriteObject(object? item) + { + if (item == null) + throw new ArgumentNullException(nameof(item)); + + lock (_syncLock) + { + switch (item) + { + case IDictionary typedItem: + WriteLine(GetFilteredDictionary(typedItem)); + return; + case ICollection typedItem: + WriteLine(typedItem.Cast()); + return; + default: + WriteLine(GetFilteredTypeProperties(item.GetType()).Select(x => item.ReadProperty(x.Name))); + break; + } + } + } + + /// + /// Writes a row of CSV text. It handles the special cases where the object is + /// a dynamic object or and array. It also handles non-collection objects fine. + /// If you do not like the way the output is handled, you can simply write an extension + /// method of this class and use the WriteLine method instead. + /// + /// The type of object to write. + /// The item. + public void WriteObject(T item) => WriteObject(item as object); + + /// + /// Writes a set of items, one per line and atomically by repeatedly calling the + /// WriteObject method. For more info check out the description of the WriteObject + /// method. + /// + /// The type of object to write. + /// The items. + /// items. + public void WriteObjects(IEnumerable items) + { + if (items == null) + throw new ArgumentNullException(nameof(items)); + + lock (_syncLock) + { + foreach (var item in items) + WriteObject(item); + } + } + + #endregion + + #region Write Headings Methods + + /// + /// Writes the headings. + /// + /// The type of object to extract headings. + /// type. + public void WriteHeadings(Type type) + { + if (type == null) + throw new ArgumentNullException(nameof(type)); + + var properties = GetFilteredTypeProperties(type).Select(p => p.Name).Cast(); + WriteLine(properties); + } + + /// + /// Writes the headings. + /// + /// The type of object to extract headings. + public void WriteHeadings() => WriteHeadings(typeof(T)); + + /// + /// Writes the headings. + /// + /// The dictionary to extract headings. + /// dictionary. + public void WriteHeadings(IDictionary dictionary) + { + if (dictionary == null) + throw new ArgumentNullException(nameof(dictionary)); + + WriteLine(GetFilteredDictionary(dictionary, true)); + } + + /// + /// Writes the headings. + /// + /// The object to extract headings. + /// obj. + public void WriteHeadings(object obj) + { + if (obj == null) + throw new ArgumentNullException(nameof(obj)); + + WriteHeadings(obj.GetType()); + } + + #endregion + + #region IDisposable Support + + /// + public void Dispose() => Dispose(true); + + /// + /// Releases unmanaged and - optionally - managed resources. + /// + /// true to release both managed and unmanaged resources; false to release only unmanaged resources. + protected virtual void Dispose(bool disposeAlsoManaged) + { + if (_isDisposing) return; + + if (disposeAlsoManaged) + { + if (_leaveStreamOpen == false) + { + _outputStream.Dispose(); + } + } + + _isDisposing = true; + } + + #endregion + + #region Support Methods + + private IEnumerable GetFilteredDictionary(IDictionary dictionary, bool filterKeys = false) + => dictionary + .Keys + .Cast() + .Select(key => key == null ? string.Empty : key.ToStringInvariant()) + .Where(stringKey => !IgnorePropertyNames.Contains(stringKey)) + .Select(stringKey => + filterKeys + ? stringKey + : dictionary[stringKey] == null ? string.Empty : dictionary[stringKey].ToStringInvariant()); + + private IEnumerable GetFilteredTypeProperties(Type type) + => TypeCache.Retrieve(type, t => + t.GetProperties(BindingFlags.Public | BindingFlags.Instance) + .Where(p => p.CanRead)) + .Where(p => !IgnorePropertyNames.Contains(p.Name)); + + #endregion + + } +} \ No newline at end of file diff --git a/Vendor/Swan.Lite-3.1.0/Formatters/HumanizeJson.cs b/Vendor/Swan.Lite-3.1.0/Formatters/HumanizeJson.cs new file mode 100644 index 0000000..600136d --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Formatters/HumanizeJson.cs @@ -0,0 +1,147 @@ +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Swan.Formatters +{ + internal class HumanizeJson + { + private readonly StringBuilder _builder = new StringBuilder(); + private readonly int _indent; + private readonly string _indentStr; + private readonly object? _obj; + + public HumanizeJson(object? obj, int indent) + { + _obj = obj; + _indent = indent; + _indentStr = new string(' ', indent * 4); + + ParseObject(); + } + + public string GetResult() => _obj == null ? string.Empty : _builder.ToString().TrimEnd(); + + private void ParseObject() + { + if (_obj == null) + { + return; + } + + switch (_obj) + { + case Dictionary dictionary: + AppendDictionary(dictionary); + break; + case List list: + AppendList(list); + break; + default: + AppendString(_obj.ToString()); + break; + } + } + + private void AppendDictionary(Dictionary objects) + { + foreach (var kvp in objects) + { + if (kvp.Value == null) continue; + + var writeOutput = false; + + switch (kvp.Value) + { + case Dictionary valueDictionary: + if (valueDictionary.Count > 0) + { + writeOutput = true; + _builder + .Append($"{_indentStr}{kvp.Key,-16}: object") + .AppendLine(); + } + + break; + case List valueList: + if (valueList.Count > 0) + { + writeOutput = true; + _builder + .Append($"{_indentStr}{kvp.Key,-16}: array[{valueList.Count}]") + .AppendLine(); + } + + break; + default: + writeOutput = true; + _builder.Append($"{_indentStr}{kvp.Key,-16}: "); + break; + } + + if (writeOutput) + _builder.AppendLine(new HumanizeJson(kvp.Value, _indent + 1).GetResult()); + } + } + + private void AppendList(IEnumerable objects) + { + var index = 0; + foreach (var value in objects) + { + var writeOutput = false; + + switch (value) + { + case Dictionary valueDictionary: + if (valueDictionary.Count > 0) + { + writeOutput = true; + _builder + .Append($"{_indentStr}[{index}]: object") + .AppendLine(); + } + + break; + case List valueList: + if (valueList.Count > 0) + { + writeOutput = true; + _builder + .Append($"{_indentStr}[{index}]: array[{valueList.Count}]") + .AppendLine(); + } + + break; + default: + writeOutput = true; + _builder.Append($"{_indentStr}[{index}]: "); + break; + } + + index++; + + if (writeOutput) + _builder.AppendLine(new HumanizeJson(value, _indent + 1).GetResult()); + } + } + + private void AppendString(string stringValue) + { + if (stringValue.Length + _indentStr.Length <= 96 && stringValue.IndexOf('\r') < 0 && + stringValue.IndexOf('\n') < 0) + { + _builder.Append($"{stringValue}"); + return; + } + + _builder.AppendLine(); + var stringLines = stringValue.ToLines().Select(l => l.Trim()); + + foreach (var line in stringLines) + { + _builder.AppendLine($"{_indentStr}{line}"); + } + } + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Formatters/Json.Converter.cs b/Vendor/Swan.Lite-3.1.0/Formatters/Json.Converter.cs new file mode 100644 index 0000000..c7e18b6 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Formatters/Json.Converter.cs @@ -0,0 +1,353 @@ +using System; +using System.Collections; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using Swan.Reflection; + +namespace Swan.Formatters +{ + /// + /// A very simple, light-weight JSON library written by Mario + /// to teach Geo how things are done + /// + /// This is an useful helper for small tasks but it doesn't represent a full-featured + /// serializer such as the beloved Json.NET. + /// + public static partial class Json + { + private class Converter + { + private static readonly ConcurrentDictionary MemberInfoNameCache = + new ConcurrentDictionary(); + + private static readonly ConcurrentDictionary ListAddMethodCache = new ConcurrentDictionary(); + + private readonly object? _target; + private readonly Type _targetType; + private readonly bool _includeNonPublic; + private readonly JsonSerializerCase _jsonSerializerCase; + + private Converter( + object? source, + Type targetType, + ref object? targetInstance, + bool includeNonPublic, + JsonSerializerCase jsonSerializerCase) + { + _targetType = targetInstance != null ? targetInstance.GetType() : targetType; + _includeNonPublic = includeNonPublic; + _jsonSerializerCase = jsonSerializerCase; + + if (source == null) + { + return; + } + + var sourceType = source.GetType(); + + if (_targetType == null || _targetType == typeof(object)) _targetType = sourceType; + if (sourceType == _targetType) + { + _target = source; + return; + } + + if (!TrySetInstance(targetInstance, source, ref _target)) + return; + + ResolveObject(source, ref _target); + } + + internal static object? FromJsonResult( + object? source, + JsonSerializerCase jsonSerializerCase, + Type? targetType = null, + bool includeNonPublic = false) + { + object? nullRef = null; + return new Converter(source, targetType ?? typeof(object), ref nullRef, includeNonPublic, jsonSerializerCase).GetResult(); + } + + private static object? FromJsonResult(object source, + Type targetType, + ref object? targetInstance, + bool includeNonPublic) + { + return new Converter(source, targetType, ref targetInstance, includeNonPublic, JsonSerializerCase.None).GetResult(); + } + + private static Type? GetAddMethodParameterType(Type targetType) + => ListAddMethodCache.GetOrAdd(targetType, + x => x.GetMethods() + .FirstOrDefault( + m => m.Name == AddMethodName && m.IsPublic && m.GetParameters().Length == 1)? + .GetParameters()[0] + .ParameterType); + + private static void GetByteArray(string sourceString, ref object? target) + { + try + { + target = Convert.FromBase64String(sourceString); + } // Try conversion from Base 64 + catch (FormatException) + { + target = Encoding.UTF8.GetBytes(sourceString); + } // Get the string bytes in UTF8 + } + + private object? GetSourcePropertyValue( + IDictionary sourceProperties, + MemberInfo targetProperty) + { + var targetPropertyName = MemberInfoNameCache.GetOrAdd( + targetProperty, + x => AttributeCache.DefaultCache.Value.RetrieveOne(x)?.PropertyName ?? x.Name.GetNameWithCase(_jsonSerializerCase)); + + return sourceProperties!.GetValueOrDefault(targetPropertyName); + } + + private bool TrySetInstance(object? targetInstance, object source, ref object? target) + { + if (targetInstance == null) + { + // Try to create a default instance + try + { + source.CreateTarget(_targetType, _includeNonPublic, ref target); + } +#pragma warning disable CA1031 // Do not catch general exception types + catch +#pragma warning restore CA1031 // Do not catch general exception types + { + return false; + } + } + else + { + target = targetInstance; + } + + return true; + } + + private object? GetResult() => _target ?? _targetType.GetDefault(); + + private void ResolveObject(object source, ref object? target) + { + switch (source) + { + // Case 0: Special Cases Handling (Source and Target are of specific convertible types) + // Case 0.1: Source is string, Target is byte[] + case string sourceString when _targetType == typeof(byte[]): + GetByteArray(sourceString, ref target); + break; + + // Case 1.1: Source is Dictionary, Target is IDictionary + case Dictionary sourceProperties when target is IDictionary targetDictionary: + PopulateDictionary(sourceProperties, targetDictionary); + break; + + // Case 1.2: Source is Dictionary, Target is not IDictionary (i.e. it is a complex type) + case Dictionary sourceProperties: + PopulateObject(sourceProperties); + break; + + // Case 2.1: Source is List, Target is Array + case List sourceList when target is Array targetArray: + PopulateArray(sourceList, targetArray); + break; + + // Case 2.2: Source is List, Target is IList + case List sourceList when target is IList targetList: + PopulateIList(sourceList, targetList); + break; + + // Case 3: Source is a simple type; Attempt conversion + default: + var sourceStringValue = source.ToStringInvariant(); + + // Handle basic types or enumerations if not + if (!_targetType.TryParseBasicType(sourceStringValue, out target)) + GetEnumValue(sourceStringValue, ref target); + + break; + } + } + + private void PopulateIList(IEnumerable objects, IList list) + { + var parameterType = GetAddMethodParameterType(_targetType); + if (parameterType == null) return; + + foreach (var item in objects) + { + try + { + list.Add(FromJsonResult( + item, + _jsonSerializerCase, + parameterType, + _includeNonPublic)); + } +#pragma warning disable CA1031 // Do not catch general exception types + catch +#pragma warning restore CA1031 // Do not catch general exception types + { + // ignored + } + } + } + + private void PopulateArray(IList objects, Array array) + { + var elementType = _targetType.GetElementType(); + + for (var i = 0; i < objects.Count; i++) + { + try + { + var targetItem = FromJsonResult( + objects[i], + _jsonSerializerCase, + elementType, + _includeNonPublic); + array.SetValue(targetItem, i); + } +#pragma warning disable CA1031 // Do not catch general exception types + catch +#pragma warning restore CA1031 // Do not catch general exception types + { + // ignored + } + } + } + + private void GetEnumValue(string sourceStringValue, ref object? target) + { + var enumType = Nullable.GetUnderlyingType(_targetType); + if (enumType == null && _targetType.IsEnum) enumType = _targetType; + if (enumType == null) return; + + try + { + target = Enum.Parse(enumType, sourceStringValue); + } +#pragma warning disable CA1031 // Do not catch general exception types + catch +#pragma warning restore CA1031 // Do not catch general exception types + { + // ignored + } + } + + private void PopulateDictionary(IDictionary sourceProperties, IDictionary targetDictionary) + { + // find the add method of the target dictionary + var addMethod = _targetType.GetMethods() + .FirstOrDefault( + m => m.Name == AddMethodName && m.IsPublic && m.GetParameters().Length == 2); + + // skip if we don't have a compatible add method + if (addMethod == null) return; + var addMethodParameters = addMethod.GetParameters(); + if (addMethodParameters[0].ParameterType != typeof(string)) return; + + // Retrieve the target entry type + var targetEntryType = addMethodParameters[1].ParameterType; + + // Add the items to the target dictionary + foreach (var sourceProperty in sourceProperties) + { + try + { + var targetEntryValue = FromJsonResult( + sourceProperty.Value, + _jsonSerializerCase, + targetEntryType, + _includeNonPublic); + targetDictionary.Add(sourceProperty.Key, targetEntryValue); + } +#pragma warning disable CA1031 // Do not catch general exception types + catch +#pragma warning restore CA1031 // Do not catch general exception types + { + // ignored + } + } + } + + private void PopulateObject(IDictionary sourceProperties) + { + if (sourceProperties == null) + return; + + if (_targetType.IsValueType) + PopulateFields(sourceProperties); + + PopulateProperties(sourceProperties); + } + + private void PopulateProperties(IDictionary sourceProperties) + { + var properties = PropertyTypeCache.DefaultCache.Value.RetrieveFilteredProperties(_targetType, false, p => p.CanWrite); + + foreach (var property in properties) + { + var sourcePropertyValue = GetSourcePropertyValue(sourceProperties, property); + if (sourcePropertyValue == null) continue; + + try + { + var currentPropertyValue = !property.PropertyType.IsArray + ? _target.ReadProperty(property.Name) + : null; + + var targetPropertyValue = FromJsonResult( + sourcePropertyValue, + property.PropertyType, + ref currentPropertyValue, + _includeNonPublic); + + _target.WriteProperty(property.Name, targetPropertyValue); + } +#pragma warning disable CA1031 // Do not catch general exception types + catch +#pragma warning restore CA1031 // Do not catch general exception types + { + // ignored + } + } + } + + private void PopulateFields(IDictionary sourceProperties) + { + foreach (var field in FieldTypeCache.DefaultCache.Value.RetrieveAllFields(_targetType)) + { + var sourcePropertyValue = GetSourcePropertyValue(sourceProperties, field); + if (sourcePropertyValue == null) continue; + + var targetPropertyValue = FromJsonResult( + sourcePropertyValue, + _jsonSerializerCase, + field.FieldType, + _includeNonPublic); + + try + { + field.SetValue(_target, targetPropertyValue); + } +#pragma warning disable CA1031 // Do not catch general exception types + catch +#pragma warning restore CA1031 // Do not catch general exception types + { + // ignored + } + } + } + } + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Formatters/Json.Deserializer.cs b/Vendor/Swan.Lite-3.1.0/Formatters/Json.Deserializer.cs new file mode 100644 index 0000000..de89a10 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Formatters/Json.Deserializer.cs @@ -0,0 +1,348 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Swan.Formatters +{ + /// + /// A very simple, light-weight JSON library written by Mario + /// to teach Geo how things are done + /// + /// This is an useful helper for small tasks but it doesn't represent a full-featured + /// serializer such as the beloved Json.NET. + /// + public partial class Json + { + /// + /// A simple JSON Deserializer. + /// + private class Deserializer + { + #region State Variables + + private readonly object? _result; + private readonly string _json; + + private Dictionary _resultObject; + private List _resultArray; + private ReadState _state = ReadState.WaitingForRootOpen; + private string? _currentFieldName; + + private int _index; + + #endregion + + private Deserializer(string json, int startIndex) + { + _json = json; + + for (_index = startIndex; _index < _json.Length; _index++) + { + switch (_state) + { + case ReadState.WaitingForRootOpen: + WaitForRootOpen(); + continue; + case ReadState.WaitingForField when char.IsWhiteSpace(_json, _index): + continue; + case ReadState.WaitingForField when (_resultObject != null && _json[_index] == CloseObjectChar) + || (_resultArray != null && _json[_index] == CloseArrayChar): + // Handle empty arrays and empty objects + _result = _resultObject ?? _resultArray as object; + return; + case ReadState.WaitingForField when _json[_index] != StringQuotedChar: + throw CreateParserException($"'{StringQuotedChar}'"); + case ReadState.WaitingForField: + { + var charCount = GetFieldNameCount(); + + _currentFieldName = Unescape(_json.SliceLength(_index + 1, charCount)); + _index += charCount + 1; + _state = ReadState.WaitingForColon; + continue; + } + + case ReadState.WaitingForColon when char.IsWhiteSpace(_json, _index): + continue; + case ReadState.WaitingForColon when _json[_index] != ValueSeparatorChar: + throw CreateParserException($"'{ValueSeparatorChar}'"); + case ReadState.WaitingForColon: + _state = ReadState.WaitingForValue; + continue; + case ReadState.WaitingForValue when char.IsWhiteSpace(_json, _index): + continue; + case ReadState.WaitingForValue when (_resultObject != null && _json[_index] == CloseObjectChar) + || (_resultArray != null && _json[_index] == CloseArrayChar): + // Handle empty arrays and empty objects + _result = _resultObject ?? _resultArray as object; + return; + case ReadState.WaitingForValue: + ExtractValue(); + continue; + } + + if (_state != ReadState.WaitingForNextOrRootClose || char.IsWhiteSpace(_json, _index)) continue; + + if (_json[_index] == FieldSeparatorChar) + { + if (_resultObject != null) + { + _state = ReadState.WaitingForField; + _currentFieldName = null; + continue; + } + + _state = ReadState.WaitingForValue; + continue; + } + + if ((_resultObject == null || _json[_index] != CloseObjectChar) && + (_resultArray == null || _json[_index] != CloseArrayChar)) + { + throw CreateParserException($"'{FieldSeparatorChar}' '{CloseObjectChar}' or '{CloseArrayChar}'"); + } + + _result = _resultObject ?? _resultArray as object; + return; + } + } + + internal static object? DeserializeInternal(string json) => new Deserializer(json, 0)._result; + + private void WaitForRootOpen() + { + if (char.IsWhiteSpace(_json, _index)) return; + + switch (_json[_index]) + { + case OpenObjectChar: + _resultObject = new Dictionary(); + _state = ReadState.WaitingForField; + return; + case OpenArrayChar: + _resultArray = new List(); + _state = ReadState.WaitingForValue; + return; + default: + throw CreateParserException($"'{OpenObjectChar}' or '{OpenArrayChar}'"); + } + } + + private void ExtractValue() + { + // determine the value based on what it starts with + switch (_json[_index]) + { + case StringQuotedChar: // expect a string + ExtractStringQuoted(); + break; + + case OpenObjectChar: // expect object + case OpenArrayChar: // expect array + ExtractObject(); + break; + + case 't': // expect true + ExtractConstant(TrueLiteral, true); + break; + + case 'f': // expect false + ExtractConstant(FalseLiteral, false); + break; + + case 'n': // expect null + ExtractConstant(NullLiteral); + break; + + default: // expect number + ExtractNumber(); + break; + } + + _currentFieldName = null; + _state = ReadState.WaitingForNextOrRootClose; + } + + private static string Unescape(string str) + { + // check if we need to unescape at all + if (str.IndexOf(StringEscapeChar) < 0) + return str; + + var builder = new StringBuilder(str.Length); + for (var i = 0; i < str.Length; i++) + { + if (str[i] != StringEscapeChar) + { + builder.Append(str[i]); + continue; + } + + if (i + 1 > str.Length - 1) + break; + + // escape sequence begins here + switch (str[i + 1]) + { + case 'u': + i = ExtractEscapeSequence(str, i, builder); + break; + case 'b': + builder.Append('\b'); + i += 1; + break; + case 't': + builder.Append('\t'); + i += 1; + break; + case 'n': + builder.Append('\n'); + i += 1; + break; + case 'f': + builder.Append('\f'); + i += 1; + break; + case 'r': + builder.Append('\r'); + i += 1; + break; + default: + builder.Append(str[i + 1]); + i += 1; + break; + } + } + + return builder.ToString(); + } + + private static int ExtractEscapeSequence(string str, int i, StringBuilder builder) + { + var startIndex = i + 2; + var endIndex = i + 5; + if (endIndex > str.Length - 1) + { + builder.Append(str[i + 1]); + i += 1; + return i; + } + + var hexCode = str.Slice(startIndex, endIndex).ConvertHexadecimalToBytes(); + builder.Append(Encoding.BigEndianUnicode.GetChars(hexCode)); + i += 5; + return i; + } + + private int GetFieldNameCount() + { + var charCount = 0; + for (var j = _index + 1; j < _json.Length; j++) + { + if (_json[j] == StringQuotedChar && _json[j - 1] != StringEscapeChar) + break; + + charCount++; + } + + return charCount; + } + + private void ExtractObject() + { + // Extract and set the value + var deserializer = new Deserializer(_json, _index); + + if (_currentFieldName != null) + _resultObject[_currentFieldName] = deserializer._result; + else + _resultArray.Add(deserializer._result); + + _index = deserializer._index; + } + + private void ExtractNumber() + { + var charCount = 0; + for (var j = _index; j < _json.Length; j++) + { + if (char.IsWhiteSpace(_json[j]) || _json[j] == FieldSeparatorChar + || (_resultObject != null && _json[j] == CloseObjectChar) + || (_resultArray != null && _json[j] == CloseArrayChar)) + break; + + charCount++; + } + + // Extract and set the value + var stringValue = _json.SliceLength(_index, charCount); + + if (decimal.TryParse(stringValue, System.Globalization.NumberStyles.Number, System.Globalization.CultureInfo.InvariantCulture, out var value) == false) + throw CreateParserException("[number]"); + + if (_currentFieldName != null) + _resultObject[_currentFieldName] = value; + else + _resultArray.Add(value); + + _index += charCount - 1; + } + + private void ExtractConstant(string boolValue, bool? value = null) + { + if (_json.SliceLength(_index, boolValue.Length) != boolValue) + throw CreateParserException($"'{ValueSeparatorChar}'"); + + // Extract and set the value + if (_currentFieldName != null) + _resultObject[_currentFieldName] = value; + else + _resultArray.Add(value); + + _index += boolValue.Length - 1; + } + + private void ExtractStringQuoted() + { + var charCount = 0; + var escapeCharFound = false; + for (var j = _index + 1; j < _json.Length; j++) + { + if (_json[j] == StringQuotedChar && !escapeCharFound) + break; + + escapeCharFound = _json[j] == StringEscapeChar && !escapeCharFound; + charCount++; + } + + // Extract and set the value + var value = Unescape(_json.SliceLength(_index + 1, charCount)); + if (_currentFieldName != null) + _resultObject[_currentFieldName] = value; + else + _resultArray.Add(value); + + _index += charCount + 1; + } + + private FormatException CreateParserException(string expected) + { + var (line, col) = _json.TextPositionAt(_index); + return new FormatException( + $"Parser error (Line {line}, Col {col}, State {_state}): Expected {expected} but got '{_json[_index]}'."); + } + + /// + /// Defines the different JSON read states. + /// + private enum ReadState + { + WaitingForRootOpen, + WaitingForField, + WaitingForColon, + WaitingForValue, + WaitingForNextOrRootClose, + } + } + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Formatters/Json.Serializer.cs b/Vendor/Swan.Lite-3.1.0/Formatters/Json.Serializer.cs new file mode 100644 index 0000000..ff3a0c5 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Formatters/Json.Serializer.cs @@ -0,0 +1,370 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Reflection; +using System.Text; +using Swan.Reflection; + +namespace Swan.Formatters +{ + /// + /// A very simple, light-weight JSON library written by Mario + /// to teach Geo how things are done + /// + /// This is an useful helper for small tasks but it doesn't represent a full-featured + /// serializer such as the beloved Json.NET. + /// + public partial class Json + { + /// + /// A simple JSON serializer. + /// + private class Serializer + { + #region Private Declarations + + private static readonly Dictionary IndentStrings = new Dictionary(); + + private readonly SerializerOptions _options; + private readonly string _result; + private readonly StringBuilder _builder; + private readonly string _lastCommaSearch; + private readonly string[]? _excludedNames = null; + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + /// The object. + /// The depth. + /// The options. + private Serializer(object? obj, int depth, SerializerOptions options, string[]? excludedNames = null) + { + if (depth > 20) + { + throw new InvalidOperationException( + "The max depth (20) has been reached. Serializer can not continue."); + } + + // Basic Type Handling (nulls, strings, number, date and bool) + _result = ResolveBasicType(obj); + + if (!string.IsNullOrWhiteSpace(_result)) + return; + + _options = options; + _excludedNames ??= excludedNames; + _options.ExcludeProperties = GetExcludedNames(obj?.GetType(), _excludedNames); + + // Handle circular references correctly and avoid them + if (options.IsObjectPresent(obj!)) + { + _result = $"{{ \"$circref\": \"{Escape(obj!.GetHashCode().ToStringInvariant(), false)}\" }}"; + return; + } + + // At this point, we will need to construct the object with a StringBuilder. + _lastCommaSearch = FieldSeparatorChar + (_options.Format ? Environment.NewLine : string.Empty); + _builder = new StringBuilder(); + + _result = obj switch + { + IDictionary itemsZero when itemsZero.Count == 0 => EmptyObjectLiteral, + IDictionary items => ResolveDictionary(items, depth), + IEnumerable enumerableZero when !enumerableZero.Cast().Any() => EmptyArrayLiteral, + IEnumerable enumerableBytes when enumerableBytes is byte[] bytes => Serialize(bytes.ToBase64(), depth, _options, _excludedNames), + IEnumerable enumerable => ResolveEnumerable(enumerable, depth), + _ => ResolveObject(obj!, depth) + }; + } + + internal static string Serialize(object? obj, int depth, SerializerOptions options, string[]? excludedNames = null) => new Serializer(obj, depth, options, excludedNames)._result; + + #endregion + + #region Helper Methods + internal static string[]? GetExcludedNames(Type? type, string[]? excludedNames) + { + if (type == null) + return excludedNames; + + var excludedByAttr = IgnoredPropertiesCache.Retrieve(type, t => t.GetProperties() + .Where(x => AttributeCache.DefaultCache.Value.RetrieveOne(x)?.Ignored == true) + .Select(x => x.Name)); + + if (excludedByAttr?.Any() != true) + return excludedNames; + + return excludedNames?.Any(string.IsNullOrWhiteSpace) == true + ? excludedByAttr.Intersect(excludedNames.Where(y => !string.IsNullOrWhiteSpace(y))).ToArray() + : excludedByAttr.ToArray(); + } + + private static string ResolveBasicType(object? obj) + { + switch (obj) + { + case null: + return NullLiteral; + case string s: + return Escape(s, true); + case bool b: + return b ? TrueLiteral : FalseLiteral; + case Type _: + case Assembly _: + case MethodInfo _: + case PropertyInfo _: + case EventInfo _: + return Escape(obj.ToString(), true); + case DateTime d: + return $"{StringQuotedChar}{d:s}{StringQuotedChar}"; + default: + var targetType = obj.GetType(); + + if (!Definitions.BasicTypesInfo.Value.ContainsKey(targetType)) + return string.Empty; + + var escapedValue = Escape(Definitions.BasicTypesInfo.Value[targetType].ToStringInvariant(obj), false); + + return decimal.TryParse(escapedValue, out _) + ? $"{escapedValue}" + : $"{StringQuotedChar}{escapedValue}{StringQuotedChar}"; + } + } + + private static bool IsNonEmptyJsonArrayOrObject(string serialized) + { + if (serialized == EmptyObjectLiteral || serialized == EmptyArrayLiteral) return false; + + // find the first position the character is not a space + return serialized.Where(c => c != ' ').Select(c => c == OpenObjectChar || c == OpenArrayChar).FirstOrDefault(); + } + + private static string Escape(string str, bool quoted) + { + if (str == null) + return string.Empty; + + var builder = new StringBuilder(str.Length * 2); + if (quoted) builder.Append(StringQuotedChar); + Escape(str, builder); + if (quoted) builder.Append(StringQuotedChar); + return builder.ToString(); + } + + private static void Escape(string str, StringBuilder builder) + { + foreach (var currentChar in str) + { + switch (currentChar) + { + case '\\': + case '"': + case '/': + builder + .Append('\\') + .Append(currentChar); + break; + case '\b': + builder.Append("\\b"); + break; + case '\t': + builder.Append("\\t"); + break; + case '\n': + builder.Append("\\n"); + break; + case '\f': + builder.Append("\\f"); + break; + case '\r': + builder.Append("\\r"); + break; + default: + if (currentChar < ' ') + { + var escapeBytes = BitConverter.GetBytes((ushort)currentChar); + if (BitConverter.IsLittleEndian == false) + Array.Reverse(escapeBytes); + + builder.Append("\\u") + .Append(escapeBytes[1].ToString("X", CultureInfo.InvariantCulture).PadLeft(2, '0')) + .Append(escapeBytes[0].ToString("X", CultureInfo.InvariantCulture).PadLeft(2, '0')); + } + else + { + builder.Append(currentChar); + } + + break; + } + } + } + + private Dictionary CreateDictionary( + Dictionary fields, + string targetType, + object target) + { + // Create the dictionary and extract the properties + var objectDictionary = new Dictionary(); + + if (!string.IsNullOrWhiteSpace(_options.TypeSpecifier)) + objectDictionary[_options.TypeSpecifier!] = targetType; + + foreach (var field in fields) + { + // Build the dictionary using property names and values + // Note: used to be: property.GetValue(target); but we would be reading private properties + try + { + objectDictionary[field.Key] = field.Value is PropertyInfo property + ? target.ReadProperty(property.Name) + : (field.Value as FieldInfo)?.GetValue(target); + } +#pragma warning disable CA1031 // Do not catch general exception types + catch +#pragma warning restore CA1031 // Do not catch general exception types + { + /* ignored */ + } + } + + return objectDictionary; + } + + private string ResolveDictionary(IDictionary items, int depth) + { + Append(OpenObjectChar, depth); + AppendLine(); + + // Iterate through the elements and output recursively + var writeCount = 0; + foreach (var key in items.Keys) + { + // Serialize and append the key (first char indented) + Append(StringQuotedChar, depth + 1); + Escape(key.ToString(), _builder); + _builder + .Append(StringQuotedChar) + .Append(ValueSeparatorChar) + .Append(" "); + + // Serialize and append the value + var serializedValue = Serialize(items[key], depth + 1, _options, _excludedNames); + + if (IsNonEmptyJsonArrayOrObject(serializedValue)) AppendLine(); + Append(serializedValue, 0); + + // Add a comma and start a new line -- We will remove the last one when we are done writing the elements + Append(FieldSeparatorChar, 0); + AppendLine(); + writeCount++; + } + + // Output the end of the object and set the result + RemoveLastComma(); + Append(CloseObjectChar, writeCount > 0 ? depth : 0); + return _builder.ToString(); + } + + private string ResolveObject(object target, int depth) + { + var targetType = target.GetType(); + + if (targetType.IsEnum) + return Convert.ToInt64(target, CultureInfo.InvariantCulture).ToStringInvariant(); + + var fields = _options.GetProperties(targetType); + + if (fields.Count == 0 && string.IsNullOrWhiteSpace(_options.TypeSpecifier)) + return EmptyObjectLiteral; + + // If we arrive here, then we convert the object into a + // dictionary of property names and values and call the serialization + // function again + var objectDictionary = CreateDictionary(fields, targetType.ToString(), target); + + return Serialize(objectDictionary, depth, _options, _excludedNames); + } + + private string ResolveEnumerable(IEnumerable target, int depth) + { + // Cast the items as a generic object array + var items = target.Cast(); + + Append(OpenArrayChar, depth); + AppendLine(); + + // Iterate through the elements and output recursively + var writeCount = 0; + foreach (var entry in items) + { + var serializedValue = Serialize(entry, depth + 1, _options, _excludedNames); + + if (IsNonEmptyJsonArrayOrObject(serializedValue)) + Append(serializedValue, 0); + else + Append(serializedValue, depth + 1); + + Append(FieldSeparatorChar, 0); + AppendLine(); + writeCount++; + } + + // Output the end of the array and set the result + RemoveLastComma(); + Append(CloseArrayChar, writeCount > 0 ? depth : 0); + return _builder.ToString(); + } + + private void SetIndent(int depth) + { + if (_options.Format == false || depth <= 0) return; + + _builder.Append(IndentStrings.GetOrAdd(depth, x => new string(' ', x * 4))); + } + + /// + /// Removes the last comma in the current string builder. + /// + private void RemoveLastComma() + { + if (_builder.Length < _lastCommaSearch.Length) + return; + + if (_lastCommaSearch.Where((t, i) => _builder[_builder.Length - _lastCommaSearch.Length + i] != t).Any()) + { + return; + } + + // If we got this far, we simply remove the comma character + _builder.Remove(_builder.Length - _lastCommaSearch.Length, 1); + } + + private void Append(string text, int depth) + { + SetIndent(depth); + _builder.Append(text); + } + + private void Append(char text, int depth) + { + SetIndent(depth); + _builder.Append(text); + } + + private void AppendLine() + { + if (_options.Format == false) return; + _builder.Append(Environment.NewLine); + } + #endregion + } + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Formatters/Json.SerializerOptions.cs b/Vendor/Swan.Lite-3.1.0/Formatters/Json.SerializerOptions.cs new file mode 100644 index 0000000..8bae789 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Formatters/Json.SerializerOptions.cs @@ -0,0 +1,152 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using Swan.Reflection; + +namespace Swan.Formatters +{ + /// + /// A very simple, light-weight JSON library written by Mario + /// to teach Geo how things are done + /// + /// This is an useful helper for small tasks but it doesn't represent a full-featured + /// serializer such as the beloved Json.NET. + /// + public class SerializerOptions + { + private static readonly ConcurrentDictionary, MemberInfo>> + TypeCache = new ConcurrentDictionary, MemberInfo>>(); + + private readonly string[]? _includeProperties; + private readonly Dictionary> _parentReferences = new Dictionary>(); + + /// + /// Initializes a new instance of the class. + /// + /// if set to true [format]. + /// The type specifier. + /// The include properties. + /// The exclude properties. + /// if set to true [include non public]. + /// The parent references. + /// The json serializer case. + public SerializerOptions( + bool format, + string? typeSpecifier, + string[]? includeProperties, + string[]? excludeProperties = null, + bool includeNonPublic = true, + IReadOnlyCollection? parentReferences = null, + JsonSerializerCase jsonSerializerCase = JsonSerializerCase.None) + { + _includeProperties = includeProperties; + + ExcludeProperties = excludeProperties; + IncludeNonPublic = includeNonPublic; + Format = format; + TypeSpecifier = typeSpecifier; + JsonSerializerCase = jsonSerializerCase; + + if (parentReferences == null) + return; + + foreach (var parentReference in parentReferences.Where(x => x.IsAlive)) + { + IsObjectPresent(parentReference.Target); + } + } + + /// + /// Gets a value indicating whether this is format. + /// + /// + /// true if format; otherwise, false. + /// + public bool Format { get; } + + /// + /// Gets the type specifier. + /// + /// + /// The type specifier. + /// + public string? TypeSpecifier { get; } + + /// + /// Gets a value indicating whether [include non public]. + /// + /// + /// true if [include non public]; otherwise, false. + /// + public bool IncludeNonPublic { get; } + + /// + /// Gets the json serializer case. + /// + /// + /// The json serializer case. + /// + public JsonSerializerCase JsonSerializerCase { get; } + + /// + /// Gets or sets the exclude properties. + /// + /// + /// The exclude properties. + /// + public string[]? ExcludeProperties { get; set; } + + internal bool IsObjectPresent(object target) + { + var hashCode = target.GetHashCode(); + + if (_parentReferences.ContainsKey(hashCode)) + { + if (_parentReferences[hashCode].Any(p => ReferenceEquals(p.Target, target))) + return true; + + _parentReferences[hashCode].Add(new WeakReference(target)); + return false; + } + + _parentReferences.Add(hashCode, new List { new WeakReference(target) }); + return false; + } + + internal Dictionary GetProperties(Type targetType) + => GetPropertiesCache(targetType) + .When(() => _includeProperties?.Length > 0, + query => query.Where(p => _includeProperties.Contains(p.Key.Item1))) + .When(() => ExcludeProperties?.Length > 0, + query => query.Where(p => !ExcludeProperties.Contains(p.Key.Item1))) + .ToDictionary(x => x.Key.Item2, x => x.Value); + + private Dictionary, MemberInfo> GetPropertiesCache(Type targetType) + { + if (TypeCache.TryGetValue(targetType, out var current)) + return current; + + var fields = + new List(PropertyTypeCache.DefaultCache.Value.RetrieveAllProperties(targetType).Where(p => p.CanRead)); + + // If the target is a struct (value type) navigate the fields. + if (targetType.IsValueType) + { + fields.AddRange(FieldTypeCache.DefaultCache.Value.RetrieveAllFields(targetType)); + } + + var value = fields + .Where(x => x.GetCustomAttribute()?.Ignored != true) + .ToDictionary( + x => Tuple.Create(x.Name, + x.GetCustomAttribute()?.PropertyName ?? x.Name.GetNameWithCase(JsonSerializerCase)), + x => x); + + TypeCache.TryAdd(targetType, value); + + return value; + } + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Formatters/Json.cs b/Vendor/Swan.Lite-3.1.0/Formatters/Json.cs new file mode 100644 index 0000000..0b0f373 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Formatters/Json.cs @@ -0,0 +1,373 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Swan.Collections; + +namespace Swan.Formatters +{ + /// + /// A very simple, light-weight JSON library written by Mario + /// to teach Geo how things are done + /// + /// This is an useful helper for small tasks but it doesn't represent a full-featured + /// serializer such as the beloved Json.NET. + /// + public static partial class Json + { + #region Constants + + internal const string AddMethodName = "Add"; + + private const char OpenObjectChar = '{'; + private const char CloseObjectChar = '}'; + + private const char OpenArrayChar = '['; + private const char CloseArrayChar = ']'; + + private const char FieldSeparatorChar = ','; + private const char ValueSeparatorChar = ':'; + + private const char StringEscapeChar = '\\'; + private const char StringQuotedChar = '"'; + + private const string EmptyObjectLiteral = "{ }"; + private const string EmptyArrayLiteral = "[ ]"; + private const string TrueLiteral = "true"; + private const string FalseLiteral = "false"; + private const string NullLiteral = "null"; + + #endregion + + private static readonly CollectionCacheRepository IgnoredPropertiesCache = new CollectionCacheRepository(); + + #region Public API + + /// + /// Serializes the specified object into a JSON string. + /// + /// The object. + /// if set to true it formats and indents the output. + /// The type specifier. Leave null or empty to avoid setting. + /// if set to true non-public getters will be also read. + /// The included property names. + /// The excluded property names. + /// + /// A that represents the current object. + /// + /// + /// The following example describes how to serialize a simple object. + /// + /// using Swan.Formatters; + /// + /// class Example + /// { + /// static void Main() + /// { + /// var obj = new { One = "One", Two = "Two" }; + /// + /// var serial = Json.Serialize(obj); // {"One": "One","Two": "Two"} + /// } + /// } + /// + /// + /// The following example details how to serialize an object using the . + /// + /// + /// using Swan.Attributes; + /// using Swan.Formatters; + /// + /// class Example + /// { + /// class JsonPropertyExample + /// { + /// [JsonProperty("data")] + /// public string Data { get; set; } + /// + /// [JsonProperty("ignoredData", true)] + /// public string IgnoredData { get; set; } + /// } + /// + /// static void Main() + /// { + /// var obj = new JsonPropertyExample() { Data = "OK", IgnoredData = "OK" }; + /// + /// // {"data": "OK"} + /// var serializedObj = Json.Serialize(obj); + /// } + /// } + /// + /// + public static string Serialize( + object? obj, + bool format = false, + string? typeSpecifier = null, + bool includeNonPublic = false, + string[]? includedNames = null, + params string[] excludedNames) => + Serialize(obj, format, typeSpecifier, includeNonPublic, includedNames, excludedNames, null, JsonSerializerCase.None); + + /// + /// Serializes the specified object into a JSON string. + /// + /// The object. + /// The json serializer case. + /// if set to true [format]. + /// The type specifier. + /// + /// A that represents the current object. + /// + public static string Serialize( + object? obj, + JsonSerializerCase jsonSerializerCase, + bool format = false, + string? typeSpecifier = null) => Serialize(obj, format, typeSpecifier, false, null, null, null, jsonSerializerCase); + + /// + /// Serializes the specified object into a JSON string. + /// + /// The object. + /// if set to true it formats and indents the output. + /// The type specifier. Leave null or empty to avoid setting. + /// if set to true non-public getters will be also read. + /// The included property names. + /// The excluded property names. + /// The parent references. + /// The json serializer case. + /// + /// A that represents the current object. + /// + public static string Serialize( + object? obj, + bool format, + string? typeSpecifier, + bool includeNonPublic, + string[]? includedNames, + string[]? excludedNames, + List? parentReferences, + JsonSerializerCase jsonSerializerCase) + { + if (obj != null && (obj is string || Definitions.AllBasicValueTypes.Contains(obj.GetType()))) + { + return SerializePrimitiveValue(obj); + } + + var options = new SerializerOptions( + format, + typeSpecifier, + includedNames, + Serializer.GetExcludedNames(obj?.GetType(), excludedNames), + includeNonPublic, + parentReferences, + jsonSerializerCase); + + return Serializer.Serialize(obj, 0, options, excludedNames); + } + + /// + /// Serializes the specified object using the SerializerOptions provided. + /// + /// The object. + /// The options. + /// + /// A that represents the current object. + /// + public static string Serialize(object? obj, SerializerOptions options) => Serializer.Serialize(obj, 0, options); + + /// + /// Serializes the specified object only including the specified property names. + /// + /// The object. + /// if set to true it formats and indents the output. + /// The include names. + /// A that represents the current object. + /// + /// The following example shows how to serialize a simple object including the specified properties. + /// + /// using Swan.Formatters; + /// + /// class Example + /// { + /// static void Main() + /// { + /// // object to serialize + /// var obj = new { One = "One", Two = "Two", Three = "Three" }; + /// + /// // the included names + /// var includedNames = new[] { "Two", "Three" }; + /// + /// // serialize only the included names + /// var data = Json.SerializeOnly(basicObject, true, includedNames); + /// // {"Two": "Two","Three": "Three" } + /// } + /// } + /// + /// + public static string SerializeOnly(object? obj, bool format, params string[] includeNames) + => Serialize(obj, new SerializerOptions(format, null, includeNames)); + + /// + /// Serializes the specified object excluding the specified property names. + /// + /// The object. + /// if set to true it formats and indents the output. + /// The exclude names. + /// A that represents the current object. + /// + /// The following code shows how to serialize a simple object excluding the specified properties. + /// + /// using Swan.Formatters; + /// + /// class Example + /// { + /// static void Main() + /// { + /// // object to serialize + /// var obj = new { One = "One", Two = "Two", Three = "Three" }; + /// + /// // the excluded names + /// var excludeNames = new[] { "Two", "Three" }; + /// + /// // serialize excluding + /// var data = Json.SerializeExcluding(basicObject, false, includedNames); + /// // {"One": "One"} + /// } + /// } + /// + /// + public static string SerializeExcluding(object? obj, bool format, params string[] excludeNames) + => Serializer.Serialize(obj, 0, new SerializerOptions(format, null, null), excludeNames); + + /// + /// Deserializes the specified json string as either a Dictionary[string, object] or as a List[object] + /// depending on the syntax of the JSON string. + /// + /// The JSON string. + /// The json serializer case. + /// + /// Type of the current deserializes. + /// + /// + /// The following code shows how to deserialize a JSON string into a Dictionary. + /// + /// using Swan.Formatters; + /// class Example + /// { + /// static void Main() + /// { + /// // json to deserialize + /// var basicJson = "{\"One\":\"One\",\"Two\":\"Two\",\"Three\":\"Three\"}"; + /// // deserializes the specified json into a Dictionary<string, object>. + /// var data = Json.Deserialize(basicJson, JsonSerializerCase.None); + /// } + /// } + /// + public static object? Deserialize(string json, JsonSerializerCase jsonSerializerCase) => + json == null + ? throw new ArgumentNullException(nameof(json)) + : Converter.FromJsonResult(Deserializer.DeserializeInternal(json), jsonSerializerCase); + + /// + /// Deserializes the specified json string as either a Dictionary[string, object] or as a List[object] + /// depending on the syntax of the JSON string. + /// + /// The JSON string. + /// + /// Type of the current deserializes. + /// + /// + /// The following code shows how to deserialize a JSON string into a Dictionary. + /// + /// using Swan.Formatters; + /// class Example + /// { + /// static void Main() + /// { + /// // json to deserialize + /// var basicJson = "{\"One\":\"One\",\"Two\":\"Two\",\"Three\":\"Three\"}"; + /// // deserializes the specified json into a Dictionary<string, object>. + /// var data = Json.Deserialize(basicJson); + /// } + /// } + /// + public static object? Deserialize(string json) => + json == null + ? throw new ArgumentNullException(nameof(json)) + : Deserialize(json, JsonSerializerCase.None); + + /// + /// Deserializes the specified JSON string and converts it to the specified object type. + /// Non-public constructors and property setters are ignored. + /// + /// The type of object to deserialize. + /// The JSON string. + /// The JSON serializer case. + /// + /// The deserialized specified type object. + /// + /// + /// The following code describes how to deserialize a JSON string into an object of type T. + /// + /// using Swan.Formatters; + /// class Example + /// { + /// static void Main() + /// { + /// // json type BasicJson to serialize + /// var basicJson = "{\"One\":\"One\",\"Two\":\"Two\",\"Three\":\"Three\"}"; + /// // deserializes the specified string in a new instance of the type BasicJson. + /// var data = Json.Deserialize<BasicJson>(basicJson); + /// } + /// } + /// + public static T Deserialize(string json, JsonSerializerCase jsonSerializerCase = JsonSerializerCase.None) => + json == null + ? throw new ArgumentNullException(nameof(json)) + : (T)Deserialize(json, typeof(T), jsonSerializerCase: jsonSerializerCase); + + /// + /// Deserializes the specified JSON string and converts it to the specified object type. + /// + /// The type of object to deserialize. + /// The JSON string. + /// if set to true, it also uses the non-public constructors and property setters. + /// + /// The deserialized specified type object. + /// + public static T Deserialize(string json, bool includeNonPublic) => + json == null + ? throw new ArgumentNullException(nameof(json)) + : (T)Deserialize(json, typeof(T), includeNonPublic); + + /// + /// Deserializes the specified JSON string and converts it to the specified object type. + /// + /// The JSON string. + /// Type of the result. + /// if set to true, it also uses the non-public constructors and property setters. + /// The json serializer case. + /// + /// Type of the current conversion from json result. + /// + public static object? Deserialize(string json, Type resultType, bool includeNonPublic = false, JsonSerializerCase jsonSerializerCase = JsonSerializerCase.None) => + json == null + ? throw new ArgumentNullException(nameof(json)) + : Converter.FromJsonResult( + Deserializer.DeserializeInternal(json), + jsonSerializerCase, + resultType, + includeNonPublic); + + #endregion + + #region Private API + private static string SerializePrimitiveValue(object obj) => + obj switch + { + string stringValue => $"\"{stringValue}\"", + bool boolValue => boolValue ? TrueLiteral : FalseLiteral, + _ => obj.ToString() + }; + + #endregion + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Formatters/JsonPropertyAttribute.cs b/Vendor/Swan.Lite-3.1.0/Formatters/JsonPropertyAttribute.cs new file mode 100644 index 0000000..d05ac4d --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Formatters/JsonPropertyAttribute.cs @@ -0,0 +1,39 @@ +using System; + +namespace Swan.Formatters +{ + /// + /// An attribute used to help setup a property behavior when serialize/deserialize JSON. + /// + /// + [AttributeUsage(AttributeTargets.Property)] + public sealed class JsonPropertyAttribute : Attribute + { + /// + /// Initializes a new instance of the class. + /// + /// Name of the property. + /// if set to true [ignored]. + public JsonPropertyAttribute(string propertyName, bool ignored = false) + { + PropertyName = propertyName ?? throw new ArgumentNullException(nameof(propertyName)); + Ignored = ignored; + } + + /// + /// Gets or sets the name of the property. + /// + /// + /// The name of the property. + /// + public string PropertyName { get; } + + /// + /// Gets or sets a value indicating whether this is ignored. + /// + /// + /// true if ignored; otherwise, false. + /// + public bool Ignored { get; } + } +} \ No newline at end of file diff --git a/Vendor/Swan.Lite-3.1.0/Formatters/JsonSerializerCase.cs b/Vendor/Swan.Lite-3.1.0/Formatters/JsonSerializerCase.cs new file mode 100644 index 0000000..d525bd4 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Formatters/JsonSerializerCase.cs @@ -0,0 +1,23 @@ +namespace Swan.Formatters +{ + /// + /// Enumerates the JSON serializer cases to use: None (keeps the same case), PascalCase, or camelCase. + /// + public enum JsonSerializerCase + { + /// + /// The none + /// + None, + + /// + /// The pascal case (eg. PascalCase) + /// + PascalCase, + + /// + /// The camel case (eg. camelCase) + /// + CamelCase, + } +} diff --git a/Vendor/Swan.Lite-3.1.0/FromString.cs b/Vendor/Swan.Lite-3.1.0/FromString.cs new file mode 100644 index 0000000..b0de440 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/FromString.cs @@ -0,0 +1,347 @@ +using System; +using System.Collections.Concurrent; +using System.ComponentModel; +using System.Linq.Expressions; +using System.Reflection; + +namespace Swan +{ + /// + /// Provides a standard way to convert strings to different types. + /// + public static class FromString + { + // It doesn't matter which converter we get here: ConvertFromInvariantString is not virtual. + private static readonly MethodInfo ConvertFromInvariantStringMethod + = new Func(TypeDescriptor.GetConverter(typeof(int)).ConvertFromInvariantString).Method; + + private static readonly MethodInfo TryConvertToInternalMethod + = typeof(FromString).GetMethod(nameof(TryConvertToInternal), BindingFlags.Static | BindingFlags.NonPublic); + + private static readonly MethodInfo ConvertToInternalMethod + = typeof(FromString).GetMethod(nameof(ConvertToInternal), BindingFlags.Static | BindingFlags.NonPublic); + + private static readonly ConcurrentDictionary> GenericTryConvertToMethods + = new ConcurrentDictionary>(); + + private static readonly ConcurrentDictionary> GenericConvertToMethods + = new ConcurrentDictionary>(); + + /// + /// Determines whether a string can be converted to the specified type. + /// + /// The type resulting from the conversion. + /// if the conversion is possible; + /// otherwise, . + /// is . + public static bool CanConvertTo(Type type) + => TypeDescriptor.GetConverter(type).CanConvertFrom(typeof(string)); + + /// + /// Determines whether a string can be converted to the specified type. + /// + /// The type resulting from the conversion. + /// if the conversion is possible; + /// otherwise, . + public static bool CanConvertTo() + => TypeDescriptor.GetConverter(typeof(TResult)).CanConvertFrom(typeof(string)); + + /// + /// Attempts to convert a string to the specified type. + /// + /// The type resulting from the conversion. + /// The string to convert. + /// When this method returns , + /// the result of the conversion. This parameter is passed uninitialized. + /// if the conversion is successful; + /// otherwise, . + /// is . + public static bool TryConvertTo(Type type, string str, out object? result) + { + var converter = TypeDescriptor.GetConverter(type); + if (!converter.CanConvertFrom(typeof(string))) + { + result = null; + return false; + } + + try + { + result = converter.ConvertFromInvariantString(str); + return true; + } + catch (Exception e) when (!e.IsCriticalException()) + { + result = null; + return false; + } + } + + /// + /// Attempts to convert a string to the specified type. + /// + /// The type resulting from the conversion. + /// The string to convert. + /// When this method returns , + /// the result of the conversion. This parameter is passed uninitialized. + /// if the conversion is successful; + /// otherwise, . + public static bool TryConvertTo(string str, out TResult result) + { + var converter = TypeDescriptor.GetConverter(typeof(TResult)); + if (!converter.CanConvertFrom(typeof(string))) + { + result = default; + return false; + } + + try + { + result = (TResult)converter.ConvertFromInvariantString(str); + return true; + } + catch (Exception e) when (!e.IsCriticalException()) + { + result = default; + return false; + } + } + + /// + /// Converts a string to the specified type. + /// + /// The type resulting from the conversion. + /// The string to convert. + /// An instance of . + /// is . + /// The conversion was not successful. + public static object ConvertTo(Type type, string str) + { + if (type == null) + throw new ArgumentNullException(nameof(type)); + + try + { + return TypeDescriptor.GetConverter(type).ConvertFromInvariantString(str); + } + catch (Exception e) when (!e.IsCriticalException()) + { + throw new StringConversionException(type, e); + } + } + + /// + /// Converts a string to the specified type. + /// + /// The type resulting from the conversion. + /// The string to convert. + /// An instance of . + /// + /// The conversion was not successful. + /// + public static TResult ConvertTo(string str) + { + try + { + return (TResult)TypeDescriptor.GetConverter(typeof(TResult)).ConvertFromInvariantString(str); + } + catch (Exception e) when (!e.IsCriticalException()) + { + throw new StringConversionException(typeof(TResult), e); + } + } + + /// + /// Attempts to convert an array of strings to an array of the specified type. + /// + /// The type resulting from the conversion of each + /// element of . + /// The array to convert. + /// When this method returns , + /// the result of the conversion. This parameter is passed uninitialized. + /// if the conversion is successful; + /// otherwise, . + /// is . + public static bool TryConvertTo(Type type, string[] strings, out object? result) + { + if (strings == null) + { + result = null; + return false; + } + + var method = GenericTryConvertToMethods.GetOrAdd(type, BuildNonGenericTryConvertLambda); + var (success, methodResult) = method(strings); + result = methodResult; + return success; + } + + /// + /// Attempts to convert an array of strings to an array of the specified type. + /// + /// The type resulting from the conversion of each + /// element of . + /// The array to convert. + /// When this method returns , + /// the result of the conversion. This parameter is passed uninitialized. + /// if the conversion is successful; + /// otherwise, . + public static bool TryConvertTo(string[] strings, out TResult[]? result) + { + if (strings == null) + { + result = null; + return false; + } + + var converter = TypeDescriptor.GetConverter(typeof(TResult)); + if (!converter.CanConvertFrom(typeof(string))) + { + result = null; + return false; + } + + try + { + result = new TResult[strings.Length]; + var i = 0; + foreach (var str in strings) + result[i++] = (TResult)converter.ConvertFromInvariantString(str); + + return true; + } + catch (Exception e) when (!e.IsCriticalException()) + { + result = null; + return false; + } + } + + /// + /// Converts an array of strings to an array of the specified type. + /// + /// The type resulting from the conversion of each + /// element of . + /// The array to convert. + /// An array of . + /// is . + /// The conversion of at least one + /// of the elements of was not successful. + public static object? ConvertTo(Type type, string[] strings) + { + if (strings == null) + return null; + + var method = GenericConvertToMethods.GetOrAdd(type, BuildNonGenericConvertLambda); + return method(strings); + } + + /// + /// Converts an array of strings to an array of the specified type. + /// + /// The type resulting from the conversion of each + /// element of . + /// The array to convert. + /// An array of . + /// The conversion of at least one + /// of the elements of was not successful. + public static TResult[]? ConvertTo(string[] strings) + { + if (strings == null) + return null; + + var converter = TypeDescriptor.GetConverter(typeof(TResult)); + var result = new TResult[strings.Length]; + var i = 0; + try + { + foreach (var str in strings) + result[i++] = (TResult)converter.ConvertFromInvariantString(str); + } + catch (Exception e) when (!e.IsCriticalException()) + { + throw new StringConversionException(typeof(TResult), e); + } + + return result; + } + + /// + /// Converts a expression, if the type can be converted to string, to a new expression including + /// the conversion to string. + /// + /// The type. + /// The string. + /// A new expression where the previous expression is converted to string. + public static Expression? ConvertExpressionTo(Type type, Expression str) + { + var converter = TypeDescriptor.GetConverter(type); + + return converter.CanConvertFrom(typeof(string)) + ? Expression.Convert( + Expression.Call(Expression.Constant(converter), ConvertFromInvariantStringMethod, str), + type) + : null; + } + + private static Func BuildNonGenericTryConvertLambda(Type type) + { + var methodInfo = TryConvertToInternalMethod.MakeGenericMethod(type); + var parameter = Expression.Parameter(typeof(string[])); + var body = Expression.Call(methodInfo, parameter); + var lambda = Expression.Lambda>(body, parameter); + return lambda.Compile(); + } + + private static (bool Success, object? Result) TryConvertToInternal(string[] strings) + { + var converter = TypeDescriptor.GetConverter(typeof(TResult)); + if (!converter.CanConvertFrom(typeof(string))) + return (false, null); + + var result = new TResult[strings.Length]; + var i = 0; + + try + { + foreach (var str in strings) + result[i++] = (TResult)converter.ConvertFromInvariantString(str); + + return (true, result); + } + catch (Exception e) when (!e.IsCriticalException()) + { + return (false, null); + } + } + + private static Func BuildNonGenericConvertLambda(Type type) + { + var methodInfo = ConvertToInternalMethod.MakeGenericMethod(type); + var parameter = Expression.Parameter(typeof(string[])); + var body = Expression.Call(methodInfo, parameter); + var lambda = Expression.Lambda>(body, parameter); + + return lambda.Compile(); + } + + private static object ConvertToInternal(string[] strings) + { + var converter = TypeDescriptor.GetConverter(typeof(TResult)); + var result = new TResult[strings.Length]; + var i = 0; + + try + { + foreach (var str in strings) + result[i++] = (TResult)converter.ConvertFromInvariantString(str); + + return result; + } + catch (Exception e) when (!e.IsCriticalException()) + { + throw new StringConversionException(typeof(TResult), e); + } + } + } +} diff --git a/Vendor/Swan.Lite-3.1.0/InternalErrorException.cs b/Vendor/Swan.Lite-3.1.0/InternalErrorException.cs new file mode 100644 index 0000000..7884e7e --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/InternalErrorException.cs @@ -0,0 +1,46 @@ +using System; +using System.Runtime.Serialization; + +/* + * NOTE TO CONTRIBUTORS: + * + * Never use this exception directly. + * Use the methods in the SelfCheck class instead. + */ + +namespace Swan +{ +#pragma warning disable CA1032 // Add standard exception constructors. + /// + /// The exception that is thrown by methods of the class + /// to signal a condition most probably caused by an internal error in a library + /// or application. + /// Do not use this class directly; use the methods of the class instead. + /// + [Serializable] + public sealed class InternalErrorException : Exception + { +#pragma warning disable SA1642 // Constructor summary documentation should begin with standard text - the tag confuses the analyzer. + /// + /// Initializes a new instance of the class. + /// Do not call this constrcutor directly; use the methods of the class instead. + /// + /// The message that describes the error. +#pragma warning disable SA1642 + internal InternalErrorException(string message) + : base(message) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// The that holds the serialized object data about the exception being thrown. + /// The that contains contextual information about the source or destination. + private InternalErrorException(SerializationInfo info, StreamingContext context) + : base(info, context) + { + } + } +#pragma warning restore CA1032 +} \ No newline at end of file diff --git a/Vendor/Swan.Lite-3.1.0/Logging/ConsoleLogger.cs b/Vendor/Swan.Lite-3.1.0/Logging/ConsoleLogger.cs new file mode 100644 index 0000000..a74bca8 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Logging/ConsoleLogger.cs @@ -0,0 +1,145 @@ +using System; + +namespace Swan.Logging +{ + /// + /// Represents a Console implementation of ILogger. + /// + /// + public class ConsoleLogger : TextLogger, ILogger + { + /// + /// Initializes a new instance of the class. + /// + protected ConsoleLogger() + { + // Empty + } + + /// + /// Gets the current instance of ConsoleLogger. + /// + /// + /// The instance. + /// + public static ConsoleLogger Instance { get; } = new ConsoleLogger(); + + /// + /// Gets or sets the debug logging prefix. + /// + /// + /// The debug prefix. + /// + public static string DebugPrefix { get; set; } = "DBG"; + + /// + /// Gets or sets the trace logging prefix. + /// + /// + /// The trace prefix. + /// + public static string TracePrefix { get; set; } = "TRC"; + + /// + /// Gets or sets the warning logging prefix. + /// + /// + /// The warn prefix. + /// + public static string WarnPrefix { get; set; } = "WRN"; + + /// + /// Gets or sets the fatal logging prefix. + /// + /// + /// The fatal prefix. + /// + public static string FatalPrefix { get; set; } = "FAT"; + + /// + /// Gets or sets the error logging prefix. + /// + /// + /// The error prefix. + /// + public static string ErrorPrefix { get; set; } = "ERR"; + + /// + /// Gets or sets the information logging prefix. + /// + /// + /// The information prefix. + /// + public static string InfoPrefix { get; set; } = "INF"; + + /// + /// Gets or sets the color of the information output logging. + /// + /// + /// The color of the information. + /// + public static ConsoleColor InfoColor { get; set; } = ConsoleColor.Cyan; + + /// + /// Gets or sets the color of the debug output logging. + /// + /// + /// The color of the debug. + /// + public static ConsoleColor DebugColor { get; set; } = ConsoleColor.Gray; + + /// + /// Gets or sets the color of the trace output logging. + /// + /// + /// The color of the trace. + /// + public static ConsoleColor TraceColor { get; set; } = ConsoleColor.DarkGray; + + /// + /// Gets or sets the color of the warning logging. + /// + /// + /// The color of the warn. + /// + public static ConsoleColor WarnColor { get; set; } = ConsoleColor.Yellow; + + /// + /// Gets or sets the color of the error logging. + /// + /// + /// The color of the error. + /// + public static ConsoleColor ErrorColor { get; set; } = ConsoleColor.DarkRed; + + /// + /// Gets or sets the color of the error logging. + /// + /// + /// The color of the error. + /// + public static ConsoleColor FatalColor { get; set; } = ConsoleColor.Red; + + /// + public LogLevel LogLevel { get; set; } = DebugLogger.IsDebuggerAttached ? LogLevel.Trace : LogLevel.Info; + + /// + public void Log(LogMessageReceivedEventArgs logEvent) + { + // Select the writer based on the message type + var writer = logEvent.MessageType == LogLevel.Error + ? TerminalWriters.StandardError + : TerminalWriters.StandardOutput; + + var (outputMessage, color) = GetOutputAndColor(logEvent); + + Terminal.Write(outputMessage, color, writer); + } + + /// + public void Dispose() + { + // Do nothing + } + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Logging/DebugLogger.cs b/Vendor/Swan.Lite-3.1.0/Logging/DebugLogger.cs new file mode 100644 index 0000000..a71e615 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Logging/DebugLogger.cs @@ -0,0 +1,51 @@ +namespace Swan.Logging +{ + /// + /// Represents a logger target. This target will write to the + /// Debug console using System.Diagnostics.Debug. + /// + /// + public class DebugLogger : TextLogger, ILogger + { + /// + /// Initializes a new instance of the class. + /// + protected DebugLogger() + { + // Empty + } + + /// + /// Gets the current instance of DebugLogger. + /// + /// + /// The instance. + /// + public static DebugLogger Instance { get; } = new DebugLogger(); + + /// + /// Gets a value indicating whether a debugger is attached. + /// + /// + /// true if this instance is debugger attached; otherwise, false. + /// + public static bool IsDebuggerAttached => System.Diagnostics.Debugger.IsAttached; + + /// + public LogLevel LogLevel { get; set; } = IsDebuggerAttached ? LogLevel.Trace : LogLevel.None; + + /// + public void Log(LogMessageReceivedEventArgs logEvent) + { + var (outputMessage, _) = GetOutputAndColor(logEvent); + + System.Diagnostics.Debug.Write(outputMessage); + } + + /// + public void Dispose() + { + // do nothing + } + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Logging/FileLogger.cs b/Vendor/Swan.Lite-3.1.0/Logging/FileLogger.cs new file mode 100644 index 0000000..eeacb63 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Logging/FileLogger.cs @@ -0,0 +1,131 @@ +using System; +using System.Collections.Concurrent; +using System.IO; +using System.Threading; +using System.Threading.Tasks; +using Swan.Threading; + +namespace Swan.Logging +{ + /// + /// A helper class to write into files the messages sent by the . + /// + /// + public class FileLogger : TextLogger, ILogger + { + private readonly ManualResetEventSlim _doneEvent = new ManualResetEventSlim(true); + private readonly ConcurrentQueue _logQueue = new ConcurrentQueue(); + private readonly ExclusiveTimer _timer; + private readonly string _filePath; + + private bool _disposedValue; // To detect redundant calls + + /// + /// Initializes a new instance of the class. + /// + public FileLogger() + : this(SwanRuntime.EntryAssemblyDirectory, true) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// The filePath. + /// if set to true [daily file]. + public FileLogger(string filePath, bool dailyFile) + { + _filePath = filePath; + DailyFile = dailyFile; + + _timer = new ExclusiveTimer( + async () => await WriteLogEntries().ConfigureAwait(false), + TimeSpan.Zero, + TimeSpan.FromSeconds(5)); + } + + /// + public LogLevel LogLevel { get; set; } + + /// + /// Gets the file path. + /// + /// + /// The file path. + /// + public string FilePath => DailyFile + ? Path.Combine(Path.GetDirectoryName(_filePath), Path.GetFileNameWithoutExtension(_filePath) + $"_{DateTime.UtcNow:yyyyMMdd}" + Path.GetExtension(_filePath)) + : _filePath; + + /// + /// Gets a value indicating whether [daily file]. + /// + /// + /// true if [daily file]; otherwise, false. + /// + public bool DailyFile { get; } + + /// + public void Log(LogMessageReceivedEventArgs logEvent) + { + var (outputMessage, _) = GetOutputAndColor(logEvent); + + _logQueue.Enqueue(outputMessage); + } + + /// + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + /// + /// Releases unmanaged and - optionally - managed resources. + /// + /// true to release both managed and unmanaged resources; false to release only unmanaged resources. + protected virtual void Dispose(bool disposing) + { + if (_disposedValue) return; + + if (disposing) + { + _timer.Pause(); + _timer.Dispose(); + + _doneEvent.Wait(); + _doneEvent.Reset(); + WriteLogEntries(true).Await(); + _doneEvent.Dispose(); + } + + _disposedValue = true; + } + + private async Task WriteLogEntries(bool finalCall = false) + { + if (_logQueue.IsEmpty) + return; + + if (!finalCall && !_doneEvent.IsSet) + return; + + _doneEvent.Reset(); + + try + { + using var file = File.AppendText(FilePath); + while (!_logQueue.IsEmpty) + { + if (_logQueue.TryDequeue(out var entry)) + await file.WriteAsync(entry).ConfigureAwait(false); + } + } + finally + { + if (!finalCall) + _doneEvent.Set(); + } + } + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Logging/ILogger.cs b/Vendor/Swan.Lite-3.1.0/Logging/ILogger.cs new file mode 100644 index 0000000..4dbf6ca --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Logging/ILogger.cs @@ -0,0 +1,24 @@ +namespace Swan.Logging +{ + using System; + + /// + /// Interface for a logger implementation. + /// + public interface ILogger : IDisposable + { + /// + /// Gets the log level. + /// + /// + /// The log level. + /// + LogLevel LogLevel { get; } + + /// + /// Logs the specified log event. + /// + /// The instance containing the event data. + void Log(LogMessageReceivedEventArgs logEvent); + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Logging/LogLevel.cs b/Vendor/Swan.Lite-3.1.0/Logging/LogLevel.cs new file mode 100644 index 0000000..b3d15a8 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Logging/LogLevel.cs @@ -0,0 +1,43 @@ +namespace Swan.Logging +{ + /// + /// Defines the log levels. + /// + public enum LogLevel + { + /// + /// The none message type + /// + None, + + /// + /// The trace message type + /// + Trace, + + /// + /// The debug message type + /// + Debug, + + /// + /// The information message type + /// + Info, + + /// + /// The warning message type + /// + Warning, + + /// + /// The error message type + /// + Error, + + /// + /// The fatal message type + /// + Fatal, + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Logging/LogMessageReceivedEventArgs.cs b/Vendor/Swan.Lite-3.1.0/Logging/LogMessageReceivedEventArgs.cs new file mode 100644 index 0000000..14e01cb --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Logging/LogMessageReceivedEventArgs.cs @@ -0,0 +1,131 @@ +using System; + +namespace Swan.Logging +{ + /// + /// Event arguments representing the message that is logged + /// on to the terminal. Use the properties to forward the data to + /// your logger of choice. + /// + /// + public class LogMessageReceivedEventArgs : EventArgs + { + /// + /// Initializes a new instance of the class. + /// + /// The sequence. + /// Type of the message. + /// The UTC date. + /// The source. + /// The message. + /// The extended data. + /// Name of the caller member. + /// The caller file path. + /// The caller line number. + public LogMessageReceivedEventArgs( + ulong sequence, + LogLevel messageType, + DateTime utcDate, + string? source, + string message, + object? extendedData, + string callerMemberName, + string callerFilePath, + int callerLineNumber) + { + Sequence = sequence; + MessageType = messageType; + UtcDate = utcDate; + Source = source; + Message = message; + CallerMemberName = callerMemberName; + CallerFilePath = callerFilePath; + CallerLineNumber = callerLineNumber; + ExtendedData = extendedData; + } + + /// + /// Gets logging message sequence. + /// + /// + /// The sequence. + /// + public ulong Sequence { get; } + + /// + /// Gets the type of the message. + /// It can be a combination as the enumeration is a set of bitwise flags. + /// + /// + /// The type of the message. + /// + public LogLevel MessageType { get; } + + /// + /// Gets the UTC date at which the event at which the message was logged. + /// + /// + /// The UTC date. + /// + public DateTime UtcDate { get; } + + /// + /// Gets the name of the source where the logging message + /// came from. This can come empty if the logger did not set it. + /// + /// + /// The source. + /// + public string? Source { get; } + + /// + /// Gets the body of the message. + /// + /// + /// The message. + /// + public string Message { get; } + + /// + /// Gets the name of the caller member. + /// + /// + /// The name of the caller member. + /// + public string CallerMemberName { get; } + + /// + /// Gets the caller file path. + /// + /// + /// The caller file path. + /// + public string CallerFilePath { get; } + + /// + /// Gets the caller line number. + /// + /// + /// The caller line number. + /// + public int CallerLineNumber { get; } + + /// + /// Gets an object representing extended data. + /// It could be an exception or anything else. + /// + /// + /// The extended data. + /// + public object? ExtendedData { get; } + + /// + /// Gets the Extended Data properties cast as an Exception (if possible) + /// Otherwise, it return null. + /// + /// + /// The exception. + /// + public Exception? Exception => ExtendedData as Exception; + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Logging/Logger.cs b/Vendor/Swan.Lite-3.1.0/Logging/Logger.cs new file mode 100644 index 0000000..1ab0503 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Logging/Logger.cs @@ -0,0 +1,664 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Threading.Tasks; + +namespace Swan.Logging +{ + /// + /// Entry-point for logging. Use this static class to register/unregister + /// loggers instances. By default, the ConsoleLogger is registered. + /// + public static class Logger + { + private static readonly object SyncLock = new object(); + private static readonly List Loggers = new List(); + + private static ulong _loggingSequence; + + static Logger() + { + if (Terminal.IsConsolePresent) + Loggers.Add(ConsoleLogger.Instance); + + if (DebugLogger.IsDebuggerAttached) + Loggers.Add(DebugLogger.Instance); + } + + #region Standard Public API + + /// + /// Registers the logger. + /// + /// The type of logger to register. + /// There is already a logger with that class registered. + public static void RegisterLogger() + where T : ILogger + { + lock (SyncLock) + { + var loggerInstance = Loggers.FirstOrDefault(x => x.GetType() == typeof(T)); + + if (loggerInstance != null) + throw new InvalidOperationException("There is already a logger with that class registered."); + + Loggers.Add(Activator.CreateInstance()); + } + } + + /// + /// Registers the logger. + /// + /// The logger. + public static void RegisterLogger(ILogger logger) + { + lock (SyncLock) + Loggers.Add(logger); + } + + /// + /// Unregisters the logger. + /// + /// The logger. + /// logger. + public static void UnregisterLogger(ILogger logger) => RemoveLogger(x => x == logger); + + /// + /// Unregisters the logger. + /// + /// The type of logger to unregister. + public static void UnregisterLogger() => RemoveLogger(x => x.GetType() == typeof(T)); + + /// + /// Remove all the loggers. + /// + public static void NoLogging() + { + lock (SyncLock) + Loggers.Clear(); + } + + #region Debug + + /// + /// Logs a debug message to the console. + /// + /// The message. + /// The source. + /// The extended data. + /// Name of the caller member. This is automatically populated. + /// The caller file path. This is automatically populated. + /// The caller line number. This is automatically populated. + public static void Debug( + this string message, + string? source = null, + object? extendedData = null, + [CallerMemberName] string callerMemberName = "", + [CallerFilePath] string callerFilePath = "", + [CallerLineNumber] int callerLineNumber = 0) + { + LogMessage(LogLevel.Debug, message, source, extendedData, callerMemberName, callerFilePath, callerLineNumber); + } + + /// + /// Logs a debug message to the console. + /// + /// The message. + /// The source. + /// The extended data. + /// Name of the caller member. + /// The caller file path. + /// The caller line number. + public static void Debug( + this string message, + Type source, + object? extendedData = null, + [CallerMemberName] string callerMemberName = "", + [CallerFilePath] string callerFilePath = "", + [CallerLineNumber] int callerLineNumber = 0) + { + LogMessage(LogLevel.Debug, message, source?.FullName, extendedData, callerMemberName, callerFilePath, callerLineNumber); + } + + /// + /// Logs a debug message to the console. + /// + /// The exception. + /// The source. + /// The message. + /// Name of the caller member. This is automatically populated. + /// The caller file path. This is automatically populated. + /// The caller line number. This is automatically populated. + public static void Debug( + this Exception extendedData, + string source, + string message, + [CallerMemberName] string callerMemberName = "", + [CallerFilePath] string callerFilePath = "", + [CallerLineNumber] int callerLineNumber = 0) + { + LogMessage(LogLevel.Debug, message, source, extendedData, callerMemberName, callerFilePath, callerLineNumber); + } + + #endregion + + #region Trace + + /// + /// Logs a trace message to the console. + /// + /// The text. + /// The source. + /// The extended data. + /// Name of the caller member. This is automatically populated. + /// The caller file path. This is automatically populated. + /// The caller line number. This is automatically populated. + public static void Trace( + this string message, + string? source = null, + object? extendedData = null, + [CallerMemberName] string callerMemberName = "", + [CallerFilePath] string callerFilePath = "", + [CallerLineNumber] int callerLineNumber = 0) + { + LogMessage(LogLevel.Trace, message, source, extendedData, callerMemberName, callerFilePath, callerLineNumber); + } + + /// + /// Logs a trace message to the console. + /// + /// The message. + /// The source. + /// The extended data. + /// Name of the caller member. + /// The caller file path. + /// The caller line number. + public static void Trace( + this string message, + Type source, + object? extendedData = null, + [CallerMemberName] string callerMemberName = "", + [CallerFilePath] string callerFilePath = "", + [CallerLineNumber] int callerLineNumber = 0) + { + LogMessage(LogLevel.Trace, message, source?.FullName, extendedData, callerMemberName, callerFilePath, callerLineNumber); + } + + /// + /// Logs a trace message to the console. + /// + /// The extended data. + /// The source. + /// The message. + /// Name of the caller member. This is automatically populated. + /// The caller file path. This is automatically populated. + /// The caller line number. This is automatically populated. + public static void Trace( + this Exception extendedData, + string source, + string message, + [CallerMemberName] string callerMemberName = "", + [CallerFilePath] string callerFilePath = "", + [CallerLineNumber] int callerLineNumber = 0) + { + LogMessage(LogLevel.Trace, message, source, extendedData, callerMemberName, callerFilePath, callerLineNumber); + } + + #endregion + + #region Warn + + /// + /// Logs a warning message to the console. + /// + /// The text. + /// The source. + /// The extended data. + /// Name of the caller member. This is automatically populated. + /// The caller file path. This is automatically populated. + /// The caller line number. This is automatically populated. + public static void Warn( + this string message, + string? source = null, + object? extendedData = null, + [CallerMemberName] string callerMemberName = "", + [CallerFilePath] string callerFilePath = "", + [CallerLineNumber] int callerLineNumber = 0) + { + LogMessage(LogLevel.Warning, message, source, extendedData, callerMemberName, callerFilePath, callerLineNumber); + } + + /// + /// Logs a warning message to the console. + /// + /// The message. + /// The source. + /// The extended data. + /// Name of the caller member. + /// The caller file path. + /// The caller line number. + public static void Warn( + this string message, + Type source, + object? extendedData = null, + [CallerMemberName] string callerMemberName = "", + [CallerFilePath] string callerFilePath = "", + [CallerLineNumber] int callerLineNumber = 0) + { + LogMessage(LogLevel.Warning, message, source?.FullName, extendedData, callerMemberName, callerFilePath, callerLineNumber); + } + + /// + /// Logs a warning message to the console. + /// + /// The extended data. + /// The source. + /// The message. + /// Name of the caller member. This is automatically populated. + /// The caller file path. This is automatically populated. + /// The caller line number. This is automatically populated. + public static void Warn( + this Exception extendedData, + string source, + string message, + [CallerMemberName] string callerMemberName = "", + [CallerFilePath] string callerFilePath = "", + [CallerLineNumber] int callerLineNumber = 0) + { + LogMessage(LogLevel.Warning, message, source, extendedData, callerMemberName, callerFilePath, callerLineNumber); + } + + #endregion + + #region Fatal + + /// + /// Logs a warning message to the console. + /// + /// The text. + /// The source. + /// The extended data. + /// Name of the caller member. This is automatically populated. + /// The caller file path. This is automatically populated. + /// The caller line number. This is automatically populated. + public static void Fatal( + this string message, + string? source = null, + object? extendedData = null, + [CallerMemberName] string callerMemberName = "", + [CallerFilePath] string callerFilePath = "", + [CallerLineNumber] int callerLineNumber = 0) + { + LogMessage(LogLevel.Fatal, message, source, extendedData, callerMemberName, callerFilePath, callerLineNumber); + } + + /// + /// Logs a warning message to the console. + /// + /// The message. + /// The source. + /// The extended data. + /// Name of the caller member. + /// The caller file path. + /// The caller line number. + public static void Fatal( + this string message, + Type source, + object? extendedData = null, + [CallerMemberName] string callerMemberName = "", + [CallerFilePath] string callerFilePath = "", + [CallerLineNumber] int callerLineNumber = 0) + { + LogMessage(LogLevel.Fatal, message, source?.FullName, extendedData, callerMemberName, callerFilePath, callerLineNumber); + } + + /// + /// Logs a warning message to the console. + /// + /// The extended data. + /// The source. + /// The message. + /// Name of the caller member. This is automatically populated. + /// The caller file path. This is automatically populated. + /// The caller line number. This is automatically populated. + public static void Fatal( + this Exception extendedData, + string source, + string message, + [CallerMemberName] string callerMemberName = "", + [CallerFilePath] string callerFilePath = "", + [CallerLineNumber] int callerLineNumber = 0) + { + LogMessage(LogLevel.Fatal, message, source, extendedData, callerMemberName, callerFilePath, callerLineNumber); + } + + #endregion + + #region Info + + /// + /// Logs an info message to the console. + /// + /// The text. + /// The source. + /// The extended data. + /// Name of the caller member. This is automatically populated. + /// The caller file path. This is automatically populated. + /// The caller line number. This is automatically populated. + public static void Info( + this string message, + string? source = null, + object? extendedData = null, + [CallerMemberName] string callerMemberName = "", + [CallerFilePath] string callerFilePath = "", + [CallerLineNumber] int callerLineNumber = 0) + { + LogMessage(LogLevel.Info, message, source, extendedData, callerMemberName, callerFilePath, callerLineNumber); + } + + /// + /// Logs an info message to the console. + /// + /// The message. + /// The source. + /// The extended data. + /// Name of the caller member. + /// The caller file path. + /// The caller line number. + public static void Info( + this string message, + Type source, + object? extendedData = null, + [CallerMemberName] string callerMemberName = "", + [CallerFilePath] string callerFilePath = "", + [CallerLineNumber] int callerLineNumber = 0) + { + LogMessage(LogLevel.Info, message, source?.FullName, extendedData, callerMemberName, callerFilePath, callerLineNumber); + } + + /// + /// Logs an info message to the console. + /// + /// The extended data. + /// The source. + /// The message. + /// Name of the caller member. This is automatically populated. + /// The caller file path. This is automatically populated. + /// The caller line number. This is automatically populated. + public static void Info( + this Exception extendedData, + string source, + string message, + [CallerMemberName] string callerMemberName = "", + [CallerFilePath] string callerFilePath = "", + [CallerLineNumber] int callerLineNumber = 0) + { + LogMessage(LogLevel.Info, message, source, extendedData, callerMemberName, callerFilePath, callerLineNumber); + } + + #endregion + + #region Error + + /// + /// Logs an error message to the console's standard error. + /// + /// The text. + /// The source. + /// The extended data. + /// Name of the caller member. This is automatically populated. + /// The caller file path. This is automatically populated. + /// The caller line number. This is automatically populated. + public static void Error( + this string message, + string? source = null, + object? extendedData = null, + [CallerMemberName] string callerMemberName = "", + [CallerFilePath] string callerFilePath = "", + [CallerLineNumber] int callerLineNumber = 0) + { + LogMessage(LogLevel.Error, message, source, extendedData, callerMemberName, callerFilePath, callerLineNumber); + } + + /// + /// Logs an error message to the console's standard error. + /// + /// The message. + /// The source. + /// The extended data. + /// Name of the caller member. + /// The caller file path. + /// The caller line number. + public static void Error( + this string message, + Type source, + object? extendedData = null, + [CallerMemberName] string callerMemberName = "", + [CallerFilePath] string callerFilePath = "", + [CallerLineNumber] int callerLineNumber = 0) + { + LogMessage(LogLevel.Error, message, source?.FullName, extendedData, callerMemberName, callerFilePath, callerLineNumber); + } + + /// + /// Logs an error message to the console's standard error. + /// + /// The exception. + /// The source. + /// The message. + /// Name of the caller member. This is automatically populated. + /// The caller file path. This is automatically populated. + /// The caller line number. This is automatically populated. + public static void Error( + this Exception ex, + string source, + string message, + [CallerMemberName] string callerMemberName = "", + [CallerFilePath] string callerFilePath = "", + [CallerLineNumber] int callerLineNumber = 0) + { + LogMessage(LogLevel.Error, message, source, ex, callerMemberName, callerFilePath, callerLineNumber); + } + + #endregion + + #endregion + + #region Extended Public API + + /// + /// Logs the specified message. + /// + /// The message. + /// The source. + /// Type of the message. + /// The extended data. + /// Name of the caller member. This is automatically populated. + /// The caller file path. This is automatically populated. + /// The caller line number. This is automatically populated. + public static void Log( + this string message, + string source, + LogLevel messageType, + object? extendedData = null, + [CallerMemberName] string callerMemberName = "", + [CallerFilePath] string callerFilePath = "", + [CallerLineNumber] int callerLineNumber = 0) + { + LogMessage(messageType, message, source, extendedData, callerMemberName, callerFilePath, callerLineNumber); + } + + /// + /// Logs the specified message. + /// + /// The message. + /// The source. + /// Type of the message. + /// The extended data. + /// Name of the caller member. + /// The caller file path. + /// The caller line number. + public static void Log( + this string message, + Type source, + LogLevel messageType, + object? extendedData = null, + [CallerMemberName] string callerMemberName = "", + [CallerFilePath] string callerFilePath = "", + [CallerLineNumber] int callerLineNumber = 0) + { + LogMessage(messageType, message, source?.FullName, extendedData, callerMemberName, callerFilePath, callerLineNumber); + } + + /// + /// Logs an error message to the console's standard error. + /// + /// The ex. + /// The source. + /// The message. + /// Name of the caller member. This is automatically populated. + /// The caller file path. This is automatically populated. + /// The caller line number. This is automatically populated. + public static void Log( + this Exception ex, + string? source = null, + string? message = null, + [CallerMemberName] string callerMemberName = "", + [CallerFilePath] string callerFilePath = "", + [CallerLineNumber] int callerLineNumber = 0) + { + if (ex is null) + return; + + LogMessage(LogLevel.Error, message ?? ex.Message, source ?? ex.Source, ex, callerMemberName, callerFilePath, callerLineNumber); + } + + /// + /// Logs an error message to the console's standard error. + /// + /// The ex. + /// The source. + /// The message. + /// Name of the caller member. This is automatically populated. + /// The caller file path. This is automatically populated. + /// The caller line number. This is automatically populated. + public static void Log( + this Exception ex, + Type? source = null, + string? message = null, + [CallerMemberName] string callerMemberName = "", + [CallerFilePath] string callerFilePath = "", + [CallerLineNumber] int callerLineNumber = 0) + { + if (ex is null) + return; + + LogMessage(LogLevel.Error, message ?? ex.Message, source?.FullName ?? ex.Source, ex, callerMemberName, callerFilePath, callerLineNumber); + } + + /// + /// Logs a trace message showing all possible non-null properties of the given object + /// This method is expensive as it uses Stringify internally. + /// + /// The object. + /// The source. + /// The title. + /// Name of the caller member. This is automatically populated. + /// The caller file path. This is automatically populated. + /// The caller line number. This is automatically populated. + public static void Dump( + this object? obj, + string source, + string text = "Object Dump", + [CallerMemberName] string callerMemberName = "", + [CallerFilePath] string callerFilePath = "", + [CallerLineNumber] int callerLineNumber = 0) + { + if (obj == null) + return; + + var message = $"{text} ({obj.GetType()}): {Environment.NewLine}{obj.Stringify().Indent(5)}"; + LogMessage(LogLevel.Trace, message, source, obj, callerMemberName, callerFilePath, callerLineNumber); + } + + /// + /// Logs a trace message showing all possible non-null properties of the given object + /// This method is expensive as it uses Stringify internally. + /// + /// The object. + /// The source. + /// The text. + /// Name of the caller member. + /// The caller file path. + /// The caller line number. + public static void Dump( + this object? obj, + Type source, + string text = "Object Dump", + [CallerMemberName] string callerMemberName = "", + [CallerFilePath] string callerFilePath = "", + [CallerLineNumber] int callerLineNumber = 0) + { + if (obj == null) + return; + + var message = $"{text} ({obj.GetType()}): {Environment.NewLine}{obj.Stringify().Indent(5)}"; + LogMessage(LogLevel.Trace, message, source?.FullName, obj, callerMemberName, callerFilePath, callerLineNumber); + } + + #endregion + + private static void RemoveLogger(Func criteria) + { + lock (SyncLock) + { + var loggerInstance = Loggers.FirstOrDefault(criteria); + + if (loggerInstance == null) + throw new InvalidOperationException("The logger is not registered."); + + loggerInstance.Dispose(); + + Loggers.Remove(loggerInstance); + } + } + + private static void LogMessage( + LogLevel logLevel, + string message, + string? sourceName, + object? extendedData, + string callerMemberName, + string callerFilePath, + int callerLineNumber) + { + var sequence = _loggingSequence; + var date = DateTime.UtcNow; + _loggingSequence++; + + var loggerMessage = string.IsNullOrWhiteSpace(message) ? + string.Empty : message.RemoveControlChars('\n'); + + var eventArgs = new LogMessageReceivedEventArgs( + sequence, + logLevel, + date, + sourceName, + loggerMessage, + extendedData, + callerMemberName, + callerFilePath, + callerLineNumber); + + foreach (var logger in Loggers) + { + Task.Run(() => + { + if (logger.LogLevel <= logLevel) + logger.Log(eventArgs); + }); + } + } + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Logging/TextLogger.cs b/Vendor/Swan.Lite-3.1.0/Logging/TextLogger.cs new file mode 100644 index 0000000..9d63efb --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Logging/TextLogger.cs @@ -0,0 +1,79 @@ +using System; + +namespace Swan.Logging +{ + /// + /// Use this class for text-based logger. + /// + public abstract class TextLogger + { + /// + /// Gets or sets the logging time format. + /// set to null or empty to prevent output. + /// + /// + /// The logging time format. + /// + public static string LoggingTimeFormat { get; set; } = "HH:mm:ss.fff"; + + /// + /// Gets the color of the output of the message (the output message has a new line char in the end). + /// + /// The instance containing the event data. + /// + /// The output message formatted and the color of the console to be used. + /// + protected (string outputMessage, ConsoleColor color) GetOutputAndColor(LogMessageReceivedEventArgs logEvent) + { + var (prefix , color) = GetConsoleColorAndPrefix(logEvent.MessageType); + + var loggerMessage = string.IsNullOrWhiteSpace(logEvent.Message) + ? string.Empty + : logEvent.Message.RemoveControlChars('\n'); + + var outputMessage = CreateOutputMessage(logEvent.Source, loggerMessage, prefix, logEvent.UtcDate); + + // Further format the output in the case there is an exception being logged + if (logEvent.MessageType == LogLevel.Error && logEvent.Exception != null) + { + try + { + outputMessage += $"{logEvent.Exception.Stringify().Indent()}{Environment.NewLine}"; + } + catch + { + // Ignore + } + } + + return (outputMessage, color); + } + + private static (string Prefix, ConsoleColor color) GetConsoleColorAndPrefix(LogLevel messageType) => + messageType switch + { + LogLevel.Debug => (ConsoleLogger.DebugPrefix, ConsoleLogger.DebugColor), + LogLevel.Error => (ConsoleLogger.ErrorPrefix, ConsoleLogger.ErrorColor), + LogLevel.Info => (ConsoleLogger.InfoPrefix, ConsoleLogger.InfoColor), + LogLevel.Trace => (ConsoleLogger.TracePrefix, ConsoleLogger.TraceColor), + LogLevel.Warning => (ConsoleLogger.WarnPrefix, ConsoleLogger.WarnColor), + LogLevel.Fatal => (ConsoleLogger.FatalPrefix, ConsoleLogger.FatalColor), + _ => (new string(' ', ConsoleLogger.InfoPrefix.Length), Terminal.Settings.DefaultColor) + }; + + private static string CreateOutputMessage(string sourceName, string loggerMessage, string prefix, DateTime date) + { + var friendlySourceName = string.IsNullOrWhiteSpace(sourceName) + ? string.Empty + : sourceName.SliceLength(sourceName.LastIndexOf('.') + 1, sourceName.Length); + + var outputMessage = string.IsNullOrWhiteSpace(sourceName) + ? loggerMessage + : $"[{friendlySourceName}] {loggerMessage}"; + + return string.IsNullOrWhiteSpace(LoggingTimeFormat) + ? $" {prefix} >> {outputMessage}{Environment.NewLine}" + : $" {date.ToLocalTime().ToString(LoggingTimeFormat)} {prefix} >> {outputMessage}{Environment.NewLine}"; + } + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Mappers/CopyableAttribute.cs b/Vendor/Swan.Lite-3.1.0/Mappers/CopyableAttribute.cs new file mode 100644 index 0000000..4f04954 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Mappers/CopyableAttribute.cs @@ -0,0 +1,13 @@ +using System; + +namespace Swan.Mappers +{ + /// + /// Represents an attribute to select which properties are copyable between objects. + /// + /// + [AttributeUsage(AttributeTargets.Property)] + public class CopyableAttribute : Attribute + { + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Mappers/IObjectMap.cs b/Vendor/Swan.Lite-3.1.0/Mappers/IObjectMap.cs new file mode 100644 index 0000000..77a3c1b --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Mappers/IObjectMap.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Reflection; + +namespace Swan.Mappers +{ + /// + /// Interface object map. + /// + public interface IObjectMap + { + /// + /// Gets or sets the map. + /// + Dictionary> Map { get; } + + /// + /// Gets or sets the type of the source. + /// + Type SourceType { get; } + + /// + /// Gets or sets the type of the destination. + /// + Type DestinationType { get; } + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Mappers/ObjectMap.cs b/Vendor/Swan.Lite-3.1.0/Mappers/ObjectMap.cs new file mode 100644 index 0000000..1774023 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Mappers/ObjectMap.cs @@ -0,0 +1,120 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Reflection; + +namespace Swan.Mappers +{ + /// + /// Represents an object map. + /// + /// The type of the source. + /// The type of the destination. + /// + public class ObjectMap : IObjectMap + { + internal ObjectMap(IEnumerable intersect) + { + SourceType = typeof(TSource); + DestinationType = typeof(TDestination); + Map = intersect.ToDictionary( + property => DestinationType.GetProperty(property.Name), + property => new List {SourceType.GetProperty(property.Name)}); + } + + /// + public Dictionary> Map { get; } + + /// + public Type SourceType { get; } + + /// + public Type DestinationType { get; } + + /// + /// Maps the property. + /// + /// The type of the destination property. + /// The type of the source property. + /// The destination property. + /// The source property. + /// + /// An object map representation of type of the destination property + /// and type of the source property. + /// + public ObjectMap MapProperty + ( + Expression> destinationProperty, + Expression> sourceProperty) + { + if (destinationProperty == null) + throw new ArgumentNullException(nameof(destinationProperty)); + + var propertyDestinationInfo = (destinationProperty.Body as MemberExpression)?.Member as PropertyInfo; + + if (propertyDestinationInfo == null) + throw new ArgumentException("Invalid destination expression", nameof(destinationProperty)); + + var sourceMembers = GetSourceMembers(sourceProperty); + + if (!sourceMembers.Any()) + throw new ArgumentException("Invalid source expression", nameof(sourceProperty)); + + // reverse order + sourceMembers.Reverse(); + Map[propertyDestinationInfo] = sourceMembers; + + return this; + } + + /// + /// Removes the map property. + /// + /// The type of the destination property. + /// The destination property. + /// + /// An object map representation of type of the destination property + /// and type of the source property. + /// + /// Invalid destination expression. + public ObjectMap RemoveMapProperty( + Expression> destinationProperty) + { + if (destinationProperty == null) + throw new ArgumentNullException(nameof(destinationProperty)); + + var propertyDestinationInfo = (destinationProperty.Body as MemberExpression)?.Member as PropertyInfo; + + if (propertyDestinationInfo == null) + throw new ArgumentException("Invalid destination expression", nameof(destinationProperty)); + + if (Map.ContainsKey(propertyDestinationInfo)) + { + Map.Remove(propertyDestinationInfo); + } + + return this; + } + + private static List GetSourceMembers(Expression> sourceProperty) + { + if (sourceProperty == null) + throw new ArgumentNullException(nameof(sourceProperty)); + + var sourceMembers = new List(); + var initialExpression = sourceProperty.Body as MemberExpression; + + while (true) + { + var propertySourceInfo = initialExpression?.Member as PropertyInfo; + + if (propertySourceInfo == null) break; + sourceMembers.Add(propertySourceInfo); + initialExpression = initialExpression.Expression as MemberExpression; + } + + return sourceMembers; + } + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Mappers/ObjectMapper.PropertyInfoComparer.cs b/Vendor/Swan.Lite-3.1.0/Mappers/ObjectMapper.PropertyInfoComparer.cs new file mode 100644 index 0000000..bd5f1a7 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Mappers/ObjectMapper.PropertyInfoComparer.cs @@ -0,0 +1,24 @@ +using System.Collections.Generic; +using System.Reflection; + +namespace Swan.Mappers +{ + /// + /// Represents an AutoMapper-like object to map from one object type + /// to another using defined properties map or using the default behaviour + /// to copy same named properties from one object to another. + /// + /// The extension methods like CopyPropertiesTo use the default behaviour. + /// + public partial class ObjectMapper + { + internal class PropertyInfoComparer : IEqualityComparer + { + public bool Equals(PropertyInfo x, PropertyInfo y) + => x != null && y != null && x.Name == y.Name && x.PropertyType == y.PropertyType; + + public int GetHashCode(PropertyInfo obj) + => obj.Name.GetHashCode() + obj.PropertyType.Name.GetHashCode(); + } + } +} \ No newline at end of file diff --git a/Vendor/Swan.Lite-3.1.0/Mappers/ObjectMapper.cs b/Vendor/Swan.Lite-3.1.0/Mappers/ObjectMapper.cs new file mode 100644 index 0000000..11e000d --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Mappers/ObjectMapper.cs @@ -0,0 +1,374 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using Swan.Reflection; + +namespace Swan.Mappers +{ + /// + /// Represents an AutoMapper-like object to map from one object type + /// to another using defined properties map or using the default behaviour + /// to copy same named properties from one object to another. + /// + /// The extension methods like CopyPropertiesTo use the default behaviour. + /// + /// + /// The following code explains how to map an object's properties into an instance of type T. + /// + /// using Swan.Mappers; + /// + /// class Example + /// { + /// class Person + /// { + /// public string Name { get; set; } + /// public int Age { get; set; } + /// } + /// + /// static void Main() + /// { + /// var obj = new { Name = "John", Age = 42 }; + /// + /// var person = Runtime.ObjectMapper.Map<Person>(obj); + /// } + /// } + /// + /// + /// The following code explains how to explicitly map certain properties. + /// + /// using Swan.Mappers; + /// + /// class Example + /// { + /// class User + /// { + /// public string Name { get; set; } + /// public Role Role { get; set; } + /// } + /// + /// public class Role + /// { + /// public string Name { get; set; } + /// } + /// + /// class UserDto + /// { + /// public string Name { get; set; } + /// public string Role { get; set; } + /// } + /// + /// static void Main() + /// { + /// // create a User object + /// var person = + /// new User { Name = "Phillip", Role = new Role { Name = "Admin" } }; + /// + /// // create an Object Mapper + /// var mapper = new ObjectMapper(); + /// + /// // map the User's Role.Name to UserDto's Role + /// mapper.CreateMap<User, UserDto>() + /// .MapProperty(d => d.Role, x => x.Role.Name); + /// + /// // apply the previous map and retrieve a UserDto object + /// var destination = mapper.Map<UserDto>(person); + /// } + /// } + /// + /// + public partial class ObjectMapper + { + private static readonly Lazy LazyInstance = new Lazy(() => new ObjectMapper()); + + private readonly List _maps = new List(); + + /// + /// Gets the current. + /// + /// + /// The current. + /// + public static ObjectMapper Current => LazyInstance.Value; + + /// + /// Copies the specified source. + /// + /// The source. + /// The target. + /// The properties to copy. + /// The ignore properties. + /// + /// Copied properties count. + /// + /// + /// source + /// or + /// target. + /// + public static int Copy( + object source, + object target, + IEnumerable? propertiesToCopy = null, + params string[]? ignoreProperties) + { + if (source == null) + throw new ArgumentNullException(nameof(source)); + + if (target == null) + throw new ArgumentNullException(nameof(target)); + + return CopyInternal( + target, + GetSourceMap(source), + propertiesToCopy, + ignoreProperties); + } + + /// + /// Copies the specified source. + /// + /// The source. + /// The target. + /// The properties to copy. + /// The ignore properties. + /// + /// Copied properties count. + /// + /// + /// source + /// or + /// target. + /// + public static int Copy( + IDictionary? source, + object? target, + IEnumerable? propertiesToCopy = null, + params string[] ignoreProperties) + { + if (source == null) + throw new ArgumentNullException(nameof(source)); + + if (target == null) + throw new ArgumentNullException(nameof(target)); + + return CopyInternal( + target, + source.ToDictionary( + x => x.Key.ToLowerInvariant(), + x => Tuple.Create(typeof(object), x.Value)), + propertiesToCopy, + ignoreProperties); + } + + /// + /// Creates the map. + /// + /// The type of the source. + /// The type of the destination. + /// + /// An object map representation of type of the destination property + /// and type of the source property. + /// + /// + /// You can't create an existing map + /// or + /// Types doesn't match. + /// + public ObjectMap CreateMap() + { + if (_maps.Any(x => x.SourceType == typeof(TSource) && x.DestinationType == typeof(TDestination))) + throw new InvalidOperationException("You can't create an existing map"); + + var sourceType = PropertyTypeCache.DefaultCache.Value.RetrieveAllProperties(true); + var destinationType = PropertyTypeCache.DefaultCache.Value.RetrieveAllProperties(true); + + var intersect = sourceType.Intersect(destinationType, new PropertyInfoComparer()).ToArray(); + + if (!intersect.Any()) + throw new InvalidOperationException("Types doesn't match"); + + var map = new ObjectMap(intersect); + + _maps.Add(map); + + return map; + } + + /// + /// Maps the specified source. + /// + /// The type of the destination. + /// The source. + /// if set to true [automatic resolve]. + /// + /// A new instance of the map. + /// + /// source. + /// You can't map from type {source.GetType().Name} to {typeof(TDestination).Name}. + public TDestination Map(object source, bool autoResolve = true) + { + if (source == null) + throw new ArgumentNullException(nameof(source)); + + var destination = Activator.CreateInstance(); + var map = _maps + .FirstOrDefault(x => x.SourceType == source.GetType() && x.DestinationType == typeof(TDestination)); + + if (map != null) + { + foreach (var property in map.Map) + { + var finalSource = property.Value.Aggregate(source, + (current, sourceProperty) => sourceProperty.GetValue(current)); + + property.Key.SetValue(destination, finalSource); + } + } + else + { + if (!autoResolve) + { + throw new InvalidOperationException( + $"You can't map from type {source.GetType().Name} to {typeof(TDestination).Name}"); + } + + // Missing mapping, try to use default behavior + Copy(source, destination!); + } + + return destination; + } + + private static int CopyInternal( + object target, + Dictionary> sourceProperties, + IEnumerable? propertiesToCopy, + IEnumerable? ignoreProperties) + { + // Filter properties + var requiredProperties = propertiesToCopy? + .Where(p => !string.IsNullOrWhiteSpace(p)) + .Select(p => p.ToLowerInvariant()); + + var ignoredProperties = ignoreProperties? + .Where(p => !string.IsNullOrWhiteSpace(p)) + .Select(p => p.ToLowerInvariant()); + + var properties = PropertyTypeCache.DefaultCache.Value + .RetrieveFilteredProperties(target.GetType(), true, x => x.CanWrite); + + return properties + .Select(x => x.Name) + .Distinct() + .ToDictionary(x => x.ToLowerInvariant(), x => properties.First(y => y.Name == x)) + .Where(x => sourceProperties.Keys.Contains(x.Key)) + .When(() => requiredProperties != null, q => q.Where(y => requiredProperties!.Contains(y.Key))) + .When(() => ignoredProperties != null, q => q.Where(y => !ignoredProperties!.Contains(y.Key))) + .ToDictionary(x => x.Value, x => sourceProperties[x.Key]) + .Sum(x => TrySetValue(x.Key, x.Value, target) ? 1 : 0); + } + + private static bool TrySetValue(PropertyInfo propertyInfo, Tuple property, object target) + { + try + { + var (type, value) = property; + + if (type.IsEnum) + { + propertyInfo.SetValue(target, + Enum.ToObject(propertyInfo.PropertyType, value)); + + return true; + } + + if (type.IsValueType || propertyInfo.PropertyType != type) + return propertyInfo.TrySetBasicType(value, target); + + if (propertyInfo.PropertyType.IsArray) + { + propertyInfo.TrySetArray(value as IEnumerable, target); + return true; + } + + propertyInfo.SetValue(target, GetValue(value, propertyInfo.PropertyType)); + + return true; + } +#pragma warning disable CA1031 // Do not catch general exception types + catch +#pragma warning restore CA1031 // Do not catch general exception types + { + // swallow + } + + return false; + } + + private static object? GetValue(object source, Type targetType) + { + if (source == null) + return null; + + object? target = null; + + source.CreateTarget(targetType, false, ref target); + + switch (source) + { + case string _: + target = source; + break; + case IList sourceList when target is IList targetList: + var addMethod = targetType.GetMethods() + .FirstOrDefault( + m => m.Name == Formatters.Json.AddMethodName && m.IsPublic && m.GetParameters().Length == 1); + + if (addMethod == null) return target; + + var isItemValueType = targetList.GetType().GetElementType().IsValueType; + + foreach (var item in sourceList) + { + try + { + targetList.Add(isItemValueType + ? item + : item.CopyPropertiesToNew()); + } +#pragma warning disable CA1031 // Do not catch general exception types + catch +#pragma warning restore CA1031 // Do not catch general exception types + { + // ignored + } + } + + break; + default: + source.CopyPropertiesTo(target!); + break; + } + + return target; + } + + private static Dictionary> GetSourceMap(object source) + { + // select distinct properties because they can be duplicated by inheritance + var sourceProperties = PropertyTypeCache.DefaultCache.Value + .RetrieveFilteredProperties(source.GetType(), true, x => x.CanRead) + .ToArray(); + + return sourceProperties + .Select(x => x.Name) + .Distinct() + .ToDictionary( + x => x.ToLowerInvariant(), + x => Tuple.Create(sourceProperties.First(y => y.Name == x).PropertyType, + sourceProperties.First(y => y.Name == x).GetValue(source))); + } + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Net/IPAddressRange.cs b/Vendor/Swan.Lite-3.1.0/Net/IPAddressRange.cs new file mode 100644 index 0000000..d09cb6f --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Net/IPAddressRange.cs @@ -0,0 +1,552 @@ +using System; +using System.Globalization; +using System.Net; +using System.Net.Sockets; +using Swan.Net.Internal; + +namespace Swan.Net +{ + // NOTE TO CONTRIBUTORS: When adding a check on a public method parameter, + // please do not just "throw new ArgumentException(...)". + // Instead, look at the exception-returning private methods at the bottom of this file + // and either find one suitable for your case, or add a new one. + // This way we can keep the exception messages consistent. + + /// + /// Represents an inclusive range of IP addresses. + /// + /// + /// This class makes no distinction between IPv4 addresses and the same addresses mapped to IPv6 + /// for the purpose of determining whether it belongs to a range: that is, the method + /// of an instance initialized with IPv4 addresses, or with the same addresses mapped to IPv6, + /// will return for both an in-range IPv4 address and the same address mapped to IPv6. + /// The constructor, however, + /// does make such distinction: you cannot initialize a range using an IPv4 address and an IPv6 address, + /// even if the latter is an IPv4 address mapped to IPv6, nor the other way around. + /// + /// + [Serializable] + public sealed class IPAddressRange : IEquatable + { + /// + /// Gets an instance of that contains no addresses. + /// The method of the returned instance will always return . + /// This property is useful to initialize non-nullable properties + /// of type . + /// + public static readonly IPAddressRange None = new IPAddressRange(IPAddressValue.MaxValue, IPAddressValue.MinValue, true, 0); + + /// + /// Gets an instance of that contains all possible IP addresses. + /// The method of the returned instance will always return . + /// + public static readonly IPAddressRange All = new IPAddressRange(IPAddressValue.MinValue, IPAddressValue.MaxValue, true, 128); + + /// + /// Gets an instance of that contains all IPv4 addresses. + /// The method of the returned instance will return + /// for all IPv4 addresses, as well as their IPv6 mapped counterparts, and + /// for all other IPv6 addresses. + /// + public static readonly IPAddressRange AllIPv4 = new IPAddressRange(IPAddressValue.MinIPv4Value, IPAddressValue.MaxIPv4Value, false, 32); + + private readonly IPAddressValue _start; + private readonly IPAddressValue _end; + private readonly bool _isV6; + private readonly byte _prefixLength; + + /// + /// Initializes a new instance of the class, + /// representing a single IP address. + /// + /// The IP address. + /// is . + public IPAddressRange(IPAddress address) + { + if (address == null) + throw new ArgumentNullException(nameof(address)); + + _start = _end = new IPAddressValue(address); + _isV6 = address.AddressFamily == AddressFamily.InterNetworkV6; + _prefixLength = 0; + } + + /// + /// Initializes a new instance of the class, + /// representing a range of IP addresses between + /// and , extremes included. + /// + /// The starting address of the range. + /// The ending address of the range. + /// + /// is . + /// - or - + /// is . + /// + /// + /// has a different AddressFamily + /// from . + /// - or - + /// is a lower address than , + /// i.e. the binary representation of in network byte order + /// is a lower number than the same representation of . + /// + public IPAddressRange(IPAddress start, IPAddress end) + { + if (start == null) + throw new ArgumentNullException(nameof(start)); + + if (end == null) + throw new ArgumentNullException(nameof(end)); + + var startFamily = start.AddressFamily; + _isV6 = startFamily == AddressFamily.InterNetworkV6; + if (end.AddressFamily != startFamily) + throw MismatchedEndFamily(nameof(end)); + + _start = new IPAddressValue(start); + _end = new IPAddressValue(end); + if (_end.CompareTo(_start) < 0) + throw EndLowerThanStart(nameof(end)); + + _prefixLength = 0; + } + + /// + /// Initializes a new instance of the class, + /// representing a CIDR subnet. + /// + /// The base address of the subnet. + /// The prefix length of the subnet. + /// is . + /// + /// is zero. + /// - or - + /// is greater than the number of bits in + /// the binary representation of (32 for IPv4 addresses, + /// 128 for IPv6 addresses.) + /// - or - + /// cannot be the base address of a subnet with a prefix length + /// equal to , because the remaining bits after the prefix + /// are not all zeros. + /// + public IPAddressRange(IPAddress baseAddress, byte prefixLength) + { + if (baseAddress == null) + throw new ArgumentNullException(nameof(baseAddress)); + + byte maxPrefixLength; + if (baseAddress.AddressFamily == AddressFamily.InterNetworkV6) + { + _isV6 = true; + maxPrefixLength = 128; + } + else + { + _isV6 = false; + maxPrefixLength = 32; + } + + if (prefixLength < 1 || prefixLength > maxPrefixLength) + throw InvalidPrefixLength(nameof(prefixLength)); + + _start = new IPAddressValue(baseAddress); + if (!_start.IsStartOfSubnet(prefixLength)) + throw InvalidSubnetBaseAddress(nameof(baseAddress)); + + _end = _start.GetEndOfSubnet(prefixLength); + _prefixLength = prefixLength; + } + + private IPAddressRange(IPAddressValue start, IPAddressValue end, bool isV6, byte prefixLength) + { + _start = start; + _end = end; + _isV6 = isV6; + _prefixLength = prefixLength; + } + + /// + /// Gets the address family of the IP address range. + /// + /// + /// Regardless of the value of this property, IPv4 addresses + /// and their IPv6 mapped counterparts will be considered the same + /// for the purposes of the method. + /// + public AddressFamily AddressFamily => _isV6 ? AddressFamily.InterNetworkV6 : AddressFamily.InterNetwork; + + /// + /// Gets a value indicating whether this instance represents a CIDR subnet. + /// + /// + /// This property is only for instances + /// initialized via the constructor. + /// Instances constructed by specifying a range will have this property + /// set to even when they actually represent a subnet. + /// For example, the instance returned by IPAddressRange.Parse("192.168.0.0-192.168.0.255") + /// will have this property set to ; for this property to be , + /// the string passed to should instead be "192.168.0.0/24" + /// (a CIDR subnet specification) or "192.168.0.0/255.255.255.0" (a base address / netmask pair, + /// only accepted by and for IPv4 addresses.) + /// + public bool IsSubnet => _prefixLength > 0; + + /// + /// Gets an instance of representing + /// the first address in the range. + /// + public IPAddress Start => _start.ToIPAddress(_isV6); + + /// + /// Gets an instance of representing + /// the last address in the range. + /// + public IPAddress End => _end.ToIPAddress(_isV6); + + /// + /// Tries to convert the string representation of a range of IP addresses + /// to an instance of . + /// + /// The string to convert. + /// When this method returns , + /// an instance of representing the same range of + /// IP addresses represented by . + /// if the conversion was successful; + /// otherwise, . + /// See the "Remarks" section of + /// for an overview of the formats accepted for . + /// + public static bool TryParse(string str, out IPAddressRange result) + => TryParseInternal(nameof(str), str, out result) == null; + + /// + /// Converts the string representation of a range of IP addresses + /// to an instance of . + /// + /// The string to convert. + /// An instance of representing the same range of + /// IP addresses represented by . + /// is . + /// is in none of the supported formats. + /// + /// This method supports the following formats for : + /// + /// + /// Format + /// Description + /// Examples + /// + /// + /// Single address + /// A single IP address. + /// + /// 192.168.23.199 + /// 2001:db8:a0b:12f0::1 + /// + /// + /// + /// Range of addresses + /// Start and end address, separated by a hyphen (-). + /// + /// 192.168.0.100-192.168.11.255 + /// 2001:db8:a0b:12f0::-2001:db8:a0b:12f0::ffff + /// + /// + /// + /// CIDR subnet + /// Base address and prefix length, separated by a slash (/). + /// + /// 169.254.0.0/16 + /// 192.168.123.0/24 + /// 2001:db8:a0b:12f0::/64 + /// + /// + /// + /// "Legacy" subnet + /// + /// Base address and netmask, separated by a slash (/). + /// Only accepted for IPv4 addresses. + /// + /// + /// 169.254.0.0/255.255.0.0 + /// 192.168.123.0/255.255.255.0 + /// + /// + /// + /// + /// + public static IPAddressRange Parse(string str) + { + var exception = TryParseInternal(nameof(str), str, out var result); + if (exception != null) + throw exception; + + return result; + } + + /// + /// + /// The result of this method will be a string that, + /// if passed to the or method, + /// will result in an instance identical to this one. + /// If this instance has been created by means of the + /// or method, the returned string will not + /// necessarily be identical to the parsed string. The possible differences + /// include the following: + /// + /// ranges consisting of just one IP address will result in a + /// string representing that single address; + /// addresses in the returned string are passed to the + /// method, resulting in standardized + /// representations that may be different from the originally parsed + /// strings; + /// the returned string will contain no blank characters; + /// address ranges parsed as address/netmask will be + /// rendered as CIDR subnets: for example, + /// IPAddressRange.Parse("192.168.19.0/255.255.255.0").ToString() + /// will return "192.168.19.0/24". + /// + /// + public override string ToString() + => _prefixLength > 0 + ? $"{Start}/{_prefixLength}" + : _start.CompareTo(_end) == 0 + ? Start.ToString() + : $"{Start}-{End}"; + + /// + /// Determines whether the given + /// sa contained in this range. + /// + /// The IP address to check. + /// if + /// is between and , inclusive; + /// otherwise, . + /// is . + /// + /// This method treats IPv4 addresses and their IPv6-mapped counterparts + /// the same; that is, given a range obtained by parsing the string 192.168.1.0/24, + /// Contains(IPAddress.Parse("192.168.1.55")) will return , + /// as will Contains(IPAddress.Parse("192.168.1.55").MapToIPv6()). This is true + /// as well if a range is initialized with IPv6 addresses. + /// + public bool Contains(IPAddress address) + { + if (address == null) + throw new ArgumentNullException(nameof(address)); + + var addressValue = new IPAddressValue(address); + return addressValue.CompareTo(_start) >= 0 + && addressValue.CompareTo(_end) <= 0; + } + + /// + public override bool Equals(object? obj) => obj is IPAddressRange other && Equals(other); + + /// + public bool Equals(IPAddressRange? other) + => other != null + && other._start.Equals(_start) + && other._end.Equals(_end) + && other._isV6 == _isV6 + && other._prefixLength == _prefixLength; + + /// + public override int GetHashCode() => CompositeHashCode.Using(_start, _end, _isV6, _prefixLength); + + private static bool TryNetmaskToCidrPrefixLength(byte[] bytes, out byte result) + { + result = 0; + var length = bytes.Length; + var prefixFound = false; + for (var i = 0; i < length; i++) + { + if (prefixFound) + { + if (bytes[i] != 0) + return false; + } + else + { + switch (bytes[i]) + { + case 0x00: + if (result == 0) + return false; + + prefixFound = true; + break; + case 0x80: + result += 1; + prefixFound = true; + break; + case 0xC0: + result += 2; + prefixFound = true; + break; + case 0xE0: + result += 3; + prefixFound = true; + break; + case 0xF0: + result += 4; + prefixFound = true; + break; + case 0xF8: + result += 5; + prefixFound = true; + break; + case 0xFC: + result += 6; + prefixFound = true; + break; + case 0xFE: + result += 7; + prefixFound = true; + break; + case 0xFF: + result += 8; + break; + default: + return false; + } + } + } + + return true; + } + + private static Exception? TryParseInternal(string paramName, string? str, out IPAddressRange result) + { + result = None; + + if (str == null) + return new ArgumentNullException(paramName); + + // Try CIDR format (e.g. 192.168.99.0/24) and address/netmask format (192.168.99.0/255.255.255.0) + var separatorPos = str.IndexOf('/'); + if (separatorPos >= 0) + return TryParseCidrOrAddressNetmaskFormat(str, separatorPos, out result); + + // Try range format (e.g. 192.168.99.100-192.168.99.199) + separatorPos = str.IndexOf('-'); + if (separatorPos >= 0) + return TryParseStartEndFormat(str, separatorPos, out result); + + // Try single address format (e.g. 192.168.99.123) + return TryParseSingleAddressFormat(str, out result); + } + + private static Exception? TryParseCidrOrAddressNetmaskFormat(string str, int separatorPos, out IPAddressRange result) + { + result = None; + + var s = str.Substring(0, separatorPos).Trim(); + if (!IPAddressUtility.TryParse(s, out var address)) + return InvalidIPAddress(); + + var addressValue = new IPAddressValue(address); + + s = str.Substring(separatorPos + 1).Trim(); + if (byte.TryParse(s, NumberStyles.None, CultureInfo.InvariantCulture, out var prefixLength)) + { + var maxPrefixLength = address.AddressFamily == AddressFamily.InterNetworkV6 ? 128 : 32; + if (prefixLength < 1 || prefixLength > maxPrefixLength) + return InvalidPrefixLength(); + + if (!addressValue.IsStartOfSubnet(prefixLength)) + return InvalidSubnetBaseAddress(); + + result = new IPAddressRange(addressValue, addressValue.GetEndOfSubnet(prefixLength), address.AddressFamily == AddressFamily.InterNetworkV6, prefixLength); + return null; + } + + // Only accept a netmask for IPv4 + if (address.AddressFamily != AddressFamily.InterNetwork) + return InvalidPrefixLength(); + + if (!IPAddressUtility.TryParse(s, out var netmask)) + return InvalidPrefixLengthOrNetmask(); + + var addressFamily = address.AddressFamily; + if (netmask.AddressFamily != addressFamily) + return MismatchedNetmaskAddressFamily(); + + var netmaskBytes = netmask.GetAddressBytes(); + if (!TryNetmaskToCidrPrefixLength(netmaskBytes, out prefixLength)) + return InvalidNetmask(); + + if (!addressValue.IsStartOfSubnet(prefixLength)) + return InvalidSubnetBaseAddress(); + + result = new IPAddressRange(addressValue, addressValue.GetEndOfSubnet(prefixLength), false, prefixLength); + return null; + } + + private static Exception? TryParseStartEndFormat(string str, int separatorPos, out IPAddressRange result) + { + result = None; + + var s = str.Substring(0, separatorPos).Trim(); + if (!IPAddressUtility.TryParse(s, out var startAddress)) + return InvalidStartAddress(); + + s = str.Substring(separatorPos + 1).Trim(); + if (!IPAddressUtility.TryParse(s, out var endAddress)) + return InvalidEndAddress(); + + var addressFamily = startAddress.AddressFamily; + if (endAddress.AddressFamily != addressFamily) + return MismatchedStartEndFamily(); + + var start = new IPAddressValue(startAddress); + var end = new IPAddressValue(endAddress); + if (end.CompareTo(start) < 0) + return EndLowerThanStart(); + + result = new IPAddressRange(start, end, addressFamily == AddressFamily.InterNetworkV6, 0); + return null; + } + + private static Exception? TryParseSingleAddressFormat(string str, out IPAddressRange result) + { + result = None; + + if (!IPAddressUtility.TryParse(str, out var address)) + return InvalidIPAddress(); + + var addressValue = new IPAddressValue(address); + result = new IPAddressRange(addressValue, addressValue, address.AddressFamily == AddressFamily.InterNetworkV6, 0); + return null; + } + + private static Exception InvalidIPAddress() => new FormatException("An invalid IP address was specified."); + + private static Exception InvalidPrefixLengthOrNetmask() => new FormatException("An invalid prefix length or netmask was specified."); + + private static Exception MismatchedNetmaskAddressFamily() => new FormatException("Address and netmask are different types of addresses."); + + private static Exception InvalidPrefixLength() => new FormatException("An invalid prefix length was specified."); + + private static Exception InvalidPrefixLength(string paramName) => new ArgumentException("The prefix length is invalid.", paramName); + + private static Exception InvalidNetmask() => new FormatException("An invalid netmask was specified."); + + private static Exception InvalidSubnetBaseAddress() => new FormatException("The specified address is not the base address of the specified subnet."); + + private static Exception InvalidSubnetBaseAddress(string paramName) => new ArgumentException("The specified address is not the base address of the specified subnet.", paramName); + + private static Exception InvalidStartAddress() => new FormatException("An invalid start address was specified for a range."); + + private static Exception InvalidEndAddress() => new FormatException("An invalid end address was specified for a range."); + + private static Exception MismatchedStartEndFamily() => new FormatException("Start and end are different types of addresses."); + + private static Exception MismatchedEndFamily(string paramName) => new ArgumentException("The end address of a range must be of the same family as the start address.", paramName); + + private static Exception EndLowerThanStart() => new FormatException("An end address was specified for a range that is lower than the start address."); + + private static Exception EndLowerThanStart(string paramName) => new ArgumentException("The end address of a range cannot be lower than the start address.", paramName); + } +} \ No newline at end of file diff --git a/Vendor/Swan.Lite-3.1.0/Net/IPAddressRangeExtensions.cs b/Vendor/Swan.Lite-3.1.0/Net/IPAddressRangeExtensions.cs new file mode 100644 index 0000000..44d75ba --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Net/IPAddressRangeExtensions.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.Net; +using System.Runtime.CompilerServices; + +namespace Swan.Net +{ + /// + /// Provides extension methods for instances and collections of . + /// + public static class IPAddressRangeExtensions + { + /// + /// Determines whether any element of a sequence of instances + /// contains the given . + /// + /// The IEnumerable<IPAddressRange> interface + /// on which this method is called. + /// The to look for. + /// if any of the ranges in + /// contains ; otherwise, . + /// is . + public static bool AnyContains(this IEnumerable @this, IPAddress address) + { + if (@this == null) + throw new ArgumentNullException(nameof(@this)); + + foreach (var range in @this) + { + if (range.Contains(address)) + return true; + } + + return false; + } + + /// + /// Determines whether no element of a sequence of instances + /// contains the given . + /// + /// The IEnumerable<IPAddressRange> interface + /// on which this method is called. + /// The to look for. + /// if none of the ranges in + /// contains ; otherwise, . + /// is . + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool NoneContains(this IEnumerable @this, IPAddress address) + => !AnyContains(@this, address); + } +} \ No newline at end of file diff --git a/Vendor/Swan.Lite-3.1.0/Net/IPAddressUtility.cs b/Vendor/Swan.Lite-3.1.0/Net/IPAddressUtility.cs new file mode 100644 index 0000000..4385c25 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Net/IPAddressUtility.cs @@ -0,0 +1,43 @@ +using System.Net; + +namespace Swan.Net +{ + /// + /// Provides utility methods to work with the class. + /// + public static class IPAddressUtility + { + /// + /// Tries to convert the string representation of an IP address + /// into an instance of + /// This method works the same way as , + /// with the exception that it will not recognize a decimal number alone + /// as an IPv4 address. + /// + /// The string to be converted. + /// When this method returns , + /// an instance of representing the same address + /// as . + /// if the conversion was successful; + /// otherwise, . + public static bool TryParse(string? str, out IPAddress address) + { + // https://docs.microsoft.com/en-us/dotnet/api/system.net.ipaddress.tryparse + // "Note that this method accepts as valid an ipString value that can be parsed as an Int64, + // and then treats that Int64 as the long value of an IP address in network byte order, + // similar to the way that the IPAddress constructor does. + // This means that this method returns true if the Int64 is parsed successfully, + // even if it represents an address that's not a valid IP address. + // For example, if str is "1", this method returns true even though "1" (or 0.0.0.1) + // is not a valid IP address and you might expect this method to return false. + // Fixing this bug would break existing apps, so the current behavior will not be changed. + // Your code can avoid this behavior by ensuring that it only uses this method + // to parse IP addresses in dotted-decimal format." + // --- + // Thus, if it parses as an Int64, let's just refuse it. + // One-part IPv4 addresses be darned. + address = IPAddress.None; + return !long.TryParse(str, out _) && IPAddress.TryParse(str, out address); + } + } +} \ No newline at end of file diff --git a/Vendor/Swan.Lite-3.1.0/Net/Internal/IPAddressValue.cs b/Vendor/Swan.Lite-3.1.0/Net/Internal/IPAddressValue.cs new file mode 100644 index 0000000..e4f33b0 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Net/Internal/IPAddressValue.cs @@ -0,0 +1,139 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Net.Sockets; + +namespace Swan.Net.Internal +{ + // NOTE TO CONTRIBUTORS: If you decide to use this type + // in any context other than IPAddressRange, please be aware + // that consistency checks were kept to the bare minimum + // for use by IPAddressRange. + // If you add consistency checks, please ensure + // that IPAddressRange still works as intended. + // Add regression tests if needed. + [Serializable] + internal struct IPAddressValue : IEquatable, IComparable + { + public static readonly IPAddressValue MinValue = new IPAddressValue(ulong.MinValue, ulong.MinValue, false); + public static readonly IPAddressValue MaxValue = new IPAddressValue(ulong.MaxValue, ulong.MaxValue, false); + public static readonly IPAddressValue MinIPv4Value = new IPAddressValue(0UL, 0xFFFF00000000UL, true); + public static readonly IPAddressValue MaxIPv4Value = new IPAddressValue(0UL, 0xFFFFFFFFFFFFUL, true); + + private static readonly IReadOnlyList LowBitMasks = BuildLowBitMasks(); + private static readonly IReadOnlyList HighBitMasks = BuildHighBitMasks(); + + private const long V4Mask0 = 0L; + private const long V4Mask1 = 0xFFFF00000000L; + + private readonly ulong _n0; + private readonly ulong _n1; + private readonly bool _isV4; + + public IPAddressValue(IPAddress address) + { + // There are no overloads of IPAddress.NetworkToHostOrder for unsigned types; + // hence the unchecked casts to signed types. + static ulong ToHostUInt32(byte[] bytes, int startIndex) + => unchecked((uint)IPAddress.NetworkToHostOrder(BitConverter.ToInt32(bytes, startIndex))); + + static ulong ToHostUInt64(byte[] bytes, int startIndex) + => unchecked((ulong)IPAddress.NetworkToHostOrder(BitConverter.ToInt64(bytes, startIndex))); + + if (address.AddressFamily == AddressFamily.InterNetworkV6) + { + var addressBytes = address.GetAddressBytes(); + _n0 = ToHostUInt64(addressBytes, 0); + _n1 = ToHostUInt64(addressBytes, 8); + _isV4 = false; + } + else + { + _n0 = V4Mask0; + _n1 = V4Mask1 + ToHostUInt32(address.GetAddressBytes(), 0); + _isV4 = true; + } + } + + private IPAddressValue(ulong n0, ulong n1, bool isV4) + { + _n0 = n0; + _n1 = n1; + _isV4 = isV4; + } + + // There are no overloads of IPAddress.HostToNetworkOrder for unsigned types; + // hence the unchecked casts to signed types. + public IPAddress ToIPAddress(bool forceV6) + => new IPAddress(_isV4 && !forceV6 + ? BitConverter.GetBytes(IPAddress.HostToNetworkOrder(unchecked((int)(uint)_n1))) + : BitConverter.GetBytes(IPAddress.HostToNetworkOrder(unchecked((long) _n0))) + .Concat(BitConverter.GetBytes(IPAddress.HostToNetworkOrder(unchecked((long) _n1)))) + .ToArray()); + + public override int GetHashCode() => CompositeHashCode.Using(_n0, _n1, _isV4); + + public override bool Equals(object obj) + => obj is IPAddressValue other && Equals(other); + + public bool Equals(IPAddressValue other) + => other._n0 == _n0 + && other._n1 == _n1; + + public int CompareTo(IPAddressValue other) + { + var result = _n0.CompareTo(other._n0); + return result == 0 ?_n1.CompareTo(other._n1) : result; + } + + public bool IsStartOfSubnet(byte prefixLength) + { + var maxPrefixLength = _isV4 ? 32 : 128; + if (prefixLength > maxPrefixLength) + throw SelfCheck.Failure($"Invalid prefix length {prefixLength} in {nameof(IsStartOfSubnet)}"); + + if (_isV4) + prefixLength += 96; + + var bitsToCheck = 128 - prefixLength; + return bitsToCheck < 64 + ? (_n1 & LowBitMasks[bitsToCheck]) == 0 + : _n1 == 0 && (_n0 & LowBitMasks[bitsToCheck]) == 0; + } + + public IPAddressValue GetEndOfSubnet(byte prefixLength) + { + var maxPrefixLength = _isV4 ? 32 : 128; + if (prefixLength > maxPrefixLength) + throw SelfCheck.Failure($"Invalid prefix length {prefixLength} in {nameof(GetEndOfSubnet)}"); + + if (_isV4) + prefixLength += 96; + + var (n0, n1) = prefixLength > 64 + ? (_n0, (_n1 & HighBitMasks[prefixLength - 64]) | LowBitMasks[128 - prefixLength]) + : ((_n0 & HighBitMasks[prefixLength]) | LowBitMasks[64 - prefixLength], 0xFFFFFFFFFFFFFFFFUL); + + return new IPAddressValue(n0, n1, _isV4); + } + + private static IReadOnlyList BuildLowBitMasks() + { + var masks = new ulong[65]; + for (var i = 0; i < 64; i++) + masks[i + 1] = (masks[i] << 1) | 1; + + return masks; + } + + private static IReadOnlyList BuildHighBitMasks() + { + var masks = new ulong[65]; + for (var i = 0; i < 64; i++) + masks[i + 1] = (masks[i] >> 1) | 0x8000000000000000UL; + + return masks; + } + } +} \ No newline at end of file diff --git a/Vendor/Swan.Lite-3.1.0/ObjectComparer.cs b/Vendor/Swan.Lite-3.1.0/ObjectComparer.cs new file mode 100644 index 0000000..3693044 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/ObjectComparer.cs @@ -0,0 +1,188 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using Swan.Reflection; + +namespace Swan +{ + /// + /// Represents a quick object comparer using the public properties of an object + /// or the public members in a structure. + /// + public static class ObjectComparer + { + /// + /// Compare if two variables of the same type are equal. + /// + /// The type of objects to compare. + /// The left. + /// The right. + /// true if the variables are equal; otherwise, false. + public static bool AreEqual(T left, T right) => AreEqual(left, right, typeof(T)); + + /// + /// Compare if two variables of the same type are equal. + /// + /// The left. + /// The right. + /// Type of the target. + /// + /// true if the variables are equal; otherwise, false. + /// + /// targetType. + public static bool AreEqual(object left, object right, Type targetType) + { + if (targetType == null) + throw new ArgumentNullException(nameof(targetType)); + + if (Definitions.BasicTypesInfo.Value.ContainsKey(targetType)) + return Equals(left, right); + + return targetType.IsValueType || targetType.IsArray + ? AreStructsEqual(left, right, targetType) + : AreObjectsEqual(left, right, targetType); + } + + /// + /// Compare if two objects of the same type are equal. + /// + /// The type of objects to compare. + /// The left. + /// The right. + /// true if the objects are equal; otherwise, false. + public static bool AreObjectsEqual(T left, T right) + where T : class + { + return AreObjectsEqual(left, right, typeof(T)); + } + + /// + /// Compare if two objects of the same type are equal. + /// + /// The left. + /// The right. + /// Type of the target. + /// true if the objects are equal; otherwise, false. + /// targetType. + public static bool AreObjectsEqual(object left, object right, Type targetType) + { + if (targetType == null) + throw new ArgumentNullException(nameof(targetType)); + + var properties = PropertyTypeCache.DefaultCache.Value.RetrieveAllProperties(targetType).ToArray(); + + foreach (var propertyTarget in properties) + { + if (propertyTarget.PropertyType.IsArray) + { + var leftObj = left.ReadProperty(propertyTarget.Name) as IEnumerable; + var rightObj = right.ReadProperty(propertyTarget.Name) as IEnumerable; + + if (!AreEnumerationsEquals(leftObj, rightObj)) + return false; + } + else + { + if (!Equals(left.ReadProperty(propertyTarget.Name), right.ReadProperty(propertyTarget.Name))) + return false; + } + } + + return true; + } + + /// + /// Compare if two structures of the same type are equal. + /// + /// The type of structs to compare. + /// The left. + /// The right. + /// true if the structs are equal; otherwise, false. + public static bool AreStructsEqual(T left, T right) + where T : struct + { + return AreStructsEqual(left, right, typeof(T)); + } + + /// + /// Compare if two structures of the same type are equal. + /// + /// The left. + /// The right. + /// Type of the target. + /// + /// true if the structs are equal; otherwise, false. + /// + /// targetType. + public static bool AreStructsEqual(object left, object right, Type targetType) + { + if (targetType == null) + throw new ArgumentNullException(nameof(targetType)); + + var fields = new List(FieldTypeCache.DefaultCache.Value.RetrieveAllFields(targetType)) + .Union(PropertyTypeCache.DefaultCache.Value.RetrieveAllProperties(targetType)); + + foreach (var targetMember in fields) + { + switch (targetMember) + { + case FieldInfo field: + if (!Equals(field.GetValue(left), field.GetValue(right))) + return false; + break; + case PropertyInfo property: + if (!Equals(left.ReadProperty(property.Name), right.ReadProperty(property.Name))) + return false; + break; + } + } + + return true; + } + + /// + /// Compare if two enumerables are equal. + /// + /// The type of enums to compare. + /// The left. + /// The right. + /// + /// true if two specified types are equal; otherwise, false. + /// + /// + /// left + /// or + /// right. + /// + public static bool AreEnumerationsEquals(T left, T right) + where T : IEnumerable? + { + if (Equals(left, default(T))) + throw new ArgumentNullException(nameof(left)); + + if (Equals(right, default(T))) + throw new ArgumentNullException(nameof(right)); + + var leftEnumerable = left.Cast().ToArray(); + var rightEnumerable = right.Cast().ToArray(); + + if (leftEnumerable.Length != rightEnumerable.Length) + return false; + + for (var i = 0; i < leftEnumerable.Length; i++) + { + var leftEl = leftEnumerable[i]; + var rightEl = rightEnumerable[i]; + + if (!AreEqual(leftEl, rightEl, leftEl.GetType())) + { + return false; + } + } + + return true; + } + } +} \ No newline at end of file diff --git a/Vendor/Swan.Lite-3.1.0/Paginator.cs b/Vendor/Swan.Lite-3.1.0/Paginator.cs new file mode 100644 index 0000000..7be3e43 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Paginator.cs @@ -0,0 +1,99 @@ +using System; + +namespace Swan +{ + /// + /// A utility class to compute paging or batching offsets. + /// + public class Paginator + { + /// + /// Initializes a new instance of the class. + /// + /// The total count of items to page over. + /// The desired size of individual pages. + public Paginator(int totalCount, int pageSize) + { + TotalCount = totalCount; + PageSize = pageSize; + PageCount = ComputePageCount(); + } + + /// + /// Gets the desired number of items per page. + /// + public int PageSize { get; } + + /// + /// Gets the total number of items to page over. + /// + public int TotalCount { get; } + + /// + /// Gets the computed number of pages. + /// + public int PageCount { get; } + + /// + /// Gets the start item index of the given page. + /// + /// Zero-based index of the page. + /// The start item index. + public int GetFirstItemIndex(int pageIndex) + { + pageIndex = FixPageIndex(pageIndex); + return pageIndex * PageSize; + } + + /// + /// Gets the end item index of the given page. + /// + /// Zero-based index of the page. + /// The end item index. + public int GetLastItemIndex(int pageIndex) + { + var startIndex = GetFirstItemIndex(pageIndex); + return Math.Min(startIndex + PageSize - 1, TotalCount - 1); + } + + /// + /// Gets the item count of the given page index. + /// + /// Zero-based index of the page. + /// The number of items that the page contains. + public int GetItemCount(int pageIndex) + { + pageIndex = FixPageIndex(pageIndex); + return (pageIndex >= PageCount - 1) + ? GetLastItemIndex(pageIndex) - GetFirstItemIndex(pageIndex) + 1 + : PageSize; + } + + /// + /// Fixes the index of the page by applying bound logic. + /// + /// Index of the page. + /// A limit-bound index. + private int FixPageIndex(int pageIndex) + { + if (pageIndex < 0) return 0; + + return pageIndex >= PageCount ? PageCount - 1 : pageIndex; + } + + /// + /// Computes the number of pages for the paginator. + /// + /// The page count. + private int ComputePageCount() + { + // include this if when you always want at least 1 page + if (TotalCount == 0) + return 0; + + return TotalCount % PageSize != 0 + ? (TotalCount / PageSize) + 1 + : TotalCount / PageSize; + } + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Parsers/ArgumentOptionAttribute.cs b/Vendor/Swan.Lite-3.1.0/Parsers/ArgumentOptionAttribute.cs new file mode 100644 index 0000000..ee3f7e2 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Parsers/ArgumentOptionAttribute.cs @@ -0,0 +1,101 @@ +using System; + +namespace Swan.Parsers +{ + /// + /// Models an option specification. + /// Based on CommandLine (Copyright 2005-2015 Giacomo Stelluti Scala and Contributors.). + /// + [AttributeUsage(AttributeTargets.Property)] + public sealed class ArgumentOptionAttribute + : Attribute + { + /// + /// Initializes a new instance of the class. + /// + /// The long name of the option. + public ArgumentOptionAttribute(string longName) + : this(string.Empty, longName) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// The short name of the option. + /// The long name of the option or null if not used. + public ArgumentOptionAttribute(char shortName, string longName) + : this(new string(shortName, 1), longName) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// The short name of the option.. + public ArgumentOptionAttribute(char shortName) + : this(new string(shortName, 1), string.Empty) + { + } + + private ArgumentOptionAttribute(string shortName, string longName) + { + ShortName = shortName ?? throw new ArgumentNullException(nameof(shortName)); + LongName = longName ?? throw new ArgumentNullException(nameof(longName)); + } + + /// + /// Gets long name of this command line option. This name is usually a single English word. + /// + /// + /// The long name. + /// + public string LongName { get; } + + /// + /// Gets a short name of this command line option, made of one character. + /// + /// + /// The short name. + /// + public string ShortName { get; } + + /// + /// When applying attribute to target properties, + /// it allows you to split an argument and consume its content as a sequence. + /// + public char Separator { get; set; } = '\0'; + + /// + /// Gets or sets mapped property default value. + /// + /// + /// The default value. + /// + public object? DefaultValue { get; set; } + + /// + /// Gets or sets a value indicating whether a command line option is required. + /// + /// + /// true if required; otherwise, false. + /// + public bool Required { get; set; } + + /// + /// Gets or sets a short description of this command line option. Usually a sentence summary. + /// + /// + /// The help text. + /// + public string? HelpText { get; set; } + + /// + /// Gets or sets the default argument. + /// + /// + /// The default argument. + /// + public bool IsDefault { get; set; } + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Parsers/ArgumentParse.Validator.cs b/Vendor/Swan.Lite-3.1.0/Parsers/ArgumentParse.Validator.cs new file mode 100644 index 0000000..c1dc208 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Parsers/ArgumentParse.Validator.cs @@ -0,0 +1,180 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using Swan.Reflection; + +namespace Swan.Parsers +{ + /// + /// Provides methods to parse command line arguments. + /// + /// Based on CommandLine (Copyright 2005-2015 Giacomo Stelluti Scala and Contributors). + /// + public partial class ArgumentParser + { + private sealed class Validator + { + private const char OptionSwitchChar = '-'; + private readonly object _instance; + private readonly IEnumerable _args; + private readonly List _updatedList = new List(); + private readonly ArgumentParserSettings _settings; + + private readonly PropertyInfo[] _properties; + + public Validator( + PropertyInfo[] properties, + IEnumerable args, + object instance, + ArgumentParserSettings settings, + bool hasVerb = false) + { + _args = args; + _instance = instance; + _settings = settings; + _properties = properties; + + PopulateInstance(); + if (!hasVerb) SetDefaultArgument(); + SetDefaultValues(); + GetRequiredList(); + } + + public List UnknownList { get; } = new List(); + public List RequiredList { get; } = new List(); + + public bool IsValid() => (_settings.IgnoreUnknownArguments || !UnknownList.Any()) && !RequiredList.Any(); + + public IEnumerable GetPropertiesOptions() + => _properties.Select(p => AttributeCache.DefaultCache.Value.RetrieveOne(p)) + .Where(x => x != null); + + private void GetRequiredList() + { + foreach (var targetProperty in _properties) + { + var optionAttr = AttributeCache.DefaultCache.Value.RetrieveOne(targetProperty); + + if (optionAttr == null || optionAttr.Required == false) + continue; + + if (targetProperty.GetValue(_instance) == null) + { + RequiredList.Add(optionAttr.LongName ?? optionAttr.ShortName); + } + } + } + + private void SetDefaultValues() + { + foreach (var targetProperty in _properties.Except(_updatedList)) + { + var optionAttr = AttributeCache.DefaultCache.Value.RetrieveOne(targetProperty); + + var defaultValue = optionAttr?.DefaultValue; + + if (defaultValue == null) + continue; + + if (SetPropertyValue(targetProperty, defaultValue.ToString(), _instance, optionAttr)) + _updatedList.Add(targetProperty); + } + } + + private void SetDefaultArgument() + { + foreach (var targetProperty in _properties.Except(_updatedList)) + { + var optionAttr = AttributeCache.DefaultCache.Value.RetrieveOne(targetProperty); + + if (!optionAttr.IsDefault) + continue; + + var defaultArgValue = _args.FirstOrDefault(); + if (string.IsNullOrWhiteSpace(defaultArgValue) || defaultArgValue[0] == OptionSwitchChar) + continue; + + if (SetPropertyValue(targetProperty, defaultArgValue, _instance, optionAttr)) + _updatedList.Add(targetProperty); + } + } + + private void PopulateInstance() + { + var propertyName = string.Empty; + + foreach (var arg in _args) + { + var ignoreSetValue = string.IsNullOrWhiteSpace(propertyName); + + if (ignoreSetValue) + { + if (string.IsNullOrWhiteSpace(arg) || arg[0] != OptionSwitchChar) continue; + + propertyName = arg.Substring(1); + + if (!string.IsNullOrWhiteSpace(propertyName) && propertyName[0] == OptionSwitchChar) + propertyName = propertyName.Substring(1); + } + + var targetProperty = TryGetProperty(propertyName); + + if (targetProperty == null) + { + // Skip if the property is not found + UnknownList.Add(propertyName); + continue; + } + + if (!ignoreSetValue && SetPropertyValue(targetProperty, arg, _instance)) + { + _updatedList.Add(targetProperty); + propertyName = string.Empty; + } + else if (targetProperty.PropertyType == typeof(bool)) + { + // If the arg is a boolean property set it to true. + targetProperty.SetValue(_instance, true); + + _updatedList.Add(targetProperty); + propertyName = string.Empty; + } + } + + if (!string.IsNullOrEmpty(propertyName)) + { + UnknownList.Add(propertyName); + } + } + + private bool SetPropertyValue( + PropertyInfo targetProperty, + string propertyValueString, + object result, + ArgumentOptionAttribute? optionAttr = null) + { + if (!targetProperty.PropertyType.IsEnum) + { + return targetProperty.PropertyType.IsArray + ? targetProperty.TrySetArray(propertyValueString.Split(optionAttr?.Separator ?? ','), result) + : targetProperty.TrySetBasicType(propertyValueString, result); + } + + var parsedValue = Enum.Parse( + targetProperty.PropertyType, + propertyValueString, + _settings.CaseInsensitiveEnumValues); + + targetProperty.SetValue(result, Enum.ToObject(targetProperty.PropertyType, parsedValue)); + + return true; + } + + private PropertyInfo TryGetProperty(string propertyName) + => _properties.FirstOrDefault(p => + string.Equals(AttributeCache.DefaultCache.Value.RetrieveOne(p)?.LongName, propertyName, _settings.NameComparer) || + string.Equals(AttributeCache.DefaultCache.Value.RetrieveOne(p)?.ShortName, propertyName, _settings.NameComparer)); + } + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Parsers/ArgumentParser.TypeResolver.cs b/Vendor/Swan.Lite-3.1.0/Parsers/ArgumentParser.TypeResolver.cs new file mode 100644 index 0000000..2ca5798 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Parsers/ArgumentParser.TypeResolver.cs @@ -0,0 +1,63 @@ +using System; +using System.Linq; +using System.Reflection; +using Swan.Reflection; + +namespace Swan.Parsers +{ + /// + /// Provides methods to parse command line arguments. + /// + public partial class ArgumentParser + { + private sealed class TypeResolver + { + public bool HasVerb { get; } + + private bool _hasVerb = false; + + private readonly string _selectedVerb; + + private PropertyInfo[]? _properties; + + public TypeResolver(string selectedVerb) + { + _selectedVerb = selectedVerb; + } + + public PropertyInfo[]? Properties => _properties?.Any() == true ? _properties : null; + + public object? GetOptionsObject(T instance) + { + _properties = PropertyTypeCache.DefaultCache.Value.RetrieveAllProperties(true).ToArray(); + + if (!_properties.Any(x => x.GetCustomAttributes(typeof(VerbOptionAttribute), false).Any())) + return instance; + + _hasVerb = true; + + var selectedVerb = string.IsNullOrWhiteSpace(_selectedVerb) + ? null + : _properties.FirstOrDefault(x => + AttributeCache.DefaultCache.Value.RetrieveOne(x).Name == _selectedVerb); + + if (selectedVerb == null) return null; + + var type = instance.GetType(); + + var verbProperty = type.GetProperty(selectedVerb.Name); + + if (verbProperty?.GetValue(instance) == null) + { + var propertyInstance = Activator.CreateInstance(selectedVerb.PropertyType); + verbProperty?.SetValue(instance, propertyInstance); + } + + _properties = PropertyTypeCache.DefaultCache.Value.RetrieveAllProperties(selectedVerb.PropertyType, true) + .ToArray(); + + return verbProperty?.GetValue(instance); + } + } + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Parsers/ArgumentParser.cs b/Vendor/Swan.Lite-3.1.0/Parsers/ArgumentParser.cs new file mode 100644 index 0000000..2bfc5b8 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Parsers/ArgumentParser.cs @@ -0,0 +1,253 @@ +using Swan.Reflection; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace Swan.Parsers +{ + /// + /// Provides methods to parse command line arguments. + /// Based on CommandLine (Copyright 2005-2015 Giacomo Stelluti Scala and Contributors.). + /// + /// + /// The following example shows how to parse CLI arguments into objects. + /// + /// class Example + /// { + /// using System; + /// using Swan.Parsers; + /// + /// static void Main(string[] args) + /// { + /// // parse the supplied command-line arguments into the options object + /// var res = Runtime.ArgumentParser.ParseArguments(args, out var options); + /// } + /// + /// class Options + /// { + /// [ArgumentOption('v', "verbose", HelpText = "Set verbose mode.")] + /// public bool Verbose { get; set; } + /// + /// [ArgumentOption('u', Required = true, HelpText = "Set user name.")] + /// public string Username { get; set; } + /// + /// [ArgumentOption('n', "names", Separator = ',', + /// Required = true, HelpText = "A list of files separated by a comma")] + /// public string[] Files { get; set; } + /// + /// [ArgumentOption('p', "port", DefaultValue = 22, HelpText = "Set port.")] + /// public int Port { get; set; } + /// + /// [ArgumentOption("color", DefaultValue = ConsoleColor.Red, + /// HelpText = "Set a color.")] + /// public ConsoleColor Color { get; set; } + /// } + /// } + /// + /// The following code describes how to parse CLI verbs. + /// + /// class Example2 + /// { + /// using Swan; + /// using Swan.Parsers; + /// + /// static void Main(string[] args) + /// { + /// // create an instance of the VerbOptions class + /// var options = new VerbOptions(); + /// + /// // parse the supplied command-line arguments into the options object + /// var res = Runtime.ArgumentParser.ParseArguments(args, options); + /// + /// // if there were no errors parsing + /// if (res) + /// { + /// if(options.Run != null) + /// { + /// // run verb was selected + /// } + /// + /// if(options.Print != null) + /// { + /// // print verb was selected + /// } + /// } + /// + /// // flush all error messages + /// Terminal.Flush(); + /// } + /// + /// class VerbOptions + /// { + /// [VerbOption("run", HelpText = "Run verb.")] + /// public RunVerbOption Run { get; set; } + /// + /// [VerbOption("print", HelpText = "Print verb.")] + /// public PrintVerbOption Print { get; set; } + /// } + /// + /// class RunVerbOption + /// { + /// [ArgumentOption('o', "outdir", HelpText = "Output directory", + /// DefaultValue = "", Required = false)] + /// public string OutDir { get; set; } + /// } + /// + /// class PrintVerbOption + /// { + /// [ArgumentOption('t', "text", HelpText = "Text to print", + /// DefaultValue = "", Required = false)] + /// public string Text { get; set; } + /// } + /// } + /// + /// + public partial class ArgumentParser + { + /// + /// Initializes a new instance of the class. + /// + public ArgumentParser() + : this(new ArgumentParserSettings()) + { + } + + /// + /// Initializes a new instance of the class, + /// configurable with using a delegate. + /// + /// The parse settings. + public ArgumentParser(ArgumentParserSettings parseSettings) + { + Settings = parseSettings ?? throw new ArgumentNullException(nameof(parseSettings)); + } + + /// + /// Gets the current. + /// + /// + /// The current. + /// + public static ArgumentParser Current { get; } = new ArgumentParser(); + + /// + /// Gets the instance that implements in use. + /// + /// + /// The settings. + /// + public ArgumentParserSettings Settings { get; } + + /// + /// Parses a string array of command line arguments constructing values in an instance of type . + /// + /// The type of the options. + /// The arguments. + /// The instance. + /// + /// true if was converted successfully; otherwise, false. + /// + /// + /// The exception that is thrown when a null reference (Nothing in Visual Basic) + /// is passed to a method that does not accept it as a valid argument. + /// + /// + /// The exception that is thrown when a method call is invalid for the object's current state. + /// + public bool ParseArguments(IEnumerable args, out T instance) + { + instance = Activator.CreateInstance(); + return ParseArguments(args, instance); + } + + /// + /// Parses a string array of command line arguments constructing values in an instance of type . + /// + /// The type of the options. + /// The arguments. + /// The instance. + /// + /// true if was converted successfully; otherwise, false. + /// + /// + /// The exception that is thrown when a null reference (Nothing in Visual Basic) + /// is passed to a method that does not accept it as a valid argument. + /// + /// + /// The exception that is thrown when a method call is invalid for the object's current state. + /// + public bool ParseArguments(IEnumerable args, T instance) + { + if (args == null) + throw new ArgumentNullException(nameof(args)); + + if (Equals(instance, default(T))) + throw new ArgumentNullException(nameof(instance)); + + var typeResolver = new TypeResolver(args.FirstOrDefault()); + var options = typeResolver.GetOptionsObject(instance); + + if (options == null) + { + ReportUnknownVerb(); + return false; + } + + if (typeResolver.Properties == null) + throw new InvalidOperationException($"Type {typeof(T).Name} is not valid"); + + var validator = new Validator(typeResolver.Properties, args, options, Settings, typeResolver.HasVerb); + + if (validator.IsValid()) + return true; + + ReportIssues(validator); + return false; + } + + private static void ReportUnknownVerb() + { + Terminal.WriteLine("No verb was specified", ConsoleColor.Red); + Terminal.WriteLine("Valid verbs:", ConsoleColor.Cyan); + + PropertyTypeCache.DefaultCache.Value + .RetrieveAllProperties(true) + .Select(x => AttributeCache.DefaultCache.Value.RetrieveOne(x)) + .Where(x => x != null) + .ToList() + .ForEach(x => Terminal.WriteLine(x.ToString(), ConsoleColor.Cyan)); + } + + private void ReportIssues(Validator validator) + { + if (Settings.WriteBanner) + Terminal.WriteWelcomeBanner(); + + var options = validator.GetPropertiesOptions(); + + foreach (var option in options) + { + Terminal.WriteLine(string.Empty); + + // TODO: If Enum list values + var shortName = string.IsNullOrWhiteSpace(option.ShortName) ? string.Empty : $"-{option.ShortName}"; + var longName = string.IsNullOrWhiteSpace(option.LongName) ? string.Empty : $"--{option.LongName}"; + var comma = string.IsNullOrWhiteSpace(shortName) || string.IsNullOrWhiteSpace(longName) + ? string.Empty + : ", "; + var defaultValue = option.DefaultValue == null ? string.Empty : $"(Default: {option.DefaultValue}) "; + + Terminal.WriteLine($" {shortName}{comma}{longName}\t\t{defaultValue}{option.HelpText}", ConsoleColor.Cyan); + } + + Terminal.WriteLine(string.Empty); + Terminal.WriteLine(" --help\t\tDisplay this help screen.", ConsoleColor.Cyan); + + if (validator.UnknownList.Any()) + Terminal.WriteLine($"Unknown arguments: {string.Join(", ", validator.UnknownList)}", ConsoleColor.Red); + + if (validator.RequiredList.Any()) + Terminal.WriteLine($"Required arguments: {string.Join(", ", validator.RequiredList)}", ConsoleColor.Red); + } + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Parsers/ArgumentParserSettings.cs b/Vendor/Swan.Lite-3.1.0/Parsers/ArgumentParserSettings.cs new file mode 100644 index 0000000..dbe2f5b --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Parsers/ArgumentParserSettings.cs @@ -0,0 +1,53 @@ +using System; + +namespace Swan.Parsers +{ + /// + /// Provides settings for . + /// Based on CommandLine (Copyright 2005-2015 Giacomo Stelluti Scala and Contributors.). + /// + public class ArgumentParserSettings + { + /// + /// Gets or sets a value indicating whether [write banner]. + /// + /// + /// true if [write banner]; otherwise, false. + /// + public bool WriteBanner { get; set; } = true; + + /// + /// Gets or sets a value indicating whether perform case sensitive comparisons. + /// Note that case insensitivity only applies to parameters, not the values + /// assigned to them (for example, enum parsing). + /// + /// + /// true if [case sensitive]; otherwise, false. + /// + public bool CaseSensitive { get; set; } = false; + + /// + /// Gets or sets a value indicating whether perform case sensitive comparisons of values. + /// Note that case insensitivity only applies to values, not the parameters. + /// + /// + /// true if [case insensitive enum values]; otherwise, false. + /// + public bool CaseInsensitiveEnumValues { get; set; } = true; + + /// + /// Gets or sets a value indicating whether the parser shall move on to the next argument and ignore the given argument if it + /// encounter an unknown arguments. + /// + /// + /// true to allow parsing the arguments with different class options that do not have all the arguments. + /// + /// + /// This allows fragmented version class parsing, useful for project with add-on where add-ons also requires command line arguments but + /// when these are unknown by the main program at build time. + /// + public bool IgnoreUnknownArguments { get; set; } = true; + + internal StringComparison NameComparer => CaseSensitive ? StringComparison.Ordinal : StringComparison.OrdinalIgnoreCase; + } +} \ No newline at end of file diff --git a/Vendor/Swan.Lite-3.1.0/Parsers/ExpressionParser.cs b/Vendor/Swan.Lite-3.1.0/Parsers/ExpressionParser.cs new file mode 100644 index 0000000..c189e70 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Parsers/ExpressionParser.cs @@ -0,0 +1,117 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; + +namespace Swan.Parsers +{ + /// + /// Represents a generic expression parser. + /// + public abstract class ExpressionParser + { + /// + /// Resolves the expression. + /// + /// The type of expression result. + /// The tokens. + /// The representation of the expression parsed. + public virtual T ResolveExpression(IEnumerable tokens) => + ResolveExpression(tokens, System.Globalization.CultureInfo.InvariantCulture); + + /// + /// Resolves the expression. + /// + /// The type of expression result. + /// The tokens. + /// The format provider. + /// The representation of the expression parsed. + public virtual T ResolveExpression(IEnumerable tokens, IFormatProvider formatProvider) + { + var conversion = Expression.Convert(Parse(tokens,formatProvider), typeof(T)); + return Expression.Lambda>(conversion).Compile()(); + } + + /// + /// Parses the specified tokens. + /// + /// The tokens. + /// + /// The final expression. + /// + public virtual Expression Parse(IEnumerable tokens) => + Parse(tokens, System.Globalization.CultureInfo.InvariantCulture); + + /// + /// Parses the specified tokens. + /// + /// The tokens. + /// The format provider. + /// + /// The final expression. + /// + public virtual Expression Parse(IEnumerable tokens, IFormatProvider formatProvider) + { + var expressionStack = new List>(); + + foreach (var token in tokens) + { + if (expressionStack.Any() == false) + expressionStack.Add(new Stack()); + + switch (token.Type) + { + case TokenType.Wall: + expressionStack.Add(new Stack()); + break; + case TokenType.Number: + expressionStack.Last().Push(Expression.Constant(Convert.ToDecimal(token.Value, formatProvider))); + break; + case TokenType.Variable: + ResolveVariable(token.Value, expressionStack.Last()); + break; + case TokenType.String: + expressionStack.Last().Push(Expression.Constant(token.Value)); + break; + case TokenType.Operator: + ResolveOperator(token.Value, expressionStack.Last()); + break; + case TokenType.Function: + ResolveFunction(token.Value, expressionStack.Last()); + + if (expressionStack.Count > 1 && expressionStack.Last().Count == 1) + { + var lastValue = expressionStack.Last().Pop(); + expressionStack.Remove(expressionStack.Last()); + expressionStack.Last().Push(lastValue); + } + + break; + } + } + + return expressionStack.Last().Pop(); + } + + /// + /// Resolves the variable. + /// + /// The value. + /// The expression stack. + public abstract void ResolveVariable(string value, Stack expressionStack); + + /// + /// Resolves the operator. + /// + /// The value. + /// The expression stack. + public abstract void ResolveOperator(string value, Stack expressionStack); + + /// + /// Resolves the function. + /// + /// The value. + /// The expression stack. + public abstract void ResolveFunction(string value, Stack expressionStack); + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Parsers/Operator.cs b/Vendor/Swan.Lite-3.1.0/Parsers/Operator.cs new file mode 100644 index 0000000..598645a --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Parsers/Operator.cs @@ -0,0 +1,32 @@ +namespace Swan.Parsers +{ + /// + /// Represents an operator with precedence. + /// + public class Operator + { + /// + /// Gets or sets the name. + /// + /// + /// The name. + /// + public string Name { get; set; } + + /// + /// Gets or sets the precedence. + /// + /// + /// The precedence. + /// + public int Precedence { get; set; } + + /// + /// Gets or sets a value indicating whether [right associative]. + /// + /// + /// true if [right associative]; otherwise, false. + /// + public bool RightAssociative { get; set; } + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Parsers/Token.cs b/Vendor/Swan.Lite-3.1.0/Parsers/Token.cs new file mode 100644 index 0000000..20d30b8 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Parsers/Token.cs @@ -0,0 +1,35 @@ +namespace Swan.Parsers +{ + /// + /// Represents a Token structure. + /// + public struct Token + { + /// + /// Initializes a new instance of the struct. + /// + /// The type. + /// The value. + public Token(TokenType type, string value) + { + Type = type; + Value = type == TokenType.Function || type == TokenType.Operator ? value.ToLowerInvariant() : value; + } + + /// + /// Gets or sets the type. + /// + /// + /// The type. + /// + public TokenType Type { get; set; } + + /// + /// Gets the value. + /// + /// + /// The value. + /// + public string Value { get; } + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Parsers/TokenType.cs b/Vendor/Swan.Lite-3.1.0/Parsers/TokenType.cs new file mode 100644 index 0000000..5777f0d --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Parsers/TokenType.cs @@ -0,0 +1,48 @@ +namespace Swan.Parsers +{ + /// + /// Enums the token types. + /// + public enum TokenType + { + /// + /// The number + /// + Number, + + /// + /// The string + /// + String, + + /// + /// The variable + /// + Variable, + + /// + /// The function + /// + Function, + + /// + /// The parenthesis + /// + Parenthesis, + + /// + /// The operator + /// + Operator, + + /// + /// The comma + /// + Comma, + + /// + /// The wall, used to specified the end of argument list of the following function + /// + Wall, + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Parsers/Tokenizer.cs b/Vendor/Swan.Lite-3.1.0/Parsers/Tokenizer.cs new file mode 100644 index 0000000..4d56714 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Parsers/Tokenizer.cs @@ -0,0 +1,361 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace Swan.Parsers +{ + /// + /// Represents a generic tokenizer. + /// + public abstract class Tokenizer + { + private const char PeriodChar = '.'; + private const char CommaChar = ','; + private const char StringQuotedChar = '"'; + private const char OpenFuncChar = '('; + private const char CloseFuncChar = ')'; + private const char NegativeChar = '-'; + + private const string OpenFuncStr = "("; + + private readonly List _operators = new List(); + + /// + /// Initializes a new instance of the class. + /// This constructor will use the following default operators: + /// + /// + /// + /// Operator + /// Precedence + /// + /// + /// = + /// 1 + /// + /// + /// != + /// 1 + /// + /// + /// > + /// 2 + /// + /// + /// < + /// 2 + /// + /// + /// >= + /// 2 + /// + /// + /// <= + /// 2 + /// + /// + /// + + /// 3 + /// + /// + /// & + /// 3 + /// + /// + /// - + /// 3 + /// + /// + /// * + /// 4 + /// + /// + /// (backslash) + /// 4 + /// + /// + /// / + /// 4 + /// + /// + /// ^ + /// 4 + /// + /// + /// + /// The input. + protected Tokenizer(string input) + { + _operators.AddRange(GetDefaultOperators()); + Tokenize(input); + } + + /// + /// Initializes a new instance of the class. + /// + /// The input. + /// The operators to use. + protected Tokenizer(string input, IEnumerable operators) + { + _operators.AddRange(operators); + Tokenize(input); + } + + /// + /// Gets the tokens. + /// + /// + /// The tokens. + /// + public List Tokens { get; } = new List(); + + /// + /// Validates the input and return the start index for tokenizer. + /// + /// The input. + /// The start index. + /// true if the input is valid, otherwise false. + public abstract bool ValidateInput(string input, out int startIndex); + + /// + /// Resolves the type of the function or member. + /// + /// The input. + /// The token type. + public abstract TokenType ResolveFunctionOrMemberType(string input); + + /// + /// Evaluates the function or member. + /// + /// The input. + /// The position. + /// true if the input is a valid function or variable, otherwise false. + public virtual bool EvaluateFunctionOrMember(string input, int position) => false; + + /// + /// Gets the default operators. + /// + /// An array with the operators to use for the tokenizer. + public virtual Operator[] GetDefaultOperators() => new[] + { + new Operator {Name = "=", Precedence = 1}, + new Operator {Name = "!=", Precedence = 1}, + new Operator {Name = ">", Precedence = 2}, + new Operator {Name = "<", Precedence = 2}, + new Operator {Name = ">=", Precedence = 2}, + new Operator {Name = "<=", Precedence = 2}, + new Operator {Name = "+", Precedence = 3}, + new Operator {Name = "&", Precedence = 3}, + new Operator {Name = "-", Precedence = 3}, + new Operator {Name = "*", Precedence = 4}, + new Operator {Name = "/", Precedence = 4}, + new Operator {Name = "\\", Precedence = 4}, + new Operator {Name = "^", Precedence = 4}, + }; + + /// + /// Shunting the yard. + /// + /// if set to true [include function stopper] (Token type Wall). + /// + /// Enumerable of the token in in. + /// + /// + /// Wrong token + /// or + /// Mismatched parenthesis. + /// + public virtual IEnumerable ShuntingYard(bool includeFunctionStopper = true) + { + var stack = new Stack(); + + foreach (var tok in Tokens) + { + switch (tok.Type) + { + case TokenType.Number: + case TokenType.Variable: + case TokenType.String: + yield return tok; + break; + case TokenType.Function: + stack.Push(tok); + break; + case TokenType.Operator: + while (stack.Any() && stack.Peek().Type == TokenType.Operator && + CompareOperators(tok.Value, stack.Peek().Value)) + yield return stack.Pop(); + + stack.Push(tok); + break; + case TokenType.Comma: + while (stack.Any() && (stack.Peek().Type != TokenType.Comma && + stack.Peek().Type != TokenType.Parenthesis)) + yield return stack.Pop(); + + break; + case TokenType.Parenthesis: + if (tok.Value == OpenFuncStr) + { + if (stack.Any() && stack.Peek().Type == TokenType.Function) + { + if (includeFunctionStopper) + yield return new Token(TokenType.Wall, tok.Value); + } + + stack.Push(tok); + } + else + { + while (stack.Peek().Value != OpenFuncStr) + yield return stack.Pop(); + + stack.Pop(); + + if (stack.Any() && stack.Peek().Type == TokenType.Function) + { + yield return stack.Pop(); + } + } + + break; + default: + throw new InvalidOperationException("Wrong token"); + } + } + + while (stack.Any()) + { + var tok = stack.Pop(); + if (tok.Type == TokenType.Parenthesis) + throw new InvalidOperationException("Mismatched parenthesis"); + + yield return tok; + } + } + + private static bool CompareOperators(Operator op1, Operator op2) => op1.RightAssociative + ? op1.Precedence < op2.Precedence + : op1.Precedence <= op2.Precedence; + + private void Tokenize(string input) + { + if (!ValidateInput(input, out var startIndex)) + { + return; + } + + for (var i = startIndex; i < input.Length; i++) + { + if (char.IsWhiteSpace(input, i)) continue; + + if (input[i] == CommaChar) + { + Tokens.Add(new Token(TokenType.Comma, new string(new[] { input[i] }))); + continue; + } + + if (input[i] == StringQuotedChar) + { + i = ExtractString(input, i); + continue; + } + + if (char.IsLetter(input, i) || EvaluateFunctionOrMember(input, i)) + { + i = ExtractFunctionOrMember(input, i); + + continue; + } + + if (char.IsNumber(input, i) || ( + input[i] == NegativeChar && + ((Tokens.Any() && Tokens.Last().Type != TokenType.Number) || !Tokens.Any()))) + { + i = ExtractNumber(input, i); + continue; + } + + if (input[i] == OpenFuncChar || + input[i] == CloseFuncChar) + { + Tokens.Add(new Token(TokenType.Parenthesis, new string(new[] { input[i] }))); + continue; + } + + i = ExtractOperator(input, i); + } + } + + private int ExtractData( + string input, + int i, + Func tokenTypeEvaluation, + Func evaluation, + int right = 0, + int left = -1) + { + var charCount = 0; + for (var j = i + right; j < input.Length; j++) + { + if (evaluation(input[j])) + break; + + charCount++; + } + + // Extract and set the value + var value = input.SliceLength(i + right, charCount); + Tokens.Add(new Token(tokenTypeEvaluation(value), value)); + + i += charCount + left; + return i; + } + + private int ExtractOperator(string input, int i) => + ExtractData( + input, + i, + x => TokenType.Operator, + x => x == OpenFuncChar || + x == CommaChar || + x == PeriodChar || + x == StringQuotedChar || + char.IsWhiteSpace(x) || + char.IsNumber(x)); + + private int ExtractFunctionOrMember(string input, int i) => + ExtractData( + input, + i, + ResolveFunctionOrMemberType, + x => x == OpenFuncChar || + x == CloseFuncChar || + x == CommaChar || + char.IsWhiteSpace(x)); + + private int ExtractNumber(string input, int i) => + ExtractData( + input, + i, + x => TokenType.Number, + x => !char.IsNumber(x) && x != PeriodChar && x != NegativeChar); + + private int ExtractString(string input, int i) + { + var length = ExtractData(input, i, x => TokenType.String, x => x == StringQuotedChar, 1, 1); + + // open string, report issue + if (length == input.Length && input[length - 1] != StringQuotedChar) + throw new FormatException($"Parser error (Position {i}): Expected '\"' but got '{input[length - 1]}'."); + + return length; + } + + private bool CompareOperators(string op1, string op2) + => CompareOperators(GetOperatorOrDefault(op1), GetOperatorOrDefault(op2)); + + private Operator GetOperatorOrDefault(string op) + => _operators.FirstOrDefault(x => x.Name == op) ?? new Operator { Name = op, Precedence = 0 }; + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Parsers/VerbOptionAttribute.cs b/Vendor/Swan.Lite-3.1.0/Parsers/VerbOptionAttribute.cs new file mode 100644 index 0000000..79496b2 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Parsers/VerbOptionAttribute.cs @@ -0,0 +1,40 @@ +using System; + +namespace Swan.Parsers +{ + /// + /// Models a verb option. + /// + [AttributeUsage(AttributeTargets.Property)] + public sealed class VerbOptionAttribute : Attribute + { + /// + /// Initializes a new instance of the class. + /// + /// The name. + /// name. + public VerbOptionAttribute(string name) + { + Name = name ?? throw new ArgumentNullException(nameof(name)); + } + + /// + /// Gets the name of the verb option. + /// + /// + /// Name. + /// + public string Name { get; } + + /// + /// Gets or sets a short description of this command line verb. Usually a sentence summary. + /// + /// + /// The help text. + /// + public string HelpText { get; set; } + + /// + public override string ToString() => $" {Name}\t\t{HelpText}"; + } +} \ No newline at end of file diff --git a/Vendor/Swan.Lite-3.1.0/Reflection/AttributeCache.cs b/Vendor/Swan.Lite-3.1.0/Reflection/AttributeCache.cs new file mode 100644 index 0000000..c4440af --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Reflection/AttributeCache.cs @@ -0,0 +1,188 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; + +namespace Swan.Reflection +{ + /// + /// A thread-safe cache of attributes belonging to a given key (MemberInfo or Type). + /// + /// The Retrieve method is the most useful one in this class as it + /// calls the retrieval process if the type is not contained + /// in the cache. + /// + public class AttributeCache + { + private readonly Lazy, IEnumerable>> _data = + new Lazy, IEnumerable>>(() => + new ConcurrentDictionary, IEnumerable>(), true); + + /// + /// Initializes a new instance of the class. + /// + /// The property cache object. + public AttributeCache(PropertyTypeCache? propertyCache = null) + { + PropertyTypeCache = propertyCache ?? PropertyTypeCache.DefaultCache.Value; + } + + /// + /// Gets the default cache. + /// + /// + /// The default cache. + /// + public static Lazy DefaultCache { get; } = new Lazy(() => new AttributeCache()); + + /// + /// A PropertyTypeCache object for caching properties and their attributes. + /// + public PropertyTypeCache PropertyTypeCache { get; } + + /// + /// Determines whether [contains] [the specified member]. + /// + /// The type of the attribute to be retrieved. + /// The member. + /// + /// true if [contains] [the specified member]; otherwise, false. + /// + public bool Contains(MemberInfo member) => _data.Value.ContainsKey(new Tuple(member, typeof(T))); + + /// + /// Gets specific attributes from a member constrained to an attribute. + /// + /// The type of the attribute to be retrieved. + /// The member. + /// true to inspect the ancestors of element; otherwise, false. + /// An array of the attributes stored for the specified type. + public IEnumerable Retrieve(MemberInfo member, bool inherit = false) + where T : Attribute + { + if (member == null) + throw new ArgumentNullException(nameof(member)); + + return Retrieve(new Tuple(member, typeof(T)), t => member.GetCustomAttributes(inherit)); + } + + /// + /// Gets all attributes of a specific type from a member. + /// + /// The member. + /// The attribute type. + /// true to inspect the ancestors of element; otherwise, false. + /// An array of the attributes stored for the specified type. + public IEnumerable Retrieve(MemberInfo member, Type type, bool inherit = false) + { + if (member == null) + throw new ArgumentNullException(nameof(member)); + + if (type == null) + throw new ArgumentNullException(nameof(type)); + + return Retrieve( + new Tuple(member, type), + t => member.GetCustomAttributes(type, inherit)); + } + + /// + /// Gets one attribute of a specific type from a member. + /// + /// The attribute type. + /// The member. + /// true to inspect the ancestors of element; otherwise, false. + /// An attribute stored for the specified type. + public T RetrieveOne(MemberInfo member, bool inherit = false) + where T : Attribute + { + if (member == null) + return default; + + var attr = Retrieve( + new Tuple(member, typeof(T)), + t => member.GetCustomAttributes(typeof(T), inherit)); + + return ConvertToAttribute(attr); + } + + /// + /// Gets one attribute of a specific type from a generic type. + /// + /// The type of the attribute. + /// The type to retrieve the attribute. + /// if set to true [inherit]. + /// An attribute stored for the specified type. + public TAttribute RetrieveOne(bool inherit = false) + where TAttribute : Attribute + { + var attr = Retrieve( + new Tuple(typeof(T), typeof(TAttribute)), + t => typeof(T).GetCustomAttributes(typeof(TAttribute), inherit)); + + return ConvertToAttribute(attr); + } + + /// + /// Gets all properties an their attributes of a given type constrained to only attributes. + /// + /// The type of the attribute to retrieve. + /// The type of the object. + /// true to inspect the ancestors of element; otherwise, false. + /// A dictionary of the properties and their attributes stored for the specified type. + public Dictionary> Retrieve(Type type, bool inherit = false) + where T : Attribute => + PropertyTypeCache.RetrieveAllProperties(type, true) + .ToDictionary(x => x, x => Retrieve(x, inherit)); + + /// + /// Gets all properties and their attributes of a given type. + /// + /// The object type used to extract the properties from. + /// The type of the attribute. + /// true to inspect the ancestors of element; otherwise, false. + /// + /// A dictionary of the properties and their attributes stored for the specified type. + /// + public Dictionary> RetrieveFromType(bool inherit = false) + => RetrieveFromType(typeof(TAttribute), inherit); + + /// + /// Gets all properties and their attributes of a given type. + /// + /// The object type used to extract the properties from. + /// Type of the attribute. + /// true to inspect the ancestors of element; otherwise, false. + /// + /// A dictionary of the properties and their attributes stored for the specified type. + /// + public Dictionary> RetrieveFromType(Type attributeType, bool inherit = false) + { + if (attributeType == null) + throw new ArgumentNullException(nameof(attributeType)); + + return PropertyTypeCache.RetrieveAllProperties(true) + .ToDictionary(x => x, x => Retrieve(x, attributeType, inherit)); + } + + private static T ConvertToAttribute(IEnumerable attr) + where T : Attribute + { + if (attr?.Any() != true) + return default; + + return attr.Count() == 1 + ? (T) Convert.ChangeType(attr.First(), typeof(T)) + : throw new AmbiguousMatchException("Multiple custom attributes of the same type found."); + } + + private IEnumerable Retrieve(Tuple key, Func, IEnumerable> factory) + { + if (factory == null) + throw new ArgumentNullException(nameof(factory)); + + return _data.Value.GetOrAdd(key, k => factory.Invoke(k).Where(item => item != null)); + } + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Reflection/ConstructorTypeCache.cs b/Vendor/Swan.Lite-3.1.0/Reflection/ConstructorTypeCache.cs new file mode 100644 index 0000000..9098e0c --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Reflection/ConstructorTypeCache.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; + +namespace Swan.Reflection +{ + /// + /// A thread-safe cache of constructors belonging to a given type. + /// + public class ConstructorTypeCache : TypeCache> + { + /// + /// Gets the default cache. + /// + /// + /// The default cache. + /// + public static Lazy DefaultCache { get; } = + new Lazy(() => new ConstructorTypeCache()); + + /// + /// Retrieves all constructors order by the number of parameters ascending. + /// + /// The type to inspect. + /// if set to true [include non public]. + /// + /// A collection with all the constructors in the given type. + /// + public IEnumerable> RetrieveAllConstructors(bool includeNonPublic = false) + => Retrieve(GetConstructors(includeNonPublic)); + + /// + /// Retrieves all constructors order by the number of parameters ascending. + /// + /// The type. + /// if set to true [include non public]. + /// + /// A collection with all the constructors in the given type. + /// + public IEnumerable> RetrieveAllConstructors(Type type, bool includeNonPublic = false) + => Retrieve(type, GetConstructors(includeNonPublic)); + + private static Func>> GetConstructors(bool includeNonPublic) + => t => t.GetConstructors(includeNonPublic ? BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance : BindingFlags.Public | BindingFlags.Instance) + .Select(x => Tuple.Create(x, x.GetParameters())) + .OrderBy(x => x.Item2.Length) + .ToList(); + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Reflection/ExtendedTypeInfo.cs b/Vendor/Swan.Lite-3.1.0/Reflection/ExtendedTypeInfo.cs new file mode 100644 index 0000000..fbaed95 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Reflection/ExtendedTypeInfo.cs @@ -0,0 +1,267 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Globalization; +using System.Linq; +using System.Reflection; + +namespace Swan.Reflection +{ + /// + /// Provides extended information about a type. + /// + /// This class is mainly used to define sets of types within the Definition class + /// and it is not meant for other than querying the BasicTypesInfo dictionary. + /// + public class ExtendedTypeInfo + { + private const string TryParseMethodName = nameof(byte.TryParse); + private const string ToStringMethodName = nameof(ToString); + + private static readonly Type[] NumericTypes = + { + typeof(byte), + typeof(sbyte), + typeof(decimal), + typeof(double), + typeof(float), + typeof(int), + typeof(uint), + typeof(long), + typeof(ulong), + typeof(short), + typeof(ushort), + }; + + private readonly ParameterInfo[]? _tryParseParameters; + private readonly int _toStringArgumentLength; + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + /// The t. + public ExtendedTypeInfo(Type t) + { + Type = t ?? throw new ArgumentNullException(nameof(t)); + IsNullableValueType = Type.IsGenericType + && Type.GetGenericTypeDefinition() == typeof(Nullable<>); + + IsValueType = t.IsValueType; + + UnderlyingType = IsNullableValueType ? + new NullableConverter(Type).UnderlyingType : + Type; + + IsNumeric = NumericTypes.Contains(UnderlyingType); + + // Extract the TryParse method info + try + { + TryParseMethodInfo = UnderlyingType.GetMethod(TryParseMethodName, + new[] { typeof(string), typeof(NumberStyles), typeof(IFormatProvider), UnderlyingType.MakeByRefType() }) ?? + UnderlyingType.GetMethod(TryParseMethodName, + new[] { typeof(string), UnderlyingType.MakeByRefType() }); + + _tryParseParameters = TryParseMethodInfo?.GetParameters(); + } + catch + { + // ignored + } + + // Extract the ToString method Info + try + { + ToStringMethodInfo = UnderlyingType.GetMethod(ToStringMethodName, + new[] { typeof(IFormatProvider) }) ?? + UnderlyingType.GetMethod(ToStringMethodName, + Array.Empty()); + + _toStringArgumentLength = ToStringMethodInfo?.GetParameters().Length ?? 0; + } + catch + { + // ignored + } + } + + #endregion + + #region Properties + + /// + /// Gets the type this extended info class provides for. + /// + /// + /// The type. + /// + public Type Type { get; } + + /// + /// Gets a value indicating whether the type is a nullable value type. + /// + /// + /// true if this instance is nullable value type; otherwise, false. + /// + public bool IsNullableValueType { get; } + + /// + /// Gets a value indicating whether the type or underlying type is numeric. + /// + /// + /// true if this instance is numeric; otherwise, false. + /// + public bool IsNumeric { get; } + + /// + /// Gets a value indicating whether the type is value type. + /// Nullable value types have this property set to False. + /// + public bool IsValueType { get; } + + /// + /// When dealing with nullable value types, this property will + /// return the underlying value type of the nullable, + /// Otherwise it will return the same type as the Type property. + /// + /// + /// The type of the underlying. + /// + public Type UnderlyingType { get; } + + /// + /// Gets the try parse method information. If the type does not contain + /// a suitable TryParse static method, it will return null. + /// + /// + /// The try parse method information. + /// + public MethodInfo TryParseMethodInfo { get; } + + /// + /// Gets the ToString method info + /// It will prefer the overload containing the IFormatProvider argument. + /// + /// + /// To string method information. + /// + public MethodInfo ToStringMethodInfo { get; } + + /// + /// Gets a value indicating whether the type contains a suitable TryParse method. + /// + /// + /// true if this instance can parse natively; otherwise, false. + /// + public bool CanParseNatively => TryParseMethodInfo != null; + + #endregion + + #region Methods + + /// + /// Tries to parse the string into an object of the type this instance represents. + /// Returns false when no suitable TryParse methods exists for the type or when parsing fails + /// for any reason. When possible, this method uses CultureInfo.InvariantCulture and NumberStyles.Any. + /// + /// The s. + /// The result. + /// true if parse was converted successfully; otherwise, false. + public bool TryParse(string s, out object? result) + { + result = Type.GetDefault(); + + try + { + if (Type == typeof(string)) + { + result = Convert.ChangeType(s, Type, CultureInfo.InvariantCulture); + return true; + } + + if ((IsNullableValueType && string.IsNullOrEmpty(s)) || !CanParseNatively) + { + return true; + } + + // Build the arguments of the TryParse method + var dynamicArguments = new List { s }; + + for (var pi = 1; pi < _tryParseParameters.Length - 1; pi++) + { + var argInfo = _tryParseParameters[pi]; + if (argInfo.ParameterType == typeof(IFormatProvider)) + dynamicArguments.Add(CultureInfo.InvariantCulture); + else if (argInfo.ParameterType == typeof(NumberStyles)) + dynamicArguments.Add(NumberStyles.Any); + else + dynamicArguments.Add(null); + } + + dynamicArguments.Add(null); + var parseArguments = dynamicArguments.ToArray(); + + if ((bool) TryParseMethodInfo.Invoke(null, parseArguments)) + { + result = parseArguments[parseArguments.Length - 1]; + return true; + } + } + catch + { + // Ignore + } + + return false; + } + + /// + /// Converts this instance to its string representation, + /// trying to use the CultureInfo.InvariantCulture + /// IFormat provider if the overload is available. + /// + /// The instance. + /// A that represents the current object. + public string ToStringInvariant(object instance) + { + if (instance == null) + return string.Empty; + + return _toStringArgumentLength != 1 + ? instance.ToString() + : ToStringMethodInfo.Invoke(instance, new object[] {CultureInfo.InvariantCulture}) as string ?? string.Empty; + } + + #endregion + } + + /// + /// Provides extended information about a type. + /// + /// This class is mainly used to define sets of types within the Constants class + /// and it is not meant for other than querying the BasicTypesInfo dictionary. + /// + /// The type of extended type information. + public class ExtendedTypeInfo : ExtendedTypeInfo + { + /// + /// Initializes a new instance of the class. + /// + public ExtendedTypeInfo() + : base(typeof(T)) + { + // placeholder + } + + /// + /// Converts this instance to its string representation, + /// trying to use the CultureInfo.InvariantCulture + /// IFormat provider if the overload is available. + /// + /// The instance. + /// A that represents the current object. + public string ToStringInvariant(T instance) => base.ToStringInvariant(instance); + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Reflection/IPropertyProxy.cs b/Vendor/Swan.Lite-3.1.0/Reflection/IPropertyProxy.cs new file mode 100644 index 0000000..d2f2040 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Reflection/IPropertyProxy.cs @@ -0,0 +1,45 @@ +using System; +using System.Reflection; + +namespace Swan.Reflection +{ + /// + /// Represents a generic interface to store getters and setters for high speed access to properties. + /// + public interface IPropertyProxy + { + /// + /// Gets the name of the property. + /// + string Name { get; } + + /// + /// Gets the type of the property. + /// + Type PropertyType { get; } + + /// + /// Gets the associated reflection property info. + /// + PropertyInfo Property { get; } + + /// + /// Gets the type owning this property proxy. + /// + Type EnclosingType { get; } + + /// + /// Gets the property value via a stored delegate. + /// + /// The instance. + /// The property value. + object? GetValue(object instance); + + /// + /// Sets the property value via a stored delegate. + /// + /// The instance. + /// The value. + void SetValue(object instance, object? value); + } +} \ No newline at end of file diff --git a/Vendor/Swan.Lite-3.1.0/Reflection/MethodInfoCache.cs b/Vendor/Swan.Lite-3.1.0/Reflection/MethodInfoCache.cs new file mode 100644 index 0000000..ca363d0 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Reflection/MethodInfoCache.cs @@ -0,0 +1,117 @@ +using System; +using System.Collections.Concurrent; +using System.Reflection; + +namespace Swan.Reflection +{ + /// + /// Represents a Method Info Cache. + /// + public class MethodInfoCache : ConcurrentDictionary + { + /// + /// Retrieves the properties stored for the specified type. + /// If the properties are not available, it calls the factory method to retrieve them + /// and returns them as an array of PropertyInfo. + /// + /// The type of type. + /// The name. + /// The alias. + /// The types. + /// + /// The cached MethodInfo. + /// + /// name + /// or + /// factory. + public MethodInfo Retrieve(string name, string alias, params Type[] types) + => Retrieve(typeof(T), name, alias, types); + + /// + /// Retrieves the specified name. + /// + /// The type of type. + /// The name. + /// The types. + /// + /// The cached MethodInfo. + /// + public MethodInfo Retrieve(string name, params Type[] types) + => Retrieve(typeof(T), name, name, types); + + /// + /// Retrieves the specified type. + /// + /// The type. + /// The name. + /// The types. + /// + /// An array of the properties stored for the specified type. + /// + public MethodInfo Retrieve(Type type, string name, params Type[] types) + => Retrieve(type, name, name, types); + + /// + /// Retrieves the specified type. + /// + /// The type. + /// The name. + /// The alias. + /// The types. + /// + /// The cached MethodInfo. + /// + public MethodInfo Retrieve(Type type, string name, string alias, params Type[] types) + { + if (type == null) + throw new ArgumentNullException(nameof(type)); + + if (alias == null) + throw new ArgumentNullException(nameof(alias)); + + if (name == null) + throw new ArgumentNullException(nameof(name)); + + return GetOrAdd( + alias, + x => type.GetMethod(name, types ?? Array.Empty())); + } + + /// + /// Retrieves the specified name. + /// + /// The type of type. + /// The name. + /// + /// The cached MethodInfo. + /// + public MethodInfo Retrieve(string name) + => Retrieve(typeof(T), name); + + /// + /// Retrieves the specified type. + /// + /// The type. + /// The name. + /// + /// The cached MethodInfo. + /// + /// + /// type + /// or + /// name. + /// + public MethodInfo Retrieve(Type type, string name) + { + if (type == null) + throw new ArgumentNullException(nameof(type)); + + if (name == null) + throw new ArgumentNullException(nameof(name)); + + return GetOrAdd( + name, + type.GetMethod); + } + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Reflection/PropertyInfoProxy.cs b/Vendor/Swan.Lite-3.1.0/Reflection/PropertyInfoProxy.cs new file mode 100644 index 0000000..466978d --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Reflection/PropertyInfoProxy.cs @@ -0,0 +1,79 @@ +using System; +using System.Linq.Expressions; +using System.Reflection; + +namespace Swan.Reflection +{ + /// + /// The concrete and hidden implementation of the implementation. + /// + /// + internal sealed class PropertyInfoProxy : IPropertyProxy + { + private readonly Func? _getter; + private readonly Action? _setter; + + /// + /// Initializes a new instance of the class. + /// + /// Type of the declaring. + /// The property information. + public PropertyInfoProxy(Type declaringType, PropertyInfo propertyInfo) + { + Property = propertyInfo; + EnclosingType = declaringType; + _getter = CreateLambdaGetter(declaringType, propertyInfo); + _setter = CreateLambdaSetter(declaringType, propertyInfo); + } + + /// + public PropertyInfo Property { get; } + + /// + public Type EnclosingType { get; } + + /// + public string Name => Property.Name; + + /// + public Type PropertyType => Property.PropertyType; + + /// + public object? GetValue(object instance) => _getter?.Invoke(instance); + + /// + public void SetValue(object instance, object? value) => _setter?.Invoke(instance, value); + + private static Func? CreateLambdaGetter(Type instanceType, PropertyInfo propertyInfo) + { + if (!propertyInfo.CanRead) + return null; + + var instanceParameter = Expression.Parameter(typeof(object), "instance"); + var typedInstance = Expression.Convert(instanceParameter, instanceType); + var property = Expression.Property(typedInstance, propertyInfo); + var convert = Expression.Convert(property, typeof(object)); + var dynamicGetter = (Func)Expression.Lambda(convert, instanceParameter).Compile(); + + return dynamicGetter; + } + + private static Action? CreateLambdaSetter(Type instanceType, PropertyInfo propertyInfo) + { + if (!propertyInfo.CanWrite) + return null; + + var instanceParameter = Expression.Parameter(typeof(object), "instance"); + var valueParameter = Expression.Parameter(typeof(object), "value"); + + var typedInstance = Expression.Convert(instanceParameter, instanceType); + var property = Expression.Property(typedInstance, propertyInfo); + var propertyValue = Expression.Convert(valueParameter, propertyInfo.PropertyType); + + var body = Expression.Assign(property, propertyValue); + var dynamicSetter = Expression.Lambda>(body, instanceParameter, valueParameter).Compile(); + + return dynamicSetter; + } + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Reflection/PropertyTypeCache.cs b/Vendor/Swan.Lite-3.1.0/Reflection/PropertyTypeCache.cs new file mode 100644 index 0000000..e7f5f9a --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Reflection/PropertyTypeCache.cs @@ -0,0 +1,74 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; + +namespace Swan.Reflection +{ + /// + /// A thread-safe cache of properties belonging to a given type. + /// + public class PropertyTypeCache : TypeCache + { + /// + /// Gets the default cache. + /// + /// + /// The default cache. + /// + public static Lazy DefaultCache { get; } = new Lazy(() => new PropertyTypeCache()); + + /// + /// Retrieves all properties. + /// + /// The type to inspect. + /// if set to true [only public]. + /// + /// A collection with all the properties in the given type. + /// + public IEnumerable RetrieveAllProperties(bool onlyPublic = false) + => Retrieve(onlyPublic ? GetAllPublicPropertiesFunc() : GetAllPropertiesFunc()); + + /// + /// Retrieves all properties. + /// + /// The type. + /// if set to true [only public]. + /// + /// A collection with all the properties in the given type. + /// + public IEnumerable RetrieveAllProperties(Type type, bool onlyPublic = false) + => Retrieve(type, onlyPublic ? GetAllPublicPropertiesFunc() : GetAllPropertiesFunc()); + + /// + /// Retrieves the filtered properties. + /// + /// The type. + /// if set to true [only public]. + /// The filter. + /// + /// A collection with all the properties in the given type. + /// + public IEnumerable RetrieveFilteredProperties( + Type type, + bool onlyPublic, + Func filter) + => Retrieve(type, + onlyPublic ? GetAllPublicPropertiesFunc(filter) : GetAllPropertiesFunc(filter)); + + private static Func> GetAllPropertiesFunc( + Func? filter = null) + => GetPropertiesFunc( + BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance, + filter); + + private static Func> GetAllPublicPropertiesFunc( + Func? filter = null) + => GetPropertiesFunc(BindingFlags.Public | BindingFlags.Instance, filter); + + private static Func> GetPropertiesFunc(BindingFlags flags, + Func? filter = null) + => t => t.GetProperties(flags) + .Where(filter ?? (p => p.CanRead || p.CanWrite)); + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Reflection/TypeCache.cs b/Vendor/Swan.Lite-3.1.0/Reflection/TypeCache.cs new file mode 100644 index 0000000..48ea8cd --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Reflection/TypeCache.cs @@ -0,0 +1,78 @@ +using System; +using System.Collections.Generic; +using System.Reflection; +using Swan.Collections; + +namespace Swan.Reflection +{ + /// + /// A thread-safe cache of members belonging to a given type. + /// + /// The Retrieve method is the most useful one in this class as it + /// calls the retrieval process if the type is not contained + /// in the cache. + /// + /// The type of Member to be cached. + public abstract class TypeCache : CollectionCacheRepository + { + /// + /// Determines whether the cache contains the specified type. + /// + /// The type of the out. + /// + /// true if [contains]; otherwise, false. + /// + public bool Contains() => ContainsKey(typeof(TOut)); + + /// + /// Retrieves the properties stored for the specified type. + /// If the properties are not available, it calls the factory method to retrieve them + /// and returns them as an array of PropertyInfo. + /// + /// The type of the out. + /// The factory. + /// An array of the properties stored for the specified type. + public IEnumerable Retrieve(Func> factory) + => Retrieve(typeof(TOut), factory); + } + + /// + /// A thread-safe cache of fields belonging to a given type + /// The Retrieve method is the most useful one in this class as it + /// calls the retrieval process if the type is not contained + /// in the cache. + /// + public class FieldTypeCache : TypeCache + { + /// + /// Gets the default cache. + /// + /// + /// The default cache. + /// + public static Lazy DefaultCache { get; } = new Lazy(() => new FieldTypeCache()); + + /// + /// Retrieves all fields. + /// + /// The type to inspect. + /// + /// A collection with all the fields in the given type. + /// + public IEnumerable RetrieveAllFields() + => Retrieve(GetAllFieldsFunc()); + + /// + /// Retrieves all fields. + /// + /// The type. + /// + /// A collection with all the fields in the given type. + /// + public IEnumerable RetrieveAllFields(Type type) + => Retrieve(type, GetAllFieldsFunc()); + + private static Func> GetAllFieldsFunc() + => t => t.GetFields(BindingFlags.Public | BindingFlags.Instance); + } +} \ No newline at end of file diff --git a/Vendor/Swan.Lite-3.1.0/SelfCheck.cs b/Vendor/Swan.Lite-3.1.0/SelfCheck.cs new file mode 100644 index 0000000..497e4c3 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/SelfCheck.cs @@ -0,0 +1,62 @@ +using System; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Text; + +namespace Swan +{ + /// + /// Provides methods to perform self-checks in library or application code. + /// + public static class SelfCheck + { + /// + /// Creates and returns an exception telling that an internal self-check has failed. + /// The returned exception will be of type ; its + /// Message property will contain the specified + /// , preceded by an indication of the assembly, source file, + /// and line number of the failed check. + /// + /// The exception message. + /// The path of the source file where this method is called. + /// This parameter is automatically added by the compiler amd should never be provided explicitly. + /// The line number in source where this method is called. + /// This parameter is automatically added by the compiler amd should never be provided explicitly. + /// + /// A newly-created instance of . + /// + public static InternalErrorException Failure(string message, [CallerFilePath] string filePath = "", [CallerLineNumber] int lineNumber = 0) + => new InternalErrorException(BuildMessage(message, filePath, lineNumber)); + + private static string BuildMessage(string message, string filePath, int lineNumber) + { + var frames = new StackTrace().GetFrames(); + if (frames == null) + return message; + + try + { + filePath = Path.GetFileName(filePath); + } + catch (ArgumentException) + { + } + + var frame = frames.FirstOrDefault(f => f.GetMethod().ReflectedType != typeof(SelfCheck)); + var sb = new StringBuilder() + .Append('[') + .Append(frame?.GetType().Assembly.GetName().Name ?? ""); + + if (!string.IsNullOrEmpty(filePath)) + { + sb.Append(": ").Append(filePath); + if (lineNumber > 0) + sb.Append('(').Append(lineNumber).Append(')'); + } + + return sb.Append("] ").Append(message).ToString(); + } + } +} \ No newline at end of file diff --git a/Vendor/Swan.Lite-3.1.0/SingletonBase.cs b/Vendor/Swan.Lite-3.1.0/SingletonBase.cs new file mode 100644 index 0000000..9df0af0 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/SingletonBase.cs @@ -0,0 +1,61 @@ +using System; + +namespace Swan +{ + /// + /// Represents a singleton pattern abstract class. + /// + /// The type of class. + public abstract class SingletonBase : IDisposable + where T : class + { + /// + /// The static, singleton instance reference. + /// + protected static readonly Lazy LazyInstance = new Lazy( + valueFactory: () => Activator.CreateInstance(typeof(T), true) as T, + isThreadSafe: true); + + private bool _isDisposing; // To detect redundant calls + + /// + /// Gets the instance that this singleton represents. + /// If the instance is null, it is constructed and assigned when this member is accessed. + /// + /// + /// The instance. + /// + public static T Instance => LazyInstance.Value; + + /// + public void Dispose() => Dispose(true); + + /// + /// Releases unmanaged and - optionally - managed resources. + /// Call the GC.SuppressFinalize if you override this method and use + /// a non-default class finalizer (destructor). + /// + /// true to release both managed and unmanaged resources; false to release only unmanaged resources. + protected virtual void Dispose(bool disposeManaged) + { + if (_isDisposing) return; + + _isDisposing = true; + + // free managed resources + if (LazyInstance == null) return; + + try + { + var disposableInstance = LazyInstance.Value as IDisposable; + disposableInstance?.Dispose(); + } +#pragma warning disable CA1031 // Do not catch general exception types + catch +#pragma warning restore CA1031 // Do not catch general exception types + { + // swallow + } + } + } +} diff --git a/Vendor/Swan.Lite-3.1.0/StringConversionException.cs b/Vendor/Swan.Lite-3.1.0/StringConversionException.cs new file mode 100644 index 0000000..30f7517 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/StringConversionException.cs @@ -0,0 +1,76 @@ +using System; +using System.Runtime.Serialization; + +namespace Swan +{ + /// + /// The exception that is thrown when a conversion from a string to a + /// specified type fails. + /// + /// + [Serializable] + public class StringConversionException : Exception + { + /// + /// Initializes a new instance of the class. + /// + public StringConversionException() + { + } + + /// + /// Initializes a new instance of the class. + /// + /// The error message that explains the reason for the exception. + public StringConversionException(string message) + : base(message) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// The error message that explains the reason for the exception. + /// The exception that is the cause of the current exception, + /// or if no inner exception is specified. + public StringConversionException(string message, Exception innerException) + : base(message, innerException) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// The desired resulting type of the attempted conversion. + public StringConversionException(Type type) + : base(BuildStandardMessageForType(type)) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// The desired resulting type of the attempted conversion. + /// The exception that is the cause of the current exception, + /// or if no inner exception is specified. + public StringConversionException(Type type, Exception innerException) + : base(BuildStandardMessageForType(type), innerException) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// The that holds the serialized object data + /// about the exception being thrown. + /// The that contains contextual information + /// about the source or destination. + protected StringConversionException(SerializationInfo info, StreamingContext context) + : base(info, context) + { + } + + private static string BuildStandardMessageForType(Type type) + => $"Cannot convert a string to an instance of {type.FullName}"; + } +} diff --git a/Vendor/Swan.Lite-3.1.0/StructEndiannessAttribute.cs b/Vendor/Swan.Lite-3.1.0/StructEndiannessAttribute.cs new file mode 100644 index 0000000..16b7932 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/StructEndiannessAttribute.cs @@ -0,0 +1,30 @@ +using System; + +namespace Swan +{ + /// + /// An attribute used to help conversion structs back and forth into arrays of bytes via + /// extension methods included in this library ToStruct and ToBytes. + /// + /// + [AttributeUsage(AttributeTargets.Field | AttributeTargets.Struct)] + public class StructEndiannessAttribute : Attribute + { + /// + /// Initializes a new instance of the class. + /// + /// The endianness. + public StructEndiannessAttribute(Endianness endianness) + { + Endianness = endianness; + } + + /// + /// Gets the endianness. + /// + /// + /// The endianness. + /// + public Endianness Endianness { get; } + } +} \ No newline at end of file diff --git a/Vendor/Swan.Lite-3.1.0/SwanRuntime.cs b/Vendor/Swan.Lite-3.1.0/SwanRuntime.cs new file mode 100644 index 0000000..1ef359d --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/SwanRuntime.cs @@ -0,0 +1,237 @@ +using Swan.Logging; +using System; +using System.IO; +using System.Reflection; +using System.Threading; + +namespace Swan +{ + /// + /// Provides utility methods to retrieve information about the current application. + /// + public static class SwanRuntime + { + private static readonly Lazy EntryAssemblyLazy = new Lazy(Assembly.GetEntryAssembly); + + private static readonly Lazy CompanyNameLazy = new Lazy(() => + { + var attribute = + EntryAssembly.GetCustomAttribute(typeof(AssemblyCompanyAttribute)) as AssemblyCompanyAttribute; + return attribute?.Company ?? string.Empty; + }); + + private static readonly Lazy ProductNameLazy = new Lazy(() => + { + var attribute = + EntryAssembly.GetCustomAttribute(typeof(AssemblyProductAttribute)) as AssemblyProductAttribute; + return attribute?.Product ?? string.Empty; + }); + + private static readonly Lazy ProductTrademarkLazy = new Lazy(() => + { + var attribute = + EntryAssembly.GetCustomAttribute(typeof(AssemblyTrademarkAttribute)) as AssemblyTrademarkAttribute; + return attribute?.Trademark ?? string.Empty; + }); + + private static readonly string ApplicationMutexName = "Global\\{{" + EntryAssembly.FullName + "}}"; + + private static readonly object SyncLock = new object(); + + private static OperatingSystem? _oS; + + #region Properties + + /// + /// Gets the current Operating System. + /// + /// + /// The os. + /// + public static OperatingSystem OS + { + get + { + if (_oS.HasValue == false) + { + var windowsDirectory = Environment.GetEnvironmentVariable("windir"); + if (string.IsNullOrEmpty(windowsDirectory) == false + && windowsDirectory.Contains(@"\") + && Directory.Exists(windowsDirectory)) + { + _oS = OperatingSystem.Windows; + } + else + { + _oS = File.Exists(@"/proc/sys/kernel/ostype") ? OperatingSystem.Unix : OperatingSystem.Osx; + } + } + + return _oS ?? OperatingSystem.Unknown; + } + } + + /// + /// Checks if this application (including version number) is the only instance currently running. + /// + /// + /// true if this instance is the only instance; otherwise, false. + /// + public static bool IsTheOnlyInstance + { + get + { + lock (SyncLock) + { + try + { + // Try to open existing mutex. + using var _ = Mutex.OpenExisting(ApplicationMutexName); + } +#pragma warning disable CA1031 // Do not catch general exception types + catch +#pragma warning restore CA1031 // Do not catch general exception types + { + try + { + // If exception occurred, there is no such mutex. + using var appMutex = new Mutex(true, ApplicationMutexName); + $"Application Mutex created {appMutex} named '{ApplicationMutexName}'".Debug( + typeof(SwanRuntime)); + + // Only one instance. + return true; + } +#pragma warning disable CA1031 // Do not catch general exception types + catch +#pragma warning restore CA1031 // Do not catch general exception types + { + // Sometimes the user can't create the Global Mutex + } + } + + // More than one instance. + return false; + } + } + } + + /// + /// Gets a value indicating whether this application instance is using the MONO runtime. + /// + /// + /// true if this instance is using MONO runtime; otherwise, false. + /// + public static bool IsUsingMonoRuntime => Type.GetType("Mono.Runtime") != null; + + /// + /// Gets the assembly that started the application. + /// + /// + /// The entry assembly. + /// + public static Assembly EntryAssembly => EntryAssemblyLazy.Value; + + /// + /// Gets the name of the entry assembly. + /// + /// + /// The name of the entry assembly. + /// + public static AssemblyName EntryAssemblyName => EntryAssemblyLazy.Value.GetName(); + + /// + /// Gets the entry assembly version. + /// + public static Version EntryAssemblyVersion => EntryAssemblyName.Version; + + /// + /// Gets the full path to the folder containing the assembly that started the application. + /// + /// + /// The entry assembly directory. + /// + public static string EntryAssemblyDirectory + { + get + { + var uri = new UriBuilder(EntryAssembly.CodeBase); + var path = Uri.UnescapeDataString(uri.Path); + return Path.GetDirectoryName(path); + } + } + + /// + /// Gets the name of the company. + /// + /// + /// The name of the company. + /// + public static string CompanyName => CompanyNameLazy.Value; + + /// + /// Gets the name of the product. + /// + /// + /// The name of the product. + /// + public static string ProductName => ProductNameLazy.Value; + + /// + /// Gets the trademark. + /// + /// + /// The product trademark. + /// + public static string ProductTrademark => ProductTrademarkLazy.Value; + + /// + /// Gets a local storage path with a version. + /// + /// + /// The local storage path. + /// + public static string LocalStoragePath + { + get + { + var localAppDataPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), + EntryAssemblyName.Name); + + var returnPath = Path.Combine(localAppDataPath, EntryAssemblyVersion.ToString()); + + if (!Directory.Exists(returnPath)) + { + Directory.CreateDirectory(returnPath); + } + + return returnPath; + } + } + + #endregion + + #region Methods + + /// + /// Build a full path pointing to the current user's desktop with the given filename. + /// + /// The filename. + /// + /// The fully qualified location of path, such as "C:\MyFile.txt". + /// + /// filename. + public static string GetDesktopFilePath(string filename) + { + if (string.IsNullOrWhiteSpace(filename)) + throw new ArgumentNullException(nameof(filename)); + + var pathWithFilename = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), + filename); + + return Path.GetFullPath(pathWithFilename); + } + + #endregion + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Terminal.Graphics.cs b/Vendor/Swan.Lite-3.1.0/Terminal.Graphics.cs new file mode 100644 index 0000000..1a1b5be --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Terminal.Graphics.cs @@ -0,0 +1,37 @@ +namespace Swan +{ + /// + /// A console terminal helper to create nicer output and receive input from the user + /// This class is thread-safe :). + /// + public static partial class Terminal + { + /// + /// Represents a Table to print in console. + /// + private static class Table + { + public static void Vertical() => Write('\u2502', Settings.BorderColor); + + public static void RightTee() => Write('\u2524', Settings.BorderColor); + + public static void TopRight() => Write('\u2510', Settings.BorderColor); + + public static void BottomLeft() => Write('\u2514', Settings.BorderColor); + + public static void BottomTee() => Write('\u2534', Settings.BorderColor); + + public static void TopTee() => Write('\u252c', Settings.BorderColor); + + public static void LeftTee() => Write('\u251c', Settings.BorderColor); + + public static void Horizontal(int length) => Write(new string('\u2500', length), Settings.BorderColor); + + public static void Tee() => Write('\u253c', Settings.BorderColor); + + public static void BottomRight() => Write('\u2518', Settings.BorderColor); + + public static void TopLeft() => Write('\u250C', Settings.BorderColor); + } + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Terminal.Interaction.cs b/Vendor/Swan.Lite-3.1.0/Terminal.Interaction.cs new file mode 100644 index 0000000..dbfacb2 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Terminal.Interaction.cs @@ -0,0 +1,260 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using Swan.Logging; + +namespace Swan +{ + /// + /// A console terminal helper to create nicer output and receive input from the user + /// This class is thread-safe :). + /// + public static partial class Terminal + { + #region ReadKey + + /// + /// Reads a key from the Terminal. This is the closest equivalent to Console.ReadKey. + /// + /// if set to true the pressed key will not be rendered to the output. + /// if set to true the output will continue to be shown. + /// This is useful for services and daemons that are running as console applications and wait for a key to exit the program. + /// The console key information. + public static ConsoleKeyInfo ReadKey(bool intercept, bool disableLocking = false) + { + if (!IsConsolePresent) return default; + if (disableLocking) return Console.ReadKey(intercept); + + lock (SyncLock) + { + Flush(); + InputDone.Reset(); + + try + { + Console.CursorVisible = true; + return Console.ReadKey(intercept); + } + finally + { + Console.CursorVisible = false; + InputDone.Set(); + } + } + } + + /// + /// Reads a key from the Terminal. + /// + /// The prompt. + /// if set to true [prevent echo]. + /// The console key information. + public static ConsoleKeyInfo ReadKey(string prompt, bool preventEcho = true) + { + if (!IsConsolePresent) return default; + + lock (SyncLock) + { + if (prompt != null) + { + Write($"{GetNowFormatted()}{Settings.UserInputPrefix} << {prompt} ", ConsoleColor.White); + } + + var input = ReadKey(true); + var echo = preventEcho ? string.Empty : input.Key.ToString(); + WriteLine(echo); + return input; + } + } + + #endregion + + #region Other Terminal Read Methods + + /// + /// Clears the screen. + /// + public static void Clear() + { + Flush(); + Console.Clear(); + } + + /// + /// Reads a line of text from the console. + /// + /// The read line. + public static string? ReadLine() + { + if (IsConsolePresent == false) return default; + + lock (SyncLock) + { + Flush(); + InputDone.Reset(); + + try + { + Console.CursorVisible = true; + return Console.ReadLine(); + } + finally + { + Console.CursorVisible = false; + InputDone.Set(); + } + } + } + + /// + /// Reads a line from the input. + /// + /// The prompt. + /// The read line. + public static string? ReadLine(string prompt) + { + if (!IsConsolePresent) return null; + + lock (SyncLock) + { + Write($"{GetNowFormatted()}{Settings.UserInputPrefix} << {prompt}: ", ConsoleColor.White); + + return ReadLine(); + } + } + + /// + /// Reads a number from the input. If unable to parse, it returns the default number. + /// + /// The prompt. + /// The default number. + /// + /// Conversions of string representation of a number to its 32-bit signed integer equivalent. + /// + public static int ReadNumber(string prompt, int defaultNumber) + { + if (!IsConsolePresent) return defaultNumber; + + lock (SyncLock) + { + Write($"{GetNowFormatted()}{Settings.UserInputPrefix} << {prompt} (default is {defaultNumber}): ", + ConsoleColor.White); + + var input = ReadLine(); + return int.TryParse(input, out var parsedInt) ? parsedInt : defaultNumber; + } + } + + /// + /// Creates a table prompt where the user can enter an option based on the options dictionary provided. + /// + /// The title. + /// The options. + /// Any key option. + /// + /// A value that identifies the console key that was pressed. + /// + /// options. + public static ConsoleKeyInfo ReadPrompt( + string title, + IDictionary options, + string anyKeyOption) + { + if (!IsConsolePresent) return default; + + if (options == null) + throw new ArgumentNullException(nameof(options)); + + const ConsoleColor textColor = ConsoleColor.White; + var lineLength = Console.WindowWidth; + var lineAlign = -(lineLength - 2); + var textFormat = "{0," + lineAlign + "}"; + + // lock the output as an atomic operation + lock (SyncLock) + { + { + // Top border + Table.TopLeft(); + Table.Horizontal(-lineAlign); + Table.TopRight(); + } + + { + // Title + Table.Vertical(); + var titleText = string.Format(CultureInfo.CurrentCulture, + textFormat, + string.IsNullOrWhiteSpace(title) ? " Select an option from the list below." : $" {title}"); + Write(titleText, textColor); + Table.Vertical(); + } + + { + // Title Bottom + Table.LeftTee(); + Table.Horizontal(lineLength - 2); + Table.RightTee(); + } + + // Options + foreach (var kvp in options) + { + Table.Vertical(); + Write(string.Format( + CultureInfo.CurrentCulture, + textFormat, + $" {"[ " + kvp.Key + " ]",-10} {kvp.Value}"), + textColor); + Table.Vertical(); + } + + // Any Key Options + if (string.IsNullOrWhiteSpace(anyKeyOption) == false) + { + Table.Vertical(); + Write(string.Format(CultureInfo.CurrentCulture, textFormat, " "), ConsoleColor.Gray); + Table.Vertical(); + + Table.Vertical(); + Write(string.Format( + CultureInfo.CurrentCulture, + textFormat, + $" {" ",-10} {anyKeyOption}"), + ConsoleColor.Gray); + Table.Vertical(); + } + + { + // Input section + Table.LeftTee(); + Table.Horizontal(lineLength - 2); + Table.RightTee(); + + Table.Vertical(); + Write(string.Format(CultureInfo.CurrentCulture, textFormat, Settings.UserOptionText), + ConsoleColor.Green); + Table.Vertical(); + + Table.BottomLeft(); + Table.Horizontal(lineLength - 2); + Table.BottomRight(); + } + } + + var inputLeft = Settings.UserOptionText.Length + 3; + + SetCursorPosition(inputLeft, CursorTop - 1); + var userInput = ReadKey(true); + Write(userInput.Key.ToString(), ConsoleColor.Gray); + + SetCursorPosition(0, CursorTop + 2); + return userInput; + } + + #endregion + + private static string GetNowFormatted() => + $" {(string.IsNullOrWhiteSpace(TextLogger.LoggingTimeFormat) ? string.Empty : DateTime.Now.ToString(TextLogger.LoggingTimeFormat) + " ")}"; + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Terminal.Output.cs b/Vendor/Swan.Lite-3.1.0/Terminal.Output.cs new file mode 100644 index 0000000..d9b8f28 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Terminal.Output.cs @@ -0,0 +1,97 @@ +using System; + +namespace Swan +{ + /// + /// A console terminal helper to create nicer output and receive input from the user + /// This class is thread-safe :). + /// + public static partial class Terminal + { + /// + /// Writes a character a number of times, optionally adding a new line at the end. + /// + /// The character code. + /// The color. + /// The count. + /// if set to true [new line]. + /// The writer flags. + public static void Write(char charCode, ConsoleColor? color = null, int count = 1, bool newLine = false, TerminalWriters writerFlags = TerminalWriters.StandardOutput) + { + lock (SyncLock) + { + var text = new string(charCode, count); + + if (newLine) + { + text += Environment.NewLine; + } + + var buffer = OutputEncoding.GetBytes(text); + var context = new OutputContext + { + OutputColor = color ?? Settings.DefaultColor, + OutputText = OutputEncoding.GetChars(buffer), + OutputWriters = writerFlags, + }; + + EnqueueOutput(context); + } + } + + /// + /// Writes the specified text in the given color. + /// + /// The text. + /// The color. + /// The writer flags. + public static void Write(string? text, ConsoleColor? color = null, TerminalWriters writerFlags = TerminalWriters.StandardOutput) + { + if (text == null) return; + + lock (SyncLock) + { + var buffer = OutputEncoding.GetBytes(text); + var context = new OutputContext + { + OutputColor = color ?? Settings.DefaultColor, + OutputText = OutputEncoding.GetChars(buffer), + OutputWriters = writerFlags, + }; + + EnqueueOutput(context); + } + } + + /// + /// Writes a New Line Sequence to the standard output. + /// + /// The writer flags. + public static void WriteLine(TerminalWriters writerFlags = TerminalWriters.StandardOutput) + => Write(Environment.NewLine, Settings.DefaultColor, writerFlags); + + /// + /// Writes a line of text in the current console foreground color + /// to the standard output. + /// + /// The text. + /// The color. + /// The writer flags. + public static void WriteLine(string text, ConsoleColor? color = null, TerminalWriters writerFlags = TerminalWriters.StandardOutput) + => Write($"{text ?? string.Empty}{Environment.NewLine}", color, writerFlags); + + /// + /// As opposed to WriteLine methods, it prepends a Carriage Return character to the text + /// so that the console moves the cursor one position up after the text has been written out. + /// + /// The text. + /// The color. + /// The writer flags. + public static void OverwriteLine(string text, ConsoleColor? color = null, TerminalWriters writerFlags = TerminalWriters.StandardOutput) + { + Write($"\r{text ?? string.Empty}", color, writerFlags); + Flush(); + CursorLeft = 0; + } + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Terminal.Settings.cs b/Vendor/Swan.Lite-3.1.0/Terminal.Settings.cs new file mode 100644 index 0000000..20d8118 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Terminal.Settings.cs @@ -0,0 +1,49 @@ +using System; + +namespace Swan +{ + /// + /// A console terminal helper to create nicer output and receive input from the user + /// This class is thread-safe :). + /// + public static partial class Terminal + { + /// + /// Terminal global settings. + /// + public static class Settings + { + /// + /// Gets or sets the default output color. + /// + /// + /// The default color. + /// + public static ConsoleColor DefaultColor { get; set; } = Console.ForegroundColor; + + /// + /// Gets the color of the border. + /// + /// + /// The color of the border. + /// + public static ConsoleColor BorderColor { get; } = ConsoleColor.DarkGreen; + + /// + /// Gets or sets the user input prefix. + /// + /// + /// The user input prefix. + /// + public static string UserInputPrefix { get; set; } = "USR"; + + /// + /// Gets or sets the user option text. + /// + /// + /// The user option text. + /// + public static string UserOptionText { get; set; } = " Option: "; + } + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Terminal.cs b/Vendor/Swan.Lite-3.1.0/Terminal.cs new file mode 100644 index 0000000..c407e4c --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Terminal.cs @@ -0,0 +1,339 @@ +using System; +using System.Collections.Concurrent; +using System.Text; +using System.Threading; +using Swan.Threading; + +namespace Swan +{ + /// + /// A console terminal helper to create nicer output and receive input from the user. + /// This class is thread-safe :). + /// + public static partial class Terminal + { + #region Private Declarations + + private const int OutputFlushInterval = 15; + private static readonly ExclusiveTimer DequeueOutputTimer; + private static readonly object SyncLock = new object(); + private static readonly ConcurrentQueue OutputQueue = new ConcurrentQueue(); + + private static readonly ManualResetEventSlim OutputDone = new ManualResetEventSlim(false); + private static readonly ManualResetEventSlim InputDone = new ManualResetEventSlim(true); + + private static bool? _isConsolePresent; + + #endregion + + #region Constructors + + /// + /// Initializes static members of the class. + /// + static Terminal() + { + lock (SyncLock) + { + if (DequeueOutputTimer != null) return; + + if (IsConsolePresent) + { + Console.CursorVisible = false; + } + + // Here we start the output task, fire-and-forget + DequeueOutputTimer = new ExclusiveTimer(DequeueOutputCycle); + DequeueOutputTimer.Resume(OutputFlushInterval); + } + } + + #endregion + + #region Synchronized Cursor Movement + + /// + /// Gets or sets the cursor left position. + /// + /// + /// The cursor left. + /// + public static int CursorLeft + { + get + { + if (IsConsolePresent == false) return -1; + lock (SyncLock) + { + Flush(); + return Console.CursorLeft; + } + } + set + { + if (IsConsolePresent == false) return; + lock (SyncLock) + { + Flush(); + Console.CursorLeft = value; + } + } + } + + /// + /// Gets or sets the cursor top position. + /// + /// + /// The cursor top. + /// + public static int CursorTop + { + get + { + if (IsConsolePresent == false) return -1; + + lock (SyncLock) + { + Flush(); + return Console.CursorTop; + } + } + set + { + if (IsConsolePresent == false) return; + + lock (SyncLock) + { + Flush(); + Console.CursorTop = value; + } + } + } + + #endregion + + #region Properties + + /// + /// Gets a value indicating whether the Console is present. + /// + /// + /// true if this instance is console present; otherwise, false. + /// + public static bool IsConsolePresent + { + get + { + if (_isConsolePresent == null) + { + _isConsolePresent = true; + try + { + var windowHeight = Console.WindowHeight; + _isConsolePresent = windowHeight >= 0; + } + catch + { + _isConsolePresent = false; + } + } + + return _isConsolePresent.Value; + } + } + + /// + /// Gets the available output writers in a bitwise mask. + /// + /// + /// The available writers. + /// + public static TerminalWriters AvailableWriters => + IsConsolePresent + ? TerminalWriters.StandardError | TerminalWriters.StandardOutput + : TerminalWriters.None; + + /// + /// Gets or sets the output encoding for the current console. + /// + /// + /// The output encoding. + /// + public static Encoding OutputEncoding + { + get => Console.OutputEncoding; + set => Console.OutputEncoding = value; + } + + #endregion + + #region Methods + + /// + /// Waits for all of the queued output messages to be written out to the console. + /// Call this method if it is important to display console text before + /// quitting the application such as showing usage or help. + /// Set the timeout to null or TimeSpan.Zero to wait indefinitely. + /// + /// The timeout. Set the amount of time to black before this method exits. + public static void Flush(TimeSpan? timeout = null) + { + if (timeout == null) timeout = TimeSpan.Zero; + var startTime = DateTime.UtcNow; + + while (OutputQueue.Count > 0) + { + // Manually trigger a timer cycle to run immediately + DequeueOutputTimer.Change(0, OutputFlushInterval); + + // Wait for the output to finish + if (OutputDone.Wait(OutputFlushInterval)) + break; + + // infinite timeout + if (timeout.Value == TimeSpan.Zero) + continue; + + // break if we have reached a timeout condition + if (DateTime.UtcNow.Subtract(startTime) >= timeout.Value) + break; + } + } + + /// + /// Sets the cursor position. + /// + /// The left. + /// The top. + public static void SetCursorPosition(int left, int top) + { + if (!IsConsolePresent) return; + + lock (SyncLock) + { + Flush(); + Console.SetCursorPosition(left.Clamp(0, left), top.Clamp(0, top)); + } + } + + /// + /// Moves the output cursor one line up starting at left position 0 + /// Please note that backlining the cursor does not clear the contents of the + /// previous line so you might need to clear it by writing an empty string the + /// length of the console width. + /// + public static void BacklineCursor() => SetCursorPosition(0, CursorTop - 1); + + /// + /// Writes a standard banner to the standard output + /// containing the company name, product name, assembly version and trademark. + /// + /// The color. + public static void WriteWelcomeBanner(ConsoleColor color = ConsoleColor.Gray) + { + WriteLine($"{SwanRuntime.CompanyName} {SwanRuntime.ProductName} [Version {SwanRuntime.EntryAssemblyVersion}]", color); + WriteLine($"{SwanRuntime.ProductTrademark}", color); + } + + /// + /// Enqueues the output to be written to the console + /// This is the only method that should enqueue to the output + /// Please note that if AvailableWriters is None, then no output will be enqueued. + /// + /// The context. + private static void EnqueueOutput(OutputContext context) + { + lock (SyncLock) + { + var availableWriters = AvailableWriters; + + if (availableWriters == TerminalWriters.None || context.OutputWriters == TerminalWriters.None) + { + OutputDone.Set(); + return; + } + + if ((context.OutputWriters & availableWriters) == TerminalWriters.None) + return; + + OutputDone.Reset(); + OutputQueue.Enqueue(context); + } + } + + /// + /// Runs a Terminal I/O cycle in the thread. + /// + private static void DequeueOutputCycle() + { + if (AvailableWriters == TerminalWriters.None) + { + OutputDone.Set(); + return; + } + + InputDone.Wait(); + + if (OutputQueue.Count <= 0) + { + OutputDone.Set(); + return; + } + + OutputDone.Reset(); + + while (OutputQueue.Count > 0) + { + if (!OutputQueue.TryDequeue(out var context)) continue; + + // Process Console output and Skip over stuff we can't display so we don't stress the output too much. + if (!IsConsolePresent) continue; + + Console.ForegroundColor = context.OutputColor; + + // Output to the standard output + if (context.OutputWriters.HasFlag(TerminalWriters.StandardOutput)) + { + Console.Out.Write(context.OutputText); + } + + // output to the standard error + if (context.OutputWriters.HasFlag(TerminalWriters.StandardError)) + { + Console.Error.Write(context.OutputText); + } + + Console.ResetColor(); + Console.ForegroundColor = context.OriginalColor; + } + } + + #endregion + + #region Output Context + + /// + /// Represents an asynchronous output context. + /// + private sealed class OutputContext + { + /// + /// Initializes a new instance of the class. + /// + public OutputContext() + { + OriginalColor = Settings.DefaultColor; + OutputWriters = IsConsolePresent + ? TerminalWriters.StandardOutput + : TerminalWriters.None; + } + + public ConsoleColor OriginalColor { get; } + public ConsoleColor OutputColor { get; set; } + public char[] OutputText { get; set; } + public TerminalWriters OutputWriters { get; set; } + } + + #endregion + } +} diff --git a/Vendor/Swan.Lite-3.1.0/TerminalWriters.Enums.cs b/Vendor/Swan.Lite-3.1.0/TerminalWriters.Enums.cs new file mode 100644 index 0000000..b1d4b9d --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/TerminalWriters.Enums.cs @@ -0,0 +1,31 @@ +using System; + +namespace Swan +{ + /// + /// Defines a set of bitwise standard terminal writers. + /// + [Flags] + public enum TerminalWriters + { + /// + /// Prevents output + /// + None = 0, + + /// + /// Writes to the Console.Out + /// + StandardOutput = 1, + + /// + /// Writes to the Console.Error + /// + StandardError = 2, + + /// + /// Writes to all possible terminal writers + /// + All = StandardOutput | StandardError, + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Threading/AtomicBoolean.cs b/Vendor/Swan.Lite-3.1.0/Threading/AtomicBoolean.cs new file mode 100644 index 0000000..7db2f17 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Threading/AtomicBoolean.cs @@ -0,0 +1,24 @@ +namespace Swan.Threading +{ + /// + /// Fast, atomic boolean combining interlocked to write value and volatile to read values. + /// + public sealed class AtomicBoolean : AtomicTypeBase + { + /// + /// Initializes a new instance of the class. + /// + /// if set to true [initial value]. + public AtomicBoolean(bool initialValue = default) + : base(initialValue ? 1 : 0) + { + // placeholder + } + + /// + protected override bool FromLong(long backingValue) => backingValue != 0; + + /// + protected override long ToLong(bool value) => value ? 1 : 0; + } +} \ No newline at end of file diff --git a/Vendor/Swan.Lite-3.1.0/Threading/AtomicDateTime.cs b/Vendor/Swan.Lite-3.1.0/Threading/AtomicDateTime.cs new file mode 100644 index 0000000..8bec976 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Threading/AtomicDateTime.cs @@ -0,0 +1,26 @@ +using System; + +namespace Swan.Threading +{ + /// + /// Defines an atomic DateTime. + /// + public sealed class AtomicDateTime : AtomicTypeBase + { + /// + /// Initializes a new instance of the class. + /// + /// The initial value. + public AtomicDateTime(DateTime initialValue) + : base(initialValue.Ticks) + { + // placeholder + } + + /// + protected override DateTime FromLong(long backingValue) => new DateTime(backingValue); + + /// + protected override long ToLong(DateTime value) => value.Ticks; + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Threading/AtomicDouble.cs b/Vendor/Swan.Lite-3.1.0/Threading/AtomicDouble.cs new file mode 100644 index 0000000..b611a08 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Threading/AtomicDouble.cs @@ -0,0 +1,28 @@ +using System; + +namespace Swan.Threading +{ + /// + /// Fast, atomic double combining interlocked to write value and volatile to read values. + /// + public sealed class AtomicDouble : AtomicTypeBase + { + /// + /// Initializes a new instance of the class. + /// + /// if set to true [initial value]. + public AtomicDouble(double initialValue = default) + : base(BitConverter.DoubleToInt64Bits(initialValue)) + { + // placeholder + } + + /// + protected override double FromLong(long backingValue) => + BitConverter.Int64BitsToDouble(backingValue); + + /// + protected override long ToLong(double value) => + BitConverter.DoubleToInt64Bits(value); + } +} \ No newline at end of file diff --git a/Vendor/Swan.Lite-3.1.0/Threading/AtomicEnum.cs b/Vendor/Swan.Lite-3.1.0/Threading/AtomicEnum.cs new file mode 100644 index 0000000..b06af12 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Threading/AtomicEnum.cs @@ -0,0 +1,43 @@ +using System; +using System.Threading; + +namespace Swan.Threading +{ + /// + /// Defines an atomic generic Enum. + /// + /// The type of enum. + public sealed class AtomicEnum + where T : struct, IConvertible + { + private long _backingValue; + + /// + /// Initializes a new instance of the class. + /// + /// The initial value. + /// T must be an enumerated type. + public AtomicEnum(T initialValue) + { + if (!Enum.IsDefined(typeof(T), initialValue)) + throw new ArgumentException("T must be an enumerated type"); + + Value = initialValue; + } + + /// + /// Gets or sets the value. + /// + public T Value + { + get => (T)Enum.ToObject(typeof(T), BackingValue); + set => BackingValue = Convert.ToInt64(value); + } + + private long BackingValue + { + get => Interlocked.Read(ref _backingValue); + set => Interlocked.Exchange(ref _backingValue, value); + } + } +} \ No newline at end of file diff --git a/Vendor/Swan.Lite-3.1.0/Threading/AtomicInteger.cs b/Vendor/Swan.Lite-3.1.0/Threading/AtomicInteger.cs new file mode 100644 index 0000000..5cad25d --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Threading/AtomicInteger.cs @@ -0,0 +1,28 @@ +using System; + +namespace Swan.Threading +{ + /// + /// Represents an atomically readable or writable integer. + /// + public class AtomicInteger : AtomicTypeBase + { + /// + /// Initializes a new instance of the class. + /// + /// if set to true [initial value]. + public AtomicInteger(int initialValue = default) + : base(Convert.ToInt64(initialValue)) + { + // placeholder + } + + /// + protected override int FromLong(long backingValue) => + Convert.ToInt32(backingValue); + + /// + protected override long ToLong(int value) => + Convert.ToInt64(value); + } +} \ No newline at end of file diff --git a/Vendor/Swan.Lite-3.1.0/Threading/AtomicLong.cs b/Vendor/Swan.Lite-3.1.0/Threading/AtomicLong.cs new file mode 100644 index 0000000..b675187 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Threading/AtomicLong.cs @@ -0,0 +1,24 @@ +namespace Swan.Threading +{ + /// + /// Fast, atomic long combining interlocked to write value and volatile to read values. + /// + public sealed class AtomicLong : AtomicTypeBase + { + /// + /// Initializes a new instance of the class. + /// + /// if set to true [initial value]. + public AtomicLong(long initialValue = default) + : base(initialValue) + { + // placeholder + } + + /// + protected override long FromLong(long backingValue) => backingValue; + + /// + protected override long ToLong(long value) => value; + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Threading/AtomicTimeSpan.cs b/Vendor/Swan.Lite-3.1.0/Threading/AtomicTimeSpan.cs new file mode 100644 index 0000000..ec27877 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Threading/AtomicTimeSpan.cs @@ -0,0 +1,26 @@ +using System; + +namespace Swan.Threading +{ + /// + /// Represents an atomic TimeSpan type. + /// + public sealed class AtomicTimeSpan : AtomicTypeBase + { + /// + /// Initializes a new instance of the class. + /// + /// The initial value. + public AtomicTimeSpan(TimeSpan initialValue) + : base(initialValue.Ticks) + { + // placeholder + } + + /// + protected override TimeSpan FromLong(long backingValue) => TimeSpan.FromTicks(backingValue); + + /// + protected override long ToLong(TimeSpan value) => value.Ticks < 0 ? 0 : value.Ticks; + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Threading/AtomicTypeBase.cs b/Vendor/Swan.Lite-3.1.0/Threading/AtomicTypeBase.cs new file mode 100644 index 0000000..fae6cd3 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Threading/AtomicTypeBase.cs @@ -0,0 +1,243 @@ +using System; +using System.Threading; + +namespace Swan.Threading +{ + /// + /// Provides a generic implementation of an Atomic (interlocked) type + /// + /// Idea taken from Memory model and .NET operations in article: + /// http://igoro.com/archive/volatile-keyword-in-c-memory-model-explained/. + /// + /// The structure type backed by a 64-bit value. + public abstract class AtomicTypeBase : IComparable, IComparable, IComparable>, IEquatable, IEquatable> + where T : struct, IComparable, IComparable, IEquatable + { + private long _backingValue; + + /// + /// Initializes a new instance of the class. + /// + /// The initial value. + protected AtomicTypeBase(long initialValue) + { + BackingValue = initialValue; + } + + /// + /// Gets or sets the value. + /// + public T Value + { + get => FromLong(BackingValue); + set => BackingValue = ToLong(value); + } + + /// + /// Gets or sets the backing value. + /// + protected long BackingValue + { + get => Interlocked.Read(ref _backingValue); + set => Interlocked.Exchange(ref _backingValue, value); + } + + /// + /// Implements the operator ==. + /// + /// a. + /// The b. + /// + /// The result of the operator. + /// + public static bool operator ==(AtomicTypeBase a, T b) => a?.Equals(b) == true; + + /// + /// Implements the operator !=. + /// + /// a. + /// The b. + /// + /// The result of the operator. + /// + public static bool operator !=(AtomicTypeBase a, T b) => a?.Equals(b) == false; + + /// + /// Implements the operator >. + /// + /// a. + /// The b. + /// + /// The result of the operator. + /// + public static bool operator >(AtomicTypeBase a, T b) => a.CompareTo(b) > 0; + + /// + /// Implements the operator <. + /// + /// a. + /// The b. + /// + /// The result of the operator. + /// + public static bool operator <(AtomicTypeBase a, T b) => a.CompareTo(b) < 0; + + /// + /// Implements the operator >=. + /// + /// a. + /// The b. + /// + /// The result of the operator. + /// + public static bool operator >=(AtomicTypeBase a, T b) => a.CompareTo(b) >= 0; + + /// + /// Implements the operator <=. + /// + /// a. + /// The b. + /// + /// The result of the operator. + /// + public static bool operator <=(AtomicTypeBase a, T b) => a.CompareTo(b) <= 0; + + /// + /// Implements the operator ++. + /// + /// The instance. + /// + /// The result of the operator. + /// + public static AtomicTypeBase operator ++(AtomicTypeBase instance) + { + Interlocked.Increment(ref instance._backingValue); + return instance; + } + + /// + /// Implements the operator --. + /// + /// The instance. + /// + /// The result of the operator. + /// + public static AtomicTypeBase operator --(AtomicTypeBase instance) + { + Interlocked.Decrement(ref instance._backingValue); + return instance; + } + + /// + /// Implements the operator -<. + /// + /// The instance. + /// The operand. + /// + /// The result of the operator. + /// + public static AtomicTypeBase operator +(AtomicTypeBase instance, long operand) + { + instance.BackingValue = instance.BackingValue + operand; + return instance; + } + + /// + /// Implements the operator -. + /// + /// The instance. + /// The operand. + /// + /// The result of the operator. + /// + public static AtomicTypeBase operator -(AtomicTypeBase instance, long operand) + { + instance.BackingValue = instance.BackingValue - operand; + return instance; + } + + /// + /// Compares the value to the other instance. + /// + /// The other instance. + /// 0 if equal, 1 if this instance is greater, -1 if this instance is less than. + /// When types are incompatible. + public int CompareTo(object other) + { + switch (other) + { + case null: + return 1; + case AtomicTypeBase atomic: + return BackingValue.CompareTo(atomic.BackingValue); + case T variable: + return Value.CompareTo(variable); + } + + throw new ArgumentException("Incompatible comparison types"); + } + + /// + /// Compares the value to the other instance. + /// + /// The other instance. + /// 0 if equal, 1 if this instance is greater, -1 if this instance is less than. + public int CompareTo(T other) => Value.CompareTo(other); + + /// + /// Compares the value to the other instance. + /// + /// The other instance. + /// 0 if equal, 1 if this instance is greater, -1 if this instance is less than. + public int CompareTo(AtomicTypeBase other) => BackingValue.CompareTo(other?.BackingValue ?? default); + + /// + /// Determines whether the specified , is equal to this instance. + /// + /// The to compare with this instance. + /// + /// true if the specified is equal to this instance; otherwise, false. + /// + public override bool Equals(object other) + { + switch (other) + { + case AtomicTypeBase atomic: + return Equals(atomic); + case T variable: + return Equals(variable); + } + + return false; + } + + /// + /// Returns a hash code for this instance. + /// + /// + /// A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. + /// + public override int GetHashCode() => BackingValue.GetHashCode(); + + /// + public bool Equals(AtomicTypeBase other) => + BackingValue == (other?.BackingValue ?? default); + + /// + public bool Equals(T other) => Equals(Value, other); + + /// + /// Converts from a long value to the target type. + /// + /// The backing value. + /// The value converted form a long value. + protected abstract T FromLong(long backingValue); + + /// + /// Converts from the target type to a long value. + /// + /// The value. + /// The value converted to a long value. + protected abstract long ToLong(T value); + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Threading/CancellationTokenOwner.cs b/Vendor/Swan.Lite-3.1.0/Threading/CancellationTokenOwner.cs new file mode 100644 index 0000000..d09ec0c --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Threading/CancellationTokenOwner.cs @@ -0,0 +1,68 @@ +using System; +using System.Threading; + +namespace Swan.Threading +{ + /// + /// Acts as a but with reusable tokens. + /// + public sealed class CancellationTokenOwner : IDisposable + { + private readonly object _syncLock = new object(); + private bool _isDisposed; + private CancellationTokenSource _tokenSource = new CancellationTokenSource(); + + /// + /// Gets the token of the current. + /// + public CancellationToken Token + { + get + { + lock (_syncLock) + { + return _isDisposed + ? CancellationToken.None + : _tokenSource.Token; + } + } + } + + /// + /// Cancels the last referenced token and creates a new token source. + /// + public void Cancel() + { + lock (_syncLock) + { + if (_isDisposed) return; + _tokenSource.Cancel(); + _tokenSource.Dispose(); + _tokenSource = new CancellationTokenSource(); + } + } + + /// + public void Dispose() => Dispose(true); + + /// + /// Releases unmanaged and - optionally - managed resources. + /// + /// true to release both managed and unmanaged resources; false to release only unmanaged resources. + private void Dispose(bool disposing) + { + lock (_syncLock) + { + if (_isDisposed) return; + + if (disposing) + { + _tokenSource.Cancel(); + _tokenSource.Dispose(); + } + + _isDisposed = true; + } + } + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Threading/ExclusiveTimer.cs b/Vendor/Swan.Lite-3.1.0/Threading/ExclusiveTimer.cs new file mode 100644 index 0000000..3b452fb --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Threading/ExclusiveTimer.cs @@ -0,0 +1,232 @@ +using System; +using System.Threading; + +namespace Swan.Threading +{ + /// + /// A threading implementation that executes at most one cycle at a time + /// in a thread. Callback execution is NOT guaranteed to be carried out + /// on the same thread every time the timer fires. + /// + public sealed class ExclusiveTimer : IDisposable + { + private readonly object _syncLock = new object(); + private readonly ManualResetEventSlim _cycleDoneEvent = new ManualResetEventSlim(true); + private readonly Timer _backingTimer; + private readonly TimerCallback _userCallback; + private readonly AtomicBoolean _isDisposing = new AtomicBoolean(); + private readonly AtomicBoolean _isDisposed = new AtomicBoolean(); + private int _period; + + /// + /// Initializes a new instance of the class. + /// + /// The timer callback. + /// The state. + /// The due time. + /// The period. + public ExclusiveTimer(TimerCallback timerCallback, object? state, int dueTime, int period) + { + _period = period; + _userCallback = timerCallback; + _backingTimer = new Timer(InternalCallback, state ?? this, dueTime, Timeout.Infinite); + } + + /// + /// Initializes a new instance of the class. + /// + /// The timer callback. + /// The state. + /// The due time. + /// The period. + public ExclusiveTimer(TimerCallback timerCallback, object? state, TimeSpan dueTime, TimeSpan period) + : this(timerCallback, state, Convert.ToInt32(dueTime.TotalMilliseconds), Convert.ToInt32(period.TotalMilliseconds)) + { + // placeholder + } + + /// + /// Initializes a new instance of the class. + /// + /// The timer callback. + public ExclusiveTimer(TimerCallback timerCallback) + : this(timerCallback, null, Timeout.Infinite, Timeout.Infinite) + { + // placeholder + } + + /// + /// Initializes a new instance of the class. + /// + /// The timer callback. + /// The due time. + /// The period. + public ExclusiveTimer(Action timerCallback, int dueTime, int period) + : this(s => { timerCallback?.Invoke(); }, null, dueTime, period) + { + // placeholder + } + + /// + /// Initializes a new instance of the class. + /// + /// The timer callback. + /// The due time. + /// The period. + public ExclusiveTimer(Action timerCallback, TimeSpan dueTime, TimeSpan period) + : this(s => { timerCallback?.Invoke(); }, null, dueTime, period) + { + // placeholder + } + + /// + /// Initializes a new instance of the class. + /// + /// The timer callback. + public ExclusiveTimer(Action timerCallback) + : this(timerCallback, Timeout.Infinite, Timeout.Infinite) + { + // placeholder + } + + /// + /// Gets a value indicating whether this instance is disposing. + /// + /// + /// true if this instance is disposing; otherwise, false. + /// + public bool IsDisposing => _isDisposing.Value; + + /// + /// Gets a value indicating whether this instance is disposed. + /// + /// + /// true if this instance is disposed; otherwise, false. + /// + public bool IsDisposed => _isDisposed.Value; + + /// + /// Waits until the time is elapsed. + /// + /// The until date. + /// The cancellation token. + public static void WaitUntil(DateTime untilDate, CancellationToken cancellationToken = default) + { + static void Callback(IWaitEvent waitEvent) + { + try + { + waitEvent.Complete(); + waitEvent.Begin(); + } + catch + { + // ignore + } + } + + using var delayLock = WaitEventFactory.Create(true); + using var timer = new ExclusiveTimer(() => Callback(delayLock), 0, 15); + while (!cancellationToken.IsCancellationRequested && DateTime.UtcNow < untilDate) + delayLock.Wait(); + } + + /// + /// Waits the specified wait time. + /// + /// The wait time. + /// The cancellation token. + public static void Wait(TimeSpan waitTime, CancellationToken cancellationToken = default) => + WaitUntil(DateTime.UtcNow.Add(waitTime), cancellationToken); + + /// + /// Changes the start time and the interval between method invocations for the internal timer. + /// + /// The due time. + /// The period. + public void Change(int dueTime, int period) + { + _period = period; + + _backingTimer.Change(dueTime, Timeout.Infinite); + } + + /// + /// Changes the start time and the interval between method invocations for the internal timer. + /// + /// The due time. + /// The period. + public void Change(TimeSpan dueTime, TimeSpan period) + => Change(Convert.ToInt32(dueTime.TotalMilliseconds), Convert.ToInt32(period.TotalMilliseconds)); + + /// + /// Changes the interval between method invocations for the internal timer. + /// + /// The period. + public void Resume(int period) => Change(0, period); + + /// + /// Changes the interval between method invocations for the internal timer. + /// + /// The period. + public void Resume(TimeSpan period) => Change(TimeSpan.Zero, period); + + /// + /// Pauses this instance. + /// + public void Pause() => Change(Timeout.Infinite, Timeout.Infinite); + + /// + public void Dispose() + { + lock (_syncLock) + { + if (_isDisposed == true || _isDisposing == true) + return; + + _isDisposing.Value = true; + } + + try + { + _cycleDoneEvent.Wait(); + _cycleDoneEvent.Dispose(); + Pause(); + _backingTimer.Dispose(); + } + finally + { + _isDisposed.Value = true; + _isDisposing.Value = false; + } + } + + /// + /// Logic that runs every time the timer hits the due time. + /// + /// The state. + private void InternalCallback(object state) + { + lock (_syncLock) + { + if (IsDisposed || IsDisposing) + return; + } + + if (_cycleDoneEvent.IsSet == false) + return; + + _cycleDoneEvent.Reset(); + + try + { + _userCallback(state); + } + finally + { + _cycleDoneEvent?.Set(); + _backingTimer?.Change(_period, Timeout.Infinite); + } + } + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Threading/ISyncLocker.cs b/Vendor/Swan.Lite-3.1.0/Threading/ISyncLocker.cs new file mode 100644 index 0000000..be75c8d --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Threading/ISyncLocker.cs @@ -0,0 +1,24 @@ +using System; + +namespace Swan.Threading +{ + /// + /// Defines a generic interface for synchronized locking mechanisms. + /// + public interface ISyncLocker : IDisposable + { + /// + /// Acquires a writer lock. + /// The lock is released when the returned locking object is disposed. + /// + /// A disposable locking object. + IDisposable AcquireWriterLock(); + + /// + /// Acquires a reader lock. + /// The lock is released when the returned locking object is disposed. + /// + /// A disposable locking object. + IDisposable AcquireReaderLock(); + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Threading/IWaitEvent.cs b/Vendor/Swan.Lite-3.1.0/Threading/IWaitEvent.cs new file mode 100644 index 0000000..6b949e8 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Threading/IWaitEvent.cs @@ -0,0 +1,57 @@ +using System; + +namespace Swan.Threading +{ + /// + /// Provides a generalized API for ManualResetEvent and ManualResetEventSlim. + /// + /// + public interface IWaitEvent : IDisposable + { + /// + /// Gets a value indicating whether the event is in the completed state. + /// + bool IsCompleted { get; } + + /// + /// Gets a value indicating whether the Begin method has been called. + /// It returns false after the Complete method is called. + /// + bool IsInProgress { get; } + + /// + /// Returns true if the underlying handle is not closed and it is still valid. + /// + bool IsValid { get; } + + /// + /// Gets a value indicating whether this instance is disposed. + /// + bool IsDisposed { get; } + + /// + /// Enters the state in which waiters need to wait. + /// All future waiters will block when they call the Wait method. + /// + void Begin(); + + /// + /// Leaves the state in which waiters need to wait. + /// All current waiters will continue. + /// + void Complete(); + + /// + /// Waits for the event to be completed. + /// + void Wait(); + + /// + /// Waits for the event to be completed. + /// Returns true when there was no timeout. False if the timeout was reached. + /// + /// The maximum amount of time to wait for. + /// true when there was no timeout. false if the timeout was reached. + bool Wait(TimeSpan timeout); + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Threading/IWorker.cs b/Vendor/Swan.Lite-3.1.0/Threading/IWorker.cs new file mode 100644 index 0000000..f70c60c --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Threading/IWorker.cs @@ -0,0 +1,69 @@ +using System; +using System.Threading.Tasks; + +namespace Swan.Threading +{ + /// + /// Defines a standard API to control background application workers. + /// + public interface IWorker + { + /// + /// Gets the current state of the worker. + /// + WorkerState WorkerState { get; } + + /// + /// Gets a value indicating whether this instance is disposed. + /// + /// + /// true if this instance is disposed; otherwise, false. + /// + bool IsDisposed { get; } + + /// + /// Gets a value indicating whether this instance is currently being disposed. + /// + /// + /// true if this instance is disposing; otherwise, false. + /// + bool IsDisposing { get; } + + /// + /// Gets or sets the time interval used to execute cycles. + /// + TimeSpan Period { get; set; } + + /// + /// Gets the name identifier of this worker. + /// + string Name { get; } + + /// + /// Starts execution of worker cycles. + /// + /// The awaitable task. + Task StartAsync(); + + /// + /// Pauses execution of worker cycles. + /// + /// The awaitable task. + Task PauseAsync(); + + /// + /// Resumes execution of worker cycles. + /// + /// The awaitable task. + Task ResumeAsync(); + + /// + /// Permanently stops execution of worker cycles. + /// An interrupt is always sent to the worker. If you wish to stop + /// the worker without interrupting then call the + /// method, await it, and finally call the method. + /// + /// The awaitable task. + Task StopAsync(); + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Threading/IWorkerDelayProvider.cs b/Vendor/Swan.Lite-3.1.0/Threading/IWorkerDelayProvider.cs new file mode 100644 index 0000000..8868c14 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Threading/IWorkerDelayProvider.cs @@ -0,0 +1,21 @@ +using System.Threading; +using System.Threading.Tasks; + +namespace Swan.Threading +{ + /// + /// An interface for a worker cycle delay provider. + /// + public interface IWorkerDelayProvider + { + /// + /// Suspends execution queues a new cycle for execution. The delay is given in + /// milliseconds. When overridden in a derived class the wait handle will be set + /// whenever an interrupt is received. + /// + /// The remaining delay to wait for in the cycle. + /// Contains a reference to a task with the scheduled period delay. + /// The cancellation token to cancel waiting. + void ExecuteCycleDelay(int wantedDelay, Task delayTask, CancellationToken token); + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Threading/PeriodicTask.cs b/Vendor/Swan.Lite-3.1.0/Threading/PeriodicTask.cs new file mode 100644 index 0000000..11aaf37 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Threading/PeriodicTask.cs @@ -0,0 +1,101 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using Swan.Logging; + +namespace Swan.Threading +{ + /// + /// Schedule an action to be periodically executed on the thread pool. + /// + public sealed class PeriodicTask : IDisposable + { + /// + /// The minimum interval between action invocations. + /// The value of this field is equal to 100 milliseconds. + /// + public static readonly TimeSpan MinInterval = TimeSpan.FromMilliseconds(100); + + private readonly Func _action; + private readonly CancellationTokenSource _cancellationTokenSource; + + private TimeSpan _interval; + + /// + /// Initializes a new instance of the class. + /// + /// The interval between invocations of . + /// The callback to invoke periodically. + /// A that can be used to cancel operations. + public PeriodicTask(TimeSpan interval, Func action, CancellationToken cancellationToken = default) + { + _action = action ?? throw new ArgumentNullException(nameof(action)); + _cancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken); + _interval = ValidateInterval(interval); + + Task.Run(ActionLoop); + } + + /// + /// Finalizes an instance of the class. + /// + ~PeriodicTask() + { + Dispose(false); + } + + /// + /// Gets or sets the interval between periodic action invocations. + /// Changes to this property take effect after next action invocation. + /// + /// + public TimeSpan Interval + { + get => _interval; + set => _interval = ValidateInterval(value); + } + + /// + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + private void Dispose(bool disposing) + { + if (disposing) + { + _cancellationTokenSource.Cancel(); + _cancellationTokenSource.Dispose(); + } + } + + private static TimeSpan ValidateInterval(TimeSpan value) + => value < MinInterval ? MinInterval : value; + + private async Task ActionLoop() + { + for (; ; ) + { + try + { + await Task.Delay(Interval, _cancellationTokenSource.Token).ConfigureAwait(false); + await _action(_cancellationTokenSource.Token).ConfigureAwait(false); + } + catch (OperationCanceledException) when (_cancellationTokenSource.IsCancellationRequested) + { + break; + } + catch (TaskCanceledException) when (_cancellationTokenSource.IsCancellationRequested) + { + break; + } + catch (Exception ex) + { + ex.Log(nameof(PeriodicTask)); + } + } + } + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Threading/RunnerBase.cs b/Vendor/Swan.Lite-3.1.0/Threading/RunnerBase.cs new file mode 100644 index 0000000..1e3dba5 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Threading/RunnerBase.cs @@ -0,0 +1,187 @@ +using System; +using System.Collections.Generic; +using System.Threading; +using Swan.Configuration; +using Swan.Logging; + +namespace Swan.Threading +{ + /// + /// Represents an background worker abstraction with a life cycle and running at a independent thread. + /// + public abstract class RunnerBase : ConfiguredObject, IDisposable + { + private Thread? _worker; + private CancellationTokenSource? _cancelTokenSource; + private ManualResetEvent? _workFinished; + + /// + /// Initializes a new instance of the class. + /// + /// if set to true [is enabled]. + protected RunnerBase(bool isEnabled) + { + Name = GetType().Name; + IsEnabled = isEnabled; + } + + /// + /// Gets the error messages. + /// + /// + /// The error messages. + /// + public List ErrorMessages { get; } = new List(); + + /// + /// Gets the name. + /// + /// + /// The name. + /// + public string Name { get; } + + /// + /// Gets a value indicating whether this instance is running. + /// + /// + /// true if this instance is running; otherwise, false. + /// + public bool IsRunning { get; private set; } + + /// + /// Gets a value indicating whether this instance is enabled. + /// + /// + /// true if this instance is enabled; otherwise, false. + /// + public bool IsEnabled { get; } + + /// + /// Starts this instance. + /// + public virtual void Start() + { + if (IsEnabled == false) + return; + + "Start Requested".Debug(Name); + _cancelTokenSource = new CancellationTokenSource(); + _workFinished = new ManualResetEvent(false); + + _worker = new Thread(() => + { + _workFinished.Reset(); + IsRunning = true; + try + { + Setup(); + DoBackgroundWork(_cancelTokenSource.Token); + } + catch (ThreadAbortException) + { + $"{nameof(ThreadAbortException)} caught.".Warn(Name); + } +#pragma warning disable CA1031 // Do not catch general exception types + catch (Exception ex) +#pragma warning restore CA1031 // Do not catch general exception types + { + $"{ex.GetType()}: {ex.Message}\r\n{ex.StackTrace}".Error(Name); + } + finally + { + Cleanup(); + _workFinished?.Set(); + IsRunning = false; + "Stopped Completely".Debug(Name); + } + }) + { + IsBackground = true, + Name = $"{Name}Thread", + }; + + _worker.Start(); + } + + /// + /// Stops this instance. + /// + public virtual void Stop() + { + if (IsEnabled == false || IsRunning == false) + return; + + "Stop Requested".Debug(Name); + _cancelTokenSource?.Cancel(); + var waitRetries = 5; + while (waitRetries >= 1) + { + if (_workFinished?.WaitOne(250) ?? true) + { + waitRetries = -1; + break; + } + + waitRetries--; + } + + if (waitRetries < 0) + { + "Workbench stopped gracefully".Debug(Name); + } + else + { + "Did not respond to stop request. Aborting thread and waiting . . .".Warn(Name); + _worker?.Abort(); + + if (_workFinished?.WaitOne(5000) == false) + "Waited and no response. Worker might have been left in an inconsistent state.".Error(Name); + else + "Waited for worker and it finally responded (OK).".Debug(Name); + } + + _workFinished?.Dispose(); + _workFinished = null; + } + + /// + public void Dispose() + { + _cancelTokenSource?.Dispose(); + _workFinished?.Dispose(); + } + + /// + /// Setups this instance. + /// + protected void Setup() + { + EnsureConfigurationNotLocked(); + OnSetup(); + LockConfiguration(); + } + + /// + /// Cleanups this instance. + /// + protected virtual void Cleanup() + { + // empty + } + + /// + /// Called when [setup]. + /// + protected virtual void OnSetup() + { + // empty + } + + /// + /// Does the background work. + /// + /// The ct. + protected abstract void DoBackgroundWork(CancellationToken cancellationToken); + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Threading/SyncLockerFactory.cs b/Vendor/Swan.Lite-3.1.0/Threading/SyncLockerFactory.cs new file mode 100644 index 0000000..ab2f470 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Threading/SyncLockerFactory.cs @@ -0,0 +1,185 @@ +using System; +using System.Threading; + +namespace Swan.Threading +{ + /// + /// Provides factory methods to create synchronized reader-writer locks + /// that support a generalized locking and releasing api and syntax. + /// + public static class SyncLockerFactory + { + #region Enums and Interfaces + + /// + /// Enumerates the locking operations. + /// + private enum LockHolderType + { + Read, + Write, + } + + /// + /// Defines methods for releasing locks. + /// + private interface ISyncReleasable + { + /// + /// Releases the writer lock. + /// + void ReleaseWriterLock(); + + /// + /// Releases the reader lock. + /// + void ReleaseReaderLock(); + } + + #endregion + + #region Factory Methods + + /// + /// Creates a reader-writer lock backed by a standard ReaderWriterLock. + /// + /// The synchronized locker. + public static ISyncLocker Create() => new SyncLocker(); + + /// + /// Creates a reader-writer lock backed by a ReaderWriterLockSlim. + /// + /// The synchronized locker. + public static ISyncLocker CreateSlim() => new SyncLockerSlim(); + + /// + /// Creates a reader-writer lock. + /// + /// if set to true it uses the Slim version of a reader-writer lock. + /// The Sync Locker. + public static ISyncLocker Create(bool useSlim) => useSlim ? CreateSlim() : Create(); + + #endregion + + #region Private Classes + + /// + /// The lock releaser. Calling the dispose method releases the lock entered by the parent SyncLocker. + /// + /// + private sealed class SyncLockReleaser : IDisposable + { + private readonly ISyncReleasable _parent; + private readonly LockHolderType _operation; + + private bool _isDisposed; + + /// + /// Initializes a new instance of the class. + /// + /// The parent. + /// The operation. + public SyncLockReleaser(ISyncReleasable parent, LockHolderType operation) + { + _parent = parent; + _operation = operation; + } + + /// + public void Dispose() + { + if (_isDisposed) return; + _isDisposed = true; + + if (_operation == LockHolderType.Read) + _parent.ReleaseReaderLock(); + else + _parent.ReleaseWriterLock(); + } + } + + /// + /// The Sync Locker backed by a ReaderWriterLock. + /// + /// + /// + private sealed class SyncLocker : ISyncLocker, ISyncReleasable + { + private bool _isDisposed; + private ReaderWriterLock? _locker = new ReaderWriterLock(); + + /// + public IDisposable AcquireReaderLock() + { + _locker?.AcquireReaderLock(Timeout.Infinite); + return new SyncLockReleaser(this, LockHolderType.Read); + } + + /// + public IDisposable AcquireWriterLock() + { + _locker?.AcquireWriterLock(Timeout.Infinite); + return new SyncLockReleaser(this, LockHolderType.Write); + } + + /// + public void ReleaseWriterLock() => _locker?.ReleaseWriterLock(); + + /// + public void ReleaseReaderLock() => _locker?.ReleaseReaderLock(); + + /// + public void Dispose() + { + if (_isDisposed) return; + _isDisposed = true; + _locker?.ReleaseLock(); + _locker = null; + } + } + + /// + /// The Sync Locker backed by ReaderWriterLockSlim. + /// + /// + /// + private sealed class SyncLockerSlim : ISyncLocker, ISyncReleasable + { + private bool _isDisposed; + + private ReaderWriterLockSlim _locker + = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion); + + /// + public IDisposable AcquireReaderLock() + { + _locker?.EnterReadLock(); + return new SyncLockReleaser(this, LockHolderType.Read); + } + + /// + public IDisposable AcquireWriterLock() + { + _locker?.EnterWriteLock(); + return new SyncLockReleaser(this, LockHolderType.Write); + } + + /// + public void ReleaseWriterLock() => _locker?.ExitWriteLock(); + + /// + public void ReleaseReaderLock() => _locker?.ExitReadLock(); + + /// + public void Dispose() + { + if (_isDisposed) return; + _isDisposed = true; + _locker?.Dispose(); + _locker = null; + } + } + + #endregion + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Threading/WaitEventFactory.cs b/Vendor/Swan.Lite-3.1.0/Threading/WaitEventFactory.cs new file mode 100644 index 0000000..ed9076f --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Threading/WaitEventFactory.cs @@ -0,0 +1,204 @@ +using System; +using System.Threading; + +namespace Swan.Threading +{ + /// + /// Provides a Manual Reset Event factory with a unified API. + /// + /// + /// The following example shows how to use the WaitEventFactory class. + /// + /// using Swan.Threading; + /// + /// public class Example + /// { + /// // create a WaitEvent using the slim version + /// private static readonly IWaitEvent waitEvent = WaitEventFactory.CreateSlim(false); + /// + /// public static void Main() + /// { + /// Task.Factory.StartNew(() => + /// { + /// DoWork(1); + /// }); + /// + /// Task.Factory.StartNew(() => + /// { + /// DoWork(2); + /// }); + /// + /// // send first signal + /// waitEvent.Complete(); + /// waitEvent.Begin(); + /// + /// Thread.Sleep(TimeSpan.FromSeconds(2)); + /// + /// // send second signal + /// waitEvent.Complete(); + /// + /// Terminal.Readline(); + /// } + /// + /// public static void DoWork(int taskNumber) + /// { + /// $"Data retrieved:{taskNumber}".WriteLine(); + /// waitEvent.Wait(); + /// + /// Thread.Sleep(TimeSpan.FromSeconds(2)); + /// $"All finished up {taskNumber}".WriteLine(); + /// } + /// } + /// + /// + public static class WaitEventFactory + { + #region Factory Methods + + /// + /// Creates a Wait Event backed by a standard ManualResetEvent. + /// + /// if initially set to completed. Generally true. + /// The Wait Event. + public static IWaitEvent Create(bool isCompleted) => new WaitEvent(isCompleted); + + /// + /// Creates a Wait Event backed by a ManualResetEventSlim. + /// + /// if initially set to completed. Generally true. + /// The Wait Event. + public static IWaitEvent CreateSlim(bool isCompleted) => new WaitEventSlim(isCompleted); + + /// + /// Creates a Wait Event backed by a ManualResetEventSlim. + /// + /// if initially set to completed. Generally true. + /// if set to true creates a slim version of the wait event. + /// The Wait Event. + public static IWaitEvent Create(bool isCompleted, bool useSlim) => useSlim ? CreateSlim(isCompleted) : Create(isCompleted); + + #endregion + + #region Backing Classes + + /// + /// Defines a WaitEvent backed by a ManualResetEvent. + /// + private class WaitEvent : IWaitEvent + { + private ManualResetEvent? _event; + + /// + /// Initializes a new instance of the class. + /// + /// if set to true [is completed]. + public WaitEvent(bool isCompleted) + { + _event = new ManualResetEvent(isCompleted); + } + + /// + public bool IsDisposed { get; private set; } + + /// + public bool IsValid + { + get + { + if (IsDisposed || _event == null) + return false; + + if (_event?.SafeWaitHandle?.IsClosed ?? true) + return false; + + return !(_event?.SafeWaitHandle?.IsInvalid ?? true); + } + } + + /// + public bool IsCompleted => IsValid == false || (_event?.WaitOne(0) ?? true); + + /// + public bool IsInProgress => !IsCompleted; + + /// + public void Begin() => _event?.Reset(); + + /// + public void Complete() => _event?.Set(); + + /// + void IDisposable.Dispose() + { + if (IsDisposed) return; + IsDisposed = true; + + _event?.Set(); + _event?.Dispose(); + _event = null; + } + + /// + public void Wait() => _event?.WaitOne(); + + /// + public bool Wait(TimeSpan timeout) => _event?.WaitOne(timeout) ?? true; + } + + /// + /// Defines a WaitEvent backed by a ManualResetEventSlim. + /// + private class WaitEventSlim : IWaitEvent + { + private ManualResetEventSlim? _event; + + /// + /// Initializes a new instance of the class. + /// + /// if set to true [is completed]. + public WaitEventSlim(bool isCompleted) + { + _event = new ManualResetEventSlim(isCompleted); + } + + /// + public bool IsDisposed { get; private set; } + + /// + public bool IsValid => + !IsDisposed && _event?.WaitHandle?.SafeWaitHandle != null && + (!_event.WaitHandle.SafeWaitHandle.IsClosed && !_event.WaitHandle.SafeWaitHandle.IsInvalid); + + /// + public bool IsCompleted => IsValid == false || _event?.IsSet == true; + + /// + public bool IsInProgress => !IsCompleted; + + /// + public void Begin() => _event?.Reset(); + + /// + public void Complete() => _event?.Set(); + + /// + void IDisposable.Dispose() + { + if (IsDisposed) return; + IsDisposed = true; + + _event?.Set(); + _event?.Dispose(); + _event = null; + } + + /// + public void Wait() => _event?.Wait(); + + /// + public bool Wait(TimeSpan timeout) => _event?.Wait(timeout) ?? true; + } + + #endregion + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Threading/WorkerState.cs b/Vendor/Swan.Lite-3.1.0/Threading/WorkerState.cs new file mode 100644 index 0000000..6e5feee --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Threading/WorkerState.cs @@ -0,0 +1,33 @@ +namespace Swan.Threading +{ + /// + /// Enumerates the different states in which a worker can be. + /// + public enum WorkerState + { + /// + /// The worker has been created and it is ready to start. + /// + Created, + + /// + /// The worker is running it cycle logic. + /// + Running, + + /// + /// The worker is running its delay logic. + /// + Waiting, + + /// + /// The worker is in the paused or suspended state. + /// + Paused, + + /// + /// The worker is stopped and ready for disposal. + /// + Stopped, + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Validators/IValidator.cs b/Vendor/Swan.Lite-3.1.0/Validators/IValidator.cs new file mode 100644 index 0000000..eb30992 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Validators/IValidator.cs @@ -0,0 +1,21 @@ +namespace Swan.Validators +{ + /// + /// A simple Validator interface. + /// + public interface IValidator + { + /// + /// The error message. + /// + string ErrorMessage { get; } + + /// + /// Checks if a value is valid. + /// + /// The type. + /// The value. + /// True if it is valid.False if it is not. + bool IsValid(T value); + } +} \ No newline at end of file diff --git a/Vendor/Swan.Lite-3.1.0/Validators/ObjectValidationResult.cs b/Vendor/Swan.Lite-3.1.0/Validators/ObjectValidationResult.cs new file mode 100644 index 0000000..9054aa8 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Validators/ObjectValidationResult.cs @@ -0,0 +1,58 @@ +using System.Collections.Generic; +using System.Linq; + +namespace Swan.Validators +{ + /// + /// Defines a validation result containing all validation errors and their properties. + /// + public class ObjectValidationResult + { + private readonly List _errors = new List(); + + /// + /// A list of errors. + /// + public IReadOnlyList Errors => _errors; + + /// + /// true if there are no errors; otherwise, false. + /// + public bool IsValid => !Errors.Any(); + + /// + /// Adds an error with a specified property name. + /// + /// The property name. + /// The error message. + public void Add(string propertyName, string errorMessage) => + _errors.Add(new ValidationError(errorMessage, propertyName)); + + /// + /// Defines a validation error. + /// + public class ValidationError + { + /// + /// Initializes a new instance of the class. + /// + /// Name of the property. + /// The error message. + public ValidationError(string propertyName, string errorMessage) + { + PropertyName = propertyName; + ErrorMessage = errorMessage; + } + + /// + /// The property name. + /// + public string PropertyName { get; } + + /// + /// The message error. + /// + public string ErrorMessage { get; } + } + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Validators/ObjectValidator.cs b/Vendor/Swan.Lite-3.1.0/Validators/ObjectValidator.cs new file mode 100644 index 0000000..59cef81 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Validators/ObjectValidator.cs @@ -0,0 +1,173 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using Swan.Reflection; + +namespace Swan.Validators +{ + /// + /// Represents an object validator. + /// + /// + /// The following code describes how to perform a simple object validation. + /// + /// using Swan.Validators; + /// + /// class Example + /// { + /// public static void Main() + /// { + /// // create an instance of ObjectValidator + /// var obj = new ObjectValidator(); + /// + /// // Add a validation to the 'Simple' class with a custom error message + /// obj.AddValidator<Simple>(x => + /// !string.IsNullOrEmpty(x.Name), "Name must not be empty"); + /// + /// // check if object is valid + /// var res = obj.IsValid(new Simple { Name = "Name" }); + /// } + /// + /// class Simple + /// { + /// public string Name { get; set; } + /// } + /// } + /// + /// + /// The following code shows of to validate an object with a custom validator and some attributes using the Runtime ObjectValidator singleton. + /// + /// using Swan.Validators; + /// + /// class Example + /// { + /// public static void Main() + /// { + /// // create an instance of ObjectValidator + /// Runtime.ObjectValidator + /// .AddValidator<Simple>(x => + /// !x.Name.Equals("Name"), "Name must not be 'Name'"); + /// + /// // validate object + /// var res = Runtime.ObjectValidator + /// .Validate(new Simple{ Name = "name", Number = 5, Email ="email@mail.com"}) + /// } + /// + /// class Simple + /// { + /// [NotNull] + /// public string Name { get; set; } + /// + /// [Range(1, 10)] + /// public int Number { get; set; } + /// + /// [Email] + /// public string Email { get; set; } + /// } + /// } + /// + /// + public class ObjectValidator + { + private static readonly Lazy LazyInstance = new Lazy(() => new ObjectValidator()); + + private readonly ConcurrentDictionary>> _predicates = + new ConcurrentDictionary>>(); + + /// + /// Gets the current. + /// + /// + /// The current. + /// + public static ObjectValidator Current => LazyInstance.Value; + + /// + /// Validates an object given the specified validators and attributes. + /// + /// The type of the object. + /// The object. + /// A validation result. + public ObjectValidationResult Validate(T target) + { + var errorList = new ObjectValidationResult(); + ValidateObject(target, false, errorList.Add); + + return errorList; + } + + /// + /// Validates an object given the specified validators and attributes. + /// + /// The type. + /// The object. + /// + /// true if the specified object is valid; otherwise, false. + /// + /// obj. + public bool IsValid(T target) => ValidateObject(target); + + /// + /// Adds a validator to a specific class. + /// + /// The type of the object. + /// The predicate that will be evaluated. + /// The message. + /// + /// predicate + /// or + /// message. + /// + public void AddValidator(Predicate predicate, string message) + where T : class + { + if (predicate == null) + throw new ArgumentNullException(nameof(predicate)); + + if (string.IsNullOrEmpty(message)) + throw new ArgumentNullException(message); + + if (!_predicates.TryGetValue(typeof(T), out var existing)) + { + existing = new List>(); + _predicates[typeof(T)] = existing; + } + + existing.Add(Tuple.Create((Delegate)predicate, message)); + } + + private bool ValidateObject(T obj, bool returnOnError = true, Action? action = null) + { + if (Equals(obj, null)) + throw new ArgumentNullException(nameof(obj)); + + if (_predicates.ContainsKey(typeof(T))) + { + foreach (var (@delegate, value) in _predicates[typeof(T)]) + { + if ((bool)@delegate.DynamicInvoke(obj)) continue; + + action?.Invoke(value, string.Empty); + if (returnOnError) return false; + } + } + + var properties = AttributeCache.DefaultCache.Value.RetrieveFromType(); + + foreach (var prop in properties) + { + foreach (var attribute in prop.Value) + { + var val = (IValidator)attribute; + + if (val.IsValid(prop.Key.GetValue(obj, null))) continue; + + action?.Invoke(val.ErrorMessage, prop.Key.Name); + if (returnOnError) return false; + } + } + + return true; + } + } +} diff --git a/Vendor/Swan.Lite-3.1.0/Validators/Validators.cs b/Vendor/Swan.Lite-3.1.0/Validators/Validators.cs new file mode 100644 index 0000000..3cdbe67 --- /dev/null +++ b/Vendor/Swan.Lite-3.1.0/Validators/Validators.cs @@ -0,0 +1,132 @@ +using System; +using System.Text.RegularExpressions; + +namespace Swan.Validators +{ + /// + /// Regex validator. + /// + [AttributeUsage(AttributeTargets.Property)] + public class MatchAttribute : Attribute, IValidator + { + /// + /// Initializes a new instance of the class. + /// + /// A regex string. + /// The error message. + /// Expression. + public MatchAttribute(string regex, string? errorMessage = null) + { + Expression = regex ?? throw new ArgumentNullException(nameof(regex)); + ErrorMessage = errorMessage ?? "String does not match the specified regular expression"; + } + + /// + /// The string regex used to find a match. + /// + public string Expression { get; } + + /// + public string ErrorMessage { get; internal set; } + + /// + public bool IsValid(T value) + { + if (Equals(value, default(T))) + return false; + + return !(value is string) + ? throw new ArgumentException("Property is not a string") + : Regex.IsMatch(value.ToString(), Expression); + } + } + + /// + /// Email validator. + /// + [AttributeUsage(AttributeTargets.Property)] + public class EmailAttribute : MatchAttribute + { + private const string EmailRegExp = + @"^(?("")("".+?(? + /// Initializes a new instance of the class. + /// + /// The error message. + public EmailAttribute(string? errorMessage = null) + : base(EmailRegExp, errorMessage ?? "String is not an email") + { + } + } + + /// + /// A not null validator. + /// + [AttributeUsage(AttributeTargets.Property)] + public class NotNullAttribute : Attribute, IValidator + { + /// + public string ErrorMessage => "Value is null"; + + /// + public bool IsValid(T value) => !Equals(default(T), value); + } + + /// + /// A range constraint validator. + /// + [AttributeUsage(AttributeTargets.Property)] + public class RangeAttribute : Attribute, IValidator + { + /// + /// Initializes a new instance of the class. + /// Constructor that takes integer minimum and maximum values. + /// + /// The minimum value. + /// The maximum value. + public RangeAttribute(int min, int max) + { + if (min >= max) + throw new InvalidOperationException("Maximum value must be greater than minimum"); + + Maximum = max; + Minimum = min; + } + + /// + /// Initializes a new instance of the class. + /// Constructor that takes double minimum and maximum values. + /// + /// The minimum value. + /// The maximum value. + public RangeAttribute(double min, double max) + { + if (min >= max) + throw new InvalidOperationException("Maximum value must be greater than minimum"); + + Maximum = max; + Minimum = min; + } + + /// + public string ErrorMessage => "Value is not within the specified range"; + + /// + /// Maximum value for the range. + /// + public IComparable Maximum { get; } + + /// + /// Minimum value for the range. + /// + public IComparable Minimum { get; } + + /// + public bool IsValid(T value) + => value is IComparable comparable + ? comparable.CompareTo(Minimum) >= 0 && comparable.CompareTo(Maximum) <= 0 + : throw new ArgumentException(nameof(value)); + } +}
");
+
+            if (encodedPath.Length > 1)
+                text.Write("../\n");
+
+            entries = entries.ToArray();
+
+            foreach (var directory in entries.Where(m => m.IsDirectory).OrderBy(e => e.Name))
+            {
+                text.Write($"{WebUtility.HtmlEncode(directory.Name)}");
+                text.Write(new string(' ', Math.Max(1, MaxEntryLength - directory.Name.Length + 1)));
+                text.Write(HttpDate.Format(directory.LastModifiedUtc));
+                text.Write('\n');
+                await Task.Yield();
+            }
+
+            foreach (var file in entries.Where(m => m.IsFile).OrderBy(e => e.Name))
+            {
+                text.Write($"{WebUtility.HtmlEncode(file.Name)}");
+                text.Write(new string(' ', Math.Max(1, MaxEntryLength - file.Name.Length + 1)));
+                text.Write(HttpDate.Format(file.LastModifiedUtc));
+                text.Write($" {file.Length.ToString("#,###", CultureInfo.InvariantCulture),SizeIndent}\n");
+                await Task.Yield();
+            }
+
+            text.Write("