blob: 7301f0f12d546eefe4ca4a255702e68eafa3c47d [file] [log] [blame]
<?php
/*
*
* Copyright 2020 gRPC authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
include 'vendor/autoload.php';
class MathService extends Math\MathStub
{
public function Div(
\Math\DivArgs $request,
\Grpc\ServerContext $context
): ?\Math\DivReply {
$dividend = $request->getDividend();
$divisor = $request->getDivisor();
if ($divisor == 0) {
$context->setStatus(
\Grpc\Status::status(
\Grpc\STATUS_INVALID_ARGUMENT,
'Cannot divide by zero'
)
);
return null;
}
// for GeneratedCodeTest::testRetry
$metadata = $context->clientMetadata();
if (array_key_exists('response-unavailable', $metadata)) {
$trailingMetadata = array_key_exists('grpc-previous-rpc-attempts', $metadata)
? ['unavailable-retry-attempts' => $metadata['grpc-previous-rpc-attempts']]
: null;
$context->setStatus(
\Grpc\Status::status(
\Grpc\STATUS_UNAVAILABLE,
"unavailable",
$trailingMetadata
)
);
return null;
}
usleep(1000); // for GeneratedCodeTest::testTimeout
$quotient = intdiv($dividend, $divisor);
$remainder = $dividend % $divisor;
$reply = new \Math\DivReply([
'quotient' => $quotient,
'remainder' => $remainder,
]);
return $reply;
}
public function DivMany(
\Grpc\ServerCallReader $reader,
\Grpc\ServerCallWriter $writter,
\Grpc\ServerContext $context
): void {
while ($divArgs = $reader->read()) {
$dividend = $divArgs->getDividend();
$divisor = $divArgs->getDivisor();
if ($divisor == 0) {
$context->setStatus(\Grpc\Status::status(
\Grpc\STATUS_INVALID_ARGUMENT,
'Cannot divide by zero'
));
$writter->finish();
return;
}
$quotient = intdiv($dividend, $divisor);
$remainder = $dividend % $divisor;
$reply = new \Math\DivReply([
'quotient' => $quotient,
'remainder' => $remainder,
]);
$writter->write($reply);
}
$writter->finish();
}
public function Fib(
\Math\FibArgs $request,
\Grpc\ServerCallWriter $writter,
\Grpc\ServerContext $context
): void {
$previous = 0;
$current = 1;
$limit = $request->getLimit();
for ($i = 0; $i < $limit; $i++) {
$num = new \Math\Num();
$num->setNum($current);
$writter->write($num);
$next = $previous + $current;
$previous = $current;
$current = $next;
}
$writter->finish();
}
/**
* Sum sums a stream of numbers, returning the final result once the stream
* is closed.
* @param \Grpc\ServerCallReader $reader read client request data of \Math\Num
* @param \Grpc\ServerContext $context server request context
* @return array with [
* \Math\Num, // response data
* optional array = [], // initial metadata
* optional \Grpc\Status = \Grpc\Status::ok // Grpc status
* ]
*/
public function Sum(
\Grpc\ServerCallReader $reader,
\Grpc\ServerContext $context
): ?\Math\Num {
$sum = 0;
while ($num = $reader->read()) {
$sum += $num->getNum();
}
$reply = new \Math\Num();
$reply->setNum($sum);
return $reply;
}
}
$server = new \Grpc\RpcServer();
$server->addHttp2Port('0.0.0.0:50052');
$server_credentials = Grpc\ServerCredentials::createSsl(
null,
file_get_contents(dirname(__FILE__) . '/../data/server1.key'),
file_get_contents(dirname(__FILE__) . '/../data/server1.pem')
);
$server->addSecureHttp2Port('0.0.0.0:50051', $server_credentials);
$server->handle(new MathService());
$server->run();