using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.IO;
using System.Xml;
namespace PageStatus {
public class PageStatusTester {
string requestUrl, cachedHeaderList, cachedHeaderHtmlTable, cachedDefinitionList, contentType, content, server, responseUrl, error, userAgent;
bool autoRedirect, deferTesting, isReady, xmlCacheIsStale;
HttpStatusCode status;
WebHeaderCollection headers;
IPAddress ipAddress;
Uri uri;
XmlDocument xml;
#region Class constructor
public PageStatusTester() { }
public PageStatusTester(string url) {
Url = url;
}
public PageStatusTester(Uri uri) {
Url = uri.ToString();
}
public PageStatusTester(string url, bool deferIO) {
if (deferTesting = deferIO)
requestUrl = url;
else
Url = url;
}
public PageStatusTester(Uri uri, bool deferIO) {
if (deferTesting = deferIO)
requestUrl = uri.ToString();
else
Url = uri.ToString();
}
#endregion
#region Real work
void Clear(string newRequestUrl) {
requestUrl = newRequestUrl;
cachedHeaderList = string.Empty;
cachedHeaderHtmlTable = string.Empty;
contentType = string.Empty;
content = string.Empty;
server = string.Empty;
error = string.Empty;
status = 0;
headers = null;
ipAddress = null;
isReady = false;
xmlCacheIsStale = true;
xml = null;
}
public void TestStatus() {
Clear(requestUrl);
try {
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(requestUrl);
req.AllowAutoRedirect = autoRedirect;
if (!string.IsNullOrEmpty(userAgent))
req.UserAgent = userAgent;
HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
status = resp.StatusCode;
headers = resp.Headers;
for (int i = 0; i != resp.Headers.Count; i++) {
cachedHeaderList += resp.Headers.AllKeys[i] + "\t=\t" + resp.Headers[i] + "\n";
cachedHeaderHtmlTable += "
";
cachedDefinitionList += "" + resp.Headers.AllKeys[i] + "" + resp.Headers[i] + "";
}
cachedHeaderHtmlTable = "";
cachedDefinitionList = "" + cachedDefinitionList + "
";
server = resp.Server;
responseUrl = resp.ResponseUri.ToString();
IPAddress[] ips = System.Net.Dns.GetHostAddresses(resp.ResponseUri.DnsSafeHost);
if (ips.Length > 0)
ipAddress = ips[0];
contentType = resp.ContentType;
StreamReader tempReader = new StreamReader(resp.GetResponseStream());
content = tempReader.ReadToEnd();
tempReader.Dispose();
} catch (WebException ex) {
if (ex.Message.Contains("404"))
status = System.Net.HttpStatusCode.NotFound;
error = ex.Message;
}
isReady = true;
}
public string Url {
get { return requestUrl; }
set {
requestUrl = value;
uri = new Uri(value);
isReady = false;
if (!deferTesting)
TestStatus();
}
}
#endregion
#region Properties - Set behavior
///
/// Gets or sets a value indicating whether redirects will be honored. If you need to
/// learn whether a page is using a 301/permenant vs a 302/temporary redirect, this
/// must be set to false. If you want to see whether the page that’s redirected TO
/// works properly, setting true will create and report on a new request against the
/// Location header.
///
public bool AutoRedirect { get { return autoRedirect; } set { autoRedirect = value; } }
public string UserAgent { get { return userAgent; } set { userAgent = value; } }
#endregion
#region Properties - expose the collected data
public bool IsReady { get { return isReady; } }
public int HttpStatusCode { get { if (!IsReady) TestStatus(); return (int)status; } }
public string HttpStatusDescription { get { if (!IsReady) TestStatus(); return status.ToString(); } }
public WebHeaderCollection Headers { get { if (!IsReady) TestStatus(); return headers; } }
public string HeaderText { get { if (!IsReady) TestStatus(); return cachedHeaderList; } }
public string HeaderHtmlTable { get { if (!IsReady) TestStatus(); return cachedHeaderHtmlTable; } }
public string ContentType { get { if (!IsReady) TestStatus(); return contentType; } }
public string Content { get { if (!IsReady) TestStatus(); return content; } }
public IPAddress IPAddress { get { if (!IsReady) TestStatus(); return ipAddress; } }
public string Server { get { return server; } }
#endregion
#region Properties - calculate on the fly
public string Domain { get { if (!IsReady) TestStatus(); return uri == null ? string.Empty : uri.Host; } }
public string Page { get { if (!IsReady) TestStatus(); return uri == null ? string.Empty : uri.PathAndQuery; } }
public XmlDocument Xml {
get {
if (!xmlCacheIsStale)
return xml;
if (IsValidXml)
return xml;
return null;
}
}
public bool IsValidXml {
get {
try {
if (!xmlCacheIsStale)
return xml != null;
if (!IsReady)
TestStatus();
xml = new XmlDocument();
xml.LoadXml(content);
xmlCacheIsStale = false;
} catch (Exception ex) {
return false;
}
return true;
}
}
#endregion
}
}