UNPKG

2.17 kBJavaScriptView Raw
1var util = require ('util'),
2 qs = require ('querystring'),
3 multiparty = require ('multiparty'),
4 task = require ('./base');
5
6
7var postTask = module.exports = function (config) {
8
9 this.request = config.request;
10 this.init (config);
11
12};
13
14util.inherits (postTask, task);
15
16util.extend (postTask.prototype, {
17
18 run: function () {
19
20 // TODO: add data limit
21
22 var self = this;
23
24 if (self.request.method != 'POST' && self.request.method != 'PUT') {
25 self.emit ('log', 'http method is ' + self.request.method || "GET");
26 return self.skipped ();
27 }
28
29 var contentType = self.request.headers['content-type'];
30 var multipartRe = /multipart|boundary=(?:"([^"]+)"|([^;]+))/i;
31
32 if (multipartRe.test(contentType)) {
33 var form = new multiparty.Form();
34 // TODO: add support for parameters
35
36 form.on ('fileBegin', function (name, file) {
37 self.emit ('log', 'started loading '+name);
38 // here we can overload generated file name
39 });
40
41 form.on ('file', function (name, file) {
42 self.emit ('log', 'finished loading '+name);
43 });
44
45 form.on ('error', function (error) {
46 self.emit ('error', 'form error '+ error);
47 });
48
49 form.on ('aborted', function () {
50 self.emit ('error', 'form aborted');
51 });
52
53 form.on ('end', function () {
54 self.emit ('log', 'form end');
55 });
56
57 form.parse(self.request, function(err, fields, files) {
58 self.completed ({err: err, fields: fields, files: files});
59 });
60 } else {
61
62 self.data = "";
63
64 self.request.on("data", function (chunk) {
65 self.data += chunk;
66 });
67
68 self.request.on("error", function (e) {
69 self.emmitError(e);
70 });
71
72 // TODO: file uploads
73
74 self.request.on("end", function () {
75
76 var fields, err;
77 var body = {fields: fields};
78
79 if (self.dumpData) {
80 self.emit ('log', self.data);
81 }
82
83 try {
84 fields = JSON.parse (self.data);
85 } catch (e) {
86 err = e;
87 }
88
89 if (err) {
90
91 err = null;
92
93 try {
94 fields = qs.parse (self.data);
95 } catch (e) {
96 err = e;
97 }
98 }
99
100 body = (err) ? self.data : {fields: fields};
101
102 self.completed (body);
103 });
104
105 }
106
107 return self.request.resume();
108 }
109});