Beispiel #1
0
        async Task ProcessHttpListenerContext(Task <HttpListenerContext> gottenContext)
        {
            var requestArrivedOn = DateTime.UtcNow;

            getContexts.Release();

            HttpListenerContext ctx = gottenContext.Result;
            HttpResponse        httpResp;

            if (!lifeCycleToken.IsShutdown)
            {
                try
                {
                    HttpRequest httpReq = ctx.Request;
                    var         result  = await router.HandleRequest(httpReq, requestArrivedOn).ConfigureAwait(false);

                    httpResp = result.HttpResponse;
                }
                catch (Exception e)
                {
                    logger.Fatal("InternalServerError processing HttpListenerContext - {0}", e.ToString());
                    httpResp = new ErrorResponse(HttpStatusCode.InternalServerError);
                }
            }
            else
            {
                httpResp = ServiceUnavailable;
            }

            await WriteAndCloseResponse(httpResp, ctx.Response).ConfigureAwait(false);
        }
 void RunJobs()
 {
     for (int i = 0; i < jobs.Length; i++)
     {
         try
         {
             jobs[i].Run();
         }
         catch (Exception e)
         {
             logger.Fatal("WaitableTimer.Job:[{0}] exception - {1}", jobs[i].Name, e.ToString());
         }
     }
 }
Beispiel #3
0
        async Task HandleSession(HttpSession session)
        {
            var closeSessionOnReturn = true;

            try
            {
                var continueRequestLoop = true;

                while (continueRequestLoop && !session.IsDisconnected()) // request loop
                {
                    try
                    {
                        TrackSessionRead(session.Id);
                        if (await session.ReadToBufferAsync().ConfigureAwait(false) == 0) // 0 => client clean disconnect
                        {
                            break;
                        }
                    }
                    finally
                    {
                        UntrackSessionRead(session.Id);
                    }

                    int responseBytesWritten;

                    while (continueRequestLoop && session.TryParseNextRequestFromBuffer(out int requestBytesParsed, out HttpRequest request))
                    {
                        Router.HandleResult result = await router.HandleRequest(request, DateTime.UtcNow).ConfigureAwait(false);

                        HttpResponse response = result.HttpResponse;

                        if (response is WebSocketUpgradeResponse)
                        {
                            continueRequestLoop = false;

                            if (response is WebSocketUpgradeResponse.AcceptUpgradeResponse acceptUpgrade)
                            {
                                responseBytesWritten = await AcceptWebSocketUpgrade(session, result.MatchedRouteTableIndex, result.MatchedEndpointIndex, acceptUpgrade).ConfigureAwait(false);

                                closeSessionOnReturn = false;
                            }
                            else
                            {
                                var rejectUpgrade = (WebSocketUpgradeResponse.RejectUpgradeResponse)response;
                                responseBytesWritten = await rejectUpgrade.WriteToAsync(session.Stream, 0, sessionReadTimeout).ConfigureAwait(false);
                            }
                        }
                        else
                        {
                            responseBytesWritten = await response.WriteToAsync(session.Stream, request.IsKeepAlive?session.KeepAlivesRemaining : 0, sessionReadTimeout).ConfigureAwait(false);

                            continueRequestLoop = request.IsKeepAlive && session.KeepAlivesRemaining > 0;
                        }

                        if (result.MatchedRouteTableIndex >= 0 && result.MatchedEndpointIndex >= 0)
                        {
                            router.Metrics.CountBytes(result.MatchedRouteTableIndex, result.MatchedEndpointIndex, requestBytesParsed, responseBytesWritten);
                        }
                    }
                }
            }
            catch (RequestException e)
            {
                sessionExceptionCounters.Count(e.GetType());
                logger.Warn("Error parsing or bad request - {0}", e.Message);
            }
            catch (SessionStreamException e)
            {
                sessionExceptionCounters.Count(e.GetType());
            }
            catch (Exception e)
            {
                sessionExceptionCounters.Count(e.GetType());
                logger.Fatal("Error handling session - {0}", e.ToString());
            }
            finally
            {
                UntrackSession(session.Id);
                if (closeSessionOnReturn)
                {
                    session.CloseQuiety();
                }
            }
        }