fix: fix mapping ipv6-based port mappings

This commit is contained in:
Paweł Niedzielski 2021-05-10 22:46:13 +02:00 committed by Alexander Zeitler
parent 48c9f0841a
commit 21b63cbc53
2 changed files with 30 additions and 21 deletions

View file

@ -4,9 +4,10 @@ const mapPorts = (
mapped?: { address: string; port: number } mapped?: { address: string; port: number }
exposed: { port: number; protocol: string } exposed: { port: number; protocol: string }
}> => { }> => {
const result = !ports if (!ports) {
? [] return []
: (() => { }
return ports.split(',').map((untypedPort) => { return ports.split(',').map((untypedPort) => {
const exposedFragments = untypedPort.trim().split('->') const exposedFragments = untypedPort.trim().split('->')
@ -14,16 +15,24 @@ const mapPorts = (
exposedFragments.length === 1 exposedFragments.length === 1
? exposedFragments[0].split('/') ? exposedFragments[0].split('/')
: exposedFragments[1].split('/') : exposedFragments[1].split('/')
const [address, mappedPort] =
exposedFragments.length === 2 ? exposedFragments[0].split(':') : [] const mapped = exposedFragments[0]
const lastDoubleColon = mapped.lastIndexOf(':')
if (lastDoubleColon === -1) {
return { return {
exposed: { port: Number(port), protocol }, exposed: { port: Number(port), protocol },
...(address && }
mappedPort && { mapped: { port: Number(mappedPort), address } }) }
const address = mapped.substr(0, lastDoubleColon)
const mappedPort = mapped.substr(lastDoubleColon + 1)
return {
exposed: { port: Number(port), protocol },
mapped: { port: Number(mappedPort), address },
} }
}) })
})()
return result
} }
export default mapPorts export default mapPorts

View file

@ -44,7 +44,7 @@ test('map multiple tcp ports exposed on ipv4 and ipv6 interfaces', () => {
}, },
{ {
exposed: { port: 443, protocol: 'tcp' }, exposed: { port: 443, protocol: 'tcp' },
mapped: { address: ':::', port: 443 } mapped: { address: '::', port: 443 }
}, },
{ {
exposed: { port: 80, protocol: 'tcp' }, exposed: { port: 80, protocol: 'tcp' },
@ -52,7 +52,7 @@ test('map multiple tcp ports exposed on ipv4 and ipv6 interfaces', () => {
}, },
{ {
exposed: { port: 80, protocol: 'tcp' }, exposed: { port: 80, protocol: 'tcp' },
mapped: { address: ':::', port: 80 } mapped: { address: '::', port: 80 }
} }
]) ])
}) })