Module: Dhall::Resolvers

Defined in:
lib/dhall/resolve.rb

Defined Under Namespace

Modules: NoCache Classes: Default, LocalOnly, None, RamCache, ReadPathAndIPFSSources, ResolutionSet, SourceWithDeadline, Standard, StandardFileCache

Constant Summary collapse

ReadPathSources =
lambda do |sources|
  sources.map do |source|
    Promise.resolve(nil).then { source.pathname.binread }
  end
end
ReadEnvironmentSources =
lambda do |sources|
  sources.map do |source|
    Promise.resolve(nil).then do
      ENV.fetch(source.var) do
        raise ImportFailedException, "No #{source}"
      end
    end
  end
end
PreflightCORS =
lambda do |source, parent_origin|
  timeout = source.deadline.timeout
  uri = source.uri
  if parent_origin != "localhost" && parent_origin != source.origin
    req = Net::HTTP::Options.new(uri)
    req["Origin"] = parent_origin
    req["Access-Control-Request-Method"] = "GET"
    req["Access-Control-Request-Headers"] =
      source.headers.map { |h| h.fetch("header").to_s }.join(",")
    r = Net::HTTP.start(
      uri.hostname,
      uri.port,
      use_ssl:       uri.scheme == "https",
      open_timeout:  timeout,
      ssl_timeout:   timeout,
      read_timeout:  timeout,
      write_timeout: timeout
    ) { |http| http.request(req) }

    raise ImportFailedException, source if r.code != "200"
    unless r["Access-Control-Allow-Origin"] == parent_origin ||
           r["Access-Control-Allow-Origin"] == "*"
      raise ImportBannedException, source
    end
  end
end
ReadHttpSources =
lambda do |sources, parent_origin|
  sources.map do |source|
    Promise.resolve(nil).then do
      PreflightCORS.call(source, parent_origin)
      timeout = source.deadline.timeout
      uri = source.uri
      req = Net::HTTP::Get.new(uri)
      source.headers.each do |header|
        req[header.fetch("header").to_s] = header.fetch("value").to_s
      end
      r = Net::HTTP.start(
        uri.hostname,
        uri.port,
        use_ssl:       uri.scheme == "https",
        open_timeout:  timeout,
        ssl_timeout:   timeout,
        read_timeout:  timeout,
        write_timeout: timeout
      ) { |http| http.request(req) }

      raise ImportFailedException, source if r.code != "200"
      r.body
    end
  end
end
StandardReadHttpSources =
lambda do |sources, parent_origin|
  ReadHttpSources.call(sources, parent_origin).map do |source_promise|
    source_promise.then do |s|
      s = s.force_encoding("UTF-8")
      unless s.valid_encoding?
        raise ImportFailedException, "#{s.inspect} is not valid UTF-8"
      end
      s
    end
  end
end
RejectSources =
lambda do |sources|
  sources.map do |source|
    Promise.new.reject(ImportBannedException.new(source))
  end
end