deadfinder 1.1.1 → 1.1.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 248abe3bb3c321a29cb164930132c0a61ad9e3f7987a8cfb863eebe614d0350f
4
- data.tar.gz: bbd932e255500d98dbd2171d5fe3fb66a820846bb5801f4b6b1b1b74905675e7
3
+ metadata.gz: 1e08daa4368e4c3e041e642f1708619637ea618c2937c6e36f2aba841f152ec4
4
+ data.tar.gz: 5162fb9eb973b7638ece6bcac4e6b2c731f3a6bd654f842f1aeeeed286cee4ed
5
5
  SHA512:
6
- metadata.gz: 4b722245eafc6373f2776db13377cbb391ab9a4c4cffb7b226e206fb8c8f7a58d1474345a7fef41b7cc14cc350ef3549db95f3359b7df7b3bcd43d0d3d580dac
7
- data.tar.gz: 5b9706ea35279e5f7c881d1839bb030ab73fb412a474a3cc9ac01837a256ff121b17154246a9ef6173a7410f29e611f52cf66dff9eff7a14c7176b27a9ab00c1
6
+ metadata.gz: aa82c3b87b81f8f5293819dbd0e242e57e7fda14fe8820197aa4e32d6c774ea0c379adda7ef49e88865fc00f32cb5cce36c6fae711ac019e2d5be921e1747d65
7
+ data.tar.gz: 952de90ed7b150e106fe33ec203140c162f2f74c941400328fc3da9c41866111f940043b53d9560903fdb822337ff8973bfc70740ad937cdc04428e5598e37fb
@@ -15,6 +15,10 @@ class Logger
15
15
  puts ' ● '.colorize(:blue) + text.to_s.colorize(:light_blue)
16
16
  end
17
17
 
18
+ def self.sub_done(text)
19
+ puts ' ✓ '.colorize(:blue) + text.to_s.colorize(:light_blue)
20
+ end
21
+
18
22
  def self.found(text)
19
23
  puts " ✘ #{text}".colorize(:red)
20
24
  end
@@ -1,3 +1,3 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- VERSION = '1.1.1'
3
+ VERSION = '1.1.2'
data/lib/deadfinder.rb CHANGED
@@ -9,22 +9,34 @@ require 'deadfinder/logger'
9
9
  require 'deadfinder/version'
10
10
  require 'concurrent-edge'
11
11
  require 'sitemap-parser'
12
+ require 'set'
12
13
 
13
14
  Channel = Concurrent::Channel
15
+ CacheSet = Set.new
16
+ CacheQue = {}
14
17
 
15
18
  class DeadFinderRunner
16
19
  def run(target, options)
17
20
  page = Nokogiri::HTML(URI.open(target))
18
- nodeset = page.css('a')
19
- link_a = nodeset.map { |element| element['href'] }.compact
21
+
22
+ nodeset_a = page.css('a')
23
+ link_a = nodeset_a.map { |element| element['href'] }.compact
24
+ nodeset_script = page.css('script')
25
+ link_script = nodeset_script.map { |element| element['src'] }.compact
26
+ nodeset_link = page.css('link')
27
+ link_link = nodeset_link.map { |element| element['href'] }.compact
28
+
29
+ link_merged = []
30
+ link_merged = link_merged.concat link_a, link_script, link_link
31
+
20
32
  Logger.target target
21
- Logger.sub_info "Found #{link_a.length} point"
33
+ Logger.sub_info "Found #{link_merged.length} point. [a:#{link_a.length}/s:#{link_script.length}/l:#{link_link.length}]"
22
34
  Logger.sub_info 'Checking'
23
- jobs = Channel.new(buffer: :buffered, capacity: 100)
24
- results = Channel.new(buffer: :buffered, capacity: 100)
35
+ jobs = Channel.new(buffer: :buffered, capacity: 1000)
36
+ results = Channel.new(buffer: :buffered, capacity: 1000)
25
37
 
26
38
  (1..options['concurrency']).each do |w|
27
- Channel.go { worker(w, jobs, results) }
39
+ Channel.go { worker(w, jobs, results, options) }
28
40
  end
29
41
 
30
42
  link_a.uniq.each do |node|
@@ -36,17 +48,27 @@ class DeadFinderRunner
36
48
  (1..link_a.uniq.length).each do
37
49
  ~results
38
50
  end
39
- Logger.sub_info 'Done'
51
+ Logger.sub_done 'Done'
40
52
  end
41
53
 
42
- def worker(_id, jobs, results)
54
+ def worker(_id, jobs, results, options)
43
55
  jobs.each do |j|
44
- begin
45
- URI.open(j)
46
- rescue StandardError => e
47
- Logger.found "[#{e}] #{j}" if e.to_s.include? '404 Not Found'
56
+ if !CacheSet.include? j
57
+ CacheSet.add j
58
+ begin
59
+ CacheQue[j] = true
60
+ URI.open(j, :read_timeout => options['timeout'])
61
+ rescue StandardError => e
62
+ Logger.found "[#{e}] #{j}" if e.to_s.include? '404 Not Found'
63
+ CacheQue[j] = false
64
+ end
65
+ results << j
66
+ else
67
+ if !CacheQue[j]
68
+ Logger.found "[404 Not Found] #{j}"
69
+ end
70
+ results << j
48
71
  end
49
- results << j
50
72
  end
51
73
  end
52
74
  end
@@ -82,6 +104,7 @@ end
82
104
 
83
105
  class DeadFinder < Thor
84
106
  class_option :concurrency, aliases: :c, default: 20, type: :numeric
107
+ class_option :timeout, aliases: :t, default: 10, type: :numeric
85
108
 
86
109
  desc 'pipe', 'Scan the URLs from STDIN. (e.g cat urls.txt | deadfinder pipe)'
87
110
  def pipe
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: deadfinder
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.1
4
+ version: 1.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - hahwul