html-proofer 3.4.0 → 3.5.0
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 +4 -4
- data/bin/htmlproofer +1 -0
- data/lib/html-proofer.rb +1 -0
- data/lib/html-proofer/check/links.rb +4 -1
- data/lib/html-proofer/check/scripts.rb +11 -0
- data/lib/html-proofer/configuration.rb +1 -0
- data/lib/html-proofer/element.rb +9 -0
- data/lib/html-proofer/url_validator.rb +12 -6
- data/lib/html-proofer/version.rb +1 -1
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c8e32513d55bbc3b6fe0b8b238199fa0270c13a4
|
4
|
+
data.tar.gz: 6b1f6264dae93f15f2e09e4542e2f7b5d6ffff3c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b9f3c3a6028eb2eae4b3fb0f999702c80c06b3a89a6a715ee7f1d5b09d12b50ca47bd739c8696d1b6ff531f647afa3b85d1ee29c04fb0c81fa5e60896787661f
|
7
|
+
data.tar.gz: b5eaa5f478efd12a53161a91218da9661a979dfe91cd1ba2873b365ec94ec0c9b2f9d8202befacb062c92da6820cd83a914e54fa9c83046a12648ba11b862337
|
data/bin/htmlproofer
CHANGED
@@ -23,6 +23,7 @@ Mercenary.program(:htmlproofer) do |p|
|
|
23
23
|
p.option 'check_html', '--check-html', 'Enables HTML validation errors from Nokogiri (default: `false`).'
|
24
24
|
p.option 'check_img_http', '--check-img-http', 'Fails an image if it\'s marked as `http` (default: `false`).'
|
25
25
|
p.option 'check_opengraph', '--check-opengraph', 'Enables the Open Graph checker (default: `false`).'
|
26
|
+
p.option 'check_sri', '--check-sri', 'Check that `<link>` and `<script>` external resources do use SRI (default: `false`).'
|
26
27
|
p.option 'directory_index_file', '--directory-index-file', String, 'Sets the file to look for when a link refers to a directory. (default: `index.html`)'
|
27
28
|
p.option 'disable_external', '--disable-external', 'If `true`, does not run the external link checker, which can take a lot of time (default: `false`)'
|
28
29
|
p.option 'empty_alt_ignore', '--empty-alt-ignore', 'If `true`, ignores images with empty alt tags'
|
data/lib/html-proofer.rb
CHANGED
@@ -38,8 +38,11 @@ class LinkCheck < ::HTMLProofer::Check
|
|
38
38
|
|
39
39
|
# intentionally here because we still want valid? & missing_href? to execute
|
40
40
|
next if @link.non_http_remote?
|
41
|
-
|
41
|
+
|
42
42
|
if !@link.internal? && @link.remote?
|
43
|
+
# we need to skip these for now; although the domain main be valid,
|
44
|
+
# curl/Typheous inaccurately return 404s for some links. cc https://git.io/vyCFx
|
45
|
+
next if @link.try(:rel) == 'dns-prefetch'
|
43
46
|
add_to_external_urls(@link.href)
|
44
47
|
next
|
45
48
|
elsif !@link.internal? && !@link.exists?
|
@@ -22,8 +22,19 @@ class ScriptCheck < ::HTMLProofer::Check
|
|
22
22
|
elsif !@script.exists?
|
23
23
|
add_issue("internal script #{@script.src} does not exist", line: line, content: content)
|
24
24
|
end
|
25
|
+
check_sri(line, content) if @script.check_sri?
|
25
26
|
end
|
26
27
|
|
27
28
|
external_urls
|
28
29
|
end
|
30
|
+
|
31
|
+
def check_sri(line, content)
|
32
|
+
if !defined? @script.integrity and !defined? @script.crossorigin
|
33
|
+
add_issue("SRI and CORS not provided in: #{@script.src}", line: line, content: content)
|
34
|
+
elsif !defined? @script.integrity
|
35
|
+
add_issue("Integrity is missing in: #{@script.src}", line: line, content: content)
|
36
|
+
elsif !defined? @script.crossorigin
|
37
|
+
add_issue("CORS not provided for external resource in: #{@script.src}", line: line, content: content)
|
38
|
+
end
|
39
|
+
end
|
29
40
|
end
|
data/lib/html-proofer/element.rb
CHANGED
@@ -26,6 +26,10 @@ module HTMLProofer
|
|
26
26
|
|
27
27
|
@html = check.html
|
28
28
|
|
29
|
+
parent_attributes = obj.ancestors.map { |a| a.try(:attributes) }
|
30
|
+
parent_attributes.pop # remove document at the end
|
31
|
+
@parent_ignorable = parent_attributes.any? { |a| !a["data-proofer-ignore"].nil? }
|
32
|
+
|
29
33
|
# fix up missing protocols
|
30
34
|
@href.insert 0, 'http:' if @href =~ %r{^//}
|
31
35
|
@src.insert 0, 'http:' if @src =~ %r{^//}
|
@@ -75,6 +79,7 @@ module HTMLProofer
|
|
75
79
|
|
76
80
|
def ignore?
|
77
81
|
return true if @data_proofer_ignore
|
82
|
+
return true if @parent_ignorable
|
78
83
|
|
79
84
|
return true if url =~ /^javascript:/
|
80
85
|
|
@@ -103,6 +108,10 @@ module HTMLProofer
|
|
103
108
|
@check.options[:check_img_http]
|
104
109
|
end
|
105
110
|
|
111
|
+
def check_sri?
|
112
|
+
@check.options[:check_sri]
|
113
|
+
end
|
114
|
+
|
106
115
|
# path is external to the file
|
107
116
|
def external?
|
108
117
|
!internal?
|
@@ -121,7 +121,13 @@ module HTMLProofer
|
|
121
121
|
end
|
122
122
|
|
123
123
|
def clean_url(href)
|
124
|
-
|
124
|
+
# catch any obvious issues, like strings in port numbers
|
125
|
+
parsed = Addressable::URI.parse(href)
|
126
|
+
if href !~ %r{^([!#$&-;=?-\[\]_a-z~]|%[0-9a-fA-F]{2})+$}
|
127
|
+
parsed.normalize
|
128
|
+
else
|
129
|
+
href
|
130
|
+
end
|
125
131
|
end
|
126
132
|
|
127
133
|
def queue_request(method, href, filenames)
|
@@ -149,14 +155,14 @@ module HTMLProofer
|
|
149
155
|
end
|
150
156
|
elsif response.timed_out?
|
151
157
|
handle_timeout(href, filenames, response_code)
|
152
|
-
elsif response_code
|
158
|
+
elsif response_code.zero?
|
153
159
|
handle_failure(effective_url, filenames, response_code, response.return_message)
|
154
160
|
elsif method == :head
|
155
161
|
queue_request(:get, href, filenames)
|
156
162
|
else
|
157
163
|
return if @options[:only_4xx] && !response_code.between?(400, 499)
|
158
164
|
# Received a non-successful http response.
|
159
|
-
msg = "External link #{href} failed: #{response_code} #{response.return_message}"
|
165
|
+
msg = "External link #{href.chomp('/')} failed: #{response_code} #{response.return_message}"
|
160
166
|
add_external_issue(filenames, msg, response_code)
|
161
167
|
@cache.add(href, filenames, response_code, msg)
|
162
168
|
end
|
@@ -179,21 +185,21 @@ module HTMLProofer
|
|
179
185
|
|
180
186
|
return unless body_doc.xpath(xpath).empty?
|
181
187
|
|
182
|
-
msg = "External link #{href} failed: #{effective_url} exists, but the hash '#{hash}' does not"
|
188
|
+
msg = "External link #{href.chomp('/')} failed: #{effective_url} exists, but the hash '#{hash}' does not"
|
183
189
|
add_external_issue(filenames, msg, response.code)
|
184
190
|
@cache.add(href, filenames, response.code, msg)
|
185
191
|
true
|
186
192
|
end
|
187
193
|
|
188
194
|
def handle_timeout(href, filenames, response_code)
|
189
|
-
msg = "External link #{href} failed: got a time out (response code #{response_code})"
|
195
|
+
msg = "External link #{href.chomp('/')} failed: got a time out (response code #{response_code})"
|
190
196
|
@cache.add(href, filenames, 0, msg)
|
191
197
|
return if @options[:only_4xx]
|
192
198
|
add_external_issue(filenames, msg, response_code)
|
193
199
|
end
|
194
200
|
|
195
201
|
def handle_failure(href, filenames, response_code, return_message)
|
196
|
-
msg = "External link #{href} failed: response code #{response_code} means something's wrong.
|
202
|
+
msg = "External link #{href.chomp('/')} failed: response code #{response_code} means something's wrong.
|
197
203
|
It's possible libcurl couldn't connect to the server or perhaps the request timed out.
|
198
204
|
Sometimes, making too many requests at once also breaks things.
|
199
205
|
Either way, the return message (if any) from the server is: #{return_message}"
|
data/lib/html-proofer/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: html-proofer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Garen Torikian
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-03-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: mercenary
|
@@ -170,6 +170,20 @@ dependencies:
|
|
170
170
|
- - ">="
|
171
171
|
- !ruby/object:Gem::Version
|
172
172
|
version: '0'
|
173
|
+
- !ruby/object:Gem::Dependency
|
174
|
+
name: pry
|
175
|
+
requirement: !ruby/object:Gem::Requirement
|
176
|
+
requirements:
|
177
|
+
- - "~>"
|
178
|
+
- !ruby/object:Gem::Version
|
179
|
+
version: 0.10.0
|
180
|
+
type: :development
|
181
|
+
prerelease: false
|
182
|
+
version_requirements: !ruby/object:Gem::Requirement
|
183
|
+
requirements:
|
184
|
+
- - "~>"
|
185
|
+
- !ruby/object:Gem::Version
|
186
|
+
version: 0.10.0
|
173
187
|
- !ruby/object:Gem::Dependency
|
174
188
|
name: awesome_print
|
175
189
|
requirement: !ruby/object:Gem::Requirement
|