Try a different approach to getting Nodejs to find
[r-node:r-node.git] / server / handlers / 400-r-upload-via-web-service.js
1 /*
2     Copyright 2010 Jamie Love
3
4     This file is part of the "R-Node Server".
5
6     R-Node Server is free software: you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation, either version 2.1 of the License, or
9     (at your option) any later version.
10
11     R-Node Server is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15
16     You should have received a copy of the GNU General Public License
17     along with R-Node Server.  If not, see <http://www.gnu.org/licenses/>.
18 */
19
20 var SYS     = require("sys");
21 var QUERY   = require ("querystring");
22 var URL     = require("url");
23 var FS      = require("fs");
24 var UTILS   = require("../rnodeUtils");
25 var MPART   = require(__dirname + "/../lib/multipart/multipart.js")
26
27 exports.name = "/R/upload-via-web-service";
28
29 exports.init = function (rNodeApi) {
30     rNodeApi.addRestrictedUrl (/^\/R\/upload-via-web-service/);
31 }
32
33 exports.handle = function (req, resp, sid, rNodeApi) {
34     req.setBodyEncoding('utf8');
35
36     var config = rNodeApi.config.features.fileUpload;
37
38     if (!config.enable) {
39         rNodeApi.log(req, "File upload disabled. Not allowing upload.");
40         var ret = {
41             success: false
42             , message: 'File uploading disabled.'
43         };
44         resp.writeHeader(200, { "Content-Type": "text/html" });
45         resp.write (JSON.stringify (ret));
46         resp.end();
47         return;
48     }
49
50     var maxLength = config.maxFileSize || (1024 * 1024);
51     if (maxLength.search(/[^0-9]/) > 0) {
52         var parts = maxLength.match(/^([0-9]+)([bkmg])/);
53         switch (parts[2]) {
54             case "k": maxLength = parts[1] * 1024; break;
55             case "m": maxLength = parts[1] * 1024 * 1024; break;
56             case "g": maxLength = parts[1] * 1024 * 1024 * 1024; break;
57             case "b": maxLength = parts[1] * 1; break;
58         }
59     }
60
61     rNodeApi.log(req, 'Max file length is: ' + maxLength);
62
63     // Get a temporary file
64     var filename = (config.directory || "/tmp") + "/" + UTILS.getRandomString();
65     var fd = FS.openSync (filename, "w");
66     var receivedLength = 0;
67     var cancelled = false;
68
69     if (!fd) {
70         var ret = {
71             success: false
72             , message: 'Cannot save file to disk.'
73         };
74         resp.writeHeader(200, { "Content-Type": "text/html" });
75         resp.write (JSON.stringify (ret));
76         resp.end();
77         return;
78     }
79
80     /*
81      * TODO
82     var sourceUrl = URL.parse (...);
83
84     var source = http.createClient(80, 'www.google.com');
85     var request = google.request('GET', '/', {'host': 'www.google.com'});
86
87     request.addListener('response', function (response) {
88             sys.puts('STATUS: ' + response.statusCode);
89             sys.puts('HEADERS: ' + JSON.stringify(response.headers));
90             response.setEncoding('utf8');
91             response.addListener('data', function (chunk) {
92                 sys.puts('BODY: ' + chunk);
93                 });
94             });
95     request.end();
96     */
97
98     return true;
99 }
100
101 exports.canHandle = function (req, rNodeApi) {
102     return req.url.beginsWith ('/R/upload-via-web-service');
103 }