diff --git a/lib/api-functions.ts b/lib/api-functions.ts index 7fdbbda..8ab04bf 100644 --- a/lib/api-functions.ts +++ b/lib/api-functions.ts @@ -145,15 +145,21 @@ export async function connectionRequest( const debug = !!getConfig(snapshot, "cwmp.debug", {}, now, evalCallback); - let udpProm; + let udpProm: Promise; if (udpConnectionRequestAddress) { - udpProm = udpConnectionRequest( - udpConnectionRequestAddress, - authExp, - UDP_CONNECTION_REQUEST_PORT, - debug, - deviceId - ); + try { + const u = new URL("udp://" + udpConnectionRequestAddress); + udpProm = udpConnectionRequest( + u.hostname, + parseInt(u.port || "80"), + authExp, + UDP_CONNECTION_REQUEST_PORT, + debug, + deviceId + ); + } catch (err) { + // Ignore invalid address + } } const status = await httpConnectionRequest( diff --git a/lib/connection-request.ts b/lib/connection-request.ts index 2920cd4..228285a 100644 --- a/lib/connection-request.ts +++ b/lib/connection-request.ts @@ -182,14 +182,13 @@ export async function httpConnectionRequest( } export async function udpConnectionRequest( - address: string, + host: string, + port: number, authExp: Expression, sourcePort = 0, _debug: boolean, deviceId: string ): Promise { - const [host, portStr] = address.split(":", 2); - const port = portStr ? parseInt(portStr) : 80; const now = Date.now(); const client = dgram.createSocket({ type: "udp4", reuseAddr: true }); @@ -216,8 +215,8 @@ export async function udpConnectionRequest( .createHmac("sha1", password) .update(`${ts}${id}${username}${cn}`) .digest("hex"); - const uri = `http://${address}?ts=${ts}&id=${id}&un=${username}&cn=${cn}&sig=${sig}`; - const msg = `GET ${uri} HTTP/1.1\r\nHost: ${address}\r\n\r\n`; + const uri = `http://${host}:${port}?ts=${ts}&id=${id}&un=${username}&cn=${cn}&sig=${sig}`; + const msg = `GET ${uri} HTTP/1.1\r\nHost: ${host}:${port}\r\n\r\n`; const message = Buffer.from(msg); for (let i = 0; i < 3; ++i) {