Заинтересовала кодировка в 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 |
Запускаю:
В 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). В какой кодировке должен быть текст, чтобы в браузере показывалось нормально? |