… | |
… | |
1730 | |
1730 | |
1731 | # bypass unshift if we already have the remaining chunk |
1731 | # bypass unshift if we already have the remaining chunk |
1732 | if ($format + $len <= length $_[0]{rbuf}) { |
1732 | if ($format + $len <= length $_[0]{rbuf}) { |
1733 | my $data = substr $_[0]{rbuf}, $format, $len; |
1733 | my $data = substr $_[0]{rbuf}, $format, $len; |
1734 | substr $_[0]{rbuf}, 0, $format + $len, ""; |
1734 | substr $_[0]{rbuf}, 0, $format + $len, ""; |
|
|
1735 | |
1735 | $cb->($_[0], Storable::thaw ($data)); |
1736 | eval { $cb->($_[0], Storable::thaw ($data)); 1 } |
|
|
1737 | or return $_[0]->_error (Errno::EBADMSG); |
1736 | } else { |
1738 | } else { |
1737 | # remove prefix |
1739 | # remove prefix |
1738 | substr $_[0]{rbuf}, 0, $format, ""; |
1740 | substr $_[0]{rbuf}, 0, $format, ""; |
1739 | |
1741 | |
1740 | # read remaining chunk |
1742 | # read remaining chunk |
1741 | $_[0]->unshift_read (chunk => $len, sub { |
1743 | $_[0]->unshift_read (chunk => $len, sub { |
1742 | if (my $ref = eval { Storable::thaw ($_[1]) }) { |
1744 | eval { $cb->($_[0], Storable::thaw ($_[1])); 1 } |
1743 | $cb->($_[0], $ref); |
|
|
1744 | } else { |
|
|
1745 | $_[0]->_error (Errno::EBADMSG); |
1745 | or $_[0]->_error (Errno::EBADMSG); |
1746 | } |
|
|
1747 | }); |
1746 | }); |
1748 | } |
1747 | } |
1749 | |
1748 | |
1750 | 1 |
1749 | 1 |
1751 | } |
1750 | } |