Как сгенерировать контент-длину - PullRequest
0 голосов
/ 12 июня 2019

Я использую данные формы модуля узла для отправки нескольких частей / форм на сервер, но я не уверен, как правильно рассчитать длину содержимого для запроса. Документация github для данных форм кажется немного неясной, и сервер, на который я отправляю, требует, чтобы заголовок длины содержимого был включен.

const FormData = require('form-data');
const fs = require('fs');
const https = require('https');

class Platform {
  _postKey(key, serviceName) {
    const options = this._getOptions();
    const keyName = (key.search(/(PUBLIC)/) !== -1) ? 'publicKey' : 'privateKey';
    const extension = (keyName == 'publicKey') ? 'pub' : '';
    const filePath = (extension.length > 0) ? __dirname + '/data/'+serviceName+'.'+extension : __dirname + '/data/'+serviceName;
    const file = fs.createWriteStream(filePath, {flags: 'wx'});
    file.write(key);
    file.end();
    const form = new FormData();
    form.append('file', fs.createReadStream(filePath));
    form.append('Name', keyName);
    form.append('MimeMajor', 'application');
    form.append('MimeMinor', 'x-pem-file');
    form.append('Extension', extension);
    form.append('FileClass', 'MFS::File');
    options.headers = form.getHeaders();
    options.headers.Authorization = 'Basic ' + Buffer.from(this.FILESTORE_USERNAME + ':' + this.FILESTORE_PASSWORD).toString('base64');
    // options.headers['Content-Length'] = key.length;
    console.log(options);
    return new Promise((resolve, reject) => {
      let post = https.request(options, (res) => {
        let data = '';
        if (res.statusCode < 200 || res.statusCode > 299) {
          reject(new Error('File Storage API returned a status code outside of acceptable range: ' + res.statusCode));
        } else {
          res.setEncoding('utf8');
          res.on('data', (chunk) => {
            data += chunk;
          });

          res.on('error', (err) => {
            reject(err);
          });

          res.on('end', () => {
            console.log(data);
            if (data) {
              resolve(JSON.parse(data));
            } else {
              resolve();
            }
          });
        }
      });
      post.on('error', reject);
      form.pipe(post);
    });
  }
}
...