Ограничить полосу загрузки HTTP POST - PullRequest
0 голосов
/ 04 октября 2019

В моем приложении я непрерывно загружаю видеоролики на десятки мегабайт видео на сервер в облаке.

Часть загрузки написана на python aiohttp, а часть получения - вВ облаке используются node.js и библиотека «request».

Я бы хотел ограничить пропускную способность HTTP-загрузки, скажем, до 1 Мбит / с или менее.

Возможно ли это даже в протоколе HTTP? Должен ли я делать это на стороне клиента (загрузчик) или на стороне сервера (получатель)?

Я много гуглял, но результаты в основном касаются «ограничения скорости», что совсем другое дело.

Помощь оценена.

1 Ответ

0 голосов
/ 04 октября 2019

В ответ на мой комментарий. Вы разделяете запрос POST или GET на загрузку и ограничиваете его на ходу, это делается на стороне сервера. Я бы сделал ограничение на стороне загрузки (не на стороне ответа), потому что это то, что вы пытаетесь контролировать. Поэтому я хотел бы предположить, что это вопрос Python, поскольку ваш обработчик загрузки находится в Python .

Примечание:

  • В примерепри выборе файла формы выгрузки читается определенный размер полезной нагрузки. Вы получаете размер.
  • Затем вы ограничиваете на основе начального размера.
  • Вы будете читать куски, а затем вернетесь с того места, на котором остановились.
  • Установите сонобработчик, чтобы разделить его на определенную скорость.
  • Затем вызвать функцию с оставленным положением фрагмента и положением чтения, чтобы продолжить.

Ограничить скорость загрузки GET, можноприменяется также к POST.

aiohttp Пример Python: https://github.com/aio-libs/aiohttp/issues/2638

import aiohttp
import asyncio


async def read(self, n: int=-1) -> bytes:
    """Read up to 'n' bytes of the response payload.

    If 'n' is -1 (default), read the entire payload.
    """
    if self._body is None:
        try:
            if n is -1:
                self._body = await self.content.read()
            else:
                chunks = []
                i = 0
                while i < n:
                    chunk = await self.content.read(n=n - i)
                    if not chunk:
                        break
                    chunks.append(chunk)
                    i += len(chunk)

                self._body = b''.join(chunks)

            for trace in self._traces:
                await trace.send_response_chunk_received(self._body)

        except BaseException:
            self.close()
            raise
    elif self._released:
        raise aiohttp.ClientConnectionError('Connection closed')

    return self._body


async def f(url, n=-1):
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as response:
            content = await read(response, n=n)
            print(len(content))


URL = 'https://upload.wikimedia.org/wikipedia/commons/thumb/7/71/2010-kodiak-bear-1.jpg/320px-2010-kodiak-bear-1.jpg'

asyncio.run(f(URL, 10_000_000))  # 10 MB
asyncio.run(f(URL, 100))
asyncio.run(f(URL))
...