コード例 #1
0
        public void BounceRequest_When_Converted_To_JsonObject_Should_Not_Be_Empty(string emailAddress, SmtpErrorCode code, string error, Instant createdAt)
        {
            var mailAddress = new MailAddress(emailAddress);

            var bounceRequest = new BounceRequest(mailAddress, code, error, createdAt);

            var json = bounceRequest.ToJson();

            Assert.NotEmpty(json);
        }
コード例 #2
0
        public void BounceRequest_When_Converted_To_FormContent_Should_Not_Be_Empty(string emailAddress, SmtpErrorCode code, string error, Instant createdAt)
        {
            var mailAddress = new MailAddress(emailAddress);

            var bounceRequest = new BounceRequest(mailAddress, code, error, createdAt);

            var formContent = bounceRequest.ToFormContent();

            Assert.NotEmpty(formContent);
        }
コード例 #3
0
        public void BounceRequest_Should_Set_Optional_Params(string emailAddress, SmtpErrorCode code, string error, Instant createdAt)
        {
            var mailAddress = new MailAddress(emailAddress);

            var bounceRequest = new BounceRequest(mailAddress, code, error, createdAt);

            Assert.Equal(emailAddress, bounceRequest.EmailAddress.Address);

            Assert.Equal(code, bounceRequest.Code);

            Assert.Equal(error, bounceRequest.Error);
        }
コード例 #4
0
        public void Initialized_BounceRequest_Check_Default_Values()
        {
            var mailAddress = new MailAddress(@"*****@*****.**");

            var bounceRequest = new BounceRequest(mailAddress);

            Assert.Equal(@"*****@*****.**", bounceRequest.EmailAddress.Address);

            Assert.Equal(SmtpErrorCode.MAILBOX_UNAVAILABLE, bounceRequest.Code);

            Assert.Equal(string.Empty, bounceRequest.Error);
        }
コード例 #5
0
        public HttpResponseMessage Post([FromBody] BounceRequest bounceRequest)
        {
            // check if valid data is received
            if (!ModelState.IsValid)
            {
                return(Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState));
            }

            var processResult = _mailBoxManager.ProcessBouncedStatusUpdate(bounceRequest);

            return(Request.CreateResponse(
                       processResult.Status.IsSuccess()
                    ? HttpStatusCode.OK
                    : HttpStatusCode.InternalServerError));
        }
コード例 #6
0
        public MessageProcessResult ProcessBouncedStatusUpdate(BounceRequest bounceRequest)
        {
            var result = new MessageProcessResult();

            try
            {
                // update message with data received from postmark
                var bouncedDto = Mapper.Map <BounceRequest, BounceUpdateDto>(bounceRequest);

                _mailBoxRepository.UpdateStatusBounced(bouncedDto);

                // update process result status correspondingly
                result.Status = ProcessingStatus.Success;
            }
            catch
            {
                // there has been an error while processing update
                result.Status = ProcessingStatus.Error;
            }

            return(result);
        }
コード例 #7
0
        BounceIt(BounceRequest request, ServerCallContext context)
        {
            var T = request.TabLevel;

            Console.WriteLine(T + "BounceIt() got a request.");
            PrintRequestHeaders(context, T);
            var builder = _tracer.BuildSpan("grpc://BounceIt");

            ISpanContext parentSpanCtx = ExtractSpanContextOrDefault(_tracer, context);

            if (parentSpanCtx != null)
            {
                builder.AsChildOf(parentSpanCtx);
            }

            using (var scope = builder.StartActive(true))
            {
                var span             = scope.Span;
                var chanceToDoIt     = request.ChanceOfBounce;
                var randomizedChance = new Random().NextDouble();
                var exceptionRisk    = new Random().NextDouble() - 0.2;
                var returnMessage    = "Hello!";
                var sleepyTimeMs     = (int)(randomizedChance * 1000);

                if (chanceToDoIt >= randomizedChance)
                {
                    span.Log(DateTime.Now,
                             $"Doing another bounce: {chanceToDoIt} >= {randomizedChance}");
                    var targetA     = request.TargetA;
                    var targetB     = request.TargetB;
                    var doTargetA   = request.DoTargetA;
                    var nextTargetA = !doTargetA;
                    var target      = doTargetA ? targetA : targetB;

                    var channel = new Channel(target, ChannelCredentials.Insecure);
                    var client  = new Bouncer.BouncerClient(channel);

                    var policy = Policy
                                 .Handle <RpcException>()
                                 .WaitAndRetry(new[]
                    {
                        TimeSpan.FromSeconds(1),
                        TimeSpan.FromSeconds(5),
                        TimeSpan.FromSeconds(10),
                    }, (exception, timespan, attempt, context) =>
                    {
                        Console.WriteLine(T + $">> Failed attempt: {attempt}");
                        span.SetTag("FailedAttempts", $"{attempt}");
                        span.Log($"Attempt #{attempt} failed. Waiting for {timespan} until trying again.");
                    });

                    policy.Execute(() =>
                    {
                        var bounceRequest = new BounceRequest {
                            TargetA        = targetA,
                            TargetB        = targetB,
                            DoTargetA      = nextTargetA,
                            ChanceOfBounce = chanceToDoIt,
                            TabLevel       = request.TabLevel + "  "
                        };
                        var metadata = CreateInjectMetadataFromSpan(_tracer, span);
                        Console.WriteLine(T + "Doing another bounce!");
                        var reply      = client.BounceIt(bounceRequest, metadata);
                        returnMessage += " " + reply.Msg;
                    });
                }
                else if (chanceToDoIt >= exceptionRisk)
                {
                    Thread.Sleep(sleepyTimeMs);
                    Console.WriteLine($"Exception thrown: {chanceToDoIt} >= {exceptionRisk}");
                    span.Log($"Exception thrown: {chanceToDoIt} >= {exceptionRisk}");
                    span.SetTag("Error", "True");
                    throw new Exception("Woopsie daisy! Got an exception!");
                }

                Console.Write(T + $"Sleeping for {sleepyTimeMs}ms...");
                Thread.Sleep(sleepyTimeMs);
                Console.WriteLine($"Woke up");

                return(Task.FromResult(new BounceReply
                {
                    Msg = returnMessage
                }));
            }
        }