From 5684e588267f534060727ca7d33ead64eb6481bf Mon Sep 17 00:00:00 2001 From: Senad Uka Date: Mon, 13 Aug 2018 15:01:28 +0200 Subject: [PATCH] Added retrying --- Gemfile | 2 ++ Gemfile.lock | 23 +++++++++++++++++++++++ config.ru | 8 +------- lib/api/app.rb | 19 ++++++++++++++++++- lib/api/tree.rb | 10 ++++++---- lib/exceptions.rb | 13 +++++++++++++ lib/repos/tree.rb | 16 ++++++++++++++-- 7 files changed, 77 insertions(+), 14 deletions(-) create mode 100644 lib/exceptions.rb diff --git a/Gemfile b/Gemfile index d879829..1614601 100644 --- a/Gemfile +++ b/Gemfile @@ -10,3 +10,5 @@ gem "rack-indifferent", "~> 1.2" gem "sinatra-router", "~> 0.2.4" gem "rest-client", "~> 2.0" + +gem "sinatra-contrib", "~> 2.0" diff --git a/Gemfile.lock b/Gemfile.lock index 384bd80..cff3876 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,14 +1,25 @@ GEM remote: https://rubygems.org/ specs: + activesupport (5.2.1) + concurrent-ruby (~> 1.0, >= 1.0.2) + i18n (>= 0.7, < 2) + minitest (~> 5.1) + tzinfo (~> 1.1) + backports (3.11.3) + concurrent-ruby (1.0.5) domain_name (0.5.20180417) unf (>= 0.0.5, < 1.0.0) dotenv (2.5.0) http-cookie (1.0.3) domain_name (~> 0.5) + i18n (1.1.0) + concurrent-ruby (~> 1.0) mime-types (3.1) mime-types-data (~> 3.2015) mime-types-data (3.2016.0521) + minitest (5.11.3) + multi_json (1.13.1) mustermann (1.0.2) netrc (0.11.0) rack (2.0.5) @@ -26,9 +37,20 @@ GEM rack (~> 2.0) rack-protection (= 2.0.3) tilt (~> 2.0) + sinatra-contrib (2.0.3) + activesupport (>= 4.0.0) + backports (>= 2.8.2) + multi_json + mustermann (~> 1.0) + rack-protection (= 2.0.3) + sinatra (= 2.0.3) + tilt (>= 1.3, < 3) sinatra-router (0.2.4) sinatra (>= 1.4, < 3.0) + thread_safe (0.3.6) tilt (2.0.8) + tzinfo (1.2.5) + thread_safe (~> 0.1) unf (0.1.4) unf_ext unf_ext (0.0.7.5) @@ -42,6 +64,7 @@ DEPENDENCIES rest-client (~> 2.0) retries (~> 0.0.5) sinatra (~> 2.0) + sinatra-contrib (~> 2.0) sinatra-router (~> 0.2.4) BUNDLED WITH diff --git a/config.ru b/config.ru index b6cc0be..e8c8330 100644 --- a/config.ru +++ b/config.ru @@ -1,15 +1,9 @@ require 'bundler/setup' require 'dotenv/load' require 'rack/indifferent' -require 'sinatra/router' require_relative 'lib/api/tree.rb' -app = Sinatra::Router.new do - mount Pruning::API::Tree -end +run Pruning::API::Tree -map '/' do - run app -end diff --git a/lib/api/app.rb b/lib/api/app.rb index 6a12a50..97a807d 100644 --- a/lib/api/app.rb +++ b/lib/api/app.rb @@ -1,15 +1,32 @@ require 'json' require 'sinatra/base' +require 'sinatra/custom_logger' require_relative '../http/query' +require_relative '../exceptions' module Pruning module API class App < Sinatra::Base before { content_type :json } after { serialise_response } + set :show_exceptions, true + + + error Pruning::Exceptions::UnexpectedError do + status 500 + end + + error Pruning::Exceptions::OriginCannotFindTheResource do + status 404 + end + + + get '/' do + "Try /tree/:name" + end + private - def serialise_response return unless content_type == 'application/json' response.body = [JSON(response.body)] diff --git a/lib/api/tree.rb b/lib/api/tree.rb index 1705d30..22af721 100644 --- a/lib/api/tree.rb +++ b/lib/api/tree.rb @@ -1,16 +1,18 @@ require 'rest-client' +require 'retries' require_relative 'app' require_relative '../repos/tree' require_relative '../pruner' +require_relative '../exceptions' module Pruning module API class Tree < App get '/tree/:name' do - tree_repo = Pruning::Repos::Tree.new(RestClient, ENV['TREE_SOURCE_API_HOSTNAME']) - complete_tree = tree_repo.get(query.name) - pruner = Pruning::Processing::Pruner.new(complete_tree) - pruner.prune_tree(query.indicator_ids) + tree_repo = Pruning::Repos::Tree.new(RestClient, ENV['TREE_SOURCE_API_HOSTNAME']) + complete_tree = tree_repo.get(query.name) + pruner = Pruning::Processing::Pruner.new(complete_tree) + pruner.prune_tree(query.indicator_ids) end end end diff --git a/lib/exceptions.rb b/lib/exceptions.rb new file mode 100644 index 0000000..0f52d13 --- /dev/null +++ b/lib/exceptions.rb @@ -0,0 +1,13 @@ +module Pruning + module Exceptions + class ServerErrorOnOrigin < StandardError + end + + class OriginCannotFindTheResource < StandardError + end + + class UnexpectedError < StandardError + end + end +end + diff --git a/lib/repos/tree.rb b/lib/repos/tree.rb index 4a3d225..b7f61f3 100644 --- a/lib/repos/tree.rb +++ b/lib/repos/tree.rb @@ -1,6 +1,7 @@ require 'rest-client' require 'retries' require 'json' +require_relative '../exceptions' module Pruning module Repos @@ -11,8 +12,19 @@ module Pruning end def get(name) - resp = @client.get(url(name)) - JSON(resp.body) + with_retries(max_tries: 3, rescue: [Pruning::Exceptions::ServerErrorOnOrigin]) do + begin + resp = @client.get(url(name)) + rescue RestClient::ExceptionWithResponse => e + if e.response.code != 404 + raise Pruning::Exceptions::ServerErrorOnOrigin + else + raise Pruning::Exceptions::OriginCannotFindTheResource + end + end + return JSON(resp.body) + end + raise Pruning::Exceptions::UnexpectedError end private