LINUX.ORG.RU

Полный url с помощью url_for с подменой схемы для websocket - как?

 , ,


0

1

Есть такой хелпер встроенный url_for. Возвращает объект Mojo::URL, а у него есть методы scheme('ws') и to_abs. Последний описан как «возвращает абсолютный» url для заданного.

Я использую именованный url для вебсокета.

my $r = $self->routes;
$r->websocket('/chat')->name('wschat')->to('chat#websocket');

но вот для jQuery WS нужен полный абсолютный url. Никак не могу его получить ни в шаблоне, ни в контроллере.

Код

url_for('wschat')->scheme('ws')->to_abs
не дает никакого эффекта.

ЧЯДНТ? Как мне получить мои заветные

ws://127.0.0.1:3000/chat

?

★★★★★

возможно проблема в js коде, покажи Там же ты не напрямую обращаешься в ws://, а сначала в http стучится и просит проапгрейдить протокол связи, как то так

wwwsevolod
()
Ответ на: комментарий от wwwsevolod

Вот эту штуку использую: http://code.google.com/p/jquery-websocket/

Она делает вот так:

ws = window['MozWebSocket'] ? new MozWebSocket(url) : window['WebSocket'] ? new WebSocket(url) : null;

Вот если url передается неполный, то тут и стопарится с ошибкой.

Т.е. Прямо на конструкторе у меня:

var ws = $.websocket('ws:///chat' { ... });
//вот такой у меня получается куцый адрес.

bvn13 ★★★★★
() автор топика
Ответ на: комментарий от bvn13

так так так, слушай,откуда у тебя перл знает что он находится на каком то домене? соотвественно он и выдаст абсолютный урл до сокета, но без домена.

wwwsevolod
()
Ответ на: комментарий от wwwsevolod

Не перл. Это же Default tag helper.

Он же: http://search.cpan.org/~sri/Mojolicious-3.97/lib/Mojolicious/Controller.pm#ur...

А использую вот это в итоге: http://search.cpan.org/~sri/Mojolicious-3.97/lib/Mojo/URL.pm#to_abs

Это Mojolicious должен (имхо) узнать, что я открываю урл в браузере вида http://127.0.0.1:3000/, и он должен этот url брать за основной, не так ли?

bvn13 ★★★★★
() автор топика
Ответ на: комментарий от bvn13

вообще это не правильно, так как все равно ты это за какой нибудь веб сервер поставишь, например за nginx, и тебе надо будет слушать порт локальный всего лишь, а домен определяться на стороне nginx, по этому придется для конструктора урлов хранить домены приложения в каких нибудь конфигах, например.

Я конечно могу что то путать так как на перле можно сказать не писал, но везде так, разве нет? в общем вывод: надо хранить домены (или как в данном случае IP адреса) в конфигах, так как иначе о них не узнаешь ничего.

wwwsevolod
()
Ответ на: комментарий от wwwsevolod

Вот я даже не знаю, что думать... Смотри, вопрос на stackoverflow.

И ответ там:

url_for generates urls relative to app root. That was done for portability: you may place your app at any url and your links won't get broken.

Т.е. Этот тагхелпер как раз и предназначен для того, чтобы приложение не зависило от своего месторасположения в сети. Но что-то оно как-то не совсем работает так, как заявлено. Либо я что-то не так делаю. В этом вопросе, кстати, второй ответ явно демонстрирует правильную работу этого тагхелпера... Но у меня не выходит. :(

bvn13 ★★★★★
() автор топика
Ответ на: комментарий от bvn13

так нет же, там описывается разница между /url и url, что первый будет абсолютным второй относительным.

насколько я понял в любом случае урл делается как localhost + порт который отдан приложению, за исключением указания хоста и порта, напрмиер

perl -Mojo -E 'a("/" => sub {$s=shift;$s->render(text=>$s->url_for("/")->host("bullshit.com")->port("12345")->to_abs) })->start' get /

или например для конкретного урла

perl -Mojo -E 'a("/" => sub {$s=shift;$s->render(text=>$s->url_for("/shitshit")->host("bullshit.com")->port("12345")->to_abs) })->start' get /

пришлось разобраться немного)

wwwsevolod
()
Последнее исправление: wwwsevolod (всего исправлений: 2)
Ответ на: комментарий от wwwsevolod

Ок. Предположим, так. Вполне резонно сейчас задаться вопросом: как написать свой тагхелпер, чтобы сделать то, что нужно мне? Ну, т.е., как создавать тагхелперы я знаю. Вопрос в том, как понять, по какому УРЛ открыто приложение в браузере? :)

bvn13 ★★★★★
() автор топика
Ответ на: комментарий от bvn13

конфиги, другого правильного пути нету в крайнем случае в заголовках хттп есть что то (помоему Host) и можно их парсить на этот вопрос, так же можно со стороны вебсервера (например тоже nginx) передавать в скрипт как аргумент значение server_name - типа более переносимо, но вообще я бы не парился и делал все через конфиги.

wwwsevolod
()
Ответ на: комментарий от bvn13

а вообще я считаю, гораздо проще и не запариваясь, строить урлы на клиенте, а сервер что бы не знал о существовании домена, знал бы он тольок что висит на локалхосте и таком то порту. плюс я почти уверен что можно написать так $.websocket('/chat' { ... }); и он автоматом подберет текущий домен и порт (так как требование для сокетов - находится на том же домене и порте). а если и не умеет то это стоило бы дописать, что вполне логично и много времени не займет.

wwwsevolod
()
Ответ на: комментарий от wwwsevolod

Вот как-то jQuery Websocket (я ссылку на библу давал выше) не работает, если писать просто $.websocket('/chat', {...}).

bvn13 ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.