Spoofing the Host Entry in a HTTPWebRequest
Join the DZone community and get the full member experience.
Join For FreeI 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 |
Opinions expressed by DZone contributors are their own.
Comments