From 345106c989356c27189f0053438fa145aa7897a0 Mon Sep 17 00:00:00 2001 From: sanyo Date: Wed, 29 Jul 2020 11:54:51 +0800 Subject: [PATCH] use golang net lib to parse google json param [ecs] --- doh-server/google.go | 62 ++++++++++++++------------------------------ 1 file changed, 20 insertions(+), 42 deletions(-) diff --git a/doh-server/google.go b/doh-server/google.go index 8504784..3d3f069 100644 --- a/doh-server/google.go +++ b/doh-server/google.go @@ -83,52 +83,30 @@ func (s *Server) parseRequestGoogle(ctx context.Context, w http.ResponseWriter, } ednsClientSubnet := r.FormValue("edns_client_subnet") - ednsClientFamily := uint16(0) - ednsClientAddress := net.IP(nil) - ednsClientNetmask := uint8(255) + + var ( + ednsClientFamily = uint16(1) + ednsClientAddress = net.IP(nil) + ednsClientNetmask = 24 + ipLen int + ipNet *net.IPNet + err error + ) + if ednsClientSubnet != "" { if ednsClientSubnet == "0/0" { ednsClientSubnet = "0.0.0.0/0" } - slash := strings.IndexByte(ednsClientSubnet, '/') - if slash < 0 { - ednsClientAddress = net.ParseIP(ednsClientSubnet) - if ednsClientAddress == nil { - return &DNSRequest{ - errcode: 400, - errtext: fmt.Sprintf("Invalid argument value: \"edns_client_subnet\" = %q", ednsClientSubnet), - } - } - if ipv4 := ednsClientAddress.To4(); ipv4 != nil { - ednsClientFamily = 1 - ednsClientAddress = ipv4 - ednsClientNetmask = 24 - } else { - ednsClientFamily = 2 - ednsClientNetmask = 56 - } - } else { - ednsClientAddress = net.ParseIP(ednsClientSubnet[:slash]) - if ednsClientAddress == nil { - return &DNSRequest{ - errcode: 400, - errtext: fmt.Sprintf("Invalid argument value: \"edns_client_subnet\" = %q", ednsClientSubnet), - } - } - if ipv4 := ednsClientAddress.To4(); ipv4 != nil { - ednsClientFamily = 1 - ednsClientAddress = ipv4 - } else { - ednsClientFamily = 2 + ednsClientAddress, ipNet, err = net.ParseCIDR(ednsClientSubnet) + if err != nil { + return &DNSRequest{ + errcode: 400, + errtext: fmt.Sprintf("Invalid argument value: \"edns_client_subnet\" = %q", ednsClientSubnet), } - netmask, err := strconv.ParseUint(ednsClientSubnet[slash+1:], 10, 8) - if err != nil { - return &DNSRequest{ - errcode: 400, - errtext: fmt.Sprintf("Invalid argument value: \"edns_client_subnet\" = %q", ednsClientSubnet), - } - } - ednsClientNetmask = uint8(netmask) + } + ednsClientNetmask, ipLen = ipNet.Mask.Size() + if ipLen == 128 { + ednsClientFamily = uint16(2) } } else { ednsClientAddress = s.findClientIP(r) @@ -156,7 +134,7 @@ func (s *Server) parseRequestGoogle(ctx context.Context, w http.ResponseWriter, edns0Subnet := new(dns.EDNS0_SUBNET) edns0Subnet.Code = dns.EDNS0SUBNET edns0Subnet.Family = ednsClientFamily - edns0Subnet.SourceNetmask = ednsClientNetmask + edns0Subnet.SourceNetmask = uint8(ednsClientNetmask) edns0Subnet.SourceScope = 0 edns0Subnet.Address = ednsClientAddress opt.Option = append(opt.Option, edns0Subnet)