dojox/io/httpParse.js

  • Provides:

    • dojox.io.httpParse
  • dojox.io.httpParse

    • type
      Function
    • parameters:
      • httpStream: (typeof String)
        HTTP stream to parse
      • topHeaders: (typeof String)
        Extra header information to add to each HTTP request (kind of HTTP inheritance)
      • partial: (typeof Boolean)
        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
    • source: [view]
       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;
    • summary
      Parses an HTTP stream for a message.
    • returns
      the content is not finished
  • dojox.io

    • type
      Object
    • summary
  • dojox

    • type
      Object
    • summary