it('should consume all request data after error throw', async () => { const keepAliveAgent = new Agent({ keepAlive: true, }); // retry 10 times for (let i = 0; i < 10; i++) { const form = formstream(); form.file('file1', path.join(__dirname, 'fixtures/bigdata.txt')); form.field('foo', 'fengmk2') .field('love', 'koa') .field('index', `${i}`); const headers = form.headers(); const result = await urllib.request(`${host}/upload`, { method: 'POST', headers, stream: form, timing: true, agent: keepAliveAgent, }); const data = result.data; const response = result.res; if (i === 0) { assert(response.keepAliveSocket === false); } else { assert(response.keepAliveSocket === true); } assert(response.status === 500); assert(data.toString().includes('Cannot read property 'error' of undefined')); // wait for the request data is consumed by onerror await sleep(200); } });
fs.stat(filepath, function(err, stat) { if(err){ callback(err); return; } var form = formstream(); form.file('media', filepath, path.basename(filepath), stat.size); var opts = { dataType: 'json', type: 'POST', headers: form.headers(), stream: form }; urllib.request(url, opts, function(err, body, resp){ if(err){ callback(err); return; } if(body.errcode){ callback(body); return; } callback(null, body.type, body.media_id, body.created_at); }); });
it('should upload with csrf', done => { const form = formstream(); // form.file('file', filepath, filename); form.file('file', __filename); // other form fields form.field('foo', 'fengmk2').field('love', 'egg'); // https://snyk.io/vuln/npm:qs:20170213 form.field('[', 'toString'); const headers = form.headers(); headers.Cookie = cookies; urllib.request(`${host}/upload?_csrf=${csrfToken}`, { method: 'POST', headers, stream: form, }, (err, body, res) => { assert(!err); assert(res.statusCode === 200); const data = JSON.parse(body); assert(data.filename === 'multipart.test.js'); assert.deepEqual(data.fields, { foo: 'fengmk2', love: 'egg', '[': 'toString', }); done(); }); });
return through.obj(function(file, enc, next) { if (!file.isBuffer()) return next(); var self = this; var content = file.contents.toString(); var form = formstream(); var data = options.data || {}; for (var key in data) { var value = data[key]; if (typeof value === 'function') { form.field(key, value(file)); } else { form.field(key, data[key]); } } var fileinputname = options.fileinputname || "file"; form.file(fileinputname, file.path); var inputOptions = _.omit(options, 'server', 'data', 'fileinputname') var requestOptions = Object.assign({}, defaultOptions, inputOptions, { headers: form.headers(options.headers), stream: form }) urllib.request(options.server, requestOptions, function (err, data, res) { callback(err, data, res); self.push(file); next(); }); });
function createMultipartForm(uploadToken, key, fsStream, putExtra, callbackFunc) { var postForm = formstream(); postForm.field('token', uploadToken); if (key) { postForm.field('key', key); } postForm.stream('file', fsStream, putExtra.fname, putExtra.mimeType); //putExtra params for (var k in putExtra.params) { if (k.startsWith('x:')) { postForm.field(k, putExtra.params[k].toString()); } } var fileBody = []; fsStream.on('data', function(data) { fileBody.push(data); }); fsStream.on('end', function() { fileBody = Buffer.concat(fileBody); var bodyCrc32 = parseInt('0x' + getCrc32(fileBody)); postForm.field('crc32', bodyCrc32); }); callbackFunc(postForm); }
function getMultipart(uptoken, key, body, extra) { var form = formstream(); form.field('token', uptoken); if(key != exports.UNDEFINED_KEY) { form.field('key', key); } form.buffer('file', new Buffer(body), key, extra.mimeType); //extra['checkcrc'] if (extra.checkCrc == 1) { var bodyCrc32 = getCrc32(body); extra.crc32 = '' + parseInt(bodyCrc32, 16); } if(extra.checkCrc) { form.field('crc32', extra.crc32); } for (var k in extra.params) { form.field(k, extra.params[k]); } return form; }
Sling.prototype.uploadStream = function (contentPath, contentStream, callback) { var form = formstream() .field('_charset_', 'utf-8') .field('*@TypeHint', 'nt:file') .stream('*', contentStream, util.fileName(contentPath)) this.formPost(util.dirName(contentPath), form, callback) }
API.prototype[method] = function (filepath, callback) { var form = formstream(); form.file('media', filepath); form.headers({ 'Content-Type': 'application/json' }); var url = this.fileServerPrefix + 'media/upload?access_token=' + this.token + '&type=' + type; urllib.request(url, { dataType: 'json', type: 'POST', headers: form.headers(), stream: form }, wrapper(callback)); };
exports.uploadPageIcon = async function (filepath) { const { accessToken } = await this.ensureAccessToken(); var stat = await statAsync(filepath); var form = formstream(); form.file('media', filepath, path.basename(filepath), stat.size); var url = 'https://api.weixin.qq.com/shakearound/material/add?access_token=' + accessToken; var opts = { dataType: 'json', method: 'POST', timeout: 60000, // 60秒超时 headers: form.headers(), data: form }; return this.request(url, opts); };
exports.uploadLogo = async function (filepath) { var stat = await statAsync(filepath); const { accessToken } = await this.ensureAccessToken(); var form = formstream(); form.file('buffer', filepath, path.basename(filepath), stat.size); var url = this.fileServerPrefix + 'media/uploadimg?access_token=' + accessToken; var opts = { dataType: 'json', method: 'POST', timeout: 60000, // 60秒超时 headers: form.headers(), stream: form }; return this.request(url, opts); };
exports.uploadMaterial = function* (filepath, type) { var token = yield* this.ensureAccessToken(); var stat = yield fs.stat(filepath); var form = formstream(); form.file('media', filepath, path.basename(filepath), stat.size); var url = prefixUrl + 'material/add_material?access_token=' + token.accessToken + '&type=' + type; var opts = { dataType: 'json', type: 'POST', timeout: 60000, // 60秒超时 headers: form.headers(), stream: form }; return yield* this.request(url, opts); };
fs.stat(filepath, function (err, stat) { if (err) { return callback(err); } var form = formstream(); form.file('buffer', filepath, path.basename(filepath), stat.size); var url = that.fileServerPrefix + 'media/uploadimg?access_token=' + that.token.accessToken; var opts = { dataType: 'json', type: 'POST', timeout: 60000, // 60秒超时 headers: form.headers(), stream: form }; that.request(url, opts, wrapper(callback)); });
fs.stat(filepath, function (err, stat) { if (err) { return callback(err); } var form = formstream(); form.file('media', filepath, path.basename(filepath), stat.size); var url = 'https://api.weixin.qq.com/shakearound/material/add?access_token=' + that.token.accessToken; var opts = { dataType: 'json', type: 'POST', timeout: 60000, // 60秒超时 headers: form.headers(), stream: form }; that.request(url, opts, callback); });
fs.stat(filepath, function (err, stat) { if (err) { return callback(err); } var form = formstream(); form.file('media', filepath, path.basename(filepath), stat.size); var url = that.prefix + 'material/add_material?access_token=' + that.token.accessToken + '&type=' + type; var opts = { dataType: 'json', type: 'POST', timeout: 60000, // 60秒超时 headers: form.headers(), stream: form }; that.request(url, opts, wrapper(callback)); });
fs.stat(filepath, function (err, stat) { if (err) { return callback(err); } var form = formstream(); form.file('media', filepath, path.basename(filepath), stat.size); var prefix = 'http://api.weixin.qq.com/'; var url = prefix + 'customservice/kfaccount/uploadheadimg?access_token=' + that.token.accessToken + '&kf_account=' + account; var opts = { dataType: 'json', type: 'POST', timeout: 60000, // 60秒超时 headers: form.headers(), stream: form }; that.request(url, opts, wrapper(callback)); });
it('should upload file with formstream', function (done) { var form = formstream(); form.file('file', __filename); form.field('hello', '你好urllib'); var args = { type: 'POST', headers: form.headers(), stream: form }; urllib.request(host + '/stream', args, function (err, data, res) { should.not.exist(err); data = data.toString(); data.should.include('你好urllib\r\n----------------------------'); data.should.include('Content-Disposition: form-data; name="file"; filename="urllib.test.js"'); done(); }); });
fs.stat(filepath, function (err, stat) { if (err) { return callback(err); } var form = formstream(); form.file('media', filepath, path.basename(filepath), stat.size); form.headers({ 'Content-Type': 'application/json' }); var url = that.fileServerPrefix + 'media/upload?access_token=' + that.token + '&type=' + type; var opts = { dataType: 'json', type: 'POST', timeout: 60000, // 60秒超时 headers: form.headers(), stream: form }; urllib.request(url, opts, wrapper(callback)); });
it('should post stream', function(done) { var form = formstream(); form.file('file1', __filename); form.field('hello', '你好urllib'); var args = { timeout: 30000, method: 'post', dataType: 'json', headers: form.headers(), stream: form }; var url = 'http://httpbin.org/post'; urllib.request(url, args, function (err, data, res) { should.not.exist(err); data.files.file1.should.be.a.String; data.form.hello.should.equal('你好urllib'); res.status.should.equal(200); done(); }); });
fs.stat(filepath, function(err, stat) { if (err) { return callback(err); } var form = formstream(); form.file('media', filepath, path.basename(filepath), stat.size); var url = "https://api.weixin.qq.com/cgi-bin/media/uploadimg"; url+="?access_token=" + token; var opts = { dataType: 'json', type: 'POST', timeout: 60000, // 60秒超时 headers: form.headers(), stream: form }; console.log("headers",opts.headers); //urllib.request(url, options, callback); urllib.request(url, opts, function(){ console.log("post weixin return:",arguments); }); });
exports.pornDetectFile = function(pornFile, callback) { var sign = auth.getPornDetectSign(); if( -1 == sign || -2 == sign){ var data = { 'code':9, 'message':'Secret id or key is empty.', 'data':{} } callback(data); } var form = formstream(); for (var i = 0; i < pornFile.length; i++) { filePath = pornFile[i]; var isExists = fs.existsSync(filePath); if (isExists) { var stats = fs.statSync(filePath); var fileSizeInBytes = stats["size"]; form.file('image['+i.toString()+']', filePath, filePath, fileSizeInBytes); } else{ callback({'httpcode':0, 'code':-1, 'message':'file '+filePath+' not exists', 'data':{}}); } } form.field('appid', conf.APPID).field('bucket', conf.BUCKET); var headers = form.headers({ 'Authorization': sign, }); var url = conf.API_PRONDETECT_URL; var urlInfo = urlM.parse(url); var options = { hostname: urlInfo.hostname, port: urlInfo.port || 80, path: urlInfo.path, method: 'POST', timeout: TIME_OUT, headers: headers }; var req = http.request(options, function (res) { res.on('data', function (data) { var ret = {}; try { var ret = JSON.parse(data.toString()); } catch (err) { ret = {}; } if (ret) { var rets = ret.result_list; if(rets){ var result = {}; for(var i = 0; i < rets.length; i++){ var res = { 'code':rets[i].code, 'message':rets[i].message || '', 'filename':rets[i].filename || '', 'data':{}, } if (0 == rets[i].code) { res.data = { 'result':rets[i].data.result || '0', 'confidence':rets[i].data.confidence || '0', 'normal score':rets[i].data.normal_score || '0', 'hot score':rets[i].data.hot_score || '0', 'p**n score':rets[i].data.porn_score || '0', 'forbid status':rets[i].data.forbid_status || '0', } } result[i] = res; } callback(result); } else{ var res = { 'code':ret.code, 'message':ret.message || '', 'data':{}, } callback(res); } } else { callback({'code':-1, 'message':'response '+data.toString()+' is not json', 'data':{}}); } }); }); form.pipe(req); }