| 132 | } |
| 133 | |
| 134 | func (p *TheDNS) TouchBrook() { |
| 135 | f := brook.DNSGate |
| 136 | brook.DNSGate = func(addr *net.UDPAddr, m *dns.Msg, l1 *net.UDPConn) (bool, error) { |
| 137 | done, err := f(addr, m, l1) |
| 138 | if err != nil || done { |
| 139 | return done, err |
| 140 | } |
| 141 | if m.Question[0].Qtype == dns.TypeA && p.DisableA { |
| 142 | err := soa(addr, m, l1) |
| 143 | return err == nil, err |
| 144 | } |
| 145 | if m.Question[0].Qtype == dns.TypeAAAA && p.DisableAAAA { |
| 146 | err := soa(addr, m, l1) |
| 147 | return err == nil, err |
| 148 | } |
| 149 | if brook.ListHasDomain(p.BlockDomain, strings.ToLower(m.Question[0].Name[0:len(m.Question[0].Name)-1]), p.Cache) { |
| 150 | err := soa(addr, m, l1) |
| 151 | return err == nil, err |
| 152 | } |
| 153 | if brook.ListHasDomain(p.BypassDomain, strings.ToLower(m.Question[0].Name[0:len(m.Question[0].Name)-1]), p.Cache1) { |
| 154 | var m1 *dns.Msg |
| 155 | if p.BypassDNSClient != nil { |
| 156 | m1, err = p.BypassDNSClient.Exchange(m) |
| 157 | } |
| 158 | if p.BypassDOHClient != nil { |
| 159 | m1, err = p.BypassDOHClient.Exchange(m) |
| 160 | } |
| 161 | if err != nil { |
| 162 | return false, err |
| 163 | } |
| 164 | m1b, err := m1.PackBuffer(nil) |
| 165 | if err != nil { |
| 166 | return false, err |
| 167 | } |
| 168 | if _, err := l1.WriteToUDP(m1b, addr); err != nil { |
| 169 | return false, err |
| 170 | } |
| 171 | return true, nil |
| 172 | } |
| 173 | if p.DOHClient != nil { |
| 174 | m1, err := p.DOHClient.Exchange(m) |
| 175 | if err != nil { |
| 176 | return false, err |
| 177 | } |
| 178 | m1b, err := m1.PackBuffer(nil) |
| 179 | if err != nil { |
| 180 | return false, err |
| 181 | } |
| 182 | if _, err := l1.WriteToUDP(m1b, addr); err != nil { |
| 183 | return false, err |
| 184 | } |
| 185 | return true, nil |
| 186 | } |
| 187 | return false, nil |
| 188 | } |
| 189 | f1 := brook.DOHGate |
| 190 | brook.DOHGate = func(m *dns.Msg, w http.ResponseWriter, r *http.Request) (done bool, err error) { |
| 191 | done, err = f1(m, w, r) |