Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
projectdiscovery
GitHub Repository: projectdiscovery/nuclei
Path: blob/dev/internal/runner/proxy.go
2070 views
1
package runner
2
3
import (
4
"bufio"
5
"fmt"
6
"net/url"
7
"os"
8
"strings"
9
10
"github.com/projectdiscovery/nuclei/v3/pkg/types"
11
"github.com/projectdiscovery/utils/errkit"
12
fileutil "github.com/projectdiscovery/utils/file"
13
proxyutils "github.com/projectdiscovery/utils/proxy"
14
)
15
16
const (
17
HTTP_PROXY_ENV = "HTTP_PROXY"
18
)
19
20
// loadProxyServers load list of proxy servers from file or comma separated
21
func loadProxyServers(options *types.Options) error {
22
if len(options.Proxy) == 0 {
23
return nil
24
}
25
proxyList := []string{}
26
for _, p := range options.Proxy {
27
if fileutil.FileExists(p) {
28
file, err := os.Open(p)
29
if err != nil {
30
return fmt.Errorf("could not open proxy file: %w", err)
31
}
32
defer func() {
33
_ = file.Close()
34
}()
35
scanner := bufio.NewScanner(file)
36
for scanner.Scan() {
37
proxy := scanner.Text()
38
if strings.TrimSpace(proxy) == "" {
39
continue
40
}
41
proxyList = append(proxyList, proxy)
42
}
43
} else {
44
proxyList = append(proxyList, p)
45
}
46
}
47
aliveProxy, err := proxyutils.GetAnyAliveProxy(options.Timeout, proxyList...)
48
if err != nil {
49
return err
50
}
51
proxyURL, err := url.Parse(aliveProxy)
52
if err != nil {
53
return errkit.Wrapf(err, "failed to parse proxy got %v", err)
54
}
55
if options.ProxyInternal {
56
_ = os.Setenv(HTTP_PROXY_ENV, proxyURL.String())
57
}
58
switch proxyURL.Scheme {
59
case proxyutils.HTTP, proxyutils.HTTPS:
60
options.Logger.Verbose().Msgf("Using %s as proxy server", proxyURL.String())
61
options.AliveHttpProxy = proxyURL.String()
62
case proxyutils.SOCKS5:
63
options.AliveSocksProxy = proxyURL.String()
64
options.Logger.Verbose().Msgf("Using %s as socket proxy server", proxyURL.String())
65
}
66
return nil
67
}
68
69