class BeValidAsset::BeValidBase

Abstract base class for other matchers

Private Instance Methods

call_validator(query_params) click to toggle source
# File lib/be_valid_asset/be_valid_base.rb, line 71
def call_validator(query_params)
  check_net_enabled
  boundary = Digest::MD5.hexdigest(Time.now.to_s)
  data = encode_multipart_params(boundary, query_params)
  return http_start(validator_host).post2(validator_path, data, "Content-type" => "multipart/form-data; boundary=#{boundary}" )
end
check_net_enabled() click to toggle source
# File lib/be_valid_asset/be_valid_base.rb, line 12
def check_net_enabled
  if ENV["NONET"] == 'true'
    raise BeValidAsset::DontRunValidAssetSpecs.new('Network tests disabled')
  end
end
encode_multipart_params(boundary, params = {}) click to toggle source
# File lib/be_valid_asset/be_valid_base.rb, line 78
def encode_multipart_params(boundary, params = {})
  ret = ''
  params.each do |k,v|
    unless v.empty?
      ret << "\r\n--#{boundary}\r\n"
      ret << "Content-Disposition: form-data; name=\"#{k.to_s}\"\r\n\r\n"
      ret << v
    end
  end
  ret << "\r\n--#{boundary}--\r\n"
  ret
end
get_validator_response(query_params = {}) click to toggle source
# File lib/be_valid_asset/be_valid_base.rb, line 54
def get_validator_response(query_params = {})
  if Configuration.enable_caching
    digest = Digest::MD5.hexdigest(query_params.to_a.sort {|a,b| a[0].to_s<=>b[0].to_s}.join)
    cache_filename = File.join(Configuration.cache_path, digest)
    if File.exist? cache_filename
      response = File.open(cache_filename) {|f| Marshal.load(f) }
    else
      response = call_validator( query_params )
      File.open(cache_filename, 'w') {|f| Marshal.dump(response, f) } if response.is_a? Net::HTTPSuccess
    end
  else
    response = call_validator( query_params )
  end
  raise "HTTP error: #{response.code}" unless response.is_a? Net::HTTPSuccess
  return response
end
http_start(host) click to toggle source
# File lib/be_valid_asset/be_valid_base.rb, line 91
def http_start(host)
  uri = URI.parse(host)
  uri = URI.parse("http://#{host}") if uri.scheme.nil?
  if uri.scheme == 'https'
    http = Net::HTTP.new uri.host, uri.port
    http.verify_mode = OpenSSL::SSL::VERIFY_NONE
    http.use_ssl = true
    http.start
  elsif ENV['http_proxy']
    proxy_uri = URI.parse(ENV['http_proxy'])
    proxy_user, proxy_pass = proxy_uri.userinfo.split(/:/) if proxy_uri.userinfo
    Net::HTTP.start(uri.host, uri.port, proxy_uri.host, proxy_uri.port, proxy_user, proxy_pass)
  else
    Net::HTTP.start(uri.host, uri.port)
  end
end
process_errors(query_params, response) click to toggle source
# File lib/be_valid_asset/be_valid_base.rb, line 34
def process_errors(query_params, response)
  fragment = query_params[:fragment] || query_params[:text]
  if Configuration.display_invalid_content || Configuration.display_invalid_lines
    lines = fragment.split($/)
  end
  lines.each_with_index{|line, index| @message << "#{'%04i' % (index+1)} : #{line}#{$/}"} if Configuration.display_invalid_content
  REXML::Document.new(response.body).root.each_element('//m:error') do |e|
    @message << "#{error_line_prefix}: line #{e.elements['m:line'].text}: #{e.elements['m:message'].get_text.value.strip}\n"
    if Configuration.display_invalid_lines
      line_no = e.elements['m:line'].text.to_i
      start_line = [line_no - (Configuration.display_invalid_lines_count / 2), 1].max
      end_line = [line_no + (Configuration.display_invalid_lines_count / 2), lines.length].min
      for i in start_line..end_line
        @message << "#{'%04i' % i}#{ i == line_no ? '>>' : '  ' }: #{ lines[i - 1] }#{ $/ }"
      end
      @message << "------\n"
    end
  end
end
response_indicates_valid?(response) click to toggle source
# File lib/be_valid_asset/be_valid_base.rb, line 30
def response_indicates_valid?(response)
  response['x-w3c-validator-status'] == 'Valid'
end
validate(query_params) click to toggle source
# File lib/be_valid_asset/be_valid_base.rb, line 18
def validate(query_params)
  query_params.merge!( {:output => 'soap12' } )
  response = get_validator_response(query_params)

  markup_is_valid = response_indicates_valid?(response)
  @message = ''
  unless markup_is_valid
    process_errors(query_params, response)
  end
  return markup_is_valid
end