Class: ProxyPacRb::Rack::ProxyPacLinter

Inherits:
Object
  • Object
show all
Defined in:
lib/proxy_pac_rb/rack/proxy_pac_linter.rb

Overview

Rack Middleware to lint proxy pac

require 'proxy_pac_rb/rack/proxy_pac_linter' use ProxyPacRb::Rack::ProxyPacLinter

require 'proxy_pac_rb/rack/proxy_pac_linter' use ProxyPacRb::Rack::ProxyPacLinter

require 'proxy_pac_rb/rack/proxy_pac_linter' use ProxyPacRb::Rack::ProxyPacLinter

Examples:

Sinatra's <server>.rb

Rack's config.ru

Middleman's config.rb

Instance Method Summary collapse

Constructor Details

#initialize(app, enabled: true) ⇒ ProxyPacLinter


27
28
29
30
31
32
33
34
35
# File 'lib/proxy_pac_rb/rack/proxy_pac_linter.rb', line 27

def initialize(
  app,
  enabled: true
)
  @app     = app
  @linter  = ProxyPacRb::ProxyPacLinter.new(silent: true)
  @loader  = ProxyPacRb::ProxyPacLoader.new
  @enabled = enabled
end

Instance Method Details

#call(env) ⇒ Object


37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/proxy_pac_rb/rack/proxy_pac_linter.rb', line 37

def call(env)
  status, headers, body = @app.call(env)

  return [status, headers, body] if enabled == false
  return [status, headers, body] unless headers.key?('Content-Type') \
    && %r{application/x-ns-proxy-autoconfig} === headers['Content-Type']

  content = []
  body.each { |part| content << part }
  content = content.join

  proxy_pac = ProxyPacFile.new(source: content)

  loader.load(proxy_pac)
  linter.lint(proxy_pac)

  unless proxy_pac.valid?
    status  = 500
    content = proxy_pac.message
    headers['Content-Length'] = content.bytesize.to_s if headers['Content-Length']
  end

  [status, headers, [content]]
ensure
  body.close if body.respond_to?(:close)
end