Skip to content

Instantly share code, notes, and snippets.

@fzhenmei
Forked from jkresner/Global.asax
Created May 30, 2014 01:42
Show Gist options
  • Save fzhenmei/425632a7b7b807874296 to your computer and use it in GitHub Desktop.
Save fzhenmei/425632a7b7b807874296 to your computer and use it in GitHub Desktop.
public class WebApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
RouteTable.Routes.MapRoute("HttpProxy", "proxy/{*path}", new { controller = "Proxy", action = "Http" })
}
}
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
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;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment