xref: /aosp_15_r20/external/grpc-grpc/src/php/tests/generated_code/math_server.php (revision cc02d7e222339f7a4f6ba5f422e6413f4bd931f2)
1<?php
2/*
3 *
4 * Copyright 2020 gRPC authors.
5 *
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
9 *
10 *     http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 *
18 */
19
20include 'vendor/autoload.php';
21
22class MathService extends Math\MathStub
23{
24    public function Div(
25        \Math\DivArgs $request,
26        \Grpc\ServerContext $context
27    ): ?\Math\DivReply {
28        $dividend = $request->getDividend();
29        $divisor = $request->getDivisor();
30        if ($divisor == 0) {
31            $context->setStatus(
32                \Grpc\Status::status(
33                    \Grpc\STATUS_INVALID_ARGUMENT,
34                    'Cannot divide by zero'
35                )
36            );
37            return null;
38        }
39        // for GeneratedCodeTest::testRetry
40        $metadata = $context->clientMetadata();
41        if (array_key_exists('response-unavailable', $metadata)) {
42            $trailingMetadata = array_key_exists('grpc-previous-rpc-attempts', $metadata)
43            ? ['unavailable-retry-attempts' => $metadata['grpc-previous-rpc-attempts']]
44            : null;
45            $context->setStatus(
46                \Grpc\Status::status(
47                    \Grpc\STATUS_UNAVAILABLE,
48                    "unavailable",
49                    $trailingMetadata
50                )
51            );
52            return null;
53        }
54        usleep(1000); // for GeneratedCodeTest::testTimeout
55        $quotient = intdiv($dividend, $divisor);
56        $remainder = $dividend % $divisor;
57        $reply = new \Math\DivReply([
58            'quotient' => $quotient,
59            'remainder' => $remainder,
60        ]);
61        return $reply;
62    }
63
64    public function DivMany(
65        \Grpc\ServerCallReader $reader,
66        \Grpc\ServerCallWriter $writter,
67        \Grpc\ServerContext $context
68    ): void {
69        while ($divArgs = $reader->read()) {
70            $dividend = $divArgs->getDividend();
71            $divisor = $divArgs->getDivisor();
72            if ($divisor == 0) {
73                $context->setStatus(\Grpc\Status::status(
74                    \Grpc\STATUS_INVALID_ARGUMENT,
75                    'Cannot divide by zero'
76                ));
77                $writter->finish();
78                return;
79            }
80            $quotient = intdiv($dividend, $divisor);
81            $remainder = $dividend % $divisor;
82            $reply = new \Math\DivReply([
83                'quotient' => $quotient,
84                'remainder' => $remainder,
85            ]);
86            $writter->write($reply);
87        }
88        $writter->finish();
89    }
90
91    public function Fib(
92        \Math\FibArgs $request,
93        \Grpc\ServerCallWriter $writter,
94        \Grpc\ServerContext $context
95    ): void {
96        $previous = 0;
97        $current = 1;
98        $limit = $request->getLimit();
99        for ($i = 0; $i < $limit; $i++) {
100            $num = new \Math\Num();
101            $num->setNum($current);
102            $writter->write($num);
103            $next = $previous + $current;
104            $previous = $current;
105            $current = $next;
106        }
107        $writter->finish();
108    }
109
110    /**
111     * Sum sums a stream of numbers, returning the final result once the stream
112     * is closed.
113     * @param \Grpc\ServerCallReader $reader read client request data of \Math\Num
114     * @param \Grpc\ServerContext $context server request context
115     * @return array with [
116     *     \Math\Num, // response data
117     *     optional array = [], // initial metadata
118     *     optional \Grpc\Status = \Grpc\Status::ok // Grpc status
119     * ]
120     */
121    public function Sum(
122        \Grpc\ServerCallReader $reader,
123        \Grpc\ServerContext $context
124    ): ?\Math\Num {
125        $sum = 0;
126        while ($num = $reader->read()) {
127            $sum += $num->getNum();
128        }
129        $reply = new \Math\Num();
130        $reply->setNum($sum);
131        return $reply;
132    }
133}
134
135$server = new \Grpc\RpcServer();
136$server->addHttp2Port('0.0.0.0:50052');
137$server_credentials = Grpc\ServerCredentials::createSsl(
138    null,
139    file_get_contents(dirname(__FILE__) . '/../data/server1.key'),
140    file_get_contents(dirname(__FILE__) . '/../data/server1.pem')
141);
142$server->addSecureHttp2Port('0.0.0.0:50051', $server_credentials);
143$server->handle(new MathService());
144$server->run();
145