mirror of
https://github.com/miekg/dns.git
synced 2025-08-11 20:16:58 +02:00
Working compression algo
This commit is contained in:
parent
1870766996
commit
cedf11f27b
4
msg.go
4
msg.go
@ -647,6 +647,10 @@ func unpackStructValue(val reflect.Value, msg []byte, off int) (off1 int, ok boo
|
|||||||
case "hex":
|
case "hex":
|
||||||
// Rest of the RR is hex encoded, network order an issue here?
|
// Rest of the RR is hex encoded, network order an issue here?
|
||||||
rdlength := int(val.FieldByName("Hdr").FieldByName("Rdlength").Uint())
|
rdlength := int(val.FieldByName("Hdr").FieldByName("Rdlength").Uint())
|
||||||
|
if off+rdlength > lenmsg {
|
||||||
|
// too large
|
||||||
|
return lenmsg, false
|
||||||
|
}
|
||||||
var consumed int
|
var consumed int
|
||||||
switch val.Type().Name() {
|
switch val.Type().Name() {
|
||||||
case "RR_DS":
|
case "RR_DS":
|
||||||
|
12
rawmsg.go
12
rawmsg.go
@ -36,12 +36,13 @@ func Compress(msg []byte) int {
|
|||||||
|
|
||||||
// First we create a table of domain names to which we
|
// First we create a table of domain names to which we
|
||||||
// can link. This is stored in 'table'
|
// can link. This is stored in 'table'
|
||||||
// Once for another name the longest possible link is
|
// Once, for another name, the longest possible link is
|
||||||
// found we save how we must change msg to perform this
|
// found we save how we must change msg to perform this
|
||||||
// compression. This is saved in 'moves'. After we
|
// compression. This is saved in 'moves'. After we
|
||||||
// traversed the entire message, we perform all the
|
// traversed the entire message, we perform all the
|
||||||
// moves.
|
// moves.
|
||||||
// TODO: Maybe it should be optimized.
|
// TODO: Maybe it should be optimized.
|
||||||
|
// TODO: put this in the packRR function
|
||||||
|
|
||||||
// Map the labels to the offset in the message
|
// Map the labels to the offset in the message
|
||||||
table := make(map[string]int)
|
table := make(map[string]int)
|
||||||
@ -77,14 +78,14 @@ Loop:
|
|||||||
//println("met lengte", len(name)+1)
|
//println("met lengte", len(name)+1)
|
||||||
// the +1 for the name is for the null byte at the end
|
// the +1 for the name is for the null byte at the end
|
||||||
|
|
||||||
// Discount for previous moves, reset the poffset counter
|
// Discount for previous moves, decrease the poffset counter
|
||||||
|
// with moves that occur before it
|
||||||
for i := len(moves)-1; i >= 0; i-- {
|
for i := len(moves)-1; i >= 0; i-- {
|
||||||
if poffset > moves[i].from {
|
if poffset > moves[i].from {
|
||||||
poffset -= (moves[i].length - 2)
|
poffset -= (moves[i].length - 2)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Only need to shorten the RR when I'm shortening the rdata
|
||||||
// need to shorten the rdlength in the RR too!
|
|
||||||
moves = append(moves, rawmove{offset: poffset, from: moffset, length: len(name) + 1})
|
moves = append(moves, rawmove{offset: poffset, from: moffset, length: len(name) + 1})
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -99,7 +100,7 @@ Loop:
|
|||||||
// In the "body" of the msg
|
// In the "body" of the msg
|
||||||
off += 2 + 2 + 4 + 1 // type, class, ttl + 1
|
off += 2 + 2 + 4 + 1 // type, class, ttl + 1
|
||||||
// we are at the rdlength
|
// we are at the rdlength
|
||||||
rdlength, _ := unpackUint16(msg, off)
|
rdlength, _ := unpackUint16(msg, off)
|
||||||
off += int(rdlength) + 1 // Skip the rdata
|
off += int(rdlength) + 1 // Skip the rdata
|
||||||
}
|
}
|
||||||
off++
|
off++
|
||||||
@ -139,5 +140,6 @@ Loop:
|
|||||||
msg[moves[i].from], msg[moves[i].from+1] = packUint16(uint16(moves[i].offset ^ 0xC000))
|
msg[moves[i].from], msg[moves[i].from+1] = packUint16(uint16(moves[i].offset ^ 0xC000))
|
||||||
saved += moves[i].length // minus something
|
saved += moves[i].length // minus something
|
||||||
}
|
}
|
||||||
|
msg = msg[:len(msg) - saved]
|
||||||
return saved
|
return saved
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user