server.c
Go to the documentation of this file.
1 /*
2  *
3  * Copyright 2015 gRPC authors.
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  */
18 
24 #include "server.h"
25 
26 #include <ext/spl/spl_exceptions.h>
27 #include <zend_exceptions.h>
28 
29 #include <grpc/grpc_security.h>
30 #include <grpc/slice.h>
31 #include <grpc/support/alloc.h>
32 
33 #include "call.h"
34 #include "completion_queue.h"
35 #include "channel.h"
36 #include "server_credentials.h"
37 #include "timeval.h"
38 
39 zend_class_entry *grpc_ce_server;
40 PHP_GRPC_DECLARE_OBJECT_HANDLER(server_ce_handlers)
41 
42 /* Frees and destroys an instance of wrapped_grpc_server */
43 PHP_GRPC_FREE_WRAPPED_FUNC_START(wrapped_grpc_server)
44  if (p->wrapped != NULL) {
49  grpc_server_destroy(p->wrapped);
50  }
52 
53 /* Initializes an instance of wrapped_grpc_call to be associated with an
54  * object of a class specified by class_type */
56  TSRMLS_DC) {
57  PHP_GRPC_ALLOC_CLASS_OBJECT(wrapped_grpc_server);
58  zend_object_std_init(&intern->std, class_type TSRMLS_CC);
59  object_properties_init(&intern->std, class_type);
60  PHP_GRPC_FREE_CLASS_OBJECT(wrapped_grpc_server, server_ce_handlers);
61 }
62 
67 PHP_METHOD(Server, __construct) {
68  wrapped_grpc_server *server =
69  PHP_GRPC_GET_WRAPPED_OBJECT(wrapped_grpc_server, getThis());
70  zval *args_array = NULL;
72 
73  /* "|a" == 1 optional array */
74  if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|a", &args_array) ==
75  FAILURE) {
76  zend_throw_exception(spl_ce_InvalidArgumentException,
77  "Server expects an array", 1 TSRMLS_CC);
78  return;
79  }
80  if (args_array == NULL) {
81  server->wrapped = grpc_server_create(NULL, NULL);
82  } else {
83  if (php_grpc_read_args_array(args_array, &args TSRMLS_CC) == FAILURE) {
84  efree(args.args);
85  return;
86  }
87  server->wrapped = grpc_server_create(&args, NULL);
88  efree(args.args);
89  }
91  NULL);
92 }
93 
98 PHP_METHOD(Server, requestCall) {
99  grpc_call_error error_code;
100  grpc_call *call;
103  grpc_event event;
104 
105  wrapped_grpc_server *server =
106  PHP_GRPC_GET_WRAPPED_OBJECT(wrapped_grpc_server, getThis());
107  zval *result;
109  object_init(result);
110 
113  error_code =
116  if (error_code != GRPC_CALL_OK) {
117  zend_throw_exception(spl_ce_LogicException, "request_call failed",
118  (long)error_code TSRMLS_CC);
119  goto cleanup;
120  }
123  NULL);
124  if (!event.success) {
125  zend_throw_exception(spl_ce_LogicException,
126  "Failed to request a call for some reason",
127  1 TSRMLS_CC);
128  goto cleanup;
129  }
130  char *method_text = grpc_slice_to_c_string(details.method);
131  char *host_text = grpc_slice_to_c_string(details.host);
132  php_grpc_add_property_string(result, "method", method_text, true);
133  php_grpc_add_property_string(result, "host", host_text, true);
134  gpr_free(method_text);
135  gpr_free(host_text);
137  grpc_php_wrap_call(call, true TSRMLS_CC));
138  php_grpc_add_property_zval(result, "absolute_deadline",
139  grpc_php_wrap_timeval(details.deadline TSRMLS_CC));
141  grpc_parse_metadata_array(&metadata TSRMLS_CC));
142 
143  cleanup:
147 }
148 
154 PHP_METHOD(Server, addHttp2Port) {
155  const char *addr;
156  php_grpc_int addr_len;
157  wrapped_grpc_server *server =
158  PHP_GRPC_GET_WRAPPED_OBJECT(wrapped_grpc_server, getThis());
159 
160  /* "s" == 1 string */
161  if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &addr, &addr_len)
162  == FAILURE) {
163  zend_throw_exception(spl_ce_InvalidArgumentException,
164  "add_http2_port expects a string", 1 TSRMLS_CC);
165  return;
166  }
168  int result = grpc_server_add_http2_port(server->wrapped, addr, creds);
170  RETURN_LONG(result);
171 }
172 
179 PHP_METHOD(Server, addSecureHttp2Port) {
180  const char *addr;
181  php_grpc_int addr_len;
182  zval *creds_obj;
183  wrapped_grpc_server *server =
184  PHP_GRPC_GET_WRAPPED_OBJECT(wrapped_grpc_server, getThis());
185 
186  /* "sO" == 1 string, 1 object */
187  if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sO", &addr, &addr_len,
188  &creds_obj, grpc_ce_server_credentials) ==
189  FAILURE) {
190  zend_throw_exception(spl_ce_InvalidArgumentException,
191  "add_http2_port expects a string and a "
192  "ServerCredentials", 1 TSRMLS_CC);
193  return;
194  }
195  wrapped_grpc_server_credentials *creds =
196  PHP_GRPC_GET_WRAPPED_OBJECT(wrapped_grpc_server_credentials, creds_obj);
197  RETURN_LONG(grpc_server_add_http2_port(server->wrapped, addr,
198  creds->wrapped));
199 }
200 
206  wrapped_grpc_server *server =
207  PHP_GRPC_GET_WRAPPED_OBJECT(wrapped_grpc_server, getThis());
208  grpc_server_start(server->wrapped);
209 }
210 
211 ZEND_BEGIN_ARG_INFO_EX(arginfo_construct, 0, 0, 0)
212  ZEND_ARG_INFO(0, args)
213 ZEND_END_ARG_INFO()
214 
215 ZEND_BEGIN_ARG_INFO_EX(arginfo_requestCall, 0, 0, 0)
216 ZEND_END_ARG_INFO()
217 
218 ZEND_BEGIN_ARG_INFO_EX(arginfo_addHttp2Port, 0, 0, 1)
219  ZEND_ARG_INFO(0, addr)
220 ZEND_END_ARG_INFO()
221 
222 ZEND_BEGIN_ARG_INFO_EX(arginfo_addSecureHttp2Port, 0, 0, 2)
223  ZEND_ARG_INFO(0, addr)
224  ZEND_ARG_INFO(0, server_creds)
225 ZEND_END_ARG_INFO()
226 
227 ZEND_BEGIN_ARG_INFO_EX(arginfo_start, 0, 0, 0)
228 ZEND_END_ARG_INFO()
229 
230 static zend_function_entry server_methods[] = {
231  PHP_ME(Server, __construct, arginfo_construct,
232  ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)
233  PHP_ME(Server, requestCall, arginfo_requestCall,
234  ZEND_ACC_PUBLIC)
235  PHP_ME(Server, addHttp2Port, arginfo_addHttp2Port,
236  ZEND_ACC_PUBLIC)
237  PHP_ME(Server, addSecureHttp2Port, arginfo_addSecureHttp2Port,
238  ZEND_ACC_PUBLIC)
239  PHP_ME(Server, start, arginfo_start,
240  ZEND_ACC_PUBLIC)
241  PHP_FE_END
242 };
243 
244 void grpc_init_server(TSRMLS_D) {
245  zend_class_entry ce;
246  INIT_CLASS_ENTRY(ce, "Grpc\\Server", server_methods);
247  ce.create_object = create_wrapped_grpc_server;
248  grpc_ce_server = zend_register_internal_class(&ce TSRMLS_CC);
249  PHP_GRPC_INIT_HANDLER(wrapped_grpc_server, server_ce_handlers);
250 }
php_grpc_add_property_string
#define php_grpc_add_property_string(arg, name, context, b)
Definition: php7_wrapper.h:28
_gevent_test_main.result
result
Definition: _gevent_test_main.py:96
server_methods
static zend_function_entry server_methods[]
Definition: server.c:230
grpc_call_error
grpc_call_error
Definition: grpc_types.h:464
completion_queue
grpc_completion_queue * completion_queue
Definition: completion_queue.c:21
grpc_call_details_destroy
GRPCAPI void grpc_call_details_destroy(grpc_call_details *details)
Definition: call_details.cc:36
grpc_call_details_init
GRPCAPI void grpc_call_details_init(grpc_call_details *details)
Definition: call_details.cc:30
cleanup
void cleanup(void)
Definition: bloaty/third_party/zlib/examples/enough.c:182
metadata
Definition: cq_verifier.cc:48
php_grpc_zend_object
#define php_grpc_zend_object
Definition: php7_wrapper.h:27
slice.h
grpc_metadata_array
Definition: grpc_types.h:579
grpc_call_details
Definition: grpc_types.h:585
channel.h
gpr_free
GPRAPI void gpr_free(void *ptr)
Definition: alloc.cc:51
metadata
struct metadata metadata
create_wrapped_grpc_server
php_grpc_zend_object create_wrapped_grpc_server(zend_class_entry *class_type TSRMLS_DC)
Definition: server.c:55
framework.rpc.grpc_channelz.Server
Server
Definition: grpc_channelz.py:42
grpc_init_server
void grpc_init_server(TSRMLS_D)
Definition: server.c:244
grpc_server_create
GRPCAPI grpc_server * grpc_server_create(const grpc_channel_args *args, void *reserved)
Definition: src/core/lib/surface/server.cc:1456
GRPC_CALL_OK
@ GRPC_CALL_OK
Definition: grpc_types.h:466
grpc_server_register_completion_queue
GRPCAPI void grpc_server_register_completion_queue(grpc_server *server, grpc_completion_queue *cq, void *reserved)
Definition: src/core/lib/surface/server.cc:1466
gpr_inf_future
GPRAPI gpr_timespec gpr_inf_future(gpr_clock_type type)
Definition: src/core/lib/gpr/time.cc:55
server.h
PHP_METHOD
PHP_METHOD(Server, __construct)
Definition: server.c:67
xds_manager.p
p
Definition: xds_manager.py:60
grpc_security.h
grpc_parse_metadata_array
zval * grpc_parse_metadata_array(grpc_metadata_array *metadata_array TSRMLS_DC)
Definition: call.c:59
grpc_channel_args
Definition: grpc_types.h:132
PHP_GRPC_INIT_HANDLER
#define PHP_GRPC_INIT_HANDLER(class_object, handler_name)
Definition: php7_wrapper.h:140
call
FilterStackCall * call
Definition: call.cc:750
grpc_insecure_server_credentials_create
GRPCAPI grpc_server_credentials * grpc_insecure_server_credentials_create()
Definition: core/lib/security/credentials/insecure/insecure_credentials.cc:71
grpc_metadata_array_destroy
GRPCAPI void grpc_metadata_array_destroy(grpc_metadata_array *array)
Definition: metadata_array.cc:35
PHP_GRPC_FREE_WRAPPED_FUNC_END
#define PHP_GRPC_FREE_WRAPPED_FUNC_END()
Definition: php7_wrapper.h:73
php_grpc_read_args_array
int php_grpc_read_args_array(zval *args_array, grpc_channel_args *args TSRMLS_DC)
Definition: channel.c:117
call.h
grpc_server_request_call
GRPCAPI grpc_call_error grpc_server_request_call(grpc_server *server, grpc_call **call, grpc_call_details *details, grpc_metadata_array *request_metadata, grpc_completion_queue *cq_bound_to_call, grpc_completion_queue *cq_for_notification, void *tag_new)
Definition: src/core/lib/surface/server.cc:1526
start
static uint64_t start
Definition: benchmark-pound.c:74
asyncio_get_stats.args
args
Definition: asyncio_get_stats.py:40
PHP_GRPC_DECLARE_OBJECT_HANDLER
#define PHP_GRPC_DECLARE_OBJECT_HANDLER(handler_name)
Definition: php7_wrapper.h:146
grpc_server_credentials_release
GRPCAPI void grpc_server_credentials_release(grpc_server_credentials *creds)
Definition: credentials.cc:95
PHP_GRPC_GET_WRAPPED_OBJECT
#define PHP_GRPC_GET_WRAPPED_OBJECT(class_object, zv)
Definition: php7_wrapper.h:149
php_grpc_int
#define php_grpc_int
Definition: php7_wrapper.h:24
grpc_server_add_http2_port
GRPCAPI int grpc_server_add_http2_port(grpc_server *server, const char *addr, grpc_server_credentials *creds)
Definition: chttp2_server.cc:1029
completion_queue.h
grpc_event
Definition: grpc_types.h:564
grpc_call
struct grpc_call grpc_call
Definition: grpc_types.h:70
grpc_php_wrap_call
zval * grpc_php_wrap_call(grpc_call *wrapped, bool owned TSRMLS_DC)
Definition: call.c:182
grpc_server_destroy
GRPCAPI void grpc_server_destroy(grpc_server *server)
Definition: src/core/lib/surface/server.cc:1519
timeval.h
grpc_php_wrap_timeval
zval * grpc_php_wrap_timeval(gpr_timespec wrapped TSRMLS_DC)
Definition: timeval.c:46
grpc_server_cancel_all_calls
GRPCAPI void grpc_server_cancel_all_calls(grpc_server *server)
Definition: src/core/lib/surface/server.cc:1512
grpc_ce_server
zend_class_entry * grpc_ce_server
Definition: server.c:39
server_credentials.h
details
static grpc_slice details
Definition: test/core/fling/client.cc:46
grpc_slice_to_c_string
GPRAPI char * grpc_slice_to_c_string(grpc_slice s)
Definition: slice/slice.cc:35
grpc_server_credentials
Definition: src/core/lib/security/credentials/credentials.h:259
grpc_completion_queue_pluck
GRPCAPI grpc_event grpc_completion_queue_pluck(grpc_completion_queue *cq, void *tag, gpr_timespec deadline, void *reserved)
Definition: completion_queue.cc:1328
grpc_ce_server_credentials
zend_class_entry * grpc_ce_server_credentials
Definition: server_credentials.c:29
wrapped
grpc_call * wrapped
Definition: src/php/ext/grpc/call.h:32
server
Definition: examples/python/async_streaming/server.py:1
intern
upb_strtable_uninit & intern
Definition: bloaty/third_party/protobuf/php/ext/google/protobuf/map.c:222
PHP_GRPC_MAKE_STD_ZVAL
#define PHP_GRPC_MAKE_STD_ZVAL(pzv)
Definition: php7_wrapper.h:42
PHP_GRPC_ALLOC_CLASS_OBJECT
#define PHP_GRPC_ALLOC_CLASS_OBJECT(class_object)
Definition: php7_wrapper.h:77
if
if(p->wrapped !=NULL)
Definition: server.c:44
alloc.h
grpc_server_shutdown_and_notify
GRPCAPI void grpc_server_shutdown_and_notify(grpc_server *server, grpc_completion_queue *cq, void *tag)
Definition: src/core/lib/surface/server.cc:1503
PHP_GRPC_FREE_CLASS_OBJECT
#define PHP_GRPC_FREE_CLASS_OBJECT(class_object, handler)
Definition: php7_wrapper.h:82
grpc_server_start
GRPCAPI void grpc_server_start(grpc_server *server)
Definition: src/core/lib/surface/server.cc:1497
GPR_CLOCK_REALTIME
@ GPR_CLOCK_REALTIME
Definition: gpr_types.h:39
PHP_GRPC_FREE_WRAPPED_FUNC_START
#define PHP_GRPC_FREE_WRAPPED_FUNC_START(class_object)
Definition: php7_wrapper.h:70
RETURN_DESTROY_ZVAL
#define RETURN_DESTROY_ZVAL(val)
Definition: php7_wrapper.h:55
grpc_event::success
int success
Definition: grpc_types.h:572
addr
struct sockaddr_in addr
Definition: libuv/docs/code/tcp-echo-server/main.c:10
grpc_metadata_array_init
GRPCAPI void grpc_metadata_array_init(grpc_metadata_array *array)
Definition: metadata_array.cc:30
php_grpc_add_property_zval
#define php_grpc_add_property_zval(res, name, val)
Definition: php7_wrapper.h:32


grpc
Author(s):
autogenerated on Thu Mar 13 2025 03:01:16