test-form.js 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. try {
  2. require('form-data')
  3. } catch (e) {
  4. console.error('form-data must be installed to run this test.')
  5. console.error('skipping this test. please install form-data and run again if you need to test this feature.')
  6. process.exit(0)
  7. }
  8. var assert = require('assert')
  9. var http = require('http');
  10. var path = require('path');
  11. var mime = require('mime-types');
  12. var request = require('../index');
  13. var fs = require('fs');
  14. var remoteFile = 'http://nodejs.org/images/logo.png';
  15. var totalLength = null;
  16. var FIELDS = [
  17. {name: 'my_field', value: 'my_value'},
  18. {name: 'my_buffer', value: new Buffer([1, 2, 3])},
  19. {name: 'my_file', value: fs.createReadStream(__dirname + '/unicycle.jpg')},
  20. {name: 'remote_file', value: request(remoteFile) }
  21. ];
  22. var server = http.createServer(function(req, res) {
  23. // temp workaround
  24. var data = '';
  25. req.setEncoding('utf8');
  26. req.on('data', function(d) {
  27. data += d;
  28. });
  29. req.on('end', function() {
  30. // check for the fields' traces
  31. // 1st field : my_field
  32. var field = FIELDS.shift();
  33. assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 );
  34. assert.ok( data.indexOf(field.value) != -1 );
  35. // 2nd field : my_buffer
  36. var field = FIELDS.shift();
  37. assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 );
  38. assert.ok( data.indexOf(field.value) != -1 );
  39. // 3rd field : my_file
  40. var field = FIELDS.shift();
  41. assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 );
  42. assert.ok( data.indexOf('; filename="'+path.basename(field.value.path)+'"') != -1 );
  43. // check for unicycle.jpg traces
  44. assert.ok( data.indexOf('2005:06:21 01:44:12') != -1 );
  45. assert.ok( data.indexOf('Content-Type: '+mime.lookup(field.value.path) ) != -1 );
  46. // 4th field : remote_file
  47. var field = FIELDS.shift();
  48. assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 );
  49. assert.ok( data.indexOf('; filename="'+path.basename(field.value.path)+'"') != -1 );
  50. // check for http://nodejs.org/images/logo.png traces
  51. assert.ok( data.indexOf('ImageReady') != -1 );
  52. assert.ok( data.indexOf('Content-Type: '+mime.lookup(remoteFile) ) != -1 );
  53. assert.ok( req.headers['content-length'] == totalLength );
  54. res.writeHead(200);
  55. res.end('done');
  56. });
  57. });
  58. server.listen(8080, function() {
  59. var req = request.post('http://localhost:8080/upload', function () {
  60. server.close();
  61. })
  62. var form = req.form()
  63. FIELDS.forEach(function(field) {
  64. form.append(field.name, field.value);
  65. });
  66. form.getLength(function (err, length) {
  67. totalLength = length;
  68. });
  69. });
  70. process.on('exit', function() {
  71. assert.strictEqual(FIELDS.length, 0);
  72. });