Beispiel #1
0
        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()));
        }
Beispiel #2
0
 static protected string GetApiPrefix(IHttpRequest request)
 {
     try
     {
         return(request.GetAbsoluteUri().AbsolutePath.Trim('/'.AsArray()).Split('/'.AsArray()).First());
     }
     catch (Exception)
     {
     }
     return("api");
 }
Beispiel #3
0
        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));
        }
Beispiel #6
0
        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))