Обойти фильтр not_found в Синатре - PullRequest
0 голосов
/ 03 февраля 2020

Я пытаюсь настроить Sinatra на

  1. Показывать простую строку 404 во всех запросах, которые не найдены.
  2. Отправлять пользовательский видеофайл 404 по одному маршруту, когда Маршрут не может выполнить запрос.

Минимальный код для отображения проблемы:

# somefile.txt
some content

# server.rb
require 'sinatra'
require 'sinatra/reloader'

set :bind, '0.0.0.0'
set :port, 3000

not_found do
  content_type :text
  "404 Not Found"
end

get '/test' do
  # in reality this is a video file, not a text file.

  # .. do some work here, and if failed, send 404 file ...

  # this does not work, since it triggers the not_found filter above
  send_file "somefile.txt", type: :text, status: 404

  # this works, but with 200 instead of 404
  # send_file "somefile.txt", type: :text
end

Фильтр not_found захватывает все, даже send_file ... status: 404

Мне кажется, это немного похоже на ошибку в send_file, но, возможно, я ошибаюсь.

Есть ли способ указать «пропустить фильтр not_found» или любой другой более подходящий способ для достижения этой цели?

Имейте в виду, что на самом деле этот сервер должен возвращать не найденное видео файл, а не текстовый файл. Я использовал здесь текст только для простоты.

1 Ответ

1 голос
/ 03 февраля 2020

Это не ошибка, как указано в документации ,

Когда возникает исключение Sinatra::NotFound или код состояния ответа 404, обработчик not_found вызывается:

Я полагаю, что вы можете решить проблему, заменив переопределение not_found обработкой ошибок следующим образом:

error Sinatra::NotFound do
  content_type :text
  "404 Not Found"
end

Это должно срабатывать только при ошибке, а не при ответе код.

...