public HttpSysListener(HttpSysOptions options, ILoggerFactory loggerFactory) { if (options == null) { throw new ArgumentNullException(nameof(options)); } if (loggerFactory == null) { throw new ArgumentNullException(nameof(loggerFactory)); } if (!HttpApi.Supported) { throw new PlatformNotSupportedException(); } Debug.Assert(HttpApi.ApiVersion == HttpApiTypes.HTTP_API_VERSION.Version20, "Invalid Http api version"); Options = options; Logger = LogHelper.CreateLogger(loggerFactory, typeof(HttpSysListener)); _state = State.Stopped; _internalLock = new object(); // V2 initialization sequence: // 1. Create server session // 2. Create url group // 3. Create request queue - Done in Start() // 4. Add urls to url group - Done in Start() // 5. Attach request queue to url group - Done in Start() try { _serverSession = new ServerSession(); _urlGroup = new UrlGroup(_serverSession, Logger); _requestQueue = new RequestQueue(_urlGroup, Logger); _disconnectListener = new DisconnectListener(_requestQueue, Logger); } catch (Exception exception) { // If Url group or request queue creation failed, close server session before throwing. _requestQueue?.Dispose(); _urlGroup?.Dispose(); _serverSession?.Dispose(); LogHelper.LogException(Logger, ".Ctor", exception); throw; } }
internal unsafe UrlGroup(ServerSession serverSession, ILogger logger) { _serverSession = serverSession; _logger = logger; ulong urlGroupId = 0; var statusCode = HttpApi.HttpCreateUrlGroup( _serverSession.Id.DangerousGetServerSessionId(), &urlGroupId, 0); if (statusCode != UnsafeNclNativeMethods.ErrorCodes.ERROR_SUCCESS) { throw new HttpSysException((int)statusCode); } Debug.Assert(urlGroupId != 0, "Invalid id returned by HttpCreateUrlGroup"); Id = urlGroupId; }