Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: разработка для Web > Кодировка в HTTP-Realm


Автор: tishaishii 15.1.2012, 15:27
Заинтересовала кодировка в HTTP WWW-Authenticate(Realm).
Заголовки сервера:
Код
HTTP/1.0 401 пользователь не авторизован
WWW-Authenticate: Basic realm="пробная зона авторизации"
Connection: close
Content-Type: text/html


Писал русские быквы в кодировках utf8, unicode и cp1251. Каждый раз получал кракозябры.
Чтобы разобраться без обиняков, создал модель:
Код
#!/usr/bin/perl

package Object;

sub new($;@) {
    my($class, $self)=(shift, {@_});
    +bless $self, $class
}
sub server($) {+$_[0]{server}}

package Server;
use IO::Socket;
use base qw(Object);

sub new($;@) {
    my$self=shift->SUPER::new(@_);
    $self->{server}=IO::Socket::INET->new(
        LocalPort=>$self->{listen},
        Listen=>$self->{quee},
        TYPE=>&SOCK_STREAM(),
        Reuse=>1
    );
    $self->{server}->autoflush(1);
    my$old=select $self->{server};
    ($\, $,, $|)=("\n", "\t", 1);
    select $old;
    +$self
}
sub perform($$) {
    my($self, $client)=(shift, shift);
#    undef while defined($_=<$client>) && $self->{loop}->($self, $client, $_);
    undef while defined($_=<$client>) && /\S/os;
    $client->print(<<'.', $headers, scalar localtime);
HTTP/1.0 401 пользователь не авторизован
WWW-Authenticate: Basic realm="пробная зона авторизации"
Connection: close
Content-Type: text/html

.
    +$self
}

sub execute($) {
    my$self=shift;
    while(my$client=$self->server->accept) {
        if(defined(my$child_pid=fork)) {
            next if $child_pid;
            $self->{server}->close unless $child_pid;
            $self->perform($client);
            last
        } else {
            die "Can't fork"
        }
    } continue {
        close $client;
    }
    +$self
}

package main;

Server->new(
    listen=>2012,
    quee=>undef,
    loop=>sub($) {
        if($_[2]=~/\bdatetime\b/ios) {
            $_[1]->print(scalar localtime)
        } elsif($_[2]=~/\btime\b/) {
            $_[1]->print(time)
        } else {
            $_[1]->print($_[2]);
            +undef
        }
    }
)->execute


Запускаю:
Код
./test &


В telnet отрабатывает как нужно:
Код
telnet localhost 2012
у попа была собака,
он её любил.
она съела кусок мяса,
- он её убил

HTTP/1.0 401 пользователь не авторизован
WWW-Authenticate: Basic realm="пробная зона авторизации"
Connection: close
Content-Type: text/html


В браузере (Firefox, Opera, MSIE) запрашиваю http://192.168.0.2:2012, получаю окно с запросом имени и пароля, а в нём - краказябры.
Локаль на сервере: ru_RU.UTF-8
Клиент в виндовс (cp1251).
В какой кодировке должен быть текст, чтобы в браузере показывалось нормально?

Автор: Pfailed 16.1.2012, 05:52
Так может указать кодировку нужно? Content-Type: text/html; charset=UTF-8

Автор: tishaishii 16.1.2012, 18:40
Не помогает.
Код
«http://192.168.56.101:2012» запрашивает имя пользователя и пароль. Сайт сообщает: «ïðîáíàÿ çîíà àâòîðèçàöèè»

Автор: tishaishii 16.1.2012, 19:08
Firefox использует ISO-8859-1, а другие - своё.
Так что, с русским, видимо, не прокатит.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)