Subversion Repositories HomeAutomation

Rev

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

Rev Author Line No. Line
1607 runge 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
}