Spoofing the Host Entry in a HTTPWebRequest
I had this idea to create a dashboard that would ping different version of a site in order to get the build number. The details are as follows:
runs on a local site at 192.x.x.x, a QA environment at 10.x.x.x, a staging environment at 66.x.x.x, and a live environment at 88.x.x.x (these IPs are made up). In order to hit each site, I would usually manually change the host file and then make the web request. This was not a great solution as I hate dealing with host file entries. On experimenting with HTTPWebRequest, I noticed that you can use reflection in order to change the Headers of the Request. The normal code to create a HTTPWebRequest would look as follows:
try
{
var request = (HttpWebRequest)HttpWebRequest.Create(new Uri("string url"));
var webresponse = (HttpWebResponse)request.GetResponse();
var streamReader = new StreamReader(webresponse.GetResponseStream());
string response = streamReader.ReadToEnd();
}I was able to spoof the host by changing the host using reflection:
try
{
var request = (HttpWebRequest)HttpWebRequest.Create(new Uri("string IP address"));
request.Headers.GetType().InvokeMember("ChangeInternal",
BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.InvokeMethod, null,
request.Headers, new object[] { "Host", "Fake host entry" });
var webresponse = (HttpWebResponse)request.GetResponse();
var streamReader = new StreamReader(webresponse.GetResponseStream());
string response = streamReader.ReadToEnd();
}This allowed me to make multiple requests to different versions of the same site. Using a simple collection of my site objects to build a dashboard that had the following outline:
| Local | QA | Stage | Live | |
| Build Number | web_12_4_qa | web_12_4_qa | web_12_5_stg | web_12_4_pro |
(Note: Opinions expressed in this article and its replies are the opinions of their respective authors and not those of DZone, Inc.)





