Subversion Repositories HomeAutomation

Rev

Blame | Last modification | View Log | SVN | RSS feed

  1.  
  2. function HTTP()
  3. {
  4. }
  5.  
  6. HTTP.prototype.mySocket = null;
  7. HTTP.prototype.myUserCallback = null;
  8. HTTP.prototype.myBuffer = null;
  9. HTTP.prototype.myRequest = null;
  10.  
  11. HTTP.prototype.request = function(callback, url)
  12. {
  13.     this.myUserCallback = callback;
  14.    
  15.     if (this.mySocket)
  16.     {
  17.         this.mySocket.stop();
  18.     }
  19.    
  20.     var self = this;
  21.    
  22.     var urlData = this.parseUrl(url);
  23.    
  24.     /*log("hostname: " + urlData['hostname'] + "\n");
  25.     log("path: " + urlData['path'] + "\n");
  26.     log("port: " + urlData['port'] + "\n");*/
  27.    
  28.     this.myBuffer = "";
  29.    
  30.     this.mySocket = new Socket(function(event, data) { self.socketCallback(event, data); }, urlData['hostname'], urlData['port'], 0);
  31.     if (this.mySocket.start())
  32.     {
  33.         this.myRequest = "GET " + urlData['path'] + " HTTP/1.1\r\n";
  34.         this.myRequest += "Host: " + urlData['hostname'] + ":" + urlData['port'] + "\r\n";
  35.         this.myRequest += "User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.2) Gecko/20090730 SUSE/3.5.2-1.1 Firefox/3.5.2\r\n";
  36.         this.myRequest += "Connection: close\r\n";
  37.         this.myRequest += "\r\n";
  38.         this.mySocket.send(this.myRequest);
  39.     }
  40. }
  41.  
  42. HTTP.prototype.parseUrl = function(url)
  43. {
  44.     var result = new Array();
  45.     result['port'] = 80;
  46.     result['path'] = "/";
  47.  
  48.     var firstSlash = url.indexOf('/');
  49.    
  50.     if (firstSlash == -1)
  51.     {
  52.         result['hostname'] = url;
  53.     }
  54.     else
  55.     {
  56.         result['hostname'] = url.substr(0, firstSlash);
  57.         result['path'] = url.substr(firstSlash);
  58.     }
  59.    
  60.     var firstColon = result['hostname'].indexOf(':');
  61.    
  62.     if (firstColon != -1)
  63.     {
  64.         result['port'] = result['hostname'].substr(firstColon+1);
  65.         result['hostname'] = result['hostname'].substr(0, firstColon);
  66.     }
  67.  
  68.     return result;
  69. }
  70.  
  71. HTTP.prototype.socketCallback = function(event, data)
  72. {
  73.     switch (event)
  74.     {
  75.     case "CONNECTED":
  76.     this.mySocket.send(this.myRequest);
  77.     break;
  78.    
  79.     case "DATA":
  80.     this.myBuffer += unescape(data);
  81.     break;
  82.    
  83.     case "RESET":
  84.     case "CLOSED":
  85.     case "DIED":
  86.     this.mySocket.stop();
  87.     this.processBuffer();
  88.     this.mySocket = null;
  89.     break;
  90.     }
  91. }
  92.  
  93. HTTP.prototype.processBuffer = function()
  94. {
  95.     ///FIXME: This is a bit ugly code... also not fully HTTP/1.1 compliant look at http://www.jmarshall.com/easy/http/
  96.  
  97.     var pos = this.myBuffer.indexOf("\n\n");
  98.    
  99.     var headerData = this.myBuffer.substr(0, pos);
  100.     var contentData = this.myBuffer.substr(pos+2);
  101.    
  102.     var headerLines = headerData.split("\n");
  103.    
  104.     var header = new Array();
  105.     var result = headerLines[0];
  106.    
  107.     for (var n = 1; n < headerLines.length; n++)
  108.     {
  109.         var headerParts = headerLines[n].split(":", 2);
  110.         header[headerParts[0]] = headerParts[1].trim(' ');
  111.     }
  112.    
  113.     this.myBuffer = "";
  114.    
  115.     if (this.myUserCallback != null)
  116.     {
  117.         this.myUserCallback(result, header, contentData);
  118.         this.myUserCallback = null;
  119.     }
  120. }
  121.