Skip to content

Commit 41e9cc1

Browse files
committed
Implemented a simplistic submit() function
Still considering to drop this feature if it becomes too much of a hastle.
1 parent 6f6b1e9 commit 41e9cc1

3 files changed

Lines changed: 79 additions & 2 deletions

File tree

lib/form_data.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
var CombinedStream = require('combined-stream');
22
var util = require('util');
33
var path = require('path');
4+
var http = require('http');
5+
var parseUrl = require('url').parse;
46
var fs = require('fs');
57
var mime = require('mime');
68
var async = require('async');
@@ -148,3 +150,24 @@ FormData.prototype.getLength = function(cb) {
148150
cb(null, knownLength);
149151
});
150152
};
153+
154+
FormData.prototype.submit = function(url, cb) {
155+
this.getLength(function(err, length) {
156+
var parsedUrl = parseUrl(url);
157+
158+
var request = http.request({
159+
method: 'post',
160+
port: parsedUrl.port || 80,
161+
path: parsedUrl.pathname,
162+
headers: this.getHeaders({'Content-Length': length}),
163+
});
164+
165+
this.pipe(request);
166+
if (cb) {
167+
request.on('error', cb);
168+
request.on('response', cb.bind(this, null));
169+
}
170+
171+
return request;
172+
}.bind(this));
173+
};

test/integration/test-pipe.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,6 @@ server.listen(common.port, function() {
4141
form.append(field.name, field.value);
4242
});
4343

44-
var http = require('http');
45-
4644
var request = http.request({
4745
method: 'post',
4846
port: common.port,

test/integration/test-submit.js

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
var common = require('../common');
2+
var assert = common.assert;
3+
var http = require('http');
4+
var path = require('path');
5+
var mime = require('mime');
6+
var fs = require('fs');
7+
var FormData = require(common.dir.lib + '/form_data');
8+
var IncomingForm = require('formidable').IncomingForm;
9+
10+
var FIELDS = [
11+
{name: 'my_field', value: 'my_value'},
12+
{name: 'my_buffer', value: new Buffer([1, 2, 3])},
13+
{name: 'my_file', value: fs.createReadStream(common.dir.fixture + '/unicycle.jpg')},
14+
];
15+
16+
var server = http.createServer(function(req, res) {
17+
var form = new IncomingForm();
18+
form.uploadDir = common.dir.tmp;
19+
form.parse(req);
20+
form
21+
.on('field', function(name, value) {
22+
var field = FIELDS.shift();
23+
assert.strictEqual(name, field.name);
24+
assert.strictEqual(value, field.value+'');
25+
})
26+
.on('file', function(name, file) {
27+
var field = FIELDS.shift();
28+
assert.strictEqual(name, field.name);
29+
assert.strictEqual(file.name, path.basename(field.value.path));
30+
assert.strictEqual(file.type, mime.lookup(file.name));
31+
})
32+
.on('end', function() {
33+
res.writeHead(200);
34+
res.end('done');
35+
});
36+
});
37+
38+
server.listen(common.port, function() {
39+
var form = new FormData();
40+
FIELDS.forEach(function(field) {
41+
form.append(field.name, field.value);
42+
});
43+
44+
form.submit('http://localhost:' + common.port + '/', function(err, res) {
45+
if (err) {
46+
throw err;
47+
}
48+
49+
assert.strictEqual(res.statusCode, 200);
50+
server.close();
51+
});
52+
});
53+
54+
process.on('exit', function() {
55+
assert.strictEqual(FIELDS.length, 0);
56+
});

0 commit comments

Comments
 (0)