]> git.ipfire.org Git - thirdparty/httpx.git/commitdiff
Suppress binary output on the command line (#2049) (#2076)
authorwaterfountain1996 <71171892+waterfountain1996@users.noreply.github.com>
Wed, 9 Feb 2022 15:40:39 +0000 (17:40 +0200)
committerGitHub <noreply@github.com>
Wed, 9 Feb 2022 15:40:39 +0000 (15:40 +0000)
httpx/_main.py
tests/conftest.py
tests/test_main.py

index 24ca30ddfc3e2342a3acac8c84b1aa8fdbdfa97c..7bd6b90846ee1d61fc636a7c077b09bbec5b947f 100644 (file)
@@ -172,10 +172,11 @@ def print_response(response: Response) -> None:
                 text = response.text
         else:
             text = response.text
+
         syntax = rich.syntax.Syntax(text, lexer_name, theme="ansi_dark", word_wrap=True)
         console.print(syntax)
-    else:  # pragma: nocover
-        console.print(rich.markup.escape(response.text))
+    else:
+        console.print(f"<{len(response.content)} bytes of binary data>")
 
 
 def format_certificate(cert: dict) -> str:  # pragma: nocover
index c40df09720a22e5faee7b389f417ce0ba1eca05c..970c3535477b2f56df1c728f1fa2538efbfa1efc 100644 (file)
@@ -80,6 +80,8 @@ async def app(scope, receive, send):
         await status_code(scope, receive, send)
     elif scope["path"].startswith("/echo_body"):
         await echo_body(scope, receive, send)
+    elif scope["path"].startswith("/echo_binary"):
+        await echo_binary(scope, receive, send)
     elif scope["path"].startswith("/echo_headers"):
         await echo_headers(scope, receive, send)
     elif scope["path"].startswith("/redirect_301"):
@@ -155,6 +157,25 @@ async def echo_body(scope, receive, send):
     await send({"type": "http.response.body", "body": body})
 
 
+async def echo_binary(scope, receive, send):
+    body = b""
+    more_body = True
+
+    while more_body:
+        message = await receive()
+        body += message.get("body", b"")
+        more_body = message.get("more_body", False)
+
+    await send(
+        {
+            "type": "http.response.start",
+            "status": 200,
+            "headers": [[b"content-type", b"application/octet-stream"]],
+        }
+    )
+    await send({"type": "http.response.body", "body": body})
+
+
 async def echo_headers(scope, receive, send):
     body = {
         name.capitalize().decode(): value.decode()
index e9f56df8da04f605267005d39b0a08d667b92777..3a202224301bbcb2bad48acb39913bb0c84fdc71 100644 (file)
@@ -52,6 +52,22 @@ def test_json(server):
     ]
 
 
+def test_binary(server):
+    url = str(server.url.copy_with(path="/echo_binary"))
+    runner = CliRunner()
+    content = "Hello, world!"
+    result = runner.invoke(httpx.main, [url, "-c", content])
+    assert result.exit_code == 0
+    assert remove_date_header(splitlines(result.output)) == [
+        "HTTP/1.1 200 OK",
+        "server: uvicorn",
+        "content-type: application/octet-stream",
+        "Transfer-Encoding: chunked",
+        "",
+        f"<{len(content)} bytes of binary data>",
+    ]
+
+
 def test_redirects(server):
     url = str(server.url.copy_with(path="/redirect_301"))
     runner = CliRunner()