private unsafe ListenerClientCertAsyncResult AsyncProcessClientCertificate(AsyncCallback requestCallback, object state)
{
if (this.m_ClientCertState == ListenerClientCertState.InProgress)
{
throw new InvalidOperationException(SR.GetString("net_listener_callinprogress", new object[] { "GetClientCertificate()/BeginGetClientCertificate()" }));
}
this.m_ClientCertState = ListenerClientCertState.InProgress;
this.HttpListenerContext.EnsureBoundHandle();
ListenerClientCertAsyncResult result = null;
if (this.m_SslStatus != SslStatus.Insecure)
{
uint size = 0x5dc;
result = new ListenerClientCertAsyncResult(this, state, requestCallback, size);
try
{
uint num2;
Label_0058:
num2 = 0;
uint num3 = UnsafeNclNativeMethods.HttpApi.HttpReceiveClientCertificate(this.HttpListenerContext.RequestQueueHandle, this.m_ConnectionId, 0, result.RequestBlob, size, &num2, result.NativeOverlapped);
if (num3 == 0xea)
{
UnsafeNclNativeMethods.HttpApi.HTTP_SSL_CLIENT_CERT_INFO *requestBlob = result.RequestBlob;
size = num2 + requestBlob->CertEncodedSize;
result.Reset(size);
goto Label_0058;
}
if ((num3 != 0) && (num3 != 0x3e5))
{
throw new HttpListenerException((int)num3);
}
return(result);
}
catch
{
if (result != null)
{
result.InternalCleanup();
}
throw;
}
}
result = new ListenerClientCertAsyncResult(this, state, requestCallback, 0);
result.InvokeCallback();
return(result);
}