Ошибка Perl 6: неправильный формат UTF-8 - PullRequest
0 голосов
/ 07 мая 2018

сейчас я изучаю Perl 6; Мой первый проект заключается в создании HTTP-клиента. Я получаю сообщение об ошибке и не понимаю, почему

Malformed UTF-8 at line 1 col 45
  in method new at main.p6 line 13
  in block <unit> at main.p6 line 43

Я думаю, что это происходит от переменной порта, но я не уверен Вот весь мой код perl6:

class Request 
{
    has     $!method;
    has     $!path;
    has     $!version;
    has     @!headers;
    has     $!socket;
    has     $.response is rw;

    method      new(:$method, :$path, :$host, :$port, :$version = "HTTP/1.1")
    {
        my $socket = IO::Socket::INET.new(:$host, :$port);
        return self.bless(:$method, :$path, :$version, :$socket);
    }

    submethod   BUILD(:$!method, :$!path, :$!version, :$!socket){}

    method      setHeader($name, $value)
    {
        my %header = name => $name, value => $value;
        @!headers.push({%header});
    }

    method      toString
    {
        my $request = "$!method $!path $!version\r\n";
        for @!headers -> %_ {
            $request ~= %_{'name'} ~ ": " ~ %_{'value'} ~ "\r\n";
        }
        $request ~ "\r\n";
    }

    method      send($i = 1)
    {
        say "Request send!";
        $!socket.print($.toString());
        say $!socket.recv for 0..$i;
    }
}
my $host = "127.0.0.1";
my Int $port = 58002;
my $request = Request.new(:method("GET"), :path("/"), :$host, :$port);

$request.setHeader("host", $host);
$request.setHeader("Accept-Language", "fr");
$request.send(2);

1 Ответ

0 голосов
/ 07 мая 2018

Этот ответ может быть бесполезным, может быть раздражающим, но я могу удалить его позже сегодня, если он был, и это все, что у меня есть, и мне нужно бежать.

Я не знаю, понимаете ли вы сообщение об ошибке, но давайте сначала рассмотрим это.

Malformed UTF-8 at line 1 col 45
  in method new at main.p6 line 13
  in block <unit> at main.p6 line 43

Это означает, что во время выполнения последней строки сообщения, строки 43 вашего кода , что-то пошло не так:

my $request = Request.new(:method("GET"), :path("/"), :$host, :$port);

Компилятор заметил, что выполнение этой последней строки включало путь, проходящий через другую строку в вашем коде, строка 13:

    return self.bless(:$method, :$path, :$version, :$socket);

Так что это помогает лучше точно определить строку, во время выполнения которой произошла ошибка.

.bless - это вызов метода. Он вызывается на self, что относится к инвоканту, переданному методу, который, как вы можете предполагать, является объектом класса, в котором появляется вызов метода, а именно классом, который вы определяете Request.

Ваш код не указывает, какой класс Request наследует (используя is), поэтому он наследует от Any. bless для Any наследуется от Mu s .

это этот код в компиляторе Rakudo:

method bless(*%attrinit) {
    nqp::create(self).BUILDALL(Empty, %attrinit);
}

Таким образом, во время выполнения этого кода Perl 6 попытался прочитать некоторый UTF8 и обнаружил недопустимый символ в столбце 45 самой первой строки некоторых данных , которые он пытался прочитать.

Так вот, это лучшее, что я могу сказать о причинах, не видя ваших данных.

...