X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/611a3323ea110671c5fa021e14f93b24e4a6d7b7..8d6ffdf2fba938e7fbb5f128664d828d2669bcfe:/apps/workbench/app/models/arvados_api_client.rb diff --git a/apps/workbench/app/models/arvados_api_client.rb b/apps/workbench/app/models/arvados_api_client.rb index 7076799f83..eb93dfcfaa 100644 --- a/apps/workbench/app/models/arvados_api_client.rb +++ b/apps/workbench/app/models/arvados_api_client.rb @@ -78,17 +78,27 @@ class ArvadosApiClient @client_mtx = Mutex.new end - def api(resources_kind, action, data=nil) + def api(resources_kind, action, data=nil, tokens={}) + profile_checkpoint if not @api_client @client_mtx.synchronize do @api_client = HTTPClient.new + @api_client.ssl_config.timeout = Rails.configuration.api_client_connect_timeout + @api_client.connect_timeout = Rails.configuration.api_client_connect_timeout + @api_client.receive_timeout = Rails.configuration.api_client_receive_timeout if Rails.configuration.arvados_insecure_https @api_client.ssl_config.verify_mode = OpenSSL::SSL::VERIFY_NONE else # Use system CA certificates - @api_client.ssl_config.add_trust_ca('/etc/ssl/certs') + ["/etc/ssl/certs/ca-certificates.crt", + "/etc/pki/tls/certs/ca-bundle.crt"] + .select { |ca_path| File.readable?(ca_path) } + .each { |ca_path| @api_client.ssl_config.add_trust_ca(ca_path) } + end + if Rails.configuration.api_response_compression + @api_client.transparent_gzip_decompression = true end end end @@ -100,8 +110,14 @@ class ArvadosApiClient url.sub! '/arvados/v1/../../', '/' query = { - 'api_token' => Thread.current[:arvados_api_token] || '', - 'reader_tokens' => (Thread.current[:reader_tokens] || []).to_json, + 'api_token' => (tokens[:arvados_api_token] || + Thread.current[:arvados_api_token] || + ''), + 'reader_tokens' => ((tokens[:reader_tokens] || + Thread.current[:reader_tokens] || + []) + + [Rails.configuration.anonymous_user_token]).to_json, + 'current_request_id' => (Thread.current[:current_request_id] || ''), } if !data.nil? data.each do |k,v| @@ -112,19 +128,20 @@ class ArvadosApiClient elsif v == false query[k] = 0 else - query[k] = JSON.dump(v) + query[k] = Oj.dump(v, mode: :compat) end end else query["_method"] = "GET" end + if @@profiling_enabled query["_profile"] = "true" end header = {"Accept" => "application/json"} - profile_checkpoint { "Prepare request #{url} #{query[:uuid]} #{query[:where]} #{query[:filters]} #{query[:order]}" } + profile_checkpoint { "Prepare request #{query["_method"] or "POST"} #{url} #{query[:uuid]} #{query.inspect[0,256]}" } msg = @client_mtx.synchronize do begin @api_client.post(url, query, header: header) @@ -133,12 +150,19 @@ class ArvadosApiClient end end profile_checkpoint 'API transaction' + if @@profiling_enabled + if msg.headers['X-Runtime'] + Rails.logger.info "API server: #{msg.headers['X-Runtime']} runtime reported" + end + Rails.logger.info "Content-Encoding #{msg.headers['Content-Encoding'].inspect}, Content-Length #{msg.headers['Content-Length'].inspect}, actual content size #{msg.content.size}" + end begin resp = Oj.load(msg.content, :symbol_keys => true) rescue Oj::ParseError resp = nil end + if not resp.is_a? Hash raise InvalidApiResponseException.new(url, msg) elsif msg.status_code != 200 @@ -212,6 +236,7 @@ class ArvadosApiClient CGI.escape(k.to_s) + '=' + CGI.escape(v.to_s) }.join('&') end + uri end def arvados_logout_url(params={})