Ответ 1
Вы можете получить доступ к объекту r.request
для расчета исходящих байтов, и вы можете определить входящие байты (сжатые или нет), просмотрев заголовок content-length
для входящего запроса. Этого достаточно для 99% всех запросов, которые вы обычно делаете.
Вычисление размера байтов заголовков достаточно просто; просто добавьте ключевые и значения длины, добавьте 4 байта для двоеточия и пробелов, плюс еще 2 для пустой строки:
def header_size(headers):
return sum(len(key) + len(value) + 4 for key, value in headers.items()) + 2
Существует также начальная строка; что {method} {path_url} HTTP/1.1{CRLF}
для запросов и HTTP/1.x {status_code} {reason}{CRLF}
для ответа. Эти длины также доступны для вас.
Общий размер:
request_line_size = len(r.request.method) + len(r.request.path_url) + 12
request_size = request_line_size + header_size(r.request.headers) + int(r.request.headers.get('content-length', 0))
response_line_size = len(r.response.reason) + 15
response_size = response_line_size + header_size(r.headers) + int(r.headers.get('content-length', 0))
total_size = request_size + response_size