Skip to content

Commit 608191e

Browse files
committed
Merge pull request #525 from dblock/default-error-status-500
Default error status 500
2 parents 9b86c32 + 6b35a04 commit 608191e

File tree

8 files changed

+39
-14
lines changed

8 files changed

+39
-14
lines changed

CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ Next Release
55

66
* [#510](https://github.com/intridea/grape/pull/510): Support lambda-based default values for params - [@myitcv](https://github.com/myitcv).
77
* [#511](https://github.com/intridea/grape/pull/511): Add `required` option for OAuth2 middleware - [@bcm](https://github.com/bcm).
8+
* [#520](https://github.com/intridea/grape/pull/520): Use `default_error_status` to specify the default status code returned from `error!` - [@salimane](https://github.com/salimane).
9+
* [#525](https://github.com/intridea/grape/pull/525): The default status code returned from `error!` has been changed from 403 to 500 - [@dblock](https://github.com/dblock).
810
* Your contribution here.
911

1012
#### Fixes

README.md

+13
Original file line numberDiff line numberDiff line change
@@ -688,6 +688,19 @@ instead of a message.
688688
error!({ "error" => "unexpected error", "detail" => "missing widget" }, 500)
689689
```
690690

691+
### Default Error HTTP Status Code
692+
693+
By default Grape returns a 500 status code from `error!`. You can change this with `default_error_status`.
694+
695+
``` ruby
696+
class API < Grape::API
697+
default_error_status 400
698+
get '/example' do
699+
error! "This should have http status code 400"
700+
end
701+
end
702+
```
703+
691704
### Handling 404
692705

693706
For Grape to handle all the 404s for your API, it can be useful to use a catch-all.

lib/grape/endpoint.rb

+4-3
Original file line numberDiff line numberDiff line change
@@ -202,8 +202,9 @@ def version
202202
# end user with the specified message.
203203
#
204204
# @param message [String] The message to display.
205-
# @param status [Integer] the HTTP Status Code. Defaults to 403.
206-
def error!(message, status = 403)
205+
# @param status [Integer] the HTTP Status Code. Defaults to default_error_status, 500 if not set.
206+
def error!(message, status = nil)
207+
status = settings[:default_error_status] unless status
207208
throw :error, message: message, status: status
208209
end
209210

@@ -405,7 +406,7 @@ def build_middleware
405406
b.use Rack::Head
406407
b.use Grape::Middleware::Error,
407408
format: settings[:format],
408-
default_status: settings[:default_error_status] || 403,
409+
default_status: settings[:default_error_status] || 500,
409410
rescue_all: settings[:rescue_all],
410411
rescued_errors: aggregate_setting(:rescued_errors),
411412
default_error_formatter: settings[:default_error_formatter],

lib/grape/middleware/error.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ module Middleware
55
class Error < Base
66
def default_options
77
{
8-
default_status: 403, # default status returned on error
8+
default_status: 500, # default status returned on error
99
default_message: "",
1010
format: :txt,
1111
formatters: {},

spec/grape/api_spec.rb

+12-3
Original file line numberDiff line numberDiff line change
@@ -993,7 +993,7 @@ def three
993993
raise "rain!"
994994
end
995995
get '/exception'
996-
last_response.status.should eql 403
996+
last_response.status.should eql 500
997997
end
998998

999999
it 'rescues only certain errors if rescue_from is called with specific errors' do
@@ -1002,7 +1002,7 @@ def three
10021002
subject.get('/unrescued') { raise "beefcake" }
10031003

10041004
get '/rescued'
1005-
last_response.status.should eql 403
1005+
last_response.status.should eql 500
10061006

10071007
lambda { get '/unrescued' }.should raise_error
10081008
end
@@ -1477,7 +1477,16 @@ def self.call(object, env)
14771477
raise "rain!"
14781478
end
14791479
get '/exception'
1480-
last_response.status.should eql 403
1480+
last_response.status.should eql 500
1481+
end
1482+
it 'uses the default error status in error!' do
1483+
subject.rescue_from :all
1484+
subject.default_error_status 400
1485+
subject.get '/exception' do
1486+
error! "rain!"
1487+
end
1488+
get '/exception'
1489+
last_response.status.should eql 400
14811490
end
14821491
end
14831492

spec/grape/endpoint_spec.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -464,7 +464,7 @@ def app
464464
end
465465

466466
get '/hey'
467-
last_response.status.should == 403
467+
last_response.status.should == 500
468468
last_response.body.should == "This is not valid."
469469
end
470470

spec/grape/middleware/error_spec.rb

+2-2
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,10 @@ def app
3131
last_response.body.should == 'Awesome stuff.'
3232
end
3333

34-
it 'defaults to a 403 status' do
34+
it 'defaults to a 500 status' do
3535
ErrApp.error = {}
3636
get '/'
37-
last_response.status.should == 403
37+
last_response.status.should == 500
3838
end
3939

4040
it 'has a default message' do

spec/grape/middleware/exception_spec.rb

+4-4
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ def call(env)
1515
# raises a hash error
1616
class ErrorHashApp
1717
class << self
18-
def error!(message, status = 403)
18+
def error!(message, status)
1919
throw :error, message: { error: message, detail: "missing widget" }, status: status
2020
end
2121

@@ -28,7 +28,7 @@ def call(env)
2828
# raises an error!
2929
class AccessDeniedApp
3030
class << self
31-
def error!(message, status = 403)
31+
def error!(message, status)
3232
throw :error, message: message, status: status
3333
end
3434

@@ -70,13 +70,13 @@ def call(env)
7070
last_response.body.should == "rain!"
7171
end
7272

73-
it 'defaults to a 403 status' do
73+
it 'defaults to a 500 status' do
7474
@app ||= Rack::Builder.app do
7575
use Grape::Middleware::Error, rescue_all: true
7676
run ExceptionApp
7777
end
7878
get '/'
79-
last_response.status.should == 403
79+
last_response.status.should == 500
8080
end
8181

8282
it 'is possible to specify a different default status code' do

0 commit comments

Comments
 (0)