/*
http handler, single object - many requests (example at bottom)
Tested:
1000 executes per second, no cache hits for 20 minutes
alternating data microtime string | phpinfo() - 1.2million+ executes, no memory leaks
*/
function httpHandler() {
this.HTTPRequestArray = new Object();
/*
=====================================================
HTTP Request Array Controls
=====================================================
*/
this.setRequest = function(httpMethod, requestURI, requestReference) {
httpMethod = httpMethod.toUpperCase();
if(this.verify_httpMethod(httpMethod)) {
this.HTTPRequestArray[requestReference] = new Object();
this.currentRequest = this.HTTPRequestArray[requestReference];
this.currentRequest.HTTPRequestHeaders = new Object();
this.currentRequest.HTTPReturnDump = false;
this.currentRequest.HTTPRequestMethod = httpMethod;
this.currentRequest.HTTPRequestURI = requestURI;
this.createHeaders();
this.setDefaults();
} else {
alert('The value: '+httpMethod+' :is not supported by this version of HTTPRequest');
}
}
this.removeRequest = function(requestReference) {
if(this.HTTPRequestArray[requestReference]) {
delete this.HTTPRequestArray[requestReference];
} else {
alert('The Request Reference: '+requestReference+' :was not found within the object');
}
}
/*
=====================================================
Request Detail Configuration
=====================================================
*/
this.setReturn = function(returnDump, requestReference) {
if(requestReference) {
this.currentRequest = this.HTTPRequestArray[requestReference];
}
this.currentRequest.HTTPReturnDump = returnDump;
}
this.setEntity = function(entity, requestReference) {
if(requestReference) {
this.currentRequest = this.HTTPRequestArray[requestReference];
}
if(in_array(this.currentRequest.HTTPRequestMethod, Array('POST','PUT'))) {
entity = trim(entity);
this.currentRequest['HTTPEntity'] = entity;
this.setHeaderValue('content-length', entity.length);
} else {
alert('The selected Request Method: '+this.currentRequest.HTTPRequestMethod+' :does not support entities');
}
};
/*
=====================================================
HTTP Request Executor
=====================================================
*/
this.execute = function(removeRequests) {
for(HTTPRequestURI in this.HTTPRequestArray) {
this.currentRequest = this.HTTPRequestArray[HTTPRequestURI];
if((this.currentRequest.HTTPRequestMethod) && (this.currentRequest.HTTPRequestURI)) {
if (window.XMLHttpRequest) {
/* Standard XMLHTTPRequest Initialisation */
this.currentRequest.HTTPRequest = new XMLHttpRequest();
this.currentRequest.Async = true;
} else if (window.ActiveXObject) {
/* Old IE XMLHTTP Object */
this.currentRequest.HTTPRequest = new ActiveXObject("Microsoft.XMLHTTP");
this.currentRequest.Async = false;
}
/* only proceed is the XMLHTTP(Request) Object Loaded */
if (this.currentRequest.HTTPRequest) {
/* open up the connection */
this.currentRequest.HTTPRequest.open(this.currentRequest.HTTPRequestMethod,this.currentRequest.HTTPRequestURI,this.currentRequest.Async);
/* Set all Request Headers that have values set */
for(headerField in this.currentRequest.HTTPRequestHeaders) {
if(this.currentRequest.HTTPRequestHeaders[headerField].value) {
this.currentRequest.HTTPRequest.setRequestHeader(headerField, this.currentRequest.HTTPRequestHeaders[headerField].value);
}
}
try {
/* ff */
this.currentRequest.HTTPRequest.toSource();
this.currentRequest.HTTPRequest.onreadystatechange = new this.recieveHTTPResponse();
} catch(err) {
/* the joys of IE... */
try {
/* IE7 */
this.currentRequest.HTTPRequest.HTTPReturnDump = http.currentRequest.HTTPReturnDump;
this.currentRequest.HTTPRequest.tempHandler = new this.recieveHTTPResponse(true);
this.currentRequest.HTTPRequest.onreadystatechange = this.currentRequest.HTTPRequest.tempHandler.handleEv;
} catch(err2) {
/* IE6 non Async!!! */
this.currentRequest.HTTPResponseHandler = new this.recieveHTTPResponseX();
this.currentRequest.HTTPRequest.onreadystatechange = this.currentRequest.HTTPResponseHandler.handleEv;
}
}
if(this.currentRequest.HTTPEntity) {
/* Send the entity (post string) if we have one */
this.currentRequest.HTTPRequest.send(this.currentRequest.HTTPEntity);
} else {
/* Send with no entity */
this.currentRequest.HTTPRequest.send('');
}
} else {
alert('Your User-Agent failed to initialise HTTPReqest');
}
}
}
if(removeRequests) {
this.HTTPRequestArray = new Object();
}
};
/*
=====================================================
HTTP Transport Response Handlers
=====================================================
*/
this.recieveHTTPResponse = function(OldStylee) {
if(!OldStylee) {
/* FF Safari Etc */
this.CurrentObj = http.currentRequest.HTTPRequest;
this.HTTPReturnDump = http.currentRequest.HTTPReturnDump;
this.handleEvent = function() {
if (this.CurrentObj.readyState==4) {
if (this.CurrentObj.status==200) {
if(this.HTTPReturnDump) {
if(this.HTTPReturnDump.prototype) {
this.HTTPReturnDump(this.CurrentObj.responseText);
} else {
document.getElementById(this.HTTPReturnDump).innerHTML = this.CurrentObj.responseText;
}
} else {
alert(this.CurrentObj.responseText);
}
} else {
if(this.HTTPReturnDump.prototype) {
this.HTTPReturnDump(false);
} else {
alert("Problem retrieving XML data");
}
}
}
};
} else {
/* IE7, have to throw back a function as onreadystatechange doesn't work on objects.. */
this.handleEv = function() {
if (this.readyState==4) {
if (this.status==200) {
if(this.HTTPReturnDump) {
if(this.HTTPReturnDump.prototype) {
this.HTTPReturnDump(this.responseText);
} else {
document.getElementById(this.HTTPReturnDump).innerHTML = this.responseText;
}
} else {
alert(this.responseText);
}
} else {
if(this.HTTPReturnDump.prototype) {
this.HTTPReturnDump(false);
} else {
alert("Problem retrieving XML data");
}
}
}
};
}
};
this.recieveHTTPResponseX = function() {
/* IE6 */
this.handleEv = function() {
var CurrentObj = http.currentRequest;
if (CurrentObj.HTTPRequest.readyState==4) {
if (CurrentObj.HTTPRequest.status==200) {
if(CurrentObj.HTTPReturnDump) {
if(CurrentObj.HTTPReturnDump.prototype) {
CurrentObj.HTTPReturnDump(CurrentObj.HTTPRequest.responseText);
} else {
document.getElementById(CurrentObj.HTTPReturnDump).innerHTML = CurrentObj.HTTPRequest.responseText;
}
} else {
alert(CurrentObj.HTTPRequest.responseText);
}
} else {
if(CurrentObj.HTTPReturnDump.prototype) {
CurrentObj.HTTPReturnDump(false);
} else {
alert("Problem retrieving XML data");
}
}
}
};
};
/*
=====================================================
Initial VALID Object Data Construction
=====================================================
*/
this.setDefaults = function() {
if(this.currentRequest.HTTPRequestMethod == 'GET') {
this.currentRequest.HTTPRequestMethod = 'POST';
this.setEntity('a');
}
if(this.currentRequest.HTTPRequestMethod == 'POST') {
this.setHeaderValue('Content-Type','application/x-www-form-urlencoded');
}
if((this.currentRequest.HTTPRequestHeaders['Cache-Control']) && (this.currentRequest.HTTPRequestHeaders['Cache-Control']['value'])) {
if(this.currentRequest.HTTPRequestHeaders['Cache-Control']['value'] == 'no-cache') {
this.setHeaderValue('Pragma','no-cache');
}
}
};
/*
=====================================================
Data Transformation Functions
=====================================================
*/
/* Return the current gmt Date and Time formatted as per the RFC-822 specification */
this.rfc822Date = function() {
var rfc822DateNow = new Date();
return rfc822DateNow.toUTCString();
};
/* Format the inputted header name to be consistent with the RFC 2616 Guidlines */
this.headerNameFormat = function(strin) {
var strArray = strin.split("-");
for(subs in strArray) {
strArray[subs] = strArray[subs].toUpperCase().substr(0,1)+strArray[subs].toLowerCase().substr(1);
}
return strArray.toString().replace(',','-');
};
/* HTTP Method Validation */
this.verify_httpMethod = function(strin) {
return in_array(strin, Array('PUT','POST','GET','HEAD','OPTIONS','TRACE'));
}
/*
=====================================================
Request Header Field Load and Value Set Functions
=====================================================
*/
/* Set the value of the specified header */
this.setHeaderValue = function(headerName, value) {
headerName = this.headerNameFormat(headerName);
if(this.currentRequest.HTTPRequestHeaders[headerName]) {
this.currentRequest.HTTPRequestHeaders[headerName].value = value;
} else {
alert('The specified header: '+headerName+' :is not available in this version of HTTPRequest');
}
};
/* make a header available for use in the current request */
this.setHeaderItem = function(fieldName,fieldValues) {
this.currentRequest.HTTPRequestHeaders[fieldName] = new Object();
for(var fieldValIndex in fieldValues) {
this.currentRequest.HTTPRequestHeaders[fieldName][fieldValIndex] = fieldValues[fieldValIndex];
}
};
/*
=====================================================
Available HTTP Request Header Field Definition
=====================================================
*/
/* set the array structure that forms the basis for the current request
define and load all the relevant HTTP Request fields based on the Request Method */
this.createHeaders = function() {
/* General-Header */
this.setHeaderItem('Cache-Control', {
'required' : false,
'headType' : 'General-Header'}
);
this.setHeaderItem('Connection', {
'required' : false,
'headType' : 'General-Header'}
);
if(in_array(this.currentRequest.HTTPRequestMethod, Array('PUT','POST'))) {
this.setHeaderItem('Date', {
'required' : false,
'headType' : 'General-Header'}
);
}
this.setHeaderItem('Pragma', {
'required' : false,
'headType' : 'General-Header'}
);
if(in_array(this.currentRequest.HTTPRequestMethod, Array('PUT','POST'))) {
this.setHeaderItem('Transfer-Encoding', {
'required' : false,
'headType' : 'General-Header'}
);
}
this.setHeaderItem('Upgrade', {
'required' : false,
'headType' : 'General-Header'}
);
this.setHeaderItem('Via', {
'required' : false,
'headType' : 'General-Header'}
);
/* Request-Header */
this.setHeaderItem('Accept', {
'required' : false,
'headType' : 'Request-Header'}
);
this.setHeaderItem('Accept-Charset', {
'required' : false,
'headType' : 'Request-Header'}
);
this.setHeaderItem('Accept-Encoding', {
'required' : false,
'headType' : 'Request-Header'}
);
this.setHeaderItem('Accept-Language', {
'required' : false,
'headType' : 'Request-Header'}
);
this.setHeaderItem('Authorization', {
'required' : false,
'headType' : 'Request-Header'}
);
this.setHeaderItem('Expect', {
'required' : false,
'headType' : 'Request-Header'}
);
this.setHeaderItem('From', {
'required' : false,
'headType' : 'Request-Header'}
);
this.setHeaderItem('Host', {
'required' : true,
'headType' : 'Request-Header'}
);
this.setHeaderItem('If-Match', {
'required' : false,
'headType' : 'Request-Header'}
);
this.setHeaderItem('If-Modified-Since', {
'required' : false,
'headType' : 'Request-Header'}
);
this.setHeaderItem('If-None-Match', {
'required' : false,
'headType' : 'Request-Header'}
);
this.setHeaderItem('If-Range', {
'required' : false,
'headType' : 'Request-Header'}
);
this.setHeaderItem('If-Unmodified-Since', {
'required' : false,
'headType' : 'Request-Header'}
);
if(in_array(this.currentRequest.HTTPRequestMethod, Array('TRACE','OPTIONS'))) {
this.setHeaderItem('Max-Forwards', {
'required' : false,
'headType' : 'Request-Header'}
);
}
if(this.currentRequest.HTTPRequestMethod == 'GET') {
this.setHeaderItem('Range', {
'required' : false,
'headType' : 'Request-Header'}
);
}
this.setHeaderItem('Referer', {
'required' : false,
'headType' : 'Request-Header'}
);
this.setHeaderItem('TE', {
'required' : false,
'headType' : 'Request-Header'}
);
this.setHeaderItem('User-Agent', {
'required' : false,
'headType' : 'Request-Header'}
);
/* Entity-Header */
if(in_array(this.currentRequest.HTTPRequestMethod, Array('PUT','DELETE'))) {
this.setHeaderItem('Allow', {
'required' : false,
'headType' : 'Entity-Header'}
);
}
if(in_array(this.currentRequest.HTTPRequestMethod, Array('GET','PUT','POST'))) {
this.setHeaderItem('Content-Encoding', {
'required' : false,
'headType' : 'Entity-Header'}
);
this.setHeaderItem('Content-Language', {
'required' : false,
'headType' : 'Entity-Header'}
);
this.setHeaderItem('Content-Length', {
'required' : true,
'headType' : 'Entity-Header'}
);
this.setHeaderItem('Content-MD5', {
'required' : false,
'headType' : 'Entity-Header'}
);
this.setHeaderItem('Content-Range', {
'required' : false,
'headType' : 'Entity-Header'}
);
this.setHeaderItem('Content-Type', {
'required' : true,
'headType' : 'Entity-Header'}
);
}
};
}
var http = new httpHandler();
/*
example
http.setRequest('POST','formprocess.php','firsttest'); // post 'what' to page formprocess.php
http.setEntity(' what ');
http.setRequest('GET','pagetwo.php','regupdate'); // get info from pagetwo
http.setHeaderValue('Cache-Control','no-cache'); // set no-cache header
http.setReturn('mydivid','regupdate'); // set the place to return output to, this can be 'id' or functionname or false(default) to discard return
http.execute(); // execute both requests
http.removeRequest('firsttest'); // remove the request with ref: firsttest
http.execute(); // execute again with the one remaining request (regupdate)
http.execute(false); // execute again with the one remaining request and reset to a blank object when done.
thoughts: interval("http.execute()", 1000); update X every second..
notes: there's no limit to the amount of requests, you can run 5000 on an execute if you want..
*/