hapijs / hapi

The Simple, Secure Framework Developers Trust
https://hapi.dev
Other
14.63k stars 1.34k forks source link

Cannot bind to Fully qualified domain name (FQDN) #4477

Open croeber8 opened 9 months ago

croeber8 commented 9 months ago

Runtime

NodeJS

Runtime version

NodeJS v18

Module version

Hapi v21

Used with

No response

Any other relevant information

No response

How can we help?

Hello, I am trying to upgrade my hapi to v21. I created a simple project just to make sure everything works.

It seems that hapi is not binding when i use the FQDN. It only binds when using 0.0.0.0. I verified this using netstat -a. This is running NodeJS v18 and HapiJS v21 on Windows Server 2019. It is showing in netstat when the FQDN is used but it looks like this

TCP [fe80::688:fda4:99b5:117%6]:8080 DEVAZRVIRRDV03:0 LISTENING

How can I get HAPI to bind to the FQDN.

Here is my code.

const Path = require('path')
const Fs = require('fs')
const Hapi = require('@hapi/hapi');
const host = 'DEVAZRVIRRDV03.dev.dss.local'
//0.0.0.0 works
//const host = '0.0.0.0'

async function Start() {
    try {

        const server = new Hapi.Server({
            host: host,
            port: 8080,
            // tls: {
            //     cert: Fs.readFileSync(Path.resolve('./cer.cer')),
            //     key: Fs.readFileSync(Path.resolve('./key.key'))
            // }
        });
        server.route({
            method: 'GET',
            path: '/test',
            config: {
                handler: async (request, reply) => {
                    console.log('handled')
                    return {
                        message: 'test'
                    };
                }
            }
        });
        console.log('starting')
        await server.start();
        console.log('started')
    } catch (e) {
        console.error(e)
    }
}
Start()
kanongil commented 9 months ago

Hapi doesn't do anything with the FQDN, except pass it to the node http server listen() method, documented here.

FYI, the DNS resolution behaviour has been changed in node to prefer IPv6. Unlike for client connections, there doesn't seem to be any way to tell the listener it to prefer IPv4 when resolving it. You will likely have to use the dns module to pre-resolve it yourself.

croeber8 commented 9 months ago

Yeah, resolving the host using dns.resolve works. Still weird I have to do that though.

image