2012-02-07 15 views
6

Questa è una domanda molto semplice: come posso eseguire un'applicazione Yesod in grado di gestire più host contemporaneamente?Applicazione Yesod indipendente dal nome host

Un'impostazione predefinita di Yesod può gestire le connessioni in arrivo da qualsiasi host, ma tutti gli URL sono resi con approot anteposto a loro. È possibile eseguire l'override di joinPath nella dichiarazione dell'istanza di Yesod, se esiste un modo per archiviare il dominio corrente in modo che sia disponibile per tale funzione, ma non lo è.

Il metodo descritto su this wiki page funziona, ma è molto fastidioso, poiché obbliga le rotte a prendere un ulteriore parametro domain (poiché non ho un set statico di domini con cui confrontarlo). Per scopi pratici (perché ho molti percorsi, alcuni dei quali indipendenti dal dominio), sarebbe meglio avere una soluzione che lascia intatti i percorsi, dal momento che è ancora possibile ottenere il nome host dalle informazioni di richiesta WAI all'interno di una funzione di gestore.

Uso le cose che richiedono URL assoluti (ad esempio e-mail, RSS, API XML) quindi approot _ = "" non è un'opzione.

Non conosco e non posso conoscere tutti i nomi host, che devono essere supportati, in fase di compilazione.

Quindi, come posso eseguire il rendering degli URL in modo che utilizzino il nome host della richiesta in entrata e non la variabile approot?

risposta

3

Un approccio consiste nell'includere il nome di dominio effettivo nel tipo di base e utilizzare un middleware che esegue il farm all'applicazione appropriata in base alla richiesta, generandone di nuovi se necessario. Tuttavia, questo sembra troppo pesante.

Voglio lasciare l'approvazione come è, poiché si adatta al caso generale, ma forse possiamo aggiungere un metodo aggiuntivo approotRequest a cui sarebbe stato assegnato il valore Request. Mi piacerebbe spostare questa discussione sulla lista.

Aggiornamento: Variazione già atterrato a Git: https://github.com/yesodweb/yesod/commit/4dd9880389e3b61f976e44525ae97831ec578a17

+0

sarò A seguito della discussione, e gradirebbe un aggiornamento a questa risposta (per gli altri utenti) una volta che una soluzione è in pronti contro termine. Grazie! – dflemstr