Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Perl 6 error: Malformed UTF-8

Tags:

http

utf-8

raku

right now, I'm learning Perl 6; my first project is to make an HTTP client .. I get an error and I do not understand why

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

I think it comes from the port variable, but I'm not sure Here is all of my perl6 code:

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);
like image 303
7hsk Avatar asked May 06 '18 22:05

7hsk


1 Answers

This answer may not be helpful, might be annoying, but I can delete it later today if it was and it's all I've got and I have to run.

I don't know if you understand the error message, but let's cover that first.

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

This means that during execution of the last line in the message, line 43 of your code, something went wrong:

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

The compiler noticed that execution of that last line involved a path that went through another line in your code, line 13:

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

So that helps better pinpoint the line during execution of which the error occurred.

.bless is a method call. It's called on self which refers to the invocant passed to the method which you can assume is an object of the class in which the method call appears, namely the class you're defining Request.

Your code doesn't specify what class Request inherits from (using is) so it inherits from Any. The bless for Any is inherited from Mu's.

which is this code in the Rakudo compiler:

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

So during execution of that code, Perl 6 attempted to read some UTF8 and encountered an invalid character at col 45 of the very first line of some data it tried to read.

So that's the best I can say about why, without seeing your data.

like image 184
raiph Avatar answered Nov 15 '22 08:11

raiph