2012-01-18 9 views
5

Vorrei poter recuperare l'URL di base della mia app Web dal codice di inizializzazione del rack nel mio config.ru. Qualcosa sulla falsariga di:È possibile ottenere l'URL di base del servizio Rack al di fuori di un gestore richieste?

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

ma non ho trovato nulla di simile che è disponibile al di fuori di un gestore di richiesta. Ovviamente, io posso fare qualcosa di simile:

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

perché la richiesta è definita in quel punto. Ma all'inizio del mio file di configurazione, nessuna di queste variabili sembra essere definita.

Esiste un metodo Rack da utilizzare per accedere a queste informazioni? È uno di quei casi in cui queste cose non sono finalizzate fino a quando l'avvio di Rack non è finito? Mi sembra di ricordare che altri framework hanno un modo per passare un proc a un metodo che verrà eseguito una volta che l'ambiente sarà "pronto". Rack ha qualcosa del genere?

+0

Cosa stai provando a impostare nel config.ru che ha bisogno di queste informazioni? – nictrix

+0

Non sto provando a * impostare * qualsiasi cosa, penso solo che sia bello per il registro mostrare dove si trova il servizio - è particolarmente utile quando un nuovo sviluppatore tenta di testare per la prima volta. – Coderer

risposta

2

Non credo sia possibile per un'applicazione Rack conoscere in anticipo il "punto di montaggio". Ad esempio, questo config.ru monta la stessa applicazione in molteplici punti di montaggio:

require 'rack' 

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

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

Rack inoltre non fornisce alcun metodo standard che è chiamato in fase di inizializzazione. Sospetto che ciò avvenga perché Rack tenta di supportare il CGI semplice, in cui è possibile creare un intero processo Ruby per gestire ogni richiesta, con il processo che si interrompe a ogni richiesta. In quella situazione, non c'è molto da usare per un metodo "init".

2

E 'circa un anno dopo, ma stavo solo lottando con lo stesso problema e ho trovato il tuo thread.

Ogni applicazione Rack fornisce un metodo di chiamata che viene chiamato dal gestore Rack. Per esempio vedi il codice di Sinatra :: Base # call. Questo metodo di chiamata viene chiamato una volta per richiesta e ha un parametro che è un hash che contiene variabili di ambiente. All'interno di questi c'è tutto ciò di cui hai bisogno e il "mount_point" che stavi richiedendo si chiama "SCRIPT_NAME".

Vedere http://www.rubydoc.info/github/rack/rack/file/SPEC per dettagli. Purtroppo questa informazione è disponibile solo per te durante una richiesta e non prima, per quanto ne so. Spero che aiuti gli altri.

Problemi correlati