@@ -11,6 +11,7 @@ import (
11
11
"path/filepath"
12
12
"regexp"
13
13
"strings"
14
+ "sync/atomic"
14
15
15
16
"github.com/vdaas/vald/internal/file"
16
17
"github.com/vdaas/vald/internal/log"
@@ -32,10 +33,9 @@ const (
32
33
)
33
34
34
35
var (
35
- format = flag .String ("format" , "html" , "file format(html)" )
36
- path = flag .String ("path" , "./" , "directory or file path" )
37
- ignorePath = flag .String ("ignore-path" , "" , "ignore path to check" )
38
-
36
+ format = flag .String ("format" , "html" , "file format(html)" )
37
+ path = flag .String ("path" , "./" , "directory or file path" )
38
+ ignorePath = flag .String ("ignore-path" , "" , "ignore path to check" )
39
39
ignoreLinks = []string {
40
40
"javascript:void(0)" ,
41
41
49
49
reSrc = regexp .MustCompile (PREFIX_SRC + BASE_REGEXP )
50
50
reSrcSet = regexp .MustCompile (PREFIX_SRCSET + BASE_REGEXP )
51
51
reHref = regexp .MustCompile (PREFIX_HREF + BASE_REGEXP )
52
-
53
- url = ""
54
52
)
55
53
56
54
func getFiles (dir string ) []string {
@@ -72,7 +70,7 @@ func getFiles(dir string) []string {
72
70
return filePaths
73
71
}
74
72
75
- func convertToURL (s string ) string {
73
+ func convertToURL (s , url string ) string {
76
74
b := bytes .NewBuffer (make ([]byte , 0 , 100 ))
77
75
if strings .HasPrefix (s , "#" ) {
78
76
b .WriteString (url )
@@ -112,7 +110,10 @@ func exec(url string, cli *http.Client) int {
112
110
return - 1
113
111
}
114
112
resp .Body .Close ()
115
- return resp .StatusCode
113
+ if resp .StatusCode < 200 || resp .StatusCode >= 300 {
114
+ return resp .StatusCode
115
+ }
116
+ return 200
116
117
}
117
118
118
119
func main () {
@@ -161,6 +162,7 @@ func main() {
161
162
}
162
163
163
164
eg , _ := errgroup .New (ctx )
165
+
164
166
countAll := 0
165
167
successAll := 0
166
168
failAll := 0
@@ -185,10 +187,10 @@ func main() {
185
187
// str := *(*string)(unsafe.Pointer(&b))
186
188
str := string (b )
187
189
// get origin url
188
- url = strings .TrimPrefix (reProp .FindString (str ), PREFIX_PROP )
190
+ originURL : = strings .TrimPrefix (reProp .FindString (str ), PREFIX_PROP )
189
191
// init counter
190
192
r := result {
191
- url : url ,
193
+ url : originURL ,
192
194
count : 0 ,
193
195
success : 0 ,
194
196
fail : 0 ,
@@ -200,38 +202,42 @@ func main() {
200
202
u := reSrc .FindAllString (str , - 1 )
201
203
for _ , elem := range u {
202
204
e := strings .TrimPrefix (elem , PREFIX_SRC )
203
- url := convertToURL (e )
204
- if ! isBlackList (url , ignoreLinks ) {
205
- urls = append (urls , map [string ]string {e : url })
205
+ targetUrl := convertToURL (e , originURL )
206
+ if ! isBlackList (targetUrl , ignoreLinks ) {
207
+ urls = append (urls , map [string ]string {e : targetUrl })
206
208
r .count ++
207
209
}
208
210
}
209
211
u = reHref .FindAllString (str , - 1 )
210
212
for _ , elem := range u {
211
213
e := strings .TrimPrefix (elem , PREFIX_HREF )
212
- url := convertToURL (e )
213
- if ! isBlackList (url , ignoreLinks ) {
214
- urls = append (urls , map [string ]string {e : url })
214
+ targetUrl := convertToURL (e , originURL )
215
+ if ! isBlackList (targetUrl , ignoreLinks ) {
216
+ urls = append (urls , map [string ]string {e : targetUrl })
215
217
r .count ++
216
218
}
217
219
}
218
220
u = reSrcSet .FindAllString (str , - 1 )
219
221
for _ , elem := range u {
220
222
e := strings .TrimPrefix (elem , PREFIX_SRCSET )
221
- url := convertToURL (e )
222
- if ! isBlackList (url , ignoreLinks ) {
223
- urls = append (urls , map [string ]string {e : url })
223
+ targetUrl := convertToURL (e , originURL )
224
+ if ! isBlackList (targetUrl , ignoreLinks ) {
225
+ urls = append (urls , map [string ]string {e : targetUrl })
224
226
r .count ++
225
227
}
226
228
}
227
- fmt .Printf ("checking...%s (url: %s)\n " , path , url )
229
+ fmt .Printf ("checking...%s (url: %s)\n " , path , originURL )
230
+ var (
231
+ success int32 = 0
232
+ fail int32 = 0
233
+ )
228
234
for _ , url := range urls {
229
235
eg .Go (func () error {
230
236
for k , v := range url {
231
237
mu .Lock ()
238
+ defer mu .Unlock ()
232
239
if _ , ok := r .errLinks [k ]; ok {
233
- r .fail ++
234
- mu .Unlock ()
240
+ atomic .AddInt32 (& fail , 1 )
235
241
continue
236
242
}
237
243
var code int
@@ -243,15 +249,12 @@ func main() {
243
249
code = exec (v , cli )
244
250
exLinks [v ] = code
245
251
}
246
- mu .Unlock ()
247
252
if code == 200 {
248
- r . success ++
253
+ atomic . AddInt32 ( & success , 1 )
249
254
} else {
250
255
log .Warnf ("[%d] %s" , code , v )
251
- mu .Lock ()
252
256
r .errLinks [k ] = code
253
- r .fail ++
254
- mu .Unlock ()
257
+ atomic .AddInt32 (& fail , 1 )
255
258
}
256
259
}
257
260
return nil
@@ -261,6 +264,9 @@ func main() {
261
264
if err != nil {
262
265
log .Error (err .Error ())
263
266
}
267
+ r .success = int (atomic .LoadInt32 (& success ))
268
+ r .fail = int (atomic .LoadInt32 (& fail ))
269
+
264
270
countAll += r .count
265
271
successAll += r .success
266
272
failAll += r .fail
@@ -275,7 +281,7 @@ func main() {
275
281
fmt .Printf ("count: %d, ok: %d, fail: %d\n \n " , v .count , v .success , v .fail )
276
282
}
277
283
fmt .Printf ("\n [summary] all: %d, OK: %d, NG: %d\n " , countAll , successAll , failAll )
278
- if failAll > 0 {
284
+ if countAll != successAll {
279
285
os .Exit (1 )
280
286
}
281
287
return
0 commit comments