github.com/projectdiscovery/nuclei/v2@v2.9.15/internal/runner/proxy.go (about) 1 package runner 2 3 import ( 4 "bufio" 5 "fmt" 6 "net/url" 7 "os" 8 "strings" 9 10 "github.com/projectdiscovery/gologger" 11 "github.com/projectdiscovery/nuclei/v2/pkg/types" 12 errorutil "github.com/projectdiscovery/utils/errors" 13 fileutil "github.com/projectdiscovery/utils/file" 14 proxyutils "github.com/projectdiscovery/utils/proxy" 15 ) 16 17 // loadProxyServers load list of proxy servers from file or comma separated 18 func loadProxyServers(options *types.Options) error { 19 if len(options.Proxy) == 0 { 20 return nil 21 } 22 proxyList := []string{} 23 for _, p := range options.Proxy { 24 if fileutil.FileExists(p) { 25 file, err := os.Open(p) 26 if err != nil { 27 return fmt.Errorf("could not open proxy file: %w", err) 28 } 29 defer file.Close() 30 scanner := bufio.NewScanner(file) 31 for scanner.Scan() { 32 proxy := scanner.Text() 33 if strings.TrimSpace(proxy) == "" { 34 continue 35 } 36 proxyList = append(proxyList, proxy) 37 } 38 } else { 39 proxyList = append(proxyList, p) 40 } 41 } 42 aliveProxy, err := proxyutils.GetAnyAliveProxy(options.Timeout, proxyList...) 43 if err != nil { 44 return err 45 } 46 proxyURL, err := url.Parse(aliveProxy) 47 if err != nil { 48 return errorutil.WrapfWithNil(err, "failed to parse proxy got %v", err) 49 } 50 if options.ProxyInternal { 51 os.Setenv(types.HTTP_PROXY_ENV, proxyURL.String()) 52 } 53 if proxyURL.Scheme == proxyutils.HTTP || proxyURL.Scheme == proxyutils.HTTPS { 54 types.ProxyURL = proxyURL.String() 55 types.ProxySocksURL = "" 56 gologger.Verbose().Msgf("Using %s as proxy server", proxyURL.String()) 57 } else if proxyURL.Scheme == proxyutils.SOCKS5 { 58 types.ProxyURL = "" 59 types.ProxySocksURL = proxyURL.String() 60 gologger.Verbose().Msgf("Using %s as socket proxy server", proxyURL.String()) 61 } 62 return nil 63 }