public async Task <IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequestMessage reqAsHttpRequestMessage,
            CancellationToken cancellationToken)
        {
            try
            {
                NewRelic.Api.Agent.NewRelic.SetTransactionName("AddressService", "GetPostcodeCoordinates");
                _logger.LogInformation("C# HTTP trigger function processed a request.");

                // accept compressed requests (can't do this with middleware)
                GetPostcodeCoordinatesRequest req = await HttpRequestMessageCompressionUtils.DeserialiseAsync <GetPostcodeCoordinatesRequest>(reqAsHttpRequestMessage);

                if (req.IsValid(out var validationResults))
                {
                    GetPostcodeCoordinatesResponse response = await _mediator.Send(req, cancellationToken);

                    return(new OkObjectResult(ResponseWrapper <GetPostcodeCoordinatesResponse, AddressServiceErrorCode> .CreateSuccessfulResponse(response)));
                }
                else
                {
                    return(new ObjectResult(ResponseWrapper <GetPostcodeCoordinatesResponse, AddressServiceErrorCode> .CreateUnsuccessfulResponse(AddressServiceErrorCode.ValidationError, validationResults))
                    {
                        StatusCode = 422
                    });
                }
            }
            catch (Exception ex)
            {
                _logger.LogErrorAndNotifyNewRelic($"Unhandled error in GetPostcodeCoordinates", ex);
                return(new ObjectResult(ResponseWrapper <GetPostcodeCoordinatesResponse, AddressServiceErrorCode> .CreateUnsuccessfulResponse(AddressServiceErrorCode.UnhandledError, "Internal Error"))
                {
                    StatusCode = StatusCodes.Status500InternalServerError
                });
            }
        }
        public async Task DeserialisationWhenContentIsNotCompressed()
        {
            var postcodeWithRadius = new PostcodeWithRadius()
            {
                Id             = 1,
                Postcode       = "NG1 5FS",
                RadiusInMetres = 100
            };

            var json = Utf8Json.JsonSerializer.ToJsonString(postcodeWithRadius);


            var httpRequestMessage = new HttpRequestMessage()
            {
                Content = new StringContent(json)
            };

            var result = await HttpRequestMessageCompressionUtils.DeserialiseAsync <PostcodeWithRadius>(httpRequestMessage);

            Assert.AreEqual(postcodeWithRadius.Id, result.Id);
            Assert.AreEqual(postcodeWithRadius.Postcode, result.Postcode);
            Assert.AreEqual(postcodeWithRadius.RadiusInMetres, result.RadiusInMetres);
        }
        public async Task DeserialisationWhenContentIsCompressed()
        {
            var postcodeWithRadius = new PostcodeWithRadius()
            {
                Id             = 1,
                Postcode       = "NG1 5FS",
                RadiusInMetres = 100
            };

            var json = Utf8Json.JsonSerializer.ToJsonString(postcodeWithRadius);

            byte[]       jsonBytes = Encoding.UTF8.GetBytes(json);
            MemoryStream ms        = new MemoryStream();

            using (GZipStream gzip = new GZipStream(ms, CompressionMode.Compress, true))
            {
                gzip.Write(jsonBytes, 0, jsonBytes.Length);
            }

            ms.Position = 0;
            StreamContent content = new StreamContent(ms);

            content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
            content.Headers.ContentEncoding.Add("gzip");


            var httpRequestMessage = new HttpRequestMessage()
            {
                Content = content
            };

            var result = await HttpRequestMessageCompressionUtils.DeserialiseAsync <PostcodeWithRadius>(httpRequestMessage);

            Assert.AreEqual(postcodeWithRadius.Id, result.Id);
            Assert.AreEqual(postcodeWithRadius.Postcode, result.Postcode);
            Assert.AreEqual(postcodeWithRadius.RadiusInMetres, result.RadiusInMetres);
        }