diff --git a/bbot/core/helpers/web/web.py b/bbot/core/helpers/web/web.py index 7d9bb18ff1..eba3bff811 100644 --- a/bbot/core/helpers/web/web.py +++ b/bbot/core/helpers/web/web.py @@ -100,7 +100,18 @@ def _build_blasthttp_kwargs(self, url, **kwargs): headers = kwargs.pop("headers", None) or {} body = kwargs.pop("body", None) data = kwargs.pop("data", None) + files = kwargs.pop("files", None) json_body = kwargs.pop("json", None) + + body_sources = [ + name + for name, val in (("body", body), ("data", data), ("json", json_body), ("files", files)) + if val is not None + ] + if len(body_sources) > 1: + raise ValueError( + f"request() got conflicting body kwargs {body_sources}; pass at most one of body, data, json, files" + ) timeout = kwargs.pop("timeout", self._http_timeout) follow_redirects = kwargs.pop("follow_redirects", None) max_redirects = kwargs.pop("max_redirects", None) @@ -191,7 +202,9 @@ def _build_blasthttp_kwargs(self, url, **kwargs): } if body is not None: - blast_kwargs["body"] = str(body) + blast_kwargs["body"] = body if isinstance(body, (bytes, bytearray)) else str(body) + if files is not None: + blast_kwargs["files"] = files if follow_redirects is not None: blast_kwargs["follow_redirects"] = follow_redirects if max_redirects is not None: @@ -253,8 +266,6 @@ async def request(self, *args, **kwargs): kwargs.pop("cache_for", None) kwargs.pop("client", None) kwargs.pop("stream", None) - if kwargs.pop("files", None) is not None: - log.warning("blasthttp does not support multipart file uploads (files= kwarg)") # allow vs follow allow_redirects = kwargs.pop("allow_redirects", None) diff --git a/bbot/test/mock_blasthttp.py b/bbot/test/mock_blasthttp.py index d86f3460d8..6f9fa8765c 100644 --- a/bbot/test/mock_blasthttp.py +++ b/bbot/test/mock_blasthttp.py @@ -69,7 +69,7 @@ async def handle_engine_request(self, web_helper_self, *args, **kwargs): into a body, then dispatches via ``self._inner.request(...)``. """ raise_error = kwargs.pop("raise_error", False) - for k in ("cache_for", "client", "stream", "files"): + for k in ("cache_for", "client", "stream"): kwargs.pop(k, None) allow_redirects = kwargs.pop("allow_redirects", None) @@ -86,7 +86,17 @@ async def handle_engine_request(self, web_helper_self, *args, **kwargs): headers = kwargs.pop("headers", None) or {} body = kwargs.pop("body", None) data = kwargs.pop("data", None) + files = kwargs.pop("files", None) json_body = kwargs.pop("json", None) + body_sources = [ + name + for name, val in (("body", body), ("data", data), ("json", json_body), ("files", files)) + if val is not None + ] + if len(body_sources) > 1: + raise ValueError( + f"request() got conflicting body kwargs {body_sources}; pass at most one of body, data, json, files" + ) cookies = kwargs.pop("cookies", None) auth = kwargs.pop("auth", None) # Drop kwargs that don't apply to mock dispatch but are valid on WebHelper. @@ -106,28 +116,33 @@ async def handle_engine_request(self, web_helper_self, *args, **kwargs): if cookies: headers["Cookie"] = "; ".join(f"{ck}={cv}" for ck, cv in cookies.items()) - # Assemble body for handler-side matching/dispatch. - body_str = "" - if json_body is not None: - body_str = _json.dumps(json_body) - headers.setdefault("Content-Type", "application/json") - elif data is not None: - if isinstance(data, dict): - body_str = urlencode(data) - headers.setdefault("Content-Type", "application/x-www-form-urlencoded") - else: - body_str = str(data) - elif body is not None: - body_str = str(body) + # Assemble body for handler-side matching/dispatch. files= wins (multipart), + # then json, then data, then raw body. + final_body = b"" + if files is None: + if json_body is not None: + final_body = _json.dumps(json_body) + headers.setdefault("Content-Type", "application/json") + elif data is not None: + if isinstance(data, dict): + final_body = urlencode(data) + headers.setdefault("Content-Type", "application/x-www-form-urlencoded") + else: + final_body = data if isinstance(data, (bytes, bytearray)) else str(data) + elif body is not None: + final_body = body if isinstance(body, (bytes, bytearray)) else str(body) try: - return await self._inner.request( - url, - method=method, - headers=headers, - body=body_str, - follow_redirects=follow_redirects, - ) + inner_kwargs = { + "method": method, + "headers": headers, + "follow_redirects": follow_redirects, + } + if files is not None: + inner_kwargs["files"] = files + else: + inner_kwargs["body"] = final_body + return await self._inner.request(url, **inner_kwargs) except Exception as e: import logging diff --git a/bbot/test/test_step_1/test_web.py b/bbot/test/test_step_1/test_web.py index 2b333bda2c..d9aff414d3 100644 --- a/bbot/test/test_step_1/test_web.py +++ b/bbot/test/test_step_1/test_web.py @@ -86,6 +86,66 @@ def server_handler(request): await scan._cleanup() +@pytest.mark.asyncio +async def test_web_request_files_multipart(bbot_scanner, bbot_httpserver): + """httpx-style files= kwarg builds a multipart/form-data body.""" + captured = {} + + def server_handler(request): + from werkzeug.wrappers import Response + + captured["body"] = request.get_data() + captured["content_type"] = request.headers.get("Content-Type", "") + return Response("ok") + + bbot_httpserver.expect_request(uri="/upload", method="POST").respond_with_handler(server_handler) + url = bbot_httpserver.url_for("/upload") + + scan = bbot_scanner() + await scan._prep() + + response = await scan.helpers.request( + url, + method="POST", + files={ + "field": (None, "value"), + "f": ("blob", b"\x00\x01\x02hello", "application/octet-stream"), + }, + ) + assert response.status_code == 200 + + ct = captured["content_type"] + assert ct.startswith("multipart/form-data; boundary=") + body = captured["body"] + assert b'name="field"' in body + assert b"value" in body + assert b'filename="blob"' in body + assert b"\x00\x01\x02hello" in body + + await scan._cleanup() + + +@pytest.mark.asyncio +async def test_web_request_rejects_conflicting_body_kwargs(bbot_scanner): + scan = bbot_scanner() + await scan._prep() + url = "http://example.com/" + + pairs = [ + {"json": {"a": 1}, "files": {"f": ("x", b"x")}}, + {"json": {"a": 1}, "data": {"a": "b"}}, + {"body": "raw", "json": {"a": 1}}, + {"body": "raw", "data": {"a": "b"}}, + {"body": "raw", "files": {"f": ("x", b"x")}}, + {"data": {"a": "b"}, "files": {"f": ("x", b"x")}}, + ] + for kwargs in pairs: + with pytest.raises(ValueError, match="conflicting body kwargs"): + await scan.helpers.request(url, method="POST", **kwargs) + + await scan._cleanup() + + @pytest.mark.asyncio async def test_web_helpers(bbot_scanner, bbot_httpserver, blasthttp_mock): # json conversion diff --git a/pyproject.toml b/pyproject.toml index 5658d9c385..a596a21fa8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -48,7 +48,7 @@ dependencies = [ "ansible-core>=2.17,<3", "tldextract>=5.3.0,<6", "cloudcheck>=10.0.0,<11", - "blasthttp>=0.5.1", + "blasthttp>=0.6.0", "blastdns>=1.9.0,<2", ] diff --git a/uv.lock b/uv.lock index 2b4a19bdd7..55e38b5f9c 100644 --- a/uv.lock +++ b/uv.lock @@ -268,7 +268,7 @@ requires-dist = [ { name = "asndb", specifier = ">=1.0.4" }, { name = "beautifulsoup4", specifier = ">=4.12.2,<5" }, { name = "blastdns", specifier = ">=1.9.0,<2" }, - { name = "blasthttp", specifier = ">=0.5.1" }, + { name = "blasthttp", specifier = ">=0.6.0" }, { name = "cachetools", specifier = ">=5.3.2,<8.0.0" }, { name = "cloudcheck", specifier = ">=10.0.0,<11" }, { name = "deepdiff", specifier = ">=8.0.0,<10" }, @@ -293,7 +293,7 @@ requires-dist = [ { name = "tabulate", specifier = "==0.8.10" }, { name = "tldextract", specifier = ">=5.3.0,<6" }, { name = "unidecode", specifier = ">=1.3.8,<2" }, - { name = "websockets", specifier = ">=14.0.0,<16.0.0" }, + { name = "websockets", specifier = ">=14.0.0,<17.0.0" }, { name = "wordninja", specifier = ">=2.0.0,<3" }, { name = "xmltojson", specifier = ">=2.0.2,<3" }, { name = "xxhash", specifier = ">=3.5.0,<4" }, @@ -450,60 +450,60 @@ wheels = [ [[package]] name = "blasthttp" -version = "0.5.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f3/87/743522a80b4638f0bd62d55d5e650c1397b311916c24d7581c00b1f2b7db/blasthttp-0.5.1.tar.gz", hash = "sha256:5aa7004eb96cc7be9677bf70641e142c000dd1cd16f63783d1eeec27ac165572", size = 137955, upload-time = "2026-05-07T18:29:12.905Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/50/2a/63176160b883a0e54c3083f434fe66673381352b0fd3ea775065ae53f1c5/blasthttp-0.5.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:95418e10c61bb8a34c75fc22ff841dc7ca07dfe28ab242db9eef408a98002abb", size = 4755999, upload-time = "2026-05-07T18:27:33.187Z" }, - { url = "https://files.pythonhosted.org/packages/9d/17/5af611bb6c37548c3de514ba74258db61cdde969991e52bb0c688a0785e0/blasthttp-0.5.1-cp310-cp310-manylinux_2_28_armv7l.whl", hash = "sha256:636281fec4a237c5f388957ea4f12bbf8f83f441390c5781653ee95fc9203d20", size = 4060750, upload-time = "2026-05-07T18:27:43.913Z" }, - { url = "https://files.pythonhosted.org/packages/57/17/6eb6d7c6b8ae201ef0276d2ec6c6ecc24973e0e2c61131cd83641c8b840d/blasthttp-0.5.1-cp310-cp310-manylinux_2_28_i686.whl", hash = "sha256:782b58702c565254f3c04d6abd526b982c1c37f2e67b91e909e648db942a494a", size = 4650132, upload-time = "2026-05-07T18:28:13.893Z" }, - { url = "https://files.pythonhosted.org/packages/1c/e5/9f28983f6f3c3eeb8bd64e0a71b11e729909c69a5ff7fc6e181036e0bd79/blasthttp-0.5.1-cp310-cp310-manylinux_2_28_ppc64le.whl", hash = "sha256:fe61ff9488c1b5e861bdd34b05891a83b137ec15bb9dbf3299e550a8a02aabdf", size = 4662736, upload-time = "2026-05-07T18:27:53.704Z" }, - { url = "https://files.pythonhosted.org/packages/b7/33/221616e23c829ada6bada7aa7103afea8f93b905a98576cac17881150475/blasthttp-0.5.1-cp310-cp310-manylinux_2_28_s390x.whl", hash = "sha256:4068e53d2b7a99909ecbcb3d636439f8eecce2ef2c8605f63bba51848a97f85f", size = 4266449, upload-time = "2026-05-07T18:28:04.038Z" }, - { url = "https://files.pythonhosted.org/packages/3a/a6/addfad565f765d7c1ff78b16862e4698056de1ac046c87ea2e309ee45cd7/blasthttp-0.5.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:d9ff490b8dd7b7ecb8372308d08091cd0ef495dc67b3af1420b38174b9161946", size = 4403803, upload-time = "2026-05-07T18:28:23.814Z" }, - { url = "https://files.pythonhosted.org/packages/47/04/fb2d63d12d067767a1b0ba2c505e76b26cea62f07644b2c90d6f2b0f721d/blasthttp-0.5.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:94c216d0ec4726b07935944a1fa4c7a38042130c89d7cb892d0d79753b793325", size = 5046967, upload-time = "2026-05-07T18:28:33.161Z" }, - { url = "https://files.pythonhosted.org/packages/84/30/dbcd4d7617ba28da4f2fe8eccdbfdb5127857163d3c533dcab8546911c19/blasthttp-0.5.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:4af762a68e17516b912a21ea7639fb294f70c81033a86fba927294eae37cc18a", size = 4364595, upload-time = "2026-05-07T18:28:43.383Z" }, - { url = "https://files.pythonhosted.org/packages/3e/8c/c4625cf90cc8b3aa6dc8cd06294133b415ce134d47138e2deacad3ac16a2/blasthttp-0.5.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:1d3f26b8a43b3c2cf99dab640cbc8abd6257199c72e3f302959bd9ad27feca40", size = 4782547, upload-time = "2026-05-07T18:28:54.075Z" }, - { url = "https://files.pythonhosted.org/packages/a4/b8/7461bc2396f501b7c8273285a28134200fa1ac106e5faea0e4d6a984a0fc/blasthttp-0.5.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:38f2f573a3e3d6efaf83266e7ac5ee54b272287b74e9e539020f6b77bf9cb2a2", size = 4750218, upload-time = "2026-05-07T18:29:03.441Z" }, - { url = "https://files.pythonhosted.org/packages/34/88/1fc3e0a9fea99ab101eb57c31f639139d5eed7be032f4f2aa9370a65f76f/blasthttp-0.5.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:bcddfa279c301ae6ee0b2753389db896a7bbc08d012f41e2c9ef97814e73c3f6", size = 4752484, upload-time = "2026-05-07T18:27:35.287Z" }, - { url = "https://files.pythonhosted.org/packages/07/7e/5b75a6d28fcc8fc5c7076960909ff4cbdd075724e1f980965c00f7973832/blasthttp-0.5.1-cp311-cp311-manylinux_2_28_armv7l.whl", hash = "sha256:b916982c34aed04e0e6ba13832c7b44ee924e989751f9bb988728f53ea7c6e42", size = 4057857, upload-time = "2026-05-07T18:27:45.652Z" }, - { url = "https://files.pythonhosted.org/packages/30/ad/9c566ea8a176f404d7f715b15c04fdd9ce53f7986342c924cfca7b7f92e0/blasthttp-0.5.1-cp311-cp311-manylinux_2_28_i686.whl", hash = "sha256:48cb954a104c2a84f3ea8fecd819ce2c2cff797b51cfb24ac00286c5e1ecb150", size = 4645668, upload-time = "2026-05-07T18:28:15.714Z" }, - { url = "https://files.pythonhosted.org/packages/5d/ac/c8c9e622e0fcf9a8843a1f66cbb1467e3b6ad789051a7ce2f2ebade1fde0/blasthttp-0.5.1-cp311-cp311-manylinux_2_28_ppc64le.whl", hash = "sha256:b256681548199fb0a7f9bf317592a394b927d5769602dd4b206ee59bfde25010", size = 4658128, upload-time = "2026-05-07T18:27:55.922Z" }, - { url = "https://files.pythonhosted.org/packages/5c/ce/e4ea0b8a068c5e86cd461473066a0e8e3e6c4556a96edf58d5a7e9511975/blasthttp-0.5.1-cp311-cp311-manylinux_2_28_s390x.whl", hash = "sha256:89b6b5c3e5603b34a570db331d5fba0d3651e347d3ff87ecae9e7dc59a296a0b", size = 4264160, upload-time = "2026-05-07T18:28:06.032Z" }, - { url = "https://files.pythonhosted.org/packages/a4/dc/01fd77bdd401d4375e6407a06e1e2c7b6860e8813c67ab9977f016663763/blasthttp-0.5.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:257520128a4009f577b63de72b6bee47e37f06b669a503f74d7de868fc04c186", size = 4402098, upload-time = "2026-05-07T18:28:25.626Z" }, - { url = "https://files.pythonhosted.org/packages/96/33/103f121023609d4b75123e019cdcfc2aee3ebb87518db93c2fcb4de6688c/blasthttp-0.5.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b70cc21ffb61a8bef833ec4e94fe82daef7aa449cf5638bb44987d6b5b8145e1", size = 5044456, upload-time = "2026-05-07T18:28:35.141Z" }, - { url = "https://files.pythonhosted.org/packages/78/2f/9f4c93d6ec8ecd75e5218cbf9b8fbe5addb9e031f66806045462366180cd/blasthttp-0.5.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:89cc27ac11495ad123f31ebe4c9c750a54782bf225375305c0a25637a4b5a40e", size = 4358153, upload-time = "2026-05-07T18:28:45.15Z" }, - { url = "https://files.pythonhosted.org/packages/1a/a0/4b5b9ba163d792f87ce1dc15180c4d49b8ccd32bca9689d0c2dfa32cef5b/blasthttp-0.5.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:a0f311998dfacdbb6cc540929471edbad7e943ba03b0721338fc187b850aa870", size = 4777624, upload-time = "2026-05-07T18:28:55.888Z" }, - { url = "https://files.pythonhosted.org/packages/63/76/d9b538467b90b0e04a50db8193717ce414e40d78250ae5c0ff6e9562cbdd/blasthttp-0.5.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:20c7a2086c0bae72ad7c12bdbe04f75258cbb49dc036eaf7c00834a625e0d0ee", size = 4746331, upload-time = "2026-05-07T18:29:05.591Z" }, - { url = "https://files.pythonhosted.org/packages/df/d3/8829983cb5be11320f0913877a49771827ab3c0b23a75b49912af96e89be/blasthttp-0.5.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:e220270707d5eeab95adc0514d7bc6615b80c7d2e4af6f2236ee731ca3c90f88", size = 4753416, upload-time = "2026-05-07T18:27:37.3Z" }, - { url = "https://files.pythonhosted.org/packages/11/4c/3dde5c943fefe6463fe0056f2e8fae9f4cedbee664f28cb882cb9060a88c/blasthttp-0.5.1-cp312-cp312-manylinux_2_28_armv7l.whl", hash = "sha256:8fc60f3edf95766cf715d26d0ce2a87a10d802431324047964a478484bcbbf39", size = 4056173, upload-time = "2026-05-07T18:27:47.611Z" }, - { url = "https://files.pythonhosted.org/packages/8d/d0/adb42760fd3c634186a21c2c3ab016d098187b0fa7867df804a593b118e9/blasthttp-0.5.1-cp312-cp312-manylinux_2_28_i686.whl", hash = "sha256:503a5324c746db7522665ec14fa6b2b00fa32e854a526c42a80719032fde1195", size = 4646538, upload-time = "2026-05-07T18:28:17.582Z" }, - { url = "https://files.pythonhosted.org/packages/a8/ec/2ca18456e012b545b5fec48ed1234d3fedf9cf9c89efec7e9848f4e06472/blasthttp-0.5.1-cp312-cp312-manylinux_2_28_ppc64le.whl", hash = "sha256:f141807b927bee9c9e6fff078027d625ba7d375d380bb79de3a69b7cd32370c1", size = 4650786, upload-time = "2026-05-07T18:27:57.896Z" }, - { url = "https://files.pythonhosted.org/packages/73/a8/6d8e19ebafbca3467b1d8655e3144d2cdf97dcf524f0029002b0e5666b10/blasthttp-0.5.1-cp312-cp312-manylinux_2_28_s390x.whl", hash = "sha256:6e116205aea16b8a772dacc9b28cb49a0e3ff6de01ed5f987c4381cb4ea2373d", size = 4271821, upload-time = "2026-05-07T18:28:07.918Z" }, - { url = "https://files.pythonhosted.org/packages/aa/4d/e9638afa76dadb50e6204d8ba19493752e4257a4e54396082abba457baa6/blasthttp-0.5.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:3190bc1605af2a3e9bfce73825a6c2892548173376c3cfd66fdfbc46349fd295", size = 4400583, upload-time = "2026-05-07T18:28:27.438Z" }, - { url = "https://files.pythonhosted.org/packages/fd/d2/8b5821db29f000a24ff83fa02c937a89f95a990ed85abfbf65d73163bf41/blasthttp-0.5.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:34fb35ff5c755d70ab195f6d1bf6b19f82ec1c9d45c264ea0688ba6e1d7b187f", size = 5045394, upload-time = "2026-05-07T18:28:37.056Z" }, - { url = "https://files.pythonhosted.org/packages/69/a0/b330f4cd0b422199a6dc8d2d46e18f971df0542d34ce59758dbe323f4f94/blasthttp-0.5.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:77c8a11a6d2101ef3a9b3ddb1d6dc35188967cec384566be6e375940221ad565", size = 4354081, upload-time = "2026-05-07T18:28:48.069Z" }, - { url = "https://files.pythonhosted.org/packages/26/8d/408beb779ee330f0fcf38016656034ddb943d620c8fe7c5c2aaed98c4096/blasthttp-0.5.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5e0603e612ae91579cf437ed9b2014451cfac73f45bf0d21c399197238944bb9", size = 4773321, upload-time = "2026-05-07T18:28:57.629Z" }, - { url = "https://files.pythonhosted.org/packages/8c/c0/3b1cde8fb0b93c7fa493a399d9babccc2117a06423955872e716eb748bb0/blasthttp-0.5.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7b7ced43ddcf436a85cc2c33c7e7895d324fc6b708a6098e122d5246bc5c2a7c", size = 4740837, upload-time = "2026-05-07T18:29:07.454Z" }, - { url = "https://files.pythonhosted.org/packages/f2/6c/fa8bfa5d1932fac65802904cd9630a8863593f884fe0e0c4924e54ef3402/blasthttp-0.5.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:45d01055a1473b22dd460881f07ad4dd9fb64cd8044c391475540c761a490fda", size = 4750786, upload-time = "2026-05-07T18:27:39.329Z" }, - { url = "https://files.pythonhosted.org/packages/fb/1e/06d57776db6ae8078acc51aa0e71b59c4316c1a2ec62c4c34418aa54f073/blasthttp-0.5.1-cp313-cp313-manylinux_2_28_armv7l.whl", hash = "sha256:2e9951422b43938059d87ea17594f81a2fe3be932e53c63a9670cd64465c8c7e", size = 4055319, upload-time = "2026-05-07T18:27:49.413Z" }, - { url = "https://files.pythonhosted.org/packages/9c/a6/9c3c09b6d214ed6b1286156b3209ec39770fc25879f0911c032fdb92de17/blasthttp-0.5.1-cp313-cp313-manylinux_2_28_i686.whl", hash = "sha256:9582a8ba5f2dd0fb140c6e2a8cbdee0a9a42171636fa4963e40bdc9370db8592", size = 4650611, upload-time = "2026-05-07T18:28:19.967Z" }, - { url = "https://files.pythonhosted.org/packages/e7/3b/4cadba4c58fe9adcba405da6ec882a42ce76fe2a158c3d61c49f0a7a75bf/blasthttp-0.5.1-cp313-cp313-manylinux_2_28_ppc64le.whl", hash = "sha256:1f014f2a540f02988df63db363dd59ea0a755becdc85e7a4e89c364e273532c3", size = 4656848, upload-time = "2026-05-07T18:27:59.929Z" }, - { url = "https://files.pythonhosted.org/packages/fa/52/eeea501e966c27b0f7931ff1fa81efdefa877dacbe273a18dfd93940faed/blasthttp-0.5.1-cp313-cp313-manylinux_2_28_s390x.whl", hash = "sha256:5b36ed6a395e70ec5bd0b9d751f2b3f27f2ca47e5d444cb2d0bd831f0c0f2089", size = 4269300, upload-time = "2026-05-07T18:28:09.993Z" }, - { url = "https://files.pythonhosted.org/packages/71/a6/ef585df6a3704e1c0adc42fd6d1fe9c5de1e3d7b4faf940268ea036c6d77/blasthttp-0.5.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:e3f189ccf8b96b83ad786ae3130a5f792edf8947b58875a88d556c7150b49bf1", size = 4398860, upload-time = "2026-05-07T18:28:29.363Z" }, - { url = "https://files.pythonhosted.org/packages/03/67/cdedc3ee88728486f2214bf8784e71f96d5c05426c58988002b9922e2813/blasthttp-0.5.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8cc079bd171452bab6e639a20ac9d946c2145e94fccde8750e9516ac988527ef", size = 5042568, upload-time = "2026-05-07T18:28:39.091Z" }, - { url = "https://files.pythonhosted.org/packages/eb/9c/bc0d90bb71a2b1b86bee746ce083e06e70d35e91774d15254c959ab21ecf/blasthttp-0.5.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:792bb93ae83211ce6effd969b318883e6df141ee32642c5659cbbf7521357402", size = 4353688, upload-time = "2026-05-07T18:28:50.014Z" }, - { url = "https://files.pythonhosted.org/packages/c6/6a/e0cf6f11b35542cf6a621b17630071c6d384eac021712a2792c104c1a700/blasthttp-0.5.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:dd2b8a4f7da0a1f01b9b7f8285b7206097b0fdec28e66fd0f227cab382434b87", size = 4776869, upload-time = "2026-05-07T18:28:59.56Z" }, - { url = "https://files.pythonhosted.org/packages/f5/b1/767ef4b4449c144844dbdabae8c8c3543566bab86a8988e7bf7605d8f6b9/blasthttp-0.5.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:31d3fdce0dec44cf90e1e7c42dea28bc5a608d4f0ec9957d6daae1d17a85a34e", size = 4740866, upload-time = "2026-05-07T18:29:09.474Z" }, - { url = "https://files.pythonhosted.org/packages/54/b8/55773b2c131d62ccd0da80df1d14c89abe2400e48d14965f64d5bc24dd67/blasthttp-0.5.1-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:7e63602c657d991a04c0f9cd07bf79e07b3653b2f8d463677fc3b400100e89a1", size = 4751678, upload-time = "2026-05-07T18:27:41.883Z" }, - { url = "https://files.pythonhosted.org/packages/fc/04/56645c45dbdbe5776d26c752fe5a6c4b78a79c257ee72d6800e7c0a7517e/blasthttp-0.5.1-cp314-cp314-manylinux_2_28_armv7l.whl", hash = "sha256:7830256ad0f7306fa6c124bcf151a60f1be3d052f281c75687d3c4c31483505b", size = 4053899, upload-time = "2026-05-07T18:27:51.345Z" }, - { url = "https://files.pythonhosted.org/packages/bd/98/a9cd12d8f511da6f88c31da2a620e65704156fda5b081dc2e32259b31db4/blasthttp-0.5.1-cp314-cp314-manylinux_2_28_i686.whl", hash = "sha256:99b2f6005a32f9bac360843bf56ccb3670e3a514d12089484161eb8f4719476b", size = 4646514, upload-time = "2026-05-07T18:28:21.852Z" }, - { url = "https://files.pythonhosted.org/packages/d5/f6/ab280c9b32e2cc69a9985a52705920dc94d45c7b4fc864e040b38d07d0b7/blasthttp-0.5.1-cp314-cp314-manylinux_2_28_ppc64le.whl", hash = "sha256:3e8482467a5f3eb8ebc2f126962469c2879527a2e12f19d3c98c1a08bcb4e52a", size = 4650094, upload-time = "2026-05-07T18:28:01.841Z" }, - { url = "https://files.pythonhosted.org/packages/b3/45/613a32c54607340c607ffd39f902fd86aa6fe51be3e6a2df9ef54639251a/blasthttp-0.5.1-cp314-cp314-manylinux_2_28_s390x.whl", hash = "sha256:caa19201bacf87a85baf66e0d5d4c50c99be6d04794c6319585a93802d79b407", size = 4268936, upload-time = "2026-05-07T18:28:12.078Z" }, - { url = "https://files.pythonhosted.org/packages/a0/3e/e5283d9f474aa781031b7998915aa5a06ff06c3862b57ba3a5a414df07b7/blasthttp-0.5.1-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:3846854fb99b71fa47b34aedd81100fc6c2c6772fc0d39b9fb36f05538d17262", size = 4401565, upload-time = "2026-05-07T18:28:31.151Z" }, - { url = "https://files.pythonhosted.org/packages/80/94/778114a7b4f1dd55d098f07a6525dfaedb1c26668d50a99b10edae7a8b65/blasthttp-0.5.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:6da8900885e8136de8ddee17fc7854cee2483cebce49f356e99dcaf59e8dc7c7", size = 5044853, upload-time = "2026-05-07T18:28:41.058Z" }, - { url = "https://files.pythonhosted.org/packages/5c/62/bbfc224d7991e3aea67d31a579e77e4b1da16bb758dcc3cf7e1e6c71d6f2/blasthttp-0.5.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:ee3bb7327110943e1d0c2c4fe1610a38a83615bff36d0f1b3beebffe1b0e135c", size = 4351539, upload-time = "2026-05-07T18:28:51.845Z" }, - { url = "https://files.pythonhosted.org/packages/e0/1c/47b56406842e69d1141d786d27d82b94efa223e1e56d20a4ecc5d09bea62/blasthttp-0.5.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:4d81941032f724243a784503a2a8cd0190974932e16ec5d8f65cc2c593de1d09", size = 4775145, upload-time = "2026-05-07T18:29:01.519Z" }, - { url = "https://files.pythonhosted.org/packages/21/f7/6b75a895c9efb6443a5cf401b3f8fd8e9b40425c1fe8abeb552a56e71fb6/blasthttp-0.5.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ec5ff94b70c3a5ec11b19a20235d07f7851dee459084063c0ab13ecd6a7a46ea", size = 4742883, upload-time = "2026-05-07T18:29:11.231Z" }, +version = "0.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1a/ea/48bb3431fa5251cdbf94bbdf3f8ef8812ef68443cdb81465349b035e2f86/blasthttp-0.6.0.tar.gz", hash = "sha256:1aeacd1138dce99fdf9629b214efa6550ffacb977760bd08545ec612afcab613", size = 143136, upload-time = "2026-05-14T16:07:59.223Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8f/d7/d5fd3c5df6168081ce544340904725f0eb6aa51c3a607d5295653888f290/blasthttp-0.6.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:56ded6b27713fa342db563beb9727f5940ce9854c4bfd28b2d20c1d002513086", size = 4768807, upload-time = "2026-05-14T16:06:38.099Z" }, + { url = "https://files.pythonhosted.org/packages/06/48/890259faa9414895b596c1f295e6e3a086c186d0c1f12515b5bfc8544e3b/blasthttp-0.6.0-cp310-cp310-manylinux_2_28_armv7l.whl", hash = "sha256:eddcf73ff84668663723b10ddf4eb040940ee9859d7915b28d155b1d5da6d8a6", size = 4077493, upload-time = "2026-05-14T16:06:46.178Z" }, + { url = "https://files.pythonhosted.org/packages/50/57/8de9e9db8f2ad1cecbb1aa886621d8e9fd538934ab332b7ad969d7e1f388/blasthttp-0.6.0-cp310-cp310-manylinux_2_28_i686.whl", hash = "sha256:abeb13860a1f201316812cc55a83ceabb596857eecda3479fc1b093584cae9d6", size = 4668672, upload-time = "2026-05-14T16:07:11.409Z" }, + { url = "https://files.pythonhosted.org/packages/75/a0/838755b14b9947e1e203b6ac003e59ae631940ebe14981f9aaaf40d6e1a2/blasthttp-0.6.0-cp310-cp310-manylinux_2_28_ppc64le.whl", hash = "sha256:fe58eabea3b735aa520b44b85198f43a6789b0bb4cec54542977a464bf37ff10", size = 4671501, upload-time = "2026-05-14T16:06:54.771Z" }, + { url = "https://files.pythonhosted.org/packages/0e/f9/06a584a15463ae3866a95ff10f812bb55bcacf38ed00cd68d36d69c92f18/blasthttp-0.6.0-cp310-cp310-manylinux_2_28_s390x.whl", hash = "sha256:6f6977918765deaf6efd915db3b9074ae4dd4da040fb01c26bb6fb1fc2d8c39e", size = 4277768, upload-time = "2026-05-14T16:07:03.803Z" }, + { url = "https://files.pythonhosted.org/packages/4f/ad/7f6a7e04cedbdec74f201e2375c9a533ba81b0c00bac02e6749bb9fe84c7/blasthttp-0.6.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:58d2a96d62191e6b20ea8472dd094c7136ec1454ea20f27661d6f0c6488f14ca", size = 4416208, upload-time = "2026-05-14T16:07:20.266Z" }, + { url = "https://files.pythonhosted.org/packages/8e/54/b98682d38e4a37156f3c6d77325b913decbd6a3a0c7bf7c9460b717b4acf/blasthttp-0.6.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:855ca86cf138afa93d1fe4a97cacfdaf327dda8ead66b886952d43988c1e12c5", size = 5055173, upload-time = "2026-05-14T16:07:27.908Z" }, + { url = "https://files.pythonhosted.org/packages/72/7e/a76fdbabcba952ffdd7c1f1e4ece57dab5cac7e0c58ac4c947449c123f3b/blasthttp-0.6.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:e791d595915f133e237a6bd03d3b8f753cc2293a49b7b3e82b62d6f4e76b63bb", size = 4373638, upload-time = "2026-05-14T16:07:35.629Z" }, + { url = "https://files.pythonhosted.org/packages/2b/16/966c970f688be1caa09c24a679f84dbfa32bc3d7c5556dec5edcc3c18531/blasthttp-0.6.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:ddfc579111b941fc691d09ffa86ed9b7be23c3b0fb3d2622369708ccf56a3a52", size = 4799390, upload-time = "2026-05-14T16:07:43.384Z" }, + { url = "https://files.pythonhosted.org/packages/a9/27/16524bce47b0883569944bdb254dd548f50906731a5c0cbdcd5e6c6e8a1a/blasthttp-0.6.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d45d00374bfc6cd77f2b26f89dc6c4e29d084b0c95eff33c54b0daa47586ff5f", size = 4760167, upload-time = "2026-05-14T16:07:51.622Z" }, + { url = "https://files.pythonhosted.org/packages/a2/80/2bab812688587f19d9742465ae467facd584f9e0739411a038287ac7abad/blasthttp-0.6.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:529b764c0a8a0d1dd2b67b4f8ccea5a079ff02cc2b50747f70dbb9697c560256", size = 4765336, upload-time = "2026-05-14T16:06:39.839Z" }, + { url = "https://files.pythonhosted.org/packages/26/1a/6ebb802a082c66f3597f387cf3d0a5ca4df50d2c3d34a48708c891937a52/blasthttp-0.6.0-cp311-cp311-manylinux_2_28_armv7l.whl", hash = "sha256:40f27fc54b8fd4dce4c2830eb5bbb85d8f4efb5872a1f0176342d6a6c826f0fc", size = 4074514, upload-time = "2026-05-14T16:06:47.98Z" }, + { url = "https://files.pythonhosted.org/packages/65/81/9bdbb226a50ed81edf9ab6cf18594097b6fee9f027344a4c5be366ea25e1/blasthttp-0.6.0-cp311-cp311-manylinux_2_28_i686.whl", hash = "sha256:b4cdd58b4f39904318783ea48321a1a1cdf9ebfeabe6695f9540d9f1f0a7eecf", size = 4665275, upload-time = "2026-05-14T16:07:13.538Z" }, + { url = "https://files.pythonhosted.org/packages/4c/24/ccefb9b9b0298a32eb43f072c152f8852585e33c30f844bb8c110ad03542/blasthttp-0.6.0-cp311-cp311-manylinux_2_28_ppc64le.whl", hash = "sha256:32c3c7533013623b45552a69f498f998d01c44739bd19c8ce0b63b804c1e1fac", size = 4669676, upload-time = "2026-05-14T16:06:57.134Z" }, + { url = "https://files.pythonhosted.org/packages/32/da/a9d9625a267ae42964503a665caf4cf9c3ccbf92829d40606b0311f851f7/blasthttp-0.6.0-cp311-cp311-manylinux_2_28_s390x.whl", hash = "sha256:20f4ff21a3b170bc208fd7fc6a87055d36e7f992c9d3bdc8af21f11c31ffb0f4", size = 4273185, upload-time = "2026-05-14T16:07:05.352Z" }, + { url = "https://files.pythonhosted.org/packages/18/85/433a37338aab174ef6b00ab77add1a6a124c22b9538d8ee6f7f9d5a7aa1c/blasthttp-0.6.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:30586869e59bf341c3be44f2165a2aa4b42fbe922636ee476c1c4e9992d7e40e", size = 4412764, upload-time = "2026-05-14T16:07:21.667Z" }, + { url = "https://files.pythonhosted.org/packages/24/cd/91fd782521faea060d5673d1bcd0a79337c5c106128be5e50d77234419ca/blasthttp-0.6.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:23f8737e9b162d7340f78506d0272335097ddce23b8471be9f2d4304b2a5bef2", size = 5051936, upload-time = "2026-05-14T16:07:29.505Z" }, + { url = "https://files.pythonhosted.org/packages/a0/c3/4da22fbe77be8205980ca7f9f68313cb4c21497b423fa163d389e3f07cb8/blasthttp-0.6.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:274ea445b893cb48899c513821225b1a29d0752f065d2181851702d0192e2988", size = 4371992, upload-time = "2026-05-14T16:07:37.184Z" }, + { url = "https://files.pythonhosted.org/packages/8d/0e/be706e86d5b034809dfffdc1e9bf83de6e1e078977bb6e90ac271af79c9a/blasthttp-0.6.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d0a435a4386f739ff5b899df8ef5210159cfd98bab19afff1bb7f21777418adc", size = 4796663, upload-time = "2026-05-14T16:07:44.887Z" }, + { url = "https://files.pythonhosted.org/packages/cc/4f/420bf3d523572672ca0ee6f1e1fa9683d881b7fc78404fc0033b06ccc1b8/blasthttp-0.6.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:834a3baa079be05c404ace80761ae4a2566c71dffa271994c2c146b13cd69044", size = 4757936, upload-time = "2026-05-14T16:07:53.124Z" }, + { url = "https://files.pythonhosted.org/packages/13/9c/21973500bc8a55c1d838c012421bbf680ba7b3a7966b747f78bfa75092d9/blasthttp-0.6.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:ba03033863b63e6ad9dc8ad6f1546009931a3714bc4e7fdafaecdc183111472e", size = 4757458, upload-time = "2026-05-14T16:06:41.441Z" }, + { url = "https://files.pythonhosted.org/packages/6c/3a/efd0e5d00819b9ac8a084aa283a460646f6b5cd21cab521be67c0bfca634/blasthttp-0.6.0-cp312-cp312-manylinux_2_28_armv7l.whl", hash = "sha256:a8ee21ce5833f3cf61395dee37255426d043248826deccb8bb03b36e4df43b38", size = 4073270, upload-time = "2026-05-14T16:06:49.891Z" }, + { url = "https://files.pythonhosted.org/packages/b1/ca/2954c2fcdfd2e5acbef065dad0cf5f0097a2e93a29e75f470d0aaadcd1ce/blasthttp-0.6.0-cp312-cp312-manylinux_2_28_i686.whl", hash = "sha256:84be7bcb5381441edc2df5f01fa5e76ff9a0d87b6cc161bb0ef5bb8984ac5828", size = 4666252, upload-time = "2026-05-14T16:07:15.361Z" }, + { url = "https://files.pythonhosted.org/packages/f3/dc/53e3fc94cad450ac92ab4eeb925749d149c313ca2365eb33c7ab3a7447ce/blasthttp-0.6.0-cp312-cp312-manylinux_2_28_ppc64le.whl", hash = "sha256:14166a045d226aed3acecfe4daadf4b27b89905d6dd83d6a30bb1e1e1a67ae57", size = 4668525, upload-time = "2026-05-14T16:06:58.518Z" }, + { url = "https://files.pythonhosted.org/packages/60/29/2e21ebc6b9f4bcaa55498213e1265d866a82409b9ef0cf1c1c039aa121a5/blasthttp-0.6.0-cp312-cp312-manylinux_2_28_s390x.whl", hash = "sha256:241dbf9c5f4977631414cd76a08a38d786996aadaed12feecb1a976fd363f547", size = 4277716, upload-time = "2026-05-14T16:07:06.989Z" }, + { url = "https://files.pythonhosted.org/packages/8d/b2/888fcb40ae9f3759c35264d359c3b25a179d2aabdcb2c80761b60581baef/blasthttp-0.6.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:8fe29d685c3bc372f9eb68341794bc2410c23faac0d0789913f270832446a8c9", size = 4412080, upload-time = "2026-05-14T16:07:23.316Z" }, + { url = "https://files.pythonhosted.org/packages/d6/0b/933ca0ac433e4217c88acf6d0fda8c82035f0a4c660eed1438fe95d27532/blasthttp-0.6.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7bcab81227fa9d1132c169e1c6471fe0d9ba7d345652c9dc6c56f33f57e9b289", size = 5048699, upload-time = "2026-05-14T16:07:30.906Z" }, + { url = "https://files.pythonhosted.org/packages/00/61/a0051df64100b7720e717f041e48691d30dc63798dcab7b58fc2061da7e0/blasthttp-0.6.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:d4d46ab96780a74c877ff10e57cdb9ca09a7070fa4b58bb65ac7b62131586fd1", size = 4370681, upload-time = "2026-05-14T16:07:39.045Z" }, + { url = "https://files.pythonhosted.org/packages/11/c1/cfcdef2a7d63e1a3c0ff859ad3e47c88752d47daa08a0e61be6a7774afa1/blasthttp-0.6.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:780c34b119fa84b8ce12a7709697820d3cfba97e1d2b4610dafcafef5af97e99", size = 4794525, upload-time = "2026-05-14T16:07:47.055Z" }, + { url = "https://files.pythonhosted.org/packages/cd/c9/22e1fc9643a89db1d1d4191298ddef232c26969a45fe8ed822641073488c/blasthttp-0.6.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6fce231bc68ca9919f7762603415b2b66326e3e71015e48573657536f4692435", size = 4756099, upload-time = "2026-05-14T16:07:54.854Z" }, + { url = "https://files.pythonhosted.org/packages/de/cf/f815fdd9fcaaecb1923ae7a15bd31fb2491003d2d69c3e8ce0054f014a8f/blasthttp-0.6.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:add7512d1349e9a02c6b96f367afca883b99f0de1d9dea156d7802f53bd02770", size = 4756447, upload-time = "2026-05-14T16:06:43.212Z" }, + { url = "https://files.pythonhosted.org/packages/36/43/1e4ddabae180bf37a70e8da6df45c30057780f3760332e3203ac682a9240/blasthttp-0.6.0-cp313-cp313-manylinux_2_28_armv7l.whl", hash = "sha256:4207c34e9a39a272b931746115e106c43e8317a110f866d3f34d56deea1faf76", size = 4072488, upload-time = "2026-05-14T16:06:51.774Z" }, + { url = "https://files.pythonhosted.org/packages/f3/64/51f136383ffb0e19f816eaf180fbe881ab642ebd35b4c232a380987c7cde/blasthttp-0.6.0-cp313-cp313-manylinux_2_28_i686.whl", hash = "sha256:f69bc235a566882d93803c23a2d675142a9e8677d591668c59e68e8fd777ef3e", size = 4668559, upload-time = "2026-05-14T16:07:17.138Z" }, + { url = "https://files.pythonhosted.org/packages/66/99/d56bd452d2f4ff3f02d2819f08a4ed8a38f8d23338543482b0300e30dbce/blasthttp-0.6.0-cp313-cp313-manylinux_2_28_ppc64le.whl", hash = "sha256:5811f54ff948978126238c90e3c0fb97f3d844dbedda249801afa25f2f58629b", size = 4668309, upload-time = "2026-05-14T16:07:00.046Z" }, + { url = "https://files.pythonhosted.org/packages/25/00/68df15ffdca54262be7a21a73933830c839791d7da2e4b46bfc937680fca/blasthttp-0.6.0-cp313-cp313-manylinux_2_28_s390x.whl", hash = "sha256:9d0d9fb433770322ad8c06bd5146f02605d585dd32729a00e14739196ee524f7", size = 4277320, upload-time = "2026-05-14T16:07:08.528Z" }, + { url = "https://files.pythonhosted.org/packages/ff/2d/4307948c59213cd6bd2953416e23c26f3f52608d63077643fd0a29285bd9/blasthttp-0.6.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:2a364a9a7893f0b8d72ac3588d5f43a213ae907a2cde79b7aa138ddd3c010ae6", size = 4411831, upload-time = "2026-05-14T16:07:24.781Z" }, + { url = "https://files.pythonhosted.org/packages/2f/4a/b6982fa4f3562862c5963b11b6a1563c4dc7d2ba78982473fe156f8014db/blasthttp-0.6.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1360b4dc332bb079faf27ee9180255aaff16225e2984c0bbfdf1cdc079190054", size = 5047182, upload-time = "2026-05-14T16:07:32.649Z" }, + { url = "https://files.pythonhosted.org/packages/46/30/a13caf8c0d8d86b4936da3ccdcf6101a50d1e96236efbcb9eb6715ec0d56/blasthttp-0.6.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:83d8047133f6ee0646c968078acf99e61213ce5c94be4ba3db87a39301730d37", size = 4371606, upload-time = "2026-05-14T16:07:40.573Z" }, + { url = "https://files.pythonhosted.org/packages/8c/77/67686791aada4e39ba7dcf5c9799ad7b92c314c2bf8bd8f6cc30751789ba/blasthttp-0.6.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:e0152eea7635053d6588957f8f5ba266aa9d2be217000f176d9aa801c69a28a0", size = 4794127, upload-time = "2026-05-14T16:07:48.652Z" }, + { url = "https://files.pythonhosted.org/packages/28/93/aae5c8b8333d61d3cdd228dc686a496559cc54583b53404f18723480ba51/blasthttp-0.6.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:06bb28235b7c48a9faee9afca9cbae74612a86215ece769edfe8c9b5776e422d", size = 4755045, upload-time = "2026-05-14T16:07:56.424Z" }, + { url = "https://files.pythonhosted.org/packages/9f/95/074bd5bd743f7972ad854614ddd4a94bb6cf5c236ed39fc4c96b1212c51b/blasthttp-0.6.0-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:5f2f1bcd183b3b9a9d60e9edccb5ffb8b11608824b88ffc848da065225a03635", size = 4762581, upload-time = "2026-05-14T16:06:44.706Z" }, + { url = "https://files.pythonhosted.org/packages/52/94/62c1a2369a5ca4397c0f32146a3ea2cb698ab3c41ce313f07e46b0d3bb70/blasthttp-0.6.0-cp314-cp314-manylinux_2_28_armv7l.whl", hash = "sha256:aca4c2d7f593fba10c71790c17bc6d47cee5e8177e1f8dc21b8e42b6a05b81d4", size = 4066477, upload-time = "2026-05-14T16:06:53.229Z" }, + { url = "https://files.pythonhosted.org/packages/c8/61/acae082d6a846b699474160bdd9e5c2c2764e6bcb8948d91fb05ceb4ce1b/blasthttp-0.6.0-cp314-cp314-manylinux_2_28_i686.whl", hash = "sha256:0b22afaca123defb8ee029106ff73e125e2015c5a93055d50db31e46e53775a2", size = 4666893, upload-time = "2026-05-14T16:07:18.703Z" }, + { url = "https://files.pythonhosted.org/packages/e2/dc/fcff4f1019d9219af540c1b5477c8e77d223727f179191023741080809dc/blasthttp-0.6.0-cp314-cp314-manylinux_2_28_ppc64le.whl", hash = "sha256:e23844187f065a4a28783a66c77e2be8573ac0f46f1b7b45fc6283b80c9a16a7", size = 4662504, upload-time = "2026-05-14T16:07:01.843Z" }, + { url = "https://files.pythonhosted.org/packages/ce/e0/d933f3642b63c5d30650c650e896929330e4291bd87daea1c7db0154436a/blasthttp-0.6.0-cp314-cp314-manylinux_2_28_s390x.whl", hash = "sha256:5df304aa290e6bee8aaa30fa7dd25142d68d84b65815004e0485c3ab9e26135c", size = 4278626, upload-time = "2026-05-14T16:07:09.947Z" }, + { url = "https://files.pythonhosted.org/packages/b4/ec/9e42f77b5e8769fccde321da6c46e8f53f3234bce11d4069525367eaec3d/blasthttp-0.6.0-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:16b235b97250e950595d52bd3cc33ef5866d447fc34ae8e87aaba9b12c00f274", size = 4413903, upload-time = "2026-05-14T16:07:26.367Z" }, + { url = "https://files.pythonhosted.org/packages/79/d7/fca5cd404cfa334af0564f0f389ca0bff1fc31dbbf8ec789e513e7f1602b/blasthttp-0.6.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b3e4d48aa123631e8b145ca8b02dca36dc228faa05f62d005e91e84df70e765f", size = 5049329, upload-time = "2026-05-14T16:07:34.185Z" }, + { url = "https://files.pythonhosted.org/packages/68/8e/d5888f46ed0fa3347c94b64026bebbb32e669f99c47331e5042f233829ba/blasthttp-0.6.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:9ab31071b463a1a2ca807110c3c4446f3162596ec4949dded0c24c5c388a0bc5", size = 4370551, upload-time = "2026-05-14T16:07:42.016Z" }, + { url = "https://files.pythonhosted.org/packages/cd/7b/1738014c489e2d6ae48389ac0046b4f078e0b1870c48d848e79b83d3662d/blasthttp-0.6.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:0cfa06dc4005b0fd13da713ba4635b53f5c217c6b2ca59c6afe0f3eecb0c1ef0", size = 4793665, upload-time = "2026-05-14T16:07:50.199Z" }, + { url = "https://files.pythonhosted.org/packages/6d/92/7cb91e22d579bb39052ecfbe298001df6d2af49405eb2bf202024a0e0a7b/blasthttp-0.6.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2cc57caa53d9135ba57a29d4a7eaf682e3499bfbe06670a79482ff88c8e3abd8", size = 4757378, upload-time = "2026-05-14T16:07:57.877Z" }, ] [[package]]