diff --git a/src/Twilio.AspNet.Core/MinimalApiTwiMLResult.cs b/src/Twilio.AspNet.Core/MinimalApiTwiMLResult.cs index 6b5e9f7..a519615 100644 --- a/src/Twilio.AspNet.Core/MinimalApiTwiMLResult.cs +++ b/src/Twilio.AspNet.Core/MinimalApiTwiMLResult.cs @@ -41,5 +41,6 @@ public partial class TwiMLResult : IResult /// Writes the TwiML to the HTTP response body /// /// The HttpContext containing the Response to write the TwiML to - public Task ExecuteAsync(HttpContext httpContext) => WriteTwiMLToResponse(httpContext.Response); + public Task ExecuteAsync(HttpContext httpContext) + => WriteTwiMLToResponse(httpContext.Response, httpContext.RequestAborted); } \ No newline at end of file diff --git a/src/Twilio.AspNet.Core/TwiMLResult.cs b/src/Twilio.AspNet.Core/TwiMLResult.cs index 9f6f648..9973d9b 100644 --- a/src/Twilio.AspNet.Core/TwiMLResult.cs +++ b/src/Twilio.AspNet.Core/TwiMLResult.cs @@ -1,4 +1,5 @@ -using System.Threading.Tasks; +using System.Threading; +using System.Threading.Tasks; using System.Xml.Linq; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; @@ -17,7 +18,7 @@ public partial class TwiMLResult : IActionResult public TwiMLResult(TwiML.TwiML twiml) : this(twiml, SaveOptions.None) { } - + /// The TwiML to respond with /// Specifies how to format TwiML public TwiMLResult(TwiML.TwiML twiml, SaveOptions formattingOptions) @@ -29,20 +30,29 @@ public TwiMLResult(TwiML.TwiML twiml, SaveOptions formattingOptions) public async Task ExecuteResultAsync(ActionContext actionContext) { var response = actionContext.HttpContext.Response; - await WriteTwiMLToResponse(response); + await WriteTwiMLToResponse(response, actionContext.HttpContext.RequestAborted) + .ConfigureAwait(false); } - - private async Task WriteTwiMLToResponse(HttpResponse response) + + private async Task WriteTwiMLToResponse(HttpResponse response, CancellationToken cancellationToken) { response.ContentType = "application/xml"; if (twiml == null) { - await response.WriteAsync(""); + await response.WriteAsync("", cancellationToken) + .ConfigureAwait(false); return; } - var data = twiml.ToString(formattingOptions); - await response.WriteAsync(data); + var doc = twiml.ToXDocument(); + +#if NET5_0_OR_GREATER + await doc.SaveAsync(response.Body, formattingOptions, cancellationToken) + .ConfigureAwait(false); +#else + await response.WriteAsync(doc.ToString(formattingOptions), cancellationToken) + .ConfigureAwait(false); +#endif } } -} +} \ No newline at end of file diff --git a/src/Twilio.AspNet.Core/ValidateRequestAttribute.cs b/src/Twilio.AspNet.Core/ValidateRequestAttribute.cs index a4189ce..2c05627 100644 --- a/src/Twilio.AspNet.Core/ValidateRequestAttribute.cs +++ b/src/Twilio.AspNet.Core/ValidateRequestAttribute.cs @@ -60,7 +60,7 @@ public override void OnActionExecuting(ActionExecutingContext filterContext) var httpContext = filterContext.HttpContext; var request = httpContext.Request; string urlOverride = null; - if (BaseUrlOverride != null) + if (!string.IsNullOrEmpty(BaseUrlOverride)) { urlOverride = $"{BaseUrlOverride}{request.Path}{request.QueryString}"; } diff --git a/src/Twilio.AspNet.Core/ValidateTwilioRequestFilter.cs b/src/Twilio.AspNet.Core/ValidateTwilioRequestFilter.cs index fb01f8b..f72b233 100644 --- a/src/Twilio.AspNet.Core/ValidateTwilioRequestFilter.cs +++ b/src/Twilio.AspNet.Core/ValidateTwilioRequestFilter.cs @@ -28,7 +28,7 @@ public ValidateTwilioRequestFilter(IServiceProvider serviceProvider) AllowLocal = options.AllowLocal ?? true; } - public async ValueTask InvokeAsync( + public ValueTask InvokeAsync( EndpointFilterInvocationContext efiContext, EndpointFilterDelegate next ) @@ -36,17 +36,17 @@ EndpointFilterDelegate next var httpContext = efiContext.HttpContext; var request = httpContext.Request; string urlOverride = null; - if (BaseUrlOverride != null) + if (!string.IsNullOrEmpty(BaseUrlOverride)) { urlOverride = $"{BaseUrlOverride}{request.Path}{request.QueryString}"; } if (RequestValidationHelper.IsValidRequest(httpContext, AuthToken, urlOverride, AllowLocal)) { - return await next(efiContext); + return next(efiContext); } - return Results.StatusCode((int) HttpStatusCode.Forbidden); + return ValueTask.FromResult((object)Results.StatusCode((int) HttpStatusCode.Forbidden)); } } diff --git a/src/Twilio.AspNet.Core/ValidateTwilioRequestMiddleware.cs b/src/Twilio.AspNet.Core/ValidateTwilioRequestMiddleware.cs index fce0aee..99040a5 100644 --- a/src/Twilio.AspNet.Core/ValidateTwilioRequestMiddleware.cs +++ b/src/Twilio.AspNet.Core/ValidateTwilioRequestMiddleware.cs @@ -24,12 +24,12 @@ IOptions options this.options = options.Value ?? throw new Exception("RequestValidationOptions is not configured."); } - public async Task InvokeAsync(HttpContext context) + public Task InvokeAsync(HttpContext context) { var request = context.Request; string urlOverride = null; - if (options.BaseUrlOverride != null) + if (!string.IsNullOrEmpty(options.BaseUrlOverride)) { urlOverride = $"{options.BaseUrlOverride.TrimEnd('/')}{request.Path}{request.QueryString}"; } @@ -38,10 +38,10 @@ public async Task InvokeAsync(HttpContext context) if (!isValid) { context.Response.StatusCode = (int) HttpStatusCode.Forbidden; - return; + return Task.CompletedTask; } - await next(context); + return next(context); } } diff --git a/src/Twilio.AspNet.Mvc/TwiMLResult.cs b/src/Twilio.AspNet.Mvc/TwiMLResult.cs index 76296bd..c4fdaf1 100644 --- a/src/Twilio.AspNet.Mvc/TwiMLResult.cs +++ b/src/Twilio.AspNet.Mvc/TwiMLResult.cs @@ -30,13 +30,8 @@ public override void ExecuteResult(ControllerContext controllerContext) return; } - var twimlString = dataTwiml.ToString(formattingOptions); - if (encoding != "utf-8") - { - twimlString = twimlString.Replace("utf-8", encoding); - } - - response.Output.Write(twimlString); + var doc = dataTwiml.ToXDocument(); + doc.Save(response.Output, formattingOptions); } } } \ No newline at end of file diff --git a/src/Twilio.AspNet.Mvc/ValidateRequestAttribute.cs b/src/Twilio.AspNet.Mvc/ValidateRequestAttribute.cs index df185a7..e2f98af 100644 --- a/src/Twilio.AspNet.Mvc/ValidateRequestAttribute.cs +++ b/src/Twilio.AspNet.Mvc/ValidateRequestAttribute.cs @@ -56,7 +56,7 @@ public override void OnActionExecuting(ActionExecutingContext filterContext) { var httpContext = filterContext.HttpContext; string urlOverride = null; - if (BaseUrlOverride != null) + if (!string.IsNullOrEmpty(BaseUrlOverride)) { urlOverride = $"{BaseUrlOverride}{httpContext.Request.Path}{httpContext.Request.QueryString}"; } diff --git a/src/testapps/AspNetCore/Program.cs b/src/testapps/AspNetCore/Program.cs index 030eb40..5a36f8f 100644 --- a/src/testapps/AspNetCore/Program.cs +++ b/src/testapps/AspNetCore/Program.cs @@ -30,7 +30,6 @@ app.UseSwaggerUI(); } -app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting();