- commit
- b9f0241
- parent
- ba891c3
- author
- Neale Pickett
- date
- 2020-09-24 18:58:15 -0600 MDT
Fix header formatting
4 files changed,
+103,
-13
A
go.mod
+5,
-0
1@@ -0,0 +1,5 @@
2+module github.com/dirtbags/netshovel
3+
4+go 1.13
5+
6+require github.com/google/gopacket v1.1.18
A
go.sum
+7,
-0
1@@ -0,0 +1,7 @@
2+github.com/google/gopacket v1.1.18 h1:lum7VRA9kdlvBi7/v2p7/zcbkduHaCH/SVVyurs7OpY=
3+github.com/google/gopacket v1.1.18/go.mod h1:UdDNZ1OO62aGYVnPhxT1U6aI7ukYtA/kB8vaU0diBUM=
4+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
5+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
6+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
7+golang.org/x/sys v0.0.0-20190405154228-4b34438f7a67/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
8+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+31,
-13
1@@ -91,6 +91,9 @@ func (pkt *Packet) DescribeFields() string {
2 }
3
4 func center(s string, w int) string {
5+ if w < 3 {
6+ return "?"
7+ }
8 if len(s) > w {
9 s = s[0:w-3] + "…"
10 }
11@@ -100,39 +103,54 @@ func center(s string, w int) string {
12 // DescribeHeader returns a multi-line string describing this packet's header structure
13 func (pkt *Packet) DescribeHeader() string {
14 out := new(strings.Builder)
15- fmt.Fprintln(out, " 0 1 ")
16- fmt.Fprintln(out, " mo0 1 2 3 4 5 6 7 8 9 a b c d e f 0 1 2 3 4 5 6 7 8 9 a b c d e f")
17+ out.WriteString(" 0 1\n")
18+ out.WriteString(" 0 1 2 3 4 5 6 7 8 9 a b c d e f 0 1 2 3 4 5 6 7 8 9 a b c d e f\n")
19+ out.WriteString("+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n")
20
21 bitOffset := 0
22 for _, f := range pkt.header {
23 bits := f.bits
24 for bits > 0 {
25- if bitOffset == 0 {
26- fmt.Fprintln(out, "+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+")
27- }
28-
29 linebits := bits
30 if linebits+bitOffset > 0x20 {
31 linebits = 0x20 - bitOffset
32 }
33
34 // Generate centered string
35- // TODO: right-align value, center name
36- nameval := fmt.Sprintf("%s (0x%x)", f.name, f.value)
37- fmt.Fprintf(out, "|%s", center(nameval, linebits*2-1))
38+ val := fmt.Sprintf("0x%x", f.value)
39+ nameval := f.name
40+ if f.bits == bits {
41+ out.WriteString("|")
42+ } else {
43+ out.WriteString(" ")
44+ val = ""
45+ nameval = "..."
46+ }
47+ out.WriteString(center(nameval, linebits*2-len(val)-2))
48+ out.WriteString(val)
49+ out.WriteString(" ")
50
51 bitOffset += linebits
52 bits -= linebits
53- if linebits == 0x20 {
54- fmt.Fprintln(out, "|")
55+ if bitOffset == 0x20 {
56+ if bits == 0 {
57+ out.WriteString("|")
58+ } else {
59+ out.WriteString(" ")
60+ }
61+ out.WriteString("\n")
62+ out.WriteString("+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n")
63 bitOffset = 0
64 }
65 }
66 }
67 if bitOffset > 0 {
68- fmt.Fprintln(out, "|")
69+ out.WriteString("|\n")
70+ for o := 0; o < bitOffset; o++ {
71+ out.WriteString("+-")
72+ }
73+ out.WriteString("+\n")
74 }
75- fmt.Fprintln(out, "+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+")
76 return out.String()
77 }
78
+60,
-0
1@@ -0,0 +1,60 @@
2+package netshovel
3+
4+import (
5+ "strings"
6+ "testing"
7+
8+ "github.com/dirtbags/netshovel/gapstring"
9+)
10+
11+// BUG(neale): The DescribeHeader test is too simplistic.
12+func TestHeaders(t *testing.T) {
13+ pkt := NewPacket()
14+ pkt.Payload = gapstring.OfBytes([]byte{0, 1, 0, 1, 42, 0xff, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64})
15+
16+ a, err := pkt.Uint16LE("le")
17+ if err != nil {
18+ t.Error(err)
19+ }
20+ if a != 0x0100 {
21+ t.Error("Uint16LE", a)
22+ }
23+
24+ b, err := pkt.Uint16BE("be")
25+ if err != nil {
26+ t.Error(err)
27+ }
28+ if b != 0x0001 {
29+ t.Error("Uint16BE", b)
30+ }
31+
32+ fnord, err := pkt.Uint8("fnord")
33+ if err != nil {
34+ t.Error(err)
35+ }
36+ if fnord != 42 {
37+ t.Error("Uint8", fnord)
38+ }
39+
40+ biggun, err := pkt.Uint32LE("biggun")
41+ if err != nil {
42+ t.Error(err)
43+ }
44+ if biggun != 0xff000001 {
45+ t.Error("biggun", biggun)
46+ }
47+
48+ bignum, err := pkt.Uint64BE("bignum")
49+ if err != nil {
50+ t.Error(err)
51+ }
52+ if bignum != 64 {
53+ t.Error("bignum", bignum)
54+ }
55+
56+ desc := pkt.DescribeHeader()
57+ lines := strings.Split(desc, "\n")
58+ if len(lines) != 14 {
59+ t.Error(desc)
60+ }
61+}