X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/89285c343d05bc7ceef55a46c4ebb38d9b047baf..c3695bc7282996d66fb1922d7971aa86fb497968:/services/api/app/controllers/application_controller.rb diff --git a/services/api/app/controllers/application_controller.rb b/services/api/app/controllers/application_controller.rb index 4f0364f15a..54d5adb439 100644 --- a/services/api/app/controllers/application_controller.rb +++ b/services/api/app/controllers/application_controller.rb @@ -27,6 +27,7 @@ class ApplicationController < ActionController::Base ERROR_ACTIONS = [:render_error, :render_not_found] + before_filter :set_cors_headers before_filter :respond_with_json_by_default before_filter :remote_ip before_filter :load_read_auths @@ -35,6 +36,7 @@ class ApplicationController < ActionController::Base before_filter :catch_redirect_hint before_filter(:find_object_by_uuid, except: [:index, :create] + ERROR_ACTIONS) + before_filter :load_required_parameters before_filter :load_limit_offset_order_params, only: [:index, :contents] before_filter :load_where_param, only: [:index, :contents] before_filter :load_filters_param, only: [:index, :contents] @@ -345,6 +347,13 @@ class ApplicationController < ActionController::Base end end + def set_cors_headers + response.headers['Access-Control-Allow-Origin'] = '*' + response.headers['Access-Control-Allow-Methods'] = 'GET, HEAD, PUT, POST, DELETE' + response.headers['Access-Control-Allow-Headers'] = 'Authorization' + response.headers['Access-Control-Max-Age'] = '86486400' + end + def respond_with_json_by_default html_index = request.accepts.index(Mime::HTML) if html_index.nil? or request.accepts[0...html_index].include?(Mime::JSON) @@ -446,6 +455,40 @@ class ApplicationController < ActionController::Base end end + def load_required_parameters + (self.class.send "_#{params[:action]}_requires_parameters" rescue {}). + each do |key, info| + if info[:required] and not params.include?(key) + raise ArgumentError.new("#{key} parameter is required") + elsif info[:type] == 'boolean' + # Make sure params[key] is either true or false -- not a + # string, not nil, etc. + if not params.include?(key) + params[key] = info[:default] + elsif [false, 'false', '0', 0].include? params[key] + params[key] = false + elsif [true, 'true', '1', 1].include? params[key] + params[key] = true + else + raise TypeError.new("#{key} parameter must be a boolean, true or false") + end + end + end + true + end + + def self._create_requires_parameters + { + ensure_unique_name: { + type: "boolean", + description: "Adjust name to ensure uniqueness instead of returning an error on (owner_uuid, name) collision.", + location: "query", + required: false, + default: false + } + } + end + def self._index_requires_parameters { filters: { type: 'array', required: false },