Skip to content

Instantly share code, notes, and snippets.

@jkresner
Created October 30, 2012 20:20
Show Gist options
  • Select an option

  • Save jkresner/3982746 to your computer and use it in GitHub Desktop.

Select an option

Save jkresner/3982746 to your computer and use it in GitHub Desktop.

Revisions

  1. jkresner created this gist Oct 30, 2012.
    7 changes: 7 additions & 0 deletions Global.asax
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,7 @@
    public class WebApplication : System.Web.HttpApplication
    {
    protected void Application_Start()
    {
    RouteTable.Routes.MapRoute("HttpProxy", "proxy/{*path}", new { controller = "Proxy", action = "Http" })
    }
    }
    69 changes: 69 additions & 0 deletions ProxyController.cs
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,69 @@
    public class ProxyController : System.Web.Mvc.Controller
    {
    protected string svcUrl = WebConfigurationManager.AppSettings["SvcUrl"];

    public ActionResult Http()
    {
    return Content(grabContent(HttpContext.Request.Url.PathAndQuery.Replace("/proxy","")));
    }

    /// <see>http://stackoverflow.com/questions/3447589/copying-http-request-inputstream</see>
    private string grabContent(string url)
    {
    string content;

    // Create a request for the URL.
    var req = HttpWebRequest.Create(svcUrl+url);
    req.Method = HttpContext.Request.HttpMethod;

    //-- No need to copy input stream for GET (actually it would throw an exception)
    if (req.Method != "GET")
    {
    req.ContentType = "application/json";

    Request.InputStream.Position = 0; //***** THIS IS REALLY IMPORTANT GOTCHA

    var requestStream = HttpContext.Request.InputStream;
    Stream webStream = null;
    try
    {
    //copy incoming request body to outgoing request
    if (requestStream != null && requestStream.Length > 0)
    {
    req.ContentLength = requestStream.Length;
    webStream = req.GetRequestStream();
    requestStream.CopyTo(webStream);
    }
    }
    finally
    {
    if (null != webStream)
    {
    webStream.Flush();
    webStream.Close();
    }
    }
    }

    // If required by the server, set the credentials.
    req.Credentials = CredentialCache.DefaultCredentials;

    // No more ProtocolViolationException!
    using (HttpWebResponse response = (HttpWebResponse)req.GetResponse())
    {
    // Display the status.
    //Console.WriteLine(response.StatusDescription);

    // Get the stream containing content returned by the server.
    using (Stream dataStream = response.GetResponseStream())
    {
    // Open the stream using a StreamReader for easy access.
    StreamReader reader = new StreamReader(dataStream);
    // Read the content.
    content = reader.ReadToEnd();
    }
    }

    return content;
    }
    }
    9 changes: 9 additions & 0 deletions init.coffee
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,9 @@
    window.su = {} # declare app namespace

    #We only need proxy for IE as other browsers support CORS

    su.initServerUrl = (url) ->
    if $.browser.msie && parseInt($.browser.version, 10) < 10
    su.serverUrl = '/proxy'
    else
    su.serverUrl = url # e.g. http://api.mydataserver.com