summaryrefslogtreecommitdiff
path: root/js/dojo/dojox/io/httpParse.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/dojo/dojox/io/httpParse.js')
-rw-r--r--js/dojo/dojox/io/httpParse.js82
1 files changed, 82 insertions, 0 deletions
diff --git a/js/dojo/dojox/io/httpParse.js b/js/dojo/dojox/io/httpParse.js
new file mode 100644
index 0000000..bcc20dd
--- /dev/null
+++ b/js/dojo/dojox/io/httpParse.js
@@ -0,0 +1,82 @@
+//>>built
+define("dojox/io/httpParse", ["dojo/_base/kernel"], function(dojo){
+dojo.getObject("io.httpParse", true, dojox);
+
+dojox.io.httpParse = function(/*String*/httpStream, /*String?*/topHeaders,/*Boolean?*/ partial){
+ // summary:
+ // Parses an HTTP stream for a message.
+ // httpStream:
+ // HTTP stream to parse
+ // topHeaders:
+ // Extra header information to add to each HTTP request (kind of HTTP inheritance)
+ // partial:
+ // A true value indicates that the stream may not be finished, it may end arbitrarily in mid stream.
+ // The last XHR object will have a special property _lastIndex that indicates the how far along
+ // the httpStream could be successfully parsed into HTTP messages.
+ // return:
+ // Returns an array of XHR-like object for reading the headers for each message
+ //
+ var xhrs=[];
+ var streamLength = httpStream.length;
+ do{
+ var headers = {};
+ var httpParts = httpStream.match(/(\n*[^\n]+)/);
+ if(!httpParts){
+ return null;
+ }
+ httpStream = httpStream.substring(httpParts[0].length+1);
+ httpParts = httpParts[1];
+ var headerParts = httpStream.match(/([^\n]+\n)*/)[0];
+
+ httpStream = httpStream.substring(headerParts.length);
+ var headerFollowingChar = httpStream.substring(0,1);
+ httpStream = httpStream.substring(1);
+ headerParts = (topHeaders || "") + headerParts;
+ var headerStr = headerParts;
+ headerParts = headerParts.match(/[^:\n]+:[^\n]+\n/g); // parse the containing and contained response headers with the contained taking precedence (by going last)
+ for(var j = 0; j < headerParts.length; j++){
+ var colonIndex = headerParts[j].indexOf(':');
+ headers[headerParts[j].substring(0,colonIndex)] = headerParts[j].substring(colonIndex+1).replace(/(^[ \r\n]*)|([ \r\n]*)$/g,''); // trim
+ }
+
+ httpParts = httpParts.split(' ');
+ var xhr = { // make it look like an xhr object, at least for the response part of the API
+ status : parseInt(httpParts[1],10),
+ statusText : httpParts[2],
+ readyState : 3, // leave it at 3 until we get a full body
+ getAllResponseHeaders : function(){
+ return headerStr;
+ },
+ getResponseHeader : function(name){
+ return headers[name];
+ }
+ };
+ var contentLength = headers['Content-Length'];
+ var content;
+ if(contentLength){
+ if(contentLength <= httpStream.length){
+ content = httpStream.substring(0,contentLength);
+ }else{
+ return xhrs; // the content is not finished
+ }
+ }else if((content = httpStream.match(/(.*)HTTP\/\d\.\d \d\d\d[\w\s]*\n/))){ // assign content
+ // if we spot another HTTP message coming up, we will just assign all the in between text to the content
+ content = content[0];
+ }else if(!partial || headerFollowingChar == '\n'){
+ // if we have to finish
+ content = httpStream;
+ }else{
+ return xhrs;
+ }
+ xhrs.push(xhr); // add it to the list, since it is a full HTTP message
+ httpStream = httpStream.substring(content.length); // move along the stream
+ xhr.responseText = content;
+ xhr.readyState = 4;
+ xhr._lastIndex = streamLength - httpStream.length; // need to pick up from where we left on streaming connections
+ }while(httpStream);
+ return xhrs;
+};
+
+return dojox.io.httpParse;
+
+});