При попытке подписаться на канал с названием "общедоступный" с Метеор, специализированный веб-сервер для push-уведомлений в реальном времени с использованием КОМЕТА, Получаю желаемый ответ:
<script>ch("public",0)</script>
Когда HTTP-запрос:
GET /push/131530959548387383/xhrinteractive/public?nc=1315309595740 HTTP/1.1
Но когда я пытаюсь подписаться на канал с названием на английском и иврите, например "tag- קוקאין", а HTTP-запрос выглядит так:
GET /push/1315309516300999786/xhrinteractive/tag-%D7%A7%D7%95%D7%A7%D7%90%D7%99%D7%9F?nc=1315309516590 HTTP/1.1
Получаю неловкий ответ - название канала стало точками:
<script>ch("tag-............", 0);</script>
Файл, отвечающий за определение заголовка, использует это регулярное выражение:
if($self->{'headerBuffer'}=~/GET\s+$::CONF{'SubscriberDynamicPageAddress'}\/([0-9a-z]+)\/([0-9a-z]+)\/([a-z0-9_\-\%\.\/]+).*?/i)
{
$self->{'subscriberID'}=$1;
$self->{'mode'}=$2;
my $persist=$self->getConf('Persist');
my $maxTime=$self->getConf('MaxTime');
$self->{'ConnectionTimeLimit'} = ($self->{'ConnectionStart'}+$maxTime) if ($maxTime>0);
my @channelData=split('/',$3);
my $channels={};
my $channelName;
my $offset;
foreach my $chandef (@channelData) {
if($chandef=~/^([a-z0-9_\-\%]+)(.(r|b|h)([0-9]*))?$/i) {
$channelName = $1;
$channels->{$channelName}->{'startIndex'} = undef;
if ($3) {
$offset = $4;
if ($3 eq 'r') { $channels->{$channelName}->{'startIndex'} = $offset; }
if ($3 eq 'b') { $channels->{$channelName}->{'startIndex'} = -$offset; }
if ($3 eq 'h') { $channels->{$channelName}->{'startIndex'} = 0; }
}
}
}
Могу добавить, что Meteor - это собственный сервер комет. его цель - отправлять уведомления в режиме реального времени: meteorserver.org
Где-то должно быть исправление ... Я пробовал искать везде, но безрезультатно. Буду признателен, если кто-то укажет мне какое-то направление.
Было бы полезно, если бы вы связались со страницей, описывающей, что такое Meteor - RSS-ридер, приложение, веб-сервер?
И укажите некоторые детали, например утверждает ли Meteor, что поддерживает UTF-8, и настроили ли вы его для этого? Также на какой платформе вы работаете, и это клиентское или серверное приложение?
Первый символ (% D7% A7) во втором URL-адресе, приведенном выше, является кодировкой UTF-8 (D7 A7) из этот еврейский символ - возможно, происходит то, что GET правильно кодируется в UTF-8 (по умолчанию для современных браузеров и клиентских приложений), но ответ либо недействителен UTF-8, либо клиентское приложение не распознает его как UTF- 8.
Обновление 1:
$chandef=~/^([a-z0-9_\-\%]+)(.(r|b|h)([0-9]*))?$/i
сопоставьте буквенно-цифровую строку UTF-8 и т. д. - см. модуль Encode CPAN и аналогичные встроенные функции кодирования / декодирования, если вы используете Perl 5.8+ и предпочтительно 5.10+. Каждый раз, когда вы видите [a-z]
в коде это красный флаг для интернационализации и Unicode. Это превращается в ответ StackOverflow, поэтому я остановлюсь на нем ...