undici icon indicating copy to clipboard operation
undici copied to clipboard

HTTP/2 over unix domain sockets returns `ERR_SSL_WRONG_VERSION_NUMBER`

Open mctrafik opened this issue 4 months ago • 3 comments

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.

mctrafik avatar Feb 28 '24 00:02 mctrafik