private void SetupV2Config()
{
uint statusCode = Interop.HttpApi.ERROR_SUCCESS;
ulong id = 0;
//
// If we have already initialized V2 config, then nothing to do.
//
if (_V2Initialized)
{
return;
}
//
// 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
{
statusCode = Interop.HttpApi.HttpCreateServerSession(
Interop.HttpApi.s_version, &id, 0);
if (statusCode != Interop.HttpApi.ERROR_SUCCESS)
{
throw new HttpListenerException((int)statusCode);
}
Debug.Assert(id != 0, "Invalid id returned by HttpCreateServerSession");
_serverSessionHandle = new HttpServerSessionHandle(id);
id = 0;
statusCode = Interop.HttpApi.HttpCreateUrlGroup(
_serverSessionHandle.DangerousGetServerSessionId(), &id, 0);
if (statusCode != Interop.HttpApi.ERROR_SUCCESS)
{
throw new HttpListenerException((int)statusCode);
}
Debug.Assert(id != 0, "Invalid id returned by HttpCreateUrlGroup");
_urlGroupId = id;
_V2Initialized = true;
}
catch (Exception exception)
{
//
// If V2 initialization fails, we mark object as unusable.
//
_state = State.Closed;
//
// If Url group or request queue creation failed, close server session before throwing.
//
_serverSessionHandle?.Dispose();
if (NetEventSource.IsEnabled) NetEventSource.Error(this, $"SetupV2Config {exception}");
throw;
}
}