public async Task Before(TReq lambdaEvent, MiddyNetContext context)
        {
            foreach (var parameter in ssmOptions.ParametersToGet)
            {
                if (IsParameterInCacheValid(parameter.Name))
                {
                    UpdateAdditionalContext(context, parameter.Name, ParametersCache[parameter.Name].Value);
                    UpdateCache(parameter.Name, ParametersCache[parameter.Name].Value);
                }
                else
                {
                    using (var ssmClient = ssmClientFactory())
                    {
                        try
                        {
                            var response = await ssmClient.GetParameterAsync(new GetParameterRequest
                            {
                                Name           = parameter.Path,
                                WithDecryption = true
                            });

                            UpdateAdditionalContext(context, parameter.Name, response.Parameter.Value);
                            UpdateCache(parameter.Name, response.Parameter.Value);
                        }
                        catch (Exception ex)
                        {
                            context.MiddlewareExceptions.Add(ex);
                        }
                    }
                }
            }
        }
        public Task Before(SNSEvent snsEvent, MiddyNetContext context)
        {
            var snsMessage = snsEvent.Records.First().Sns;

            var traceParentHeaderValue = string.Empty;

            if (snsMessage.MessageAttributes.ContainsKey(TraceParentHeaderName))
            {
                traceParentHeaderValue = snsMessage.MessageAttributes[TraceParentHeaderName].Value;
            }

            var traceStateHeaderValue = string.Empty;

            if (snsMessage.MessageAttributes.ContainsKey(TraceStateHeaderName))
            {
                traceParentHeaderValue = snsMessage.MessageAttributes[TraceStateHeaderName].Value;
            }

            var traceContext = TraceContext.Handle(traceParentHeaderValue, traceStateHeaderValue);

            context.Logger.EnrichWith(new LogProperty(TraceParentHeaderName, traceContext.TraceParent));
            context.Logger.EnrichWith(new LogProperty(TraceStateHeaderName, traceContext.TraceState));
            context.Logger.EnrichWith(new LogProperty(TraceIdHeaderName, traceContext.TraceId));

            return(Task.CompletedTask);
        }
Beispiel #3
0
        public async Task GetTheValueFromCacheIfItsAlreadyThere()
        {
            var ssmClient = Substitute.For <IAmazonSimpleSystemsManagement>();

            ssmClient.GetParameterAsync(Arg.Is <GetParameterRequest>(r => r.Name == Param1Path)).Returns(
                Task.FromResult(new GetParameterResponse {
                Parameter = new Parameter {
                    Value = Param1Value
                }
            }));

            var context = new MiddyNetContext(Substitute.For <ILambdaContext>());

            var options = new SSMOptions
            {
                ParametersToGet = new List <SSMParameterToGet>
                {
                    new SSMParameterToGet(Param1Name, Param1Path)
                },
                CacheExpiryInMillis = 60 * 1000
            };

            var ssmMiddleware = new SSMMiddleware <int, int>(options, () => ssmClient, new SystemTimeProvider());
            await ssmMiddleware.Before(1, context);

            await ssmMiddleware.Before(1, context);

            await ssmClient.Received(1).GetParameterAsync(Arg.Is <GetParameterRequest>(r => r.Name == Param1Path));
        }
        public Task Before(APIGatewayProxyRequest lambdaEvent, MiddyNetContext context)
        {
            incomingOrigin = GetOriginHeader(lambdaEvent);

            httpMethod = lambdaEvent.HttpMethod;

            return(Task.CompletedTask);
        }
Beispiel #5
0
            protected override Task <int> Handle(int lambdaEvent, MiddyNetContext context)
            {
                LogLines.Add(FunctionLog);
                ContextLogLines.AddRange(context.AdditionalContext.Select(kv => $"{kv.Key}-{kv.Value}"));
                Exceptions.AddRange(context.MiddlewareExceptions);

                return(Task.FromResult(0));
            }
        private void UpdateAdditionalContext(MiddyNetContext context, string parameterName, string parameterValue)
        {
            if (context.AdditionalContext.ContainsKey(parameterName))
            {
                context.AdditionalContext.Remove(parameterName);
            }

            context.AdditionalContext.Add(parameterName, parameterValue);
        }
Beispiel #7
0
 public HttpCorsMiddlewareShould()
 {
     context = new MiddyNetContext(Substitute.For <ILambdaContext>());
     request = new APIGatewayProxyRequest
     {
         HttpMethod = "GET",
         Headers    = new Dictionary <string, string>()
     };
 }
Beispiel #8
0
            public Task <int> After(int lambdaResponse, MiddyNetContext context)
            {
                LogLines.Add($"{MiddlewareAfterLog}-{position}");

                if (Failing)
                {
                    throw new MiddlewareException();
                }
                return(Task.FromResult(0));
            }
        protected override Task <string[]> Handle(int lambdaEvent, MiddyNetContext context)
        {
            if (context.MiddlewareExceptions.Any())
            {
                return(Task.FromResult(new[] { context.MiddlewareExceptions.First().ToString() }));
            }

            var results = ParametersToGet.Select(n => context.AdditionalContext[n].ToString()).ToArray();

            return(Task.FromResult(results));
        }
Beispiel #10
0
            public Task Before(int lambdaEvent, MiddyNetContext context)
            {
                LogLines.Add($"{MiddlewareBeforeLog}-{position}");
                context.AdditionalContext.Add($"{ContextKeyLog}-{position}", $"{ContextLog}-{position}");

                if (Failing)
                {
                    throw new MiddlewareException();
                }

                return(Task.CompletedTask);
            }
Beispiel #11
0
        protected override Task <int> Handle(SNSEvent lambdaEvent, MiddyNetContext context)
        {
            var originalTraceParentHeaderValue = string.Empty;

            if (lambdaEvent.Records[0].Sns.MessageAttributes.ContainsKey("traceparent"))
            {
                originalTraceParentHeaderValue = lambdaEvent.Records[0].Sns.MessageAttributes["traceparent"].Value;
            }

            context.Logger.Log(LogLevel.Info, "Function called", new LogProperty("original-traceparent", originalTraceParentHeaderValue));

            return(Task.FromResult(0));
        }
        public async Task EnrichLoggerWithTraceContext()
        {
            var logger  = Substitute.For <IMiddyLogger>();
            var context = new MiddyNetContext(Substitute.For <ILambdaContext>(), _ => logger);

            var middleware = new SNSTracingMiddleware <int>();

            var snsEvent = new SNSEvent
            {
                Records = new List <SNSEvent.SNSRecord>()
                {
                    new SNSEvent.SNSRecord
                    {
                        Sns = new SNSEvent.SNSMessage
                        {
                            MessageAttributes = new Dictionary <string, SNSEvent.MessageAttribute>
                            {
                                {
                                    "traceparent",
                                    new SNSEvent.MessageAttribute {
                                        Type = "String", Value = "traceparent header value"
                                    }
                                },
                                {
                                    "tracestate",
                                    new SNSEvent.MessageAttribute {
                                        Type = "String", Value = "tracestate header value"
                                    }
                                }
                            }
                        }
                    }
                }
            };

            await middleware.Before(snsEvent, context);

            logger.Received().EnrichWith(Arg.Is <LogProperty>(p => p.Key == "traceparent"));
            logger.Received().EnrichWith(Arg.Is <LogProperty>(p => p.Key == "tracestate"));
            logger.Received().EnrichWith(Arg.Is <LogProperty>(p => p.Key == "trace-id"));
        }
Beispiel #13
0
        public async Task EnrichLoggerWithTraceContext()
        {
            var logger  = Substitute.For <IMiddyLogger>();
            var context = new MiddyNetContext(Substitute.For <ILambdaContext>(), _ => logger);

            var middleware = new ApiGatewayTracingMiddleware <int>();

            var apiGatewayEvent = new APIGatewayProxyRequest
            {
                Headers = new Dictionary <string, string>
                {
                    { "traceparent", "traceparent header value" },
                    { "tracestate", "tracestate header value" }
                }
            };

            await middleware.Before(apiGatewayEvent, context);

            logger.Received().EnrichWith(Arg.Is <LogProperty>(p => p.Key == "traceparent"));
            logger.Received().EnrichWith(Arg.Is <LogProperty>(p => p.Key == "tracestate"));
            logger.Received().EnrichWith(Arg.Is <LogProperty>(p => p.Key == "trace-id"));
        }
Beispiel #14
0
        public async Task GetParametersAndSetToContextOnBeforeMethod()
        {
            var ssmClient = Substitute.For <IAmazonSimpleSystemsManagement>();

            ssmClient.GetParameterAsync(Arg.Is <GetParameterRequest>(r => r.Name == Param1Path)).Returns(
                Task.FromResult(new GetParameterResponse {
                Parameter = new Parameter {
                    Value = Param1Value
                }
            }));
            ssmClient.GetParameterAsync(Arg.Is <GetParameterRequest>(r => r.Name == Param2Path)).Returns(
                Task.FromResult(new GetParameterResponse {
                Parameter = new Parameter {
                    Value = Param2Value
                }
            }));

            var context = new MiddyNetContext(Substitute.For <ILambdaContext>());

            var options = new SSMOptions
            {
                ParametersToGet = new List <SSMParameterToGet>
                {
                    new SSMParameterToGet(Param1Name, Param1Path),
                    new SSMParameterToGet(Param2Name, Param2Path)
                }
            };

            var ssmMiddleware = new SSMMiddleware <int, int>(options, () => ssmClient, new SystemTimeProvider());
            await ssmMiddleware.Before(1, context);

            await ssmClient.Received().GetParameterAsync(Arg.Is <GetParameterRequest>(r => r.Name == Param1Path));

            await ssmClient.Received().GetParameterAsync(Arg.Is <GetParameterRequest>(r => r.Name == Param2Path));

            context.AdditionalContext.Should().Contain(Param1Name, Param1Value);
            context.AdditionalContext.Should().Contain(Param2Name, Param2Value);
        }
Beispiel #15
0
        public async Task GetTheValueFromSSMIfItsCacheHasExpired()
        {
            var ssmClient = Substitute.For <IAmazonSimpleSystemsManagement>();

            ssmClient.GetParameterAsync(Arg.Is <GetParameterRequest>(r => r.Name == Param1Path)).Returns(
                Task.FromResult(new GetParameterResponse {
                Parameter = new Parameter {
                    Value = Param1Value
                }
            }));

            var now = System.DateTime.UtcNow;

            var timeProvider = Substitute.For <ITimeProvider>();

            var context = new MiddyNetContext(Substitute.For <ILambdaContext>());

            var options = new SSMOptions
            {
                ParametersToGet = new List <SSMParameterToGet>
                {
                    new SSMParameterToGet(Param1Name, Param1Path)
                },
                CacheExpiryInMillis = 60 * 1000
            };

            var ssmMiddleware = new SSMMiddleware <int, int>(options, () => ssmClient, timeProvider);

            timeProvider.UtcNow.Returns(now);
            await ssmMiddleware.Before(1, context);

            timeProvider.UtcNow.Returns(now.AddMilliseconds(70 * 1000));
            await ssmMiddleware.Before(1, context);

            await ssmClient.Received(2).GetParameterAsync(Arg.Is <GetParameterRequest>(r => r.Name == Param1Path));
        }
        public Task Before(APIGatewayProxyRequest apiGatewayEvent, MiddyNetContext context)
        {
            var traceParentHeaderValue = string.Empty;

            if (apiGatewayEvent.Headers.ContainsKey(TraceParentHeaderName))
            {
                traceParentHeaderValue = apiGatewayEvent.Headers[TraceParentHeaderName];
            }

            var traceStateHeaderValue = string.Empty;

            if (apiGatewayEvent.Headers.ContainsKey(TraceStateHeaderName))
            {
                traceStateHeaderValue = apiGatewayEvent.Headers[TraceStateHeaderName];
            }

            var traceContext = TraceContext.Handle(traceParentHeaderValue, traceStateHeaderValue);

            context.Logger.EnrichWith(new LogProperty(TraceParentHeaderName, traceContext.TraceParent));
            context.Logger.EnrichWith(new LogProperty(TraceStateHeaderName, traceContext.TraceState));
            context.Logger.EnrichWith(new LogProperty(TraceIdHeaderName, traceContext.TraceId));

            return(Task.CompletedTask);
        }
        public Task <APIGatewayProxyResponse> After(APIGatewayProxyResponse lambdaResponse, MiddyNetContext context)
        {
            if (IsNullOrWhiteSpace(httpMethod))
            {
                return(Task.FromResult(lambdaResponse));
            }

            InitialiseHeaders(lambdaResponse);

            SetAllowOriginHeader(lambdaResponse);

            SetAllowHeadersHeader(lambdaResponse);

            SetAllowCredentialsHeader(lambdaResponse);

            SetCacheControlHeader(lambdaResponse);

            SetMaxAgeHeader(lambdaResponse);

            return(Task.FromResult(lambdaResponse));
        }
 public Task <TRes> After(TRes lambdaResponse, MiddyNetContext context)
 {
     return(Task.FromResult(lambdaResponse));
 }
Beispiel #19
0
        protected override Task <APIGatewayProxyResponse> Handle(APIGatewayProxyRequest lambdaEvent, MiddyNetContext context)
        {
            var result = new APIGatewayProxyResponse
            {
                StatusCode = 200,
                Body       = "hello from test"
            };

            return(Task.FromResult(result));
        }
Beispiel #20
0
 public Task Before(int lambdaEvent, MiddyNetContext context)
 {
     return(Task.CompletedTask);
 }
Beispiel #21
0
        protected override Task <APIGatewayProxyResponse> Handle(APIGatewayProxyRequest proxyRequest, MiddyNetContext context)
        {
            var originalTraceParentHeaderValue = string.Empty;

            if (proxyRequest.Headers.ContainsKey("traceparent"))
            {
                originalTraceParentHeaderValue = proxyRequest.Headers["traceparent"];
            }

            context.Logger.Log(LogLevel.Info, "Function called", new LogProperty("original-traceparent", originalTraceParentHeaderValue));

            return(Task.FromResult(new APIGatewayProxyResponse
            {
                StatusCode = 200,
                Body = "Ok"
            }));
        }