-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathworker.go
70 lines (58 loc) · 1.39 KB
/
worker.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package onionsweep
import (
"fmt"
"net/http"
"net/url"
"os"
"sync"
)
type Worker struct {
ID int
OnionSweep *OnionSweep
}
// Cache of already checked hosts
var cache = make(map[string]bool)
var cacheLock = &sync.Mutex{}
func NewWorker(id int, onionSweep *OnionSweep) *Worker {
return &Worker{
ID: id,
OnionSweep: onionSweep,
}
}
func (w *Worker) Run() {
defer w.OnionSweep.Wg.Done()
for job := range w.OnionSweep.Jobs {
parsedUrl, err := url.Parse(job)
if err != nil {
fmt.Fprintf(os.Stderr, "Error parsing URL: %s\n", err.Error())
continue
}
cacheLock.Lock()
resolvable, ok := cache[parsedUrl.Host]
cacheLock.Unlock()
if ok && !resolvable {
w.writeResult(job, "cached", 0, "dead")
continue
}
req, err := http.NewRequest("GET", job, nil)
if err != nil {
fmt.Fprintf(os.Stderr, "Error parsing URL: %s\n", err.Error())
continue
}
resp, err := w.OnionSweep.Client.Do(req)
if err != nil {
cacheLock.Lock()
cache[parsedUrl.Host] = false
cacheLock.Unlock()
w.writeResult(job, err.Error(), 0, "dead")
continue
}
cacheLock.Lock()
cache[parsedUrl.Host] = true
cacheLock.Unlock()
w.writeResult(job, "", resp.StatusCode, "live")
}
}
func (w *Worker) writeResult(url, errorReason string, statusCode int, liveOrDead string) {
w.OnionSweep.Results <- fmt.Sprintf("%s\t%d\t%s\t%s", url, statusCode, liveOrDead, errorReason)
}