Rescue Rack RangeError в контроллере - PullRequest
0 голосов
/ 14 января 2019

У меня есть приложение 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, когда они превышают лимит?

...