// dialDestination dials the destination server and wraps the resulting net.Conn // in a countingConn if an InstanceId was configured. func (server *Server) dialDestination(addr string) (net.Conn, error) { if !server.AllowNonGlobalDestinations { host := strings.Split(addr, ":")[0] ipAddr, err := net.ResolveIPAddr("ip", host) if err != nil { err = fmt.Errorf("Unable to resolve destination IP addr: %s", err) log.Error(err.Error()) return nil, err } if !ipAddr.IP.IsGlobalUnicast() { err = fmt.Errorf("Not accepting connections to non-global address: %s", host) log.Error(err.Error()) return nil, err } } return net.DialTimeout("tcp", addr, dialTimeout) }
// doVerify does the verification and returns a boolean indicating whether or // not to continue processing more verifications. func (vms *verifiedMasqueradeSet) doVerify(masquerade *Masquerade) bool { errCh := make(chan error, 2) go func() { // Limit amount of time we'll wait for a response time.Sleep(30 * time.Second) errCh <- fmt.Errorf("Timed out verifying %s", masquerade.Domain) }() go func() { start := time.Now() httpClient := HttpClient(vms.testServer, masquerade) req, _ := http.NewRequest("HEAD", "http://www.google.com/humans.txt", nil) resp, err := httpClient.Do(req) if err != nil { errCh <- fmt.Errorf("HTTP ERROR FOR MASQUERADE %v: %v", masquerade.Domain, err) return } else { body, err := ioutil.ReadAll(resp.Body) defer resp.Body.Close() if err != nil { errCh <- fmt.Errorf("HTTP Body Error: %s", body) } else { delta := time.Now().Sub(start) log.Debugf("SUCCESSFUL CHECK FOR: %s IN %s, %s", masquerade.Domain, delta, body) errCh <- nil } } }() err := <-errCh if err != nil { log.Error(err) return true } if vms.incrementVerifiedCount() { vms.verifiedCh <- masquerade return true } return false }