September 2017 Update

This commit is contained in:
Ingy döt Net 2017-09-23 10:01:46 +02:00
parent bba7bfd280
commit ba8067c3b7
14570 changed files with 153136 additions and 63871 deletions

View file

@ -0,0 +1,118 @@
// version 1.1.3
import java.math.BigInteger
enum class AddressSpace { IPv4, IPv6, Invalid }
data class IPAddressComponents(
val address: BigInteger,
val addressSpace: AddressSpace,
val port: Int // -1 denotes 'not specified'
)
val INVALID = IPAddressComponents(BigInteger.ZERO, AddressSpace.Invalid, 0)
fun ipAddressParse(ipAddress: String): IPAddressComponents {
var addressSpace = AddressSpace.IPv4
var ipa = ipAddress.toLowerCase()
var port = -1
var trans = false
if (ipa.startsWith("::ffff:") && '.' in ipa) {
addressSpace = AddressSpace.IPv6
trans = true
ipa = ipa.drop(7)
}
else if (ipa.startsWith("[::ffff:") && '.' in ipa) {
addressSpace = AddressSpace.IPv6
trans = true
ipa = ipa.drop(8).replace("]", "")
}
val octets = ipa.split('.').reversed().toTypedArray()
var address = BigInteger.ZERO
if (octets.size == 4) {
val split = octets[0].split(':')
if (split.size == 2) {
val temp = split[1].toIntOrNull()
if (temp == null || temp !in 0..65535) return INVALID
port = temp
octets[0] = split[0]
}
for (i in 0..3) {
val num = octets[i].toLongOrNull()
if (num == null || num !in 0..255) return INVALID
val bigNum = BigInteger.valueOf(num)
address = address.or(bigNum.shiftLeft(i * 8))
}
if (trans) address += BigInteger("ffff00000000", 16)
}
else if (octets.size == 1) {
addressSpace = AddressSpace.IPv6
if (ipa[0] == '[') {
ipa = ipa.drop(1)
val split = ipa.split("]:")
if (split.size != 2) return INVALID
val temp = split[1].toIntOrNull()
if (temp == null || temp !in 0..65535) return INVALID
port = temp
ipa = ipa.dropLast(2 + split[1].length)
}
val hextets = ipa.split(':').reversed().toMutableList()
val len = hextets.size
if (ipa.startsWith("::"))
hextets[len - 1] = "0"
else if (ipa.endsWith("::"))
hextets[0] = "0"
if (ipa == "::") hextets[1] = "0"
if (len > 8 || (len == 8 && hextets.any { it == "" }) || hextets.count { it == "" } > 1)
return INVALID
if (len < 8) {
var insertions = 8 - len
for (i in 0..7) {
if (hextets[i] == "") {
hextets[i] = "0"
while (insertions-- > 0) hextets.add(i, "0")
break
}
}
}
for (j in 0..7) {
val num = hextets[j].toLongOrNull(16)
if (num == null || num !in 0x0..0xFFFF) return INVALID
val bigNum = BigInteger.valueOf(num)
address = address.or(bigNum.shiftLeft(j * 16))
}
}
else return INVALID
return IPAddressComponents(address, addressSpace, port)
}
fun main(args: Array<String>) {
val ipas = listOf(
"127.0.0.1",
"127.0.0.1:80",
"::1",
"[::1]:80",
"2605:2700:0:3::4713:93e3",
"[2605:2700:0:3::4713:93e3]:80",
"::ffff:192.168.173.22",
"[::ffff:192.168.173.22]:80",
"1::",
"::",
"256.0.0.0",
"::ffff:127.0.0.0.1"
)
for (ipa in ipas) {
val (address, addressSpace, port) = ipAddressParse(ipa)
println("IP address : $ipa")
println("Address : ${"%X".format(address)}")
println("Address Space : $addressSpace")
println("Port : ${if (port == -1) "not specified" else port.toString()}")
println()
}
}

View file

@ -0,0 +1,27 @@
from ipaddress import ip_address
from urllib.parse import urlparse
tests = [
"127.0.0.1",
"127.0.0.1:80",
"::1",
"[::1]:80",
"::192.168.0.1",
"2605:2700:0:3::4713:93e3",
"[2605:2700:0:3::4713:93e3]:80" ]
def parse_ip_port(netloc):
try:
ip = ip_address(netloc)
port = None
except ValueError:
parsed = urlparse('//{}'.format(netloc))
ip = ip_address(parsed.hostname)
port = parsed.port
return ip, port
for address in tests:
ip, port = parse_ip_port(address)
hex_ip = {4:'{:08X}', 6:'{:032X}'}[ip.version].format(int(ip))
print("{:39s} {:>32s} IPv{} port={}".format(
str(ip), hex_ip, ip.version, port ))

View file

@ -1,39 +1,38 @@
/*REXX program to parse an IP address into ──► IPv4 or IPv6 format, port*/
say center('input IP address' ,30),
center('hex IP address' ,32),
center('decimal IP address' ,39) 'space port'
_=''
say copies(_,30) copies(_,32) copies(_,39) copies(_,5) copies(_,5)
call IP_parse 127.0.0.1 /*this IP doesn't need quotes. */
/*REXX program parses an IP address into ──► IPv4 or IPv6 format, optional pport.*/
_="_"; say center('input IP address' , 30),
center('hex IP address' , 32),
center('decimal IP address' , 39) 'space port'
say copies(_, 30) copies(_, 32) copies(_, 39) copies(_, 5) copies(_, 5)
call IP_parse 127.0.0.1 /*this simple IP doesn't need quotes.*/
call IP_parse '127.0.0.1:80'
call IP_parse '::1'
call IP_parse '[::1]:80'
call IP_parse '2605:2700:0:3::4713:93e3'
call IP_parse '[2605:2700:0:3::4713:93e3]:80'
exit /*stick a fork in it, we're done.*/
/*──────────────────────────────────IP_parse subroutine─────────────────*/
IP_parse: procedure; parse arg a .; hx=; @.=; numeric digits 50
dot=pos('.',a)\==0 /*see if there is a dot present. */
exit /*stick a fork in it, we're all done. */
/*──────────────────────────────────────────────────────────────────────────────────────*/
IP_parse: procedure; parse arg a .; hx=; @.=; numeric digits 50
dot=pos(.,a)\==0 /*see if there is a dot present in IP. */
if dot then do; parse var a @.1 '.' @.2 "." @.3 '.' @.4 ":" port
do j=1 for 4; hx=hx || d2x(@.j,2)
end /*j*/
end /*if dot*/
else do; parse var a pureA ']:' port
_=space(translate(pureA,,'[]'),0) /*remove brackets*/
parse var _ x '::' y
do L=1 until x=='' /*get left side.*/
parse var x @.L ':' x
end /*L*/
y=reverse(y)
do r=8 by -1 /*get right side.*/
parse var y z ':' y; if z=='' then leave
@.r=reverse(z)
end /*r*/
if dot then do; parse var a @.1 '.' @.2 "." @.3 '.' @.4 ":" port
do j=1 for 4; hx=hx || d2x(@.j, 2)
end /*j*/
end
else do; parse var a pureA ']:' port
_=space( translate( pureA, , '[]'), 0) /*remove brackets.*/
parse var _ x '::' y
do L=1 until x=='' /*get left side. */
parse var x @.L ':' x
end /*L*/
y=reverse(y)
do r=8 by -1 /*get right side. */
parse var y z ':' y; if z=='' then leave
@.r=reverse(z)
end /*r*/
do k=1 for 8; hx=hx || right(word(@.k 0, 1), 4, 0)
end /*k*/
end /*else dot*/
do k=1 for 8; hx=hx || right( word(@.k 0, 1), 4, 0)
end /*k*/
end
say left(a,30) right(hx,32) right(x2d(hx),39) ' IPv'||(6-2*dot) right(port,5)
return
say left(a,30) right(hx,32) right(x2d(hx),39) ' IPv' || (6-2*dot) right(port,5)
return