undici
undici copied to clipboard
HTTP/2 over unix domain sockets returns `ERR_SSL_WRONG_VERSION_NUMBER`
Bug Description
I'm trying to send a request to a local server running HTTP/2 without TLS (H2C) over a unix domain socket. This is what my company uses for internal services.
However, when I try to fetch the results, I git an SSL error:
{"library":"SSL routines","reason":"wrong version number","code":"ERR_SSL_WRONG_VERSION_NUMBER"} (fetch) TypeError: fetch failed
Reproducible By
I'm using node
to start the local server:
import { createServer } from 'node:http2';
const server = createServer();
// ...define services.
server.listen('/tmp/test.sock');
I can successfully query the local server via curl:
curl -k -v \
--unix-socket "/tmp/test.sock" \
--insecure \
-d '{"message":"test"}' \
-H "Content-Type: application/json" \
--http2-prior-knowledge \
http://localhost/api/demo_rest
But it doesn't work when querying using undici:
import { Agent, fetch as undiciFetch } from 'undici';
const localhostAgent = new Agent({
connect: {
socketPath: '/tmp/test.sock',
rejectUnauthorized: false,
requestCert: false,
},
allowH2: true,
});
await undiciFetch('http://localhost/api/demo_rest', {
body: JSON.stringify({ message: 'Greetings' }),
headers: { 'Content-type': 'application/json' },
method: 'POST',
dispatcher: localhostAgent,
});
Expected Behavior
The expected behavior is that when a dispatcher does not request a cert, the fetch is able to make a request to an HTTP/2 server over a unix domain socket.
Logs & Screenshots
N/A
Environment
MacOs 14
Additional context
It feels really weird that I can easily start an insecure HTTP2 server using node, but it's very hard (or impossible) to send requests to it.