Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Select an option

  • Save bencoderer/2f6bd131c8574238e759 to your computer and use it in GitHub Desktop.

Select an option

Save bencoderer/2f6bd131c8574238e759 to your computer and use it in GitHub Desktop.
using System;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using System.Web.Mvc;
namespace DemoApp
{
public class ExternalJavaScriptFileAttribute : ActionFilterAttribute
{
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
var response = filterContext.HttpContext.Response;
response.Filter = new StripEnclosingScriptTagsFilter(response.Filter);
response.ContentType = "application/javascript";
}
private class StripEnclosingScriptTagsFilter : MemoryStream
{
private const string Pattern = @"^<script[^>]*>(.*)</script>$";
private readonly Stream _responseStream;
private readonly StringBuilder _output;
public StripEnclosingScriptTagsFilter(Stream responseStream)
{
_responseStream = responseStream;
_output = new StringBuilder();
}
public override void Write(byte[] buffer, int offset, int count)
{
string response = GetStringResponse(buffer, offset, count);
_output.Append(response);
}
public override void Flush()
{
string response = _output.ToString().Trim();
response = Regex.Replace(response, Pattern, "$1", RegexOptions.Singleline);
WriteStringResponse(response);
}
private static string GetStringResponse(byte[] buffer, int offset, int count)
{
byte[] responseData = new byte[count];
Buffer.BlockCopy(buffer, offset, responseData, 0, count);
return Encoding.Default.GetString(buffer);
}
private void WriteStringResponse(string response)
{
byte[] outdata = Encoding.Default.GetBytes(response);
_responseStream.Write(outdata, 0, outdata.GetLength(0));
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment