`--stream` does not print entire buffer
I'm testing streaming SSR react server with xh, and I found that xh does not display entire response unlike what curl does.
Testing against same endpoint with xh and curl:
~ ❱ xh http://127.0.0.1:3000 --stream
HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
Connection: keep-alive
Content-Type: text/html
Date: Sun, 04 Sep 2022 14:28:37 GMT
Keep-Alive: timeout=72
Transfer-Encoding: chunked
<!DOCTYPE html>
<html>
<head>
<title>hello</title>
<meta charset="utf-8" />
<meta name="viewport" content="initial-scale=1, maximum-scale=1, width=device-width" />
</head>
<body>
~ ❱ curl http://127.0.0.1:3000 --include
HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
Content-Type: text/html
Date: Sun, 04 Sep 2022 14:30:13 GMT
Connection: keep-alive
Keep-Alive: timeout=72
Transfer-Encoding: chunked
<!DOCTYPE html>
<html>
<head>
<title>hello</title>
<meta charset="utf-8" />
<meta name="viewport" content="initial-scale=1, maximum-scale=1, width=device-width" />
</head>
<body>
~ ❱ curl http://127.0.0.1:3000 --include --no-buffer
HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
Content-Type: text/html
Date: Sun, 04 Sep 2022 14:31:16 GMT
Connection: keep-alive
Keep-Alive: timeout=72
Transfer-Encoding: chunked
<!DOCTYPE html>
<html>
<head>
<title>hello</title>
<meta charset="utf-8" />
<meta name="viewport" content="initial-scale=1, maximum-scale=1, width=device-width" />
</head>
<body>
<div id="root"><!--$?--><template id="B:0"></template>suspending...<!--/$-->
As you can see, content of the body is printed only when curl is used with --no-buffer parameter.
I can't find xh option equivalent with curl --no-buffer from documentation or source code.
Any help would be appriciated!
This happens because --stream only shows complete lines, like HTTPie. See httpie/httpie#1060
We don't have an option like --no-buffer. Maybe we should.
I see two workarounds:
-
Send a newline immediately after
<div id="root"><!--$?--><template id="B:0"></template>suspending...<!--/$-->. Then curl won't need--no-buffereither. -
Pipe the output through cat:
xh :3000 --stream --print=hb | catThis disables the "smart" line-buffering and just sends everything through as soon as it's received. (--print=hbensures you still see the headers, those are hidden by default when piping.)