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  }