public Task <IHttpResponse> Instigate(IApplication httpApp, IHttpRequest request, ParameterInfo parameterInfo, Func <object, Task <IHttpResponse> > onSuccess) { return(EastFive.Web.Configuration.Settings.GetString(AppSettings.ApiKey, (authorizedApiKey) => { var queryParams = request.GetAbsoluteUri().ParseQueryString(); if (queryParams["ApiKeySecurity"] == authorizedApiKey) { return onSuccess(new Controllers.ApiSecurity { key = queryParams["ApiKeySecurity"], }); } var authorization = request.GetAuthorization(); if (authorization == authorizedApiKey) { return onSuccess(new Controllers.ApiSecurity { key = authorization, }); } return request.CreateResponse(HttpStatusCode.Unauthorized).AsTask(); }, (why) => request.CreateResponse(HttpStatusCode.Unauthorized).AddReason(why).AsTask())); }
static protected string GetApiPrefix(IHttpRequest request) { try { return(request.GetAbsoluteUri().AbsolutePath.Trim('/'.AsArray()).Split('/'.AsArray()).First()); } catch (Exception) { } return("api"); }
static protected Uri GetServerLocation(IHttpRequest request) { var url = request.GetAbsoluteUri(); if (url.IsDefaultOrNull()) { return(new Uri("http://example.com")); } var hostUrlString = url.GetLeftPart(UriPartial.Authority); return(new Uri(hostUrlString)); }
private static Task <MessageCard> CreateMessageCardAsync(MethodInfo method, string title, string summary, IApplication httpApp, IHttpRequest request) { return(CreateMessageCardAsync(title, summary, default(MonitoringRequest), httpApp, request, () => new MessageCard.Section { title = "Request Information", markdown = false, // so that underscores are not stripped facts = new MessageCard.Section.Fact[] { new MessageCard.Section.Fact { name = "Resource:", value = method.DeclaringType.FullName, }, new MessageCard.Section.Fact { name = "Http Method:", value = request.Method.Method, }, new MessageCard.Section.Fact { name = "Method:", value = method.Name, }, new MessageCard.Section.Fact { name = "URL", value = request.GetAbsoluteUri().OriginalString, }, new MessageCard.Section.Fact { name = "Reason:", value = summary, }, } })); }
public async Task <string> TeamsNotifyAsync(Type controllerType, IInvokeResource resourceInvoker, IApplication httpApp, IHttpRequest request, IHttpResponse response, string teamsNotifyParam, string collectionFolder) { var monitoringRequest = await Api.Azure.Monitoring.MonitoringRequest.CreateAsync( controllerType, resourceInvoker, httpApp, request, collectionFolder); var monitoringRequestId = monitoringRequest.id.ToString(); var responseParam = response.Headers .Where(hdr => hdr.Key == Middleware.HeaderStatusName) .Where(hdr => hdr.Value.AnyNullSafe()) .First( (hdr, next) => hdr.Value.First(), () => ""); var message = await CreateMessageCardAsync( teamsNotifyParam, $"{request} = {response.StatusCode} / {response.ReasonPhrase}", monitoringRequest, httpApp, request, () => { var cardSection = new MessageCard.Section { title = "Request/Response Information", markdown = false, // so that underscores are not stripped facts = new MessageCard.Section.Fact[] { new MessageCard.Section.Fact { name = "Response Param:", value = responseParam, }, new MessageCard.Section.Fact { name = "Http Method:", value = request.Method.Method, }, new MessageCard.Section.Fact { name = "URL:", value = request.GetAbsoluteUri().OriginalString, }, new MessageCard.Section.Fact { name = "Status Code:", value = $"{response.StatusCode.ToString()} / {(int)response.StatusCode}", }, new MessageCard.Section.Fact { name = "Reason:", value = response.ReasonPhrase, }, new MessageCard.Section.Fact { name = "RequestID:", value = monitoringRequestId, }, }, }; return(cardSection); }); return(await message.SendAsync(teamsHookUrl)); }
public virtual bool DoesHandleRequest(Type type, IHttpRequest request, out double matchQuality, out string [] componentsMatched) { matchQuality = (this.Route.HasBlackSpace() ? 0 : 2) + (this.Namespace.HasBlackSpace() ? 0 : 1); var requestUrl = request.GetAbsoluteUri(); var path = requestUrl.AbsolutePath; while (path.Contains("//")) { path = path.Replace("//", "/"); } var pathParameters = path .Split('/'.AsArray()) .Where(v => v.HasBlackSpace()) .ToArray(); if (IsExcluded()) { componentsMatched = new string[] { }; return(false); } if (!IsNamespaceCorrect(out string [] nsComponents)) { componentsMatched = new string[] { }; return(false); } if (this.Route.HasBlackSpace()) { var doesMatch = DoesMatch(nsComponents.Length, this.Route, out string [] routeComponents); componentsMatched = nsComponents .Concat(routeComponents.NullToEmpty()) .ToArray(); return(doesMatch); } { //var route = pathParameters // .Skip(nsComponents.Length) // .First(); componentsMatched = nsComponents; //.Append(route) //.ToArray(); return(true); } bool DoesMatch(int index, string value, out string [] matchComponents) { var valueComponents = value.Split('/'); if (pathParameters.Length < index + valueComponents.Length) { matchComponents = default; // new string[] { }; return(false); } matchComponents = pathParameters.Skip(index).Take(valueComponents.Length).ToArray(); if (!valueComponents.SequenceEqual(matchComponents, StringComparison.OrdinalIgnoreCase)) { return(false); } return(true); } bool IsNamespaceCorrect(out string [] nsComponents) { if (this.Namespace.IsNullOrWhiteSpace()) { nsComponents = pathParameters.Take(1).ToArray(); return(true); } if (!Namespace.Contains(',')) { return(DoesMatch(0, this.Namespace, out nsComponents)); } bool doesAnyNamespaceMatch; (doesAnyNamespaceMatch, nsComponents) = Namespace .Split(',') .First( (ns, next) => { if (!DoesMatch(0, ns, out string[] nsInner)) { return(next()); } return(true, nsInner); }, () => (false, new string[] { })); return(doesAnyNamespaceMatch); }
public async Task <IHttpResponse> HandleRouteAsync(Type controllerType, IInvokeResource resourceInvoker, IApplication httpApp, IHttpRequest routeData, RouteHandlingDelegate continueExecution) { var stopwatch = Stopwatch.StartNew(); var requestId = Guid.NewGuid().ToString("N"); var telemetry = new RequestTelemetry() { Id = requestId, Source = controllerType.Assembly.FullName, Timestamp = DateTimeOffset.UtcNow, Url = routeData.GetAbsoluteUri(), // request.RequestUri, }; #region User / Session var claims = routeData.GetClaims( claimsEnumerable => claimsEnumerable.ToArray(), () => new Claim[] { }, (why) => new Claim[] { }); var sessionIdClaimType = Api.Auth.ClaimEnableSessionAttribute.Type; var sessionIdMaybe = SessionToken.GetClaimIdMaybe(claims, sessionIdClaimType); if (sessionIdMaybe.HasValue) { telemetry.Context.Session.Id = sessionIdMaybe.Value.ToString().ToUpper(); } var accountIdClaimType = EastFive.Api.AppSettings.ActorIdClaimType.ConfigurationString( (accIdCT) => accIdCT, (why) => default); if (accountIdClaimType.HasBlackSpace()) { var accountIdMaybe = SessionToken.GetClaimIdMaybe(claims, accountIdClaimType); if (accountIdMaybe.HasValue) { var accountIdStr = accountIdMaybe.Value.ToString().ToUpper(); telemetry.Context.User.AccountId = accountIdStr; telemetry.Context.User.AuthenticatedUserId = accountIdStr; } } foreach (var claim in claims.Distinct(claim => claim.Type)) { telemetry.Properties.Add($"claim[{claim.Type}]", claim.Value); } #endregion routeData.Properties.Add(HttpRequestMessagePropertyRequestTelemetryKey, telemetry); var response = await continueExecution(controllerType, httpApp, routeData); telemetry.ResponseCode = response.StatusCode.ToString(); if (response.ReasonPhrase.HasBlackSpace()) { telemetry.Properties.AddOrReplace("reason_phrase", response.ReasonPhrase); } telemetry.Success = response.StatusCode.IsSuccess(); #region Method result identfiers if (response.Headers.TryGetValue(Middleware.HeaderStatusType, out string[] statusNames))