aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--brokenlinks/worker.go40
1 files changed, 26 insertions, 14 deletions
diff --git a/brokenlinks/worker.go b/brokenlinks/worker.go
index 8d7918f..0493a77 100644
--- a/brokenlinks/worker.go
+++ b/brokenlinks/worker.go
@@ -133,7 +133,10 @@ func (wrk *worker) scanAll() (result *Result, err error) {
wrk.seenLink[firstLinkq.url] = http.StatusProcessing
wrk.wg.Add(1)
- go wrk.scan(firstLinkq)
+ go func() {
+ var resultq = wrk.scan(firstLinkq)
+ wrk.pushResult(resultq)
+ }()
wrk.wg.Wait()
var resultq = <-wrk.resultq
@@ -157,7 +160,10 @@ func (wrk *worker) scanAll() (result *Result, err error) {
wrk.seenLink[linkq.url] = http.StatusProcessing
wrk.wg.Add(1)
- go wrk.scan(linkq)
+ go func() {
+ var resultq = wrk.scan(linkq)
+ wrk.pushResult(resultq)
+ }()
}
wrk.processAndWait()
@@ -175,7 +181,10 @@ func (wrk *worker) scanPastResult() (result *Result, err error) {
}
wrk.seenLink[linkq.url] = http.StatusProcessing
wrk.wg.Add(1)
- go wrk.scan(linkq)
+ go func() {
+ var resultq = wrk.scan(linkq)
+ wrk.pushResult(resultq)
+ }()
}
wrk.processAndWait()
@@ -246,7 +255,10 @@ func (wrk *worker) processResult(
if !seen {
wrk.seenLink[linkq.url] = http.StatusProcessing
wrk.wg.Add(1)
- go wrk.scan(linkq)
+ go func() {
+ var resultq = wrk.scan(linkq)
+ wrk.pushResult(resultq)
+ }()
continue
}
if seenStatus >= http.StatusBadRequest {
@@ -307,7 +319,7 @@ func (wrk *worker) markBroken(linkq linkQueue) {
}
// scan fetch the HTML page or image to check if its valid.
-func (wrk *worker) scan(linkq linkQueue) {
+func (wrk *worker) scan(linkq linkQueue) (resultq map[string]linkQueue) {
defer func() {
if wrk.opts.IsVerbose && linkq.errScan != nil {
wrk.log.Printf("error: %d %s error=%v\n", linkq.status,
@@ -316,8 +328,8 @@ func (wrk *worker) scan(linkq linkQueue) {
wrk.wg.Done()
}()
+ resultq = make(map[string]linkQueue)
var (
- resultq = map[string]linkQueue{}
httpResp *http.Response
err error
)
@@ -326,8 +338,7 @@ func (wrk *worker) scan(linkq linkQueue) {
linkq.status = StatusBadLink
linkq.errScan = err
resultq[linkq.url] = linkq
- go wrk.pushResult(resultq)
- return
+ return resultq
}
defer httpResp.Body.Close()
@@ -336,16 +347,14 @@ func (wrk *worker) scan(linkq linkQueue) {
resultq[linkq.url] = linkq
if slices.Contains(wrk.opts.ignoreStatus, httpResp.StatusCode) {
- return
+ return nil
}
if httpResp.StatusCode >= http.StatusBadRequest {
- go wrk.pushResult(resultq)
- return
+ return resultq
}
if linkq.kind == atom.Img || linkq.isExternal {
- go wrk.pushResult(resultq)
- return
+ return resultq
}
var doc *html.Node
@@ -399,7 +408,7 @@ func (wrk *worker) scan(linkq linkQueue) {
resultq[nodeLink.url] = *nodeLink
}
}
- go wrk.pushResult(resultq)
+ return resultq
}
func (wrk *worker) fetch(linkq linkQueue) (
@@ -483,6 +492,9 @@ func (wrk *worker) processLink(parentUrl *url.URL, val string, kind atom.Atom) (
}
func (wrk *worker) pushResult(resultq map[string]linkQueue) {
+ if len(resultq) == 0 {
+ return
+ }
var tick = time.NewTicker(100 * time.Millisecond)
for {
select {