Adding to @pbaranski's answer.
This would work for httpx. Recording both request and response data usage:
async def measure_data_usage(self, res: httpx.Response):
# get size of req
method_len = len(res.request.method)
url_len = len('\r\n'.join(f'{value}' for value in res.request.url.raw))
headers_len = len('\r\n'.join(f'{key}{value}'
for key, value in
res.request.headers.items()))
body_len = len(res.request.content if res.request.content else ())
total_req_size = method_len + url_len + headers_len + body_len
# get size of resp
url_len = len('\r\n'.join(f'{value}' for value in res.request.url.raw))
headers_len = len('\r\n'.join(f'{key}{value}'
for key, value in
res.headers.items()))
body_len = len(res.request.content if res.content else ())
total_resp_size = url_len + headers_len + body_len
There's repetition. You can feel free to optimize according to your program. I'm leaving it in for clarity.