Перед отправкой POST согласовать максимальный размер тела запроса с удаленным сервером - PullRequest
0 голосов
/ 31 мая 2018

У меня есть сервер Node JS, который отправляет объекты JSON неопределенного размера на удаленный сервер, ограничение размера запроса тела которого может быть неизвестно заранее.

В случае, если мой объект JSON превышаетМаксимальный размер запроса. Я хочу отправить данные в виде кусков.

Я тестирую фиктивную реализацию удаленного сервера, которая использует анализатор тела библиотеки npm для установки максимального размера тела запроса.Когда я отправил запрос, который превысил это ограничение, фиктивный удаленный сервер возвратил ошибку: PayloadTooLargeError: request entity too large

Вопрос. Есть ли способ определить максимальный размер тела запроса, принимаемый сервером, с помощью стандартных методов HTTP изаголовки?

1 Ответ

0 голосов
/ 01 июня 2018

Я не думаю, что вы сможете запросить удаленный сервер, чтобы получить его максимум.

Вероятно, вам лучше всего попробовать подход «проверь и посмотреть», когда вы начинаете с разумногозначение и переключаться на чанкинг, уменьшая его на некоторое соотношение каждый раз, когда вы получаете отклонение с 413.

Я бы предположил, что 8 МБ-10 МБ - хороший начальный размер для обычных интернет-серверов.Но в вашем конкретном приложении вы можете знать некоторые дополнительные ограничения относительно типа серверов, к которым оно подключается, и типичного размера данных, которые вы пытаетесь отправить, поэтому вы можете использовать большее значение по умолчанию.

Я не уверен, что рекомендовал бы это, но вот тупой скрипт, который отправляет кучу фиктивных запросов на бинарный поиск, максимальный размер google.com которого составляет 4096 байт.

var http = require('http');
var querystring = require('querystring');

function compute_size(domain) {
  var max_size = 10240;
  var min_size = 0;

  function send_req(size) {
    var post_data = '*'.repeat(size)
    var post_options = {
      host: domain,
      port: '80',
      path: '/',
      method: 'POST',
      headers: {
        'Content-Length': size
      }
    };

    var req = http.request(post_options, function(res) {
      console.log('Try for size ' + size + ': ' + res.statusCode);
      var fn;

      if (res.statusCode == 413) {
        max_size = size;
        fn = Math.floor;
      } else {
        min_size = size;
        fn = Math.ceil;
      }

      var next_size = fn((max_size - min_size)/2+min_size);

      if (next_size == max_size || next_size == min_size) {
        console.log('Found max: ', min_size);
      } else {
        send_req(next_size);
      }
    });

    req.write(post_data);
    req.end();

  }

  send_req(max_size);
}

compute_size('google.com');

Вот вывод для Google.com, выводя максимум 4096 ... lol

$ node post.js
Try for size 10240: 413
Try for size 5120: 413
Try for size 2560: 405
Try for size 3840: 405
Try for size 4480: 413
Try for size 4160: 413
Try for size 4000: 405
Try for size 4080: 405
Try for size 4120: 413
Try for size 4100: 413
Try for size 4090: 405
Try for size 4095: 405
Try for size 4098: 413
Try for size 4096: 405
Try for size 4097: 413
Found max:  4096
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...