class CartoCSSHelper::OverpassDownloader

Public Class Methods

cache_filename(query) click to toggle source
# File lib/cartocss_helper/overpass_downloader.rb, line 12
def self.cache_filename(query)
  hash = Digest::SHA1.hexdigest query
  query_cache_filename = CartoCSSHelper::Configuration.get_path_to_folder_for_overpass_cache + hash + '_query.cache'
  return query_cache_filename
end
cache_timestamp(query) click to toggle source
# File lib/cartocss_helper/overpass_downloader.rb, line 18
def self.cache_timestamp(query)
  downloader = GenericCachedDownloader.new
  return downloader.get_cache_timestamp(cache_filename(query))
end
escape_query(query) click to toggle source
# File lib/cartocss_helper/overpass_downloader.rb, line 59
def self.escape_query(query)
  # code causing bug - (// inside quotes, as predicted) - why it was even added?
  #query = query.gsub(/\/\/.*\n/, '') # add proper parsing - it will mutilate // inside quotes etc
  # TODO: replace complaint above by a test
  # maybe URI.escape(query, "/") is sufficient?

  # escape backslash - turns \ into \\
  query = query.gsub('\\', '\\\\')

  # newlines, tabs added in query for readability may be safely deleted
  query = query.delete("\n")
  query = query.delete("\t")

  #query = URI.escape(query) # no escaping for / [add require 'uri' to use it]
  #query = URI.escape(query, "/") # escapes only / [add require 'uri' to use it]
  #query = CGI.escape(query) # escapes spaces to + sign
  
  query = Addressable::URI.encode_component(query, Addressable::URI::CharacterClasses::QUERY)
        query = query.gsub("/", "%2F") # escape slashes manually

  # inside query also & and + must be escaped (entire query is an url parameter)
  query = query.gsub("&", "%26")
  query = query.gsub('+', '%2B')
  return query
end
format_query_into_url(query) click to toggle source
# File lib/cartocss_helper/overpass_downloader.rb, line 85
def self.format_query_into_url(query)
  query = escape_query(query)
  if query.length > 8174 #8175 is too much and allows crashes
    raise 'see https://github.com/matkoniecz/CartoCSSHelper/issues/35'
  end
  base_overpass_url = OverpassDownloader.get_overpass_instance_url
  return base_overpass_url + '/interpreter?data=' + query
end
get_allowed_timeout_in_seconds() click to toggle source
# File lib/cartocss_helper/overpass_downloader.rb, line 55
def self.get_allowed_timeout_in_seconds
  return 10 * 60
end
get_overpass_instance_url() click to toggle source
# File lib/cartocss_helper/overpass_downloader.rb, line 94
def self.get_overpass_instance_url
  return CartoCSSHelper::Configuration.get_overpass_instance_url
end
run_overpass_query(query, description, invalidate_cache: false) click to toggle source
# File lib/cartocss_helper/overpass_downloader.rb, line 23
def self.run_overpass_query(query, description, invalidate_cache: false)
  url = OverpassDownloader.format_query_into_url(query)
  timeout = OverpassDownloader.get_allowed_timeout_in_seconds
  downloader = GenericCachedDownloader.new(timeout: timeout, stop_on_timeout: false)
  return downloader.get_specified_resource(url, cache_filename(query), description: description, invalidate_cache: invalidate_cache)
rescue RequestTimeout => e
  puts 'Overpass API refused to process this request. It will be not attempted again, most likely query is too complex. It is also possible that Overpass servers are unavailable'
  puts
  puts query
  puts
  puts url
  puts
  puts e
  raise OverpassRefusedResponse
rescue ExceptionWithResponse => e
  if e.http_code == 400
    puts "invalid query"
    puts
    puts query
    puts
    puts url
    puts
    puts "url with %20 replaced back by spaces, %22 by \""
    puts url.replace("%20", " ").replace("%22", '"')
    puts
    puts e
  elsif e.http_code == 414
    puts 'see https://github.com/matkoniecz/CartoCSSHelper/issues/35'
  end
  raise e
end