]> Cypherpunks repositories - gostls13.git/commitdiff
net/netip: make AddrPort.MarshalText format 4-in-6 IPs consistently
authorBrad Fitzpatrick <bradfitz@golang.org>
Sun, 12 Dec 2021 03:35:08 +0000 (19:35 -0800)
committerBrad Fitzpatrick <bradfitz@golang.org>
Sun, 12 Dec 2021 06:14:07 +0000 (06:14 +0000)
Thanks again to @capnspacehook.

Fixes #50110

Change-Id: I1973bdea68eac9842b45f9524f62152e4f5342cf
Reviewed-on: https://go-review.googlesource.com/c/go/+/371114
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
Reviewed-by: Matt Layher <mdlayher@gmail.com>
Trust: Matt Layher <mdlayher@gmail.com>
Trust: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gopher Robot <gobot@golang.org>

src/net/netip/netip.go
src/net/netip/netip_test.go

index dc5faff40fbe518efd7c6b980bc1599eb05fefaf..aaaf435ed8ec21e6a52199f3e9202f0317f84d9d 100644 (file)
@@ -1157,8 +1157,17 @@ func (p AddrPort) AppendTo(b []byte) []byte {
        case z4:
                b = p.ip.appendTo4(b)
        default:
-               b = append(b, '[')
-               b = p.ip.appendTo6(b)
+               if p.ip.Is4In6() {
+                       b = append(b, "[::ffff:"...)
+                       b = p.ip.Unmap().appendTo4(b)
+                       if z := p.ip.Zone(); z != "" {
+                               b = append(b, '%')
+                               b = append(b, z...)
+                       }
+               } else {
+                       b = append(b, '[')
+                       b = p.ip.appendTo6(b)
+               }
                b = append(b, ']')
        }
        b = append(b, ':')
index 21055451392e3e7b7874b88cee9c9c4f3e7daee8..869628050a8acd29992eec9f9a6408147707e8b2 100644 (file)
@@ -347,6 +347,32 @@ func TestAddrMarshalUnmarshalBinary(t *testing.T) {
        }
 }
 
+func TestAddrPortMarshalTextString(t *testing.T) {
+       tests := []struct {
+               in   AddrPort
+               want string
+       }{
+               {mustIPPort("1.2.3.4:80"), "1.2.3.4:80"},
+               {mustIPPort("[1::CAFE]:80"), "[1::cafe]:80"},
+               {mustIPPort("[1::CAFE%en0]:80"), "[1::cafe%en0]:80"},
+               {mustIPPort("[::FFFF:192.168.140.255]:80"), "[::ffff:192.168.140.255]:80"},
+               {mustIPPort("[::FFFF:192.168.140.255%en0]:80"), "[::ffff:192.168.140.255%en0]:80"},
+       }
+       for i, tt := range tests {
+               if got := tt.in.String(); got != tt.want {
+                       t.Errorf("%d. for (%v, %v) String = %q; want %q", i, tt.in.Addr(), tt.in.Port(), got, tt.want)
+               }
+               mt, err := tt.in.MarshalText()
+               if err != nil {
+                       t.Errorf("%d. for (%v, %v) MarshalText error: %v", i, tt.in.Addr(), tt.in.Port(), err)
+                       continue
+               }
+               if string(mt) != tt.want {
+                       t.Errorf("%d. for (%v, %v) MarshalText = %q; want %q", i, tt.in.Addr(), tt.in.Port(), mt, tt.want)
+               }
+       }
+}
+
 func TestAddrPortMarshalUnmarshalBinary(t *testing.T) {
        tests := []struct {
                ipport   string