From 01e8a11df5a64c14e10a60bc006b5267efab5478 Mon Sep 17 00:00:00 2001 From: Ahmad Al-Bayaty Date: Tue, 1 Oct 2019 21:32:31 -0400 Subject: [PATCH] Updated to work with Turbolinks 5 --- src/TurboLinks.Net/TurboLinks.cs | 31 +++++++++++-------------------- 1 file changed, 11 insertions(+), 20 deletions(-) diff --git a/src/TurboLinks.Net/TurboLinks.cs b/src/TurboLinks.Net/TurboLinks.cs index 6b27387..09b510c 100644 --- a/src/TurboLinks.Net/TurboLinks.cs +++ b/src/TurboLinks.Net/TurboLinks.cs @@ -8,7 +8,7 @@ namespace TurboLinks.Net { public class TurboLinks { - private RequestDelegate _next; + readonly private RequestDelegate _next; public TurboLinks(RequestDelegate next) { @@ -17,35 +17,26 @@ public TurboLinks(RequestDelegate next) public async Task Invoke(HttpContext context) { - var memoryStream = new MemoryStream(); - var bodyStream = context.Response.Body; - context.Response.Body = memoryStream; - await _next?.Invoke(context); - var request = context.Request; - var response = context.Response; - - if (!string.IsNullOrWhiteSpace(request.Headers["X-XHR-Referer"])) + //Adding Turbolinks header to fix redirect issues in Turbolinks. + if ((context.Response.StatusCode == 302) || (context.Response.StatusCode == 301)) { - context.Response.Cookies.Append("request_method", request.Method, new CookieOptions { HttpOnly = false }); - if (context.Response.StatusCode == 301 || context.Response.StatusCode == 302) + context.Response.OnStarting(state => { - var uri = new Uri(response.Headers["Location"]); - if (uri.Host.Equals(request.Host.Value)) + var httpContext = (HttpContext)state; + if (!httpContext.Response.Headers.ContainsKey("Turbolinks-Location")) { - response.Headers["X-XHR-Redirected-To"] = response.Headers["Location"]; + httpContext.Response.Headers.Add("Turbolinks-Location", new[] { httpContext.Response.Headers["Location"].ToString() }); } - } + return Task.FromResult(0); + }, context); } - memoryStream.WriteTo(bodyStream); - await bodyStream.FlushAsync(); - memoryStream.Dispose(); - bodyStream.Dispose(); + await _next(context); } } public static class BuilderExtension { public static IApplicationBuilder UseTurboLinks(this IApplicationBuilder app) => app.UseMiddleware(); - } + } \ No newline at end of file