deadfinder 1.1.1 → 1.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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