require "uri"
module FmRest
module V1
module Connection
BASE_PATH = "/fmi/data/v1"
DATABASES_PATH = "#{BASE_PATH}/databases"
= { "User-Agent" => "fmrest-ruby/#{::FmRest::VERSION} Faraday/#{::Faraday::VERSION}" }.freeze
= .merge("Content-Type" => "application/json").freeze
CLARIS_ID_HTTP_AUTH_TYPE = "FMID"
FILEMAKER_CLOUD_HOST_MATCHER = /\.filemaker-cloud\.com\Z/.freeze
def build_connection(settings = FmRest.default_connection_settings, &block)
settings = ConnectionSettings.wrap(settings)
base_connection(settings, headers: ) do |conn|
conn.use RaiseErrors
conn.use TokenSession, settings
conn.request :multipart
conn.request :json
if block_given?
yield conn, settings
else
conn.use TypeCoercer, settings
conn.response :json, content_type: /\bjson$/
end
if settings.log
conn.response :logger, FmRest.logger, bodies: true, headers: true, log_level: settings.log_level
end
conn.adapter Faraday.default_adapter
end
end
def auth_connection(settings = FmRest.default_connection_settings)
settings = ConnectionSettings.wrap(settings)
if is_cloud_host = cloud_host?(settings)
FmRest.require_cloud_support
end
base_connection(settings, headers: ) do |conn|
conn.use Cloud::AuthErrorHandler, settings if is_cloud_host
conn.use RaiseErrors
if settings.fmid_token?
conn.request :authorization, CLARIS_ID_HTTP_AUTH_TYPE, -> { settings.fmid_token }
elsif is_cloud_host
conn.request :authorization, CLARIS_ID_HTTP_AUTH_TYPE, -> { Cloud::ClarisIdTokenManager.new(settings).fetch_token }
else
conn.request :authorization, :basic, settings.username!, settings.password!
end
if settings.log
conn.response :logger, FmRest.logger, bodies: true, headers: true, log_level: settings.log_level
end
conn.response :json, content_type: /\bjson$/
conn.adapter Faraday.default_adapter
end
end
def base_connection(settings = FmRest.default_connection_settings, faraday_options = nil, &block)
settings = ConnectionSettings.wrap(settings)
host = settings.host!
scheme = "https"
if host.match(/\Ahttps?:\/\//)
uri = URI(host)
host = uri.hostname
host += ":#{uri.port}" if uri.port != uri.default_port
scheme = uri.scheme
end
faraday_options = (faraday_options || {}).dup
faraday_options[:ssl] = settings.ssl if settings.ssl?
faraday_options[:proxy] = settings.proxy if settings.proxy?
database = V1.url_encode(settings.database!)
Faraday.new(
"#{scheme}://#{host}#{DATABASES_PATH}/#{database}/".freeze,
faraday_options,
&block
)
end
private
def cloud_host?(settings)
if settings.cloud == :auto
return FILEMAKER_CLOUD_HOST_MATCHER =~ settings.host
end
settings.cloud
end
end
end
end