Class: HTMLProofer::Middleware

Inherits:
Object
  • Object
show all
Defined in:
lib/html-proofer/middleware.rb

Defined Under Namespace

Classes: InvalidHtmlError

Constant Summary collapse

HTML_SIGNATURE =
[
  '<!DOCTYPE HTML',
  '<HTML',
  '<HEAD',
  '<SCRIPT',
  '<IFRAME',
  '<H1',
  '<DIV',
  '<FONT',
  '<TABLE',
  '<A',
  '<STYLE',
  '<TITLE',
  '<B',
  '<BODY',
  '<BR',
  '<P',
  '<!--'
]

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(app) ⇒ Middleware

Returns a new instance of Middleware.


27
28
29
# File 'lib/html-proofer/middleware.rb', line 27

def initialize(app)
  @app = app
end

Class Method Details

.optionsObject


16
17
18
19
20
21
22
23
24
25
# File 'lib/html-proofer/middleware.rb', line 16

def self.options
  @options ||= {
    type:                :file,
    allow_missing_href:  true, # Permitted in html5
    allow_hash_href:     true,
    check_external_hash: true,
    check_html:          true,
    url_ignore:          [/.*/], # Don't try to check local files exist
  }
end

Instance Method Details

#call(env) ⇒ Object


51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/html-proofer/middleware.rb', line 51

def call(env)
  result = @app.call(env)
  return result if env['REQUEST_METHOD'] != 'GET'
  return result if env['QUERY_STRING'] =~ /proofer-ignore/
  return result if result.first != 200
  body = []
  result.last.each { |e| body << e }

  body = body.join('')
  begin
    html = body.lstrip
  rescue
    return result # Invalid encoding; it's not gonna be html.
  end
  if HTML_SIGNATURE.any? { |sig| html.upcase.start_with? sig }
    parsed = HTMLProofer::Runner.new(
      'response',
      Middleware.options
    ).check_parsed(
      Nokogiri::HTML(Utils.clean_content(html)), 'response'
    )

    if parsed[:failures].length > 0
      raise InvalidHtmlError.new(parsed[:failures])
    end
  end
  result
end