From cbf7fd64b4ba1b67a34f433392d481f6d4d96eac Mon Sep 17 00:00:00 2001 From: Dmitriy Strukov Date: Mon, 3 Apr 2017 10:26:13 +0300 Subject: [PATCH] Improved invalid host message --- Gemfile.lock | 5 ++++- lib/canvas-api.rb | 52 +++++++++++++++++++++++------------------------ spec/init_spec.rb | 12 +++++------ 3 files changed, 36 insertions(+), 33 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 611d26b..665e96f 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -5,7 +5,7 @@ GEM ethon (0.7.0) ffi (>= 1.3.0) ffi (1.9.3) - json (1.7.7) + json (2.0.3) rspec (2.13.0) rspec-core (~> 2.13.0) rspec-expectations (~> 2.13.0) @@ -24,3 +24,6 @@ DEPENDENCIES json rspec typhoeus + +BUNDLED WITH + 1.14.6 diff --git a/lib/canvas-api.rb b/lib/canvas-api.rb index 1ceda2d..f07c5cf 100644 --- a/lib/canvas-api.rb +++ b/lib/canvas-api.rb @@ -6,7 +6,7 @@ module Canvas class API - def initialize(args={}) + def initialize(args={}) @host = args[:host] && args[:host].to_s @token = args[:token] && args[:token].to_s @client_id = args[:client_id] && args[:client_id].to_s @@ -14,32 +14,32 @@ def initialize(args={}) @insecure = !!args[:insecure] raise "host required" unless @host raise "invalid host, protocol required" unless @host.match(/^http/) - raise "invalid host" unless @host.match(/^https?:\/\/[^\/]+$/) + raise "invalid host (try changing to #{host.match(/^https?:\/\/[^\/]+/)})" unless @host.match(/^https?:\/\/[^\/]+$/) raise "token or client_id required" if !@token && !@client_id raise "secret required for client_id configuration" if @client_id && !@secret end - + attr_accessor :host attr_accessor :token attr_accessor :client_id - + def masquerade_as(user_id) @as_user_id = user_id && user_id.to_s end - + def stop_masquerading @as_user_id = nil end - + def self.encode_id(prefix, id) return nil unless prefix && id "hex:#{prefix}:" + id.to_s.unpack("H*")[0] end - + def encode_id(prefix, id) Canvas::API.encode_id(prefix, id) end - + def oauth_url(callback_url, scopes="") raise "client_id required for oauth flow" unless @client_id raise "secret required for oauth flow" unless @secret @@ -49,11 +49,11 @@ def oauth_url(callback_url, scopes="") scopes = scopes.length > 0 ? "&scopes=#{CGI.escape(scopes)}" : "" "#{@host}/login/oauth2/auth?client_id=#{@client_id}&response_type=code&redirect_uri=#{CGI.escape(callback_url)}#{scopes}" end - + def login_url(callback_url) oauth_url(callback_url, "/auth/userinfo") end - + def retrieve_access_token(code, callback_url) raise "client_id required for oauth flow" unless @client_id raise "secret required for oauth flow" unless @secret @@ -67,11 +67,11 @@ def retrieve_access_token(code, callback_url) end res end - + def logout !!delete("/login/oauth2/token")['logged_out'] end - + def validate_call(endpoint) raise "token required for api calls" unless @token raise "missing host" unless @host @@ -80,7 +80,7 @@ def validate_call(endpoint) raise "invalid endpoint" unless endpoint.match(/^\/api\/v\d+\//) unless @token == 'ignore' raise "invalid endpoint" unless (URI.parse(endpoint) rescue nil) end - + def generate_uri(endpoint, params=nil) validate_call(endpoint) unless @token == "ignore" @@ -102,7 +102,7 @@ def generate_uri(endpoint, params=nil) @http.use_ssl = @uri.scheme == 'https' @uri end - + def retrieve_response(request) request.options[:headers]['User-Agent'] = "CanvasAPI Ruby" if @insecure @@ -122,7 +122,7 @@ def retrieve_response(request) if !response.code.to_s.match(/2\d\d/) json['message'] ||= "unexpected error" json['status'] ||= response.code.to_s - raise ApiError.new("#{json['status']} #{json['message']}") + raise ApiError.new("#{json['status']} #{json['message']}") end else json = ResultSet.new(self, json) @@ -133,12 +133,12 @@ def retrieve_response(request) end json end - + # Semi-hack so I can write better specs def get_request(endpoint) Typhoeus::Request.new(@uri.to_s, method: :get) end - + def get(endpoint, params=nil) generate_uri(endpoint, params) request = get_request(endpoint) @@ -152,7 +152,7 @@ def delete(endpoint, params={}) request.options[:body] = clean_params(params) retrieve_response(request) end - + def put(endpoint, params={}) query_parameters = params.is_a?(Hash) ? params['query_parameters'] || params[:query_parameters] : {} generate_uri(endpoint, query_parameters) @@ -160,7 +160,7 @@ def put(endpoint, params={}) request.options[:body] = clean_params(params) retrieve_response(request) end - + def post(endpoint, params={}) query_parameters = params.is_a?(Hash) ? params['query_parameters'] || params[:query_parameters] : {} generate_uri(endpoint, query_parameters) @@ -198,7 +198,7 @@ def clean_params(params, prefix=nil) end res end - + def upload_file_from_local(endpoint, file, opts={}) raise "Missing File object" unless file.is_a?(File) params = { @@ -212,7 +212,7 @@ def upload_file_from_local(endpoint, file, opts={}) elsif opts[:parent_folder_path] || opts['parent_folder_path'] params[:parent_folder_path] = opts[:parent_folder_path] || opts['parent_folder_path'] end - + res = post(endpoint, params) if !res['upload_url'] raise ApiError.new("Unexpected error: #{res['message'] || 'no upload URL returned'}") @@ -222,7 +222,7 @@ def upload_file_from_local(endpoint, file, opts={}) res = get(status_path) res end - + def multipart_upload(url, upload_params, params, file) req = Typhoeus::Request.new(url, method: :post) upload_params.each do |k, v| @@ -235,7 +235,7 @@ def multipart_upload(url, upload_params, params, file) raise ApiError.new("Unexpected error: #{res.body}") if !res.headers['Location'] res.headers['Location'] end - + def upload_file_from_url(endpoint, opts) asynch = opts.delete('asynch') || opts.delete(:asynch) ['url', 'name', 'size'].each do |k| @@ -277,11 +277,11 @@ def initialize(api, arr) end attr_accessor :next_endpoint attr_accessor :link - + def more? !!next_endpoint end - + def next_page! ResultSet.new(@api, []) unless next_endpoint more = @api.get(next_endpoint) @@ -321,4 +321,4 @@ def recursively_generate_pairs(h, prefix, pairs) end end end -end \ No newline at end of file +end diff --git a/spec/init_spec.rb b/spec/init_spec.rb index 7736c78..800b776 100644 --- a/spec/init_spec.rb +++ b/spec/init_spec.rb @@ -5,23 +5,23 @@ expect { Canvas::API.new }.to raise_error(RuntimeError, "host required") expect { Canvas::API.new(:host => nil) }.to raise_error(RuntimeError, "host required") end - + it "should error if invalid host provided" do expect { Canvas::API.new(:host => "canvas.example.com") }.to raise_error(RuntimeError, "invalid host, protocol required") expect { Canvas::API.new(:host => "ftp://canvas.example.com") }.to raise_error(RuntimeError, "invalid host, protocol required") - expect { Canvas::API.new(:host => "http://canvas.example.com/") }.to raise_error(RuntimeError, "invalid host") - expect { Canvas::API.new(:host => "http://canvas.example.com/") }.to raise_error(RuntimeError, "invalid host") + expect { Canvas::API.new(:host => "http://canvas.example.com/") }.to raise_error(RuntimeError, "invalid host (try changing to http://canvas.example.com)") + expect { Canvas::API.new(:host => "http://canvas.example.com/") }.to raise_error(RuntimeError, "invalid host (try changing to http://canvas.example.com)") end it "should error if no token or client id provided" do expect { Canvas::API.new(:host => "http://canvas.example.com") }.to raise_error(RuntimeError, "token or client_id required") expect { Canvas::API.new(:host => "http://canvas.example.com", :token => nil) }.to raise_error(RuntimeError, "token or client_id required") end - + it "should accept valid configurations" do expect { Canvas::API.new(:host => "http://canvas.example.com", :token => "abc") }.to_not raise_error expect { Canvas::API.new(:host => "http://canvas.api.of.coolness.example.com", :client_id => 123) }.to raise_error(RuntimeError, "secret required for client_id configuration") expect { Canvas::API.new(:host => "http://canvas.api.of.coolness.example.com", :client_id => 123, :secret => "abc") }.to_not raise_error end - -end \ No newline at end of file + +end