У меня есть приложение rails с конечной точкой GraphQL, которое принимает большие объемы данных. Один пост может легко быть 500Kb. Я столкнулся с key_space_limit
;
Rack::Utils.key_space_limit = 8 * 65536
но я хотел бы дать пользователям API полезную ошибку, если они превышают лимит 512 КБ. В настоящее время это 500 Internal Server Error
, что не идеально.
Я попытался спасти RangeErrors
в контроллере graphql
def execute
...
rescue RangeError => e
render json: { error: { message: "message too large, please limit messages to 512Kb"}, data: {} }, status: 400
end
однако я все еще получаю RangeError
;
2019-01-14 13:04:23 -0500: Rack app error handling request { POST /graphql }
#<RangeError: exceeded available parameter key space>
Я также не могу повторить проблему в тестах контроллера. Этот тест не провалится, как если бы он был запущен в процессе разработки или производства;
test "large posts should work" do
request.headers['HTTP_ACCESS_TOKEN'] = @biometric_token.token
lots_of_biometrics = ''
10000.times do
lots_of_biometrics += '''
{
value: 80
type: weight
source: "really long string that take up loads of space because"
notes: "another really long string because we are testing large posts to the graphql endpoint"
},
'''
end
large_query = """
mutation {
BulkCreate(
biometrics: [#{lots_of_biometrics}]
) {
id
records_total
}
}
"""
Sidekiq::Testing.inline! do
post :execute, format: :json, body: large_query
end
body = JSON.parse(response.body)
assert_response :success
end
Я предполагаю, что ошибка происходит на более высоком уровне абстракции, чем контроллер. Мне известно о рисках DDoS при увеличении key_space_limit
, поэтому я предполагаю, что это сделано специально. Но есть ли у кого-нибудь предложения дать полезный ответ пользователям API, когда они превышают лимит?