2015-05-06 5 views
1

Ищете способ, как запустить тот же самый PSGI $app для нескольких запросов, которые не определены mount prefix. Как до mount в таком screnario? Например. пусть говорят, что я в моем app.psgiУстановка приложения PSGI по регулярному выражению - разные пути -> одно приложение

use Plack::Builder; 

my $defaultapp = sub { ... }; 
my $someapp = sub { ... }; 
my $otherapp = sub { ... }; 

builder { 

    mount '/some' => $someapp; # ok 

    #and here need something like: 
    mount "_regex_here" => $otherapp; #??? 

    mount '/' => $defaultapp; #OK - last mount is the "default" 
} 

например, запросы соответствие

  • /some/path - хочет быть обработаны $someapp (это нормально)
  • /[A-Z]\w+/\w+\.(xxx|yyy|zzz)$ - хочет быть обработаны $otherapp
  • любой другой запрос может быть обработан $defaultapp (Ok тоже)

Это, вероятно, «damm-easy», но мое чтение через Plack::Builder не дает ответа. (Каждый mount в Maual и примеры strict /path на основе ...)

EDIT: Если это не возможное благодаря mount возможно решить вышеуказанное требование в некоторой чистой (читай не хак) путь? Мне не нужно изменять PATH_INFO, а также SCRIPT_NAME (как это делает URLMap) - просто нужно запустить заданный $otherapp для согласованных запросов.

EDIT2:

Чтобы быть более ясным. $someapp и $otherapp уже существуют приложения. Особенно $otherapp - сложное приложение, которое обрабатывает каждый запрос по-своему, но запросы, которые «принадлежат» к $otherapp, можно описать с помощью регулярных выражений.

Я не могу использовать mount /fixed/prefix, потому что $otherapp создает разные URL-адреса во время выполнения, например. например, на основе активности пользователей она может создать /Abc/xyz.eee и/или /Zzz/uuu.ddd и т.д .. Поэтому я не могу префикс $otherapp как, например:

mount '/other' => $otherapp 

Теперь хочу «импорт» этот старый fashinoed $otherapp Ань новый сервер на базе PSGI и, кроме того, $defaultapp и $someapp сделают что-то с данными $otherapp. Это звучит сложно, но в реальности это не так - нужно только запустить $otherapp на основе запроса регулярного выражения, например. что-то, как в Apache SetHandler somehandler *.ext ...

+0

Как про прокси-приложение, которое перенаправляет на другой по URL-адресу? –

+0

Я использую Plack :: Builder для установки нескольких приложений Dancer2 на разных префиксах, например. '/ foo' и'/bar'.Dancer2 имеет сложную логику маршрутизации, включая подстановочные знаки и сопоставление регулярных выражений, поэтому я обрабатываю переменные маршруты. Возможно, вы могли бы сделать что-то подобное в своих приложениях? – ThisSuitIsBlackNot

ответ

0

code на самом деле

push @{$self->{_mapping}}, [ $host, $location, qr/^\Q$location\E/, $app ]; 

Как вы можете видеть, не регулярное выражение не поддерживается в $locationно может быть, вы можете обмануть его, предоставляя '\\Eregex_here\\Q' в качестве места и I не знаю, как его обмануть.

+0

Thanx - и существует какой-то _clean_ (правильный) способ решить вышеизложенное? – kobame

+2

Вы не можете отменить '\ Q' значением в цитируемой переменной. – choroba

+0

Ничего себе, никогда не знал этого. Исправлена. –