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()); } } }
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(); } } }