After conducting brief tests on multiple browsers such as IE 7 & 8, Firefox, Chrome for both Windows and OSX, I recommend trying it out yourself and minifying the code. If you have any better suggestions or improvements, please feel free to share them with me. I did consider using a script instead of an image but ultimately decided against it due to my lack of knowledge in that area.
In the upcoming version, a cookie will be written upon timeout and subsequent requests will be handled server-side using relative asset paths. The cookie will expire after 30 minutes and will be renewed with each consecutive timeout. As for the initial failover, I am considering a redirect as a simple solution, although I might explore more elegant yet complex alternatives as well.
<script type="text/javascript">
//<![CDATA[
// Absolute path to a picture on your CDN to be monitored
cdnImagePath = "http://YOURCDNADDRESS.net/empty.gif";
//this is relative path (cross domain limitation)
//will be followed by "timeout" or "other" as a reason i.e. /cdnMonitor.php?message=timeout
cdnMonitoringPath = "/cdnMonitor.php?message=";
// Recommended 3000 for 3 second(s) timeout
cdnTimeoutMilisec = 3000;
// Set to true to be notified after timeout (provides extra information)
cdnNotifyAfterTimeout = false;
// Handler methods
cdnOK = function(){
if (!cdnTimer && cdnNotifyAfterTimeout) cdnNotify('success');
}
cdnFail = function(reason){
if (reason != "timeout") {
if (cdnTimer) clearTimeout(cdnTimer);
message = "error"
} else {
message = reason;
}
cdnNotify(message);
}
cdnTimeout = function() {
cdnTimer = false;
if (cdnImage.complete == false) {
cdnFail("timeout");
}
}
cdnNotify = function(message) {
if (window.XMLHttpRequest) {
xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", cdnMonitoringPath + message, true);
xmlhttp.send();
} else {// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
}
// Load test image and define event handlers
cdnTimer = setTimeout("cdnTimeout()", cdnTimeoutMilisec);
cdnImage = new Image();
cdnImage.onload = cdnOK;
cdnImage.onerror = cdnFail;
cdnImage.src = cdnImagePath + "?" + Math.floor(Math.random()*1000000);
//]]>
</script>
Additionally, here is the code snippet for ad hoc monitoring on the server side with cdnMonitor.php:
error_log(date('Y-m-d H:i:s.') .next(explode('.',microtime(1))). ' - '. $_GET['message'] . ' - '. $_SERVER['HTTP_X_REAL_IP']. ' - ' . $_SERVER['HTTP_USER_AGENT'] ."\n", 3, '/tmp/cdnMonitor.log');
You may need to adjust the "HTTP_X_REAL_IP" to REMOTE_ADDR or any other variable depending on your requirements, especially if you are using a reverse proxy like I do.
Finally, I made some last-minute changes in the post editor so there may be some issues. Hopefully everything works smoothly!