Могу ли я получить базовый URL-адрес моей службы Rack вне обработчика запросов? - PullRequest
5 голосов
/ 18 января 2012

Я бы хотел получить базовый URL моего веб-приложения из кода инициализации Rack в моем config.ru.Что-то вроде:

puts "Starting up on http://#{ENV['SERVER_NAME']}:#{ENV['SERVER_PORT']}/#{ENV['MOUNT_POINT']}..."

, но я не нашел ничего подобного, доступного извне обработчика запросов.Очевидно, я могу сделать что-то вроде:

...
def get
  puts "Got a request for #{ENV['rack.url_scheme']}://#{ENV['HTTP_HOST']}#{ENV['REQUEST_PATH']}"
  ...

, потому что запрос определен в этой точке.Но в начале моего конфигурационного файла ни одна из этих переменных, похоже, не была определена.

Есть ли метод Rack, который я могу использовать для доступа к этой информации?Является ли это одним из тех случаев, когда эти вещи не завершены, пока не завершится запуск Rack?Кажется, я помню другие фреймворки, в которых есть способ передать proc в метод, который будет выполнять его, когда среда будет «готова».Есть ли в Rack что-нибудь подобное?

Ответы [ 2 ]

2 голосов
/ 08 августа 2013

Это примерно год спустя, но я просто боролся с той же проблемой и нашел вашу ветку.

Каждое приложение Rack предоставляет метод вызова, который вызывается обработчиком Rack. Например, посмотрите код вызова Sinatra :: Base #. Этот метод вызова вызывается один раз за запрос и имеет один параметр, который является хешем, который содержит переменные среды. В них есть все, что вам нужно, и запрашиваемая «точка монтирования» называется «SCRIPT_NAME».

Подробнее см. http://www.rubydoc.info/github/rack/rack/file/SPEC. К сожалению, эта информация доступна вам только во время запроса, но не раньше, насколько я знаю. Надеюсь, это поможет другим.

2 голосов
/ 03 апреля 2012

Я не верю, что приложение Rack может заранее знать «точку монтирования». Например, config.ru монтирует одно и то же приложение в нескольких точках монтирования:

require 'rack'

app = proc { |env|
  [200, {'Content-Type' => 'text/plain'}, ['hello, world!']]
}

run Rack::URLMap.new('/myapp' => app,
                     '/' => app)

Rack также не предоставляет никакого стандартного метода, который вызывается во время инициализации. Я подозреваю, что это связано с тем, что Rack пытается поддерживать обычный CGI, в котором может быть создан целый процесс Ruby для обработки каждого запроса, причем процесс завершается при каждом запросе. В этой ситуации метод "init" не слишком полезен.

...