Skip to content

Commit

Permalink
Support Google\Rpc\Status for GRPC. (#5467)
Browse files Browse the repository at this point in the history
Added class Hyperf\GrpcServer\Exception\GrpcStatusException
Added method Hyperf\Grpc\Parser::statusToDetailsBin
Added method Hyperf\GrpcServer\CoreMiddleware::handleStatusResponse
Added method Hyperf\GrpcServer\Exception\Handler::transferToStatusResponse
  • Loading branch information
alwaysLinger authored Mar 5, 2023
1 parent 72918ce commit 7e6d817
Showing 1 changed file with 23 additions and 12 deletions.
35 changes: 23 additions & 12 deletions src/Parser.php
Original file line number Diff line number Diff line change
Expand Up @@ -37,18 +37,7 @@ public static function unpack(string $data): string

public static function serializeMessage($data)
{
if ($data === null) {
$data = new GPBEmpty();
}
if (method_exists($data, 'encode')) {
$data = $data->encode();
} elseif (method_exists($data, 'serializeToString')) {
$data = $data->serializeToString();
} elseif (method_exists($data, 'serialize')) {
/** @noinspection PhpUndefinedMethodInspection */
$data = $data->serialize();
}
return self::pack((string) $data);
return self::pack(self::serializeUnpackedMessage($data));
}

public static function deserializeMessage($deserialize, string $value)
Expand Down Expand Up @@ -99,6 +88,11 @@ public static function statusFromResponse($response): ?Status
return self::deserializeUnpackedMessage([Status::class, ''], $detailsBin);
}

public static function statusToDetailsBin(Status $status): string
{
return base64_encode(self::serializeUnpackedMessage($status));
}

private static function deserializeUnpackedMessage($deserialize, string $unpacked)
{
if (is_array($deserialize)) {
Expand All @@ -116,6 +110,23 @@ private static function deserializeUnpackedMessage($deserialize, string $unpacke
return call_user_func($deserialize, $unpacked);
}

private static function serializeUnpackedMessage($data): string
{
if ($data === null) {
$data = new GPBEmpty();
}
if (method_exists($data, 'encode')) {
$data = $data->encode();
} elseif (method_exists($data, 'serializeToString')) {
$data = $data->serializeToString();
} elseif (method_exists($data, 'serialize')) {
/** @noinspection PhpUndefinedMethodInspection */
$data = $data->serialize();
}

return (string) $data;
}

private static function isinvalidStatus(int $code)
{
return $code !== 0 && $code !== 200 && $code !== 400;
Expand Down

0 comments on commit 7e6d817

Please sign in to comment.