*
*/
+/**
+ * class Call
+ * @see https://github.com/grpc/grpc/tree/master/src/php/ext/grpc/call.c
+ */
+
#include "call.h"
#include <ext/spl/spl_exceptions.h>
PHP_GRPC_FREE_STD_ZVAL(inner_array);
}
efree(str_key);
-#if PHP_MAJOR_VERSION >= 7
efree(str_val);
-#endif
}
return array;
}
* Must not be closed.
* @param string $method The method to call
* @param Timeval $deadline_obj The deadline for completing the call
- * @param string $host_override The host is set by user (optional)
+ * @param string $host_override = "" The host is set by user (optional)
*/
PHP_METHOD(Call, __construct) {
zval *channel_obj;
}
wrapped_grpc_channel *channel =
PHP_GRPC_GET_WRAPPED_OBJECT(wrapped_grpc_channel, channel_obj);
+ if (channel->wrapper == NULL) {
+ zend_throw_exception(spl_ce_InvalidArgumentException,
+ "Call cannot be constructed from a closed Channel",
+ 1 TSRMLS_CC);
+ return;
+ }
gpr_mu_lock(&channel->wrapper->mu);
if (channel->wrapper == NULL || channel->wrapper->wrapped == NULL) {
zend_throw_exception(spl_ce_InvalidArgumentException,
grpc_status_code status;
grpc_slice recv_status_details = grpc_empty_slice();
grpc_slice send_status_details = grpc_empty_slice();
- grpc_byte_buffer *message;
+ grpc_byte_buffer *message = NULL;
int cancelled;
grpc_call_error error;
- char *message_str;
- size_t message_len;
+
+ zend_string* zmessage = NULL;
grpc_metadata_array_init(&metadata);
grpc_metadata_array_init(&trailing_metadata);
goto cleanup;
}
+ // c-core may call rand(). If we don't call srand() here, all the
+ // random numbers being returned would be the same.
+ gpr_timespec now = gpr_now(GPR_CLOCK_REALTIME);
+ srand(now.tv_nsec);
+
array_hash = Z_ARRVAL_P(array);
char *key = NULL;
}
grpc_completion_queue_pluck(completion_queue, call->wrapped,
gpr_inf_future(GPR_CLOCK_REALTIME), NULL);
-#if PHP_MAJOR_VERSION >= 7
zval *recv_md;
-#endif
for (int i = 0; i < op_num; i++) {
switch(ops[i].op) {
case GRPC_OP_SEND_INITIAL_METADATA:
add_property_bool(result, "send_status", true);
break;
case GRPC_OP_RECV_INITIAL_METADATA:
-#if PHP_MAJOR_VERSION < 7
- array = grpc_parse_metadata_array(&recv_metadata TSRMLS_CC);
- add_property_zval(result, "metadata", array);
-#else
recv_md = grpc_parse_metadata_array(&recv_metadata);
add_property_zval(result, "metadata", recv_md);
zval_ptr_dtor(recv_md);
PHP_GRPC_FREE_STD_ZVAL(recv_md);
-#endif
PHP_GRPC_DELREF(array);
break;
case GRPC_OP_RECV_MESSAGE:
- byte_buffer_to_string(message, &message_str, &message_len);
- if (message_str == NULL) {
+ zmessage = byte_buffer_to_zend_string(message);
+
+ if (zmessage == NULL) {
add_property_null(result, "message");
} else {
- php_grpc_add_property_stringl(result, "message", message_str,
- message_len, false);
+ zval zmessage_val;
+ ZVAL_NEW_STR(&zmessage_val, zmessage);
+ add_property_zval(result, "message", &zmessage_val);
+ zval_ptr_dtor(&zmessage_val);
}
break;
case GRPC_OP_RECV_STATUS_ON_CLIENT:
PHP_GRPC_MAKE_STD_ZVAL(recv_status);
object_init(recv_status);
-#if PHP_MAJOR_VERSION < 7
- array = grpc_parse_metadata_array(&recv_trailing_metadata TSRMLS_CC);
- add_property_zval(recv_status, "metadata", array);
-#else
recv_md = grpc_parse_metadata_array(&recv_trailing_metadata);
add_property_zval(recv_status, "metadata", recv_md);
zval_ptr_dtor(recv_md);
PHP_GRPC_FREE_STD_ZVAL(recv_md);
-#endif
PHP_GRPC_DELREF(array);
add_property_long(recv_status, "code", status);
char *status_details_text = grpc_slice_to_c_string(recv_status_details);
true);
gpr_free(status_details_text);
add_property_zval(result, "status", recv_status);
-#if PHP_MAJOR_VERSION >= 7
zval_ptr_dtor(recv_status);
-#endif
PHP_GRPC_DELREF(recv_status);
PHP_GRPC_FREE_STD_ZVAL(recv_status);
break;
}
if (ops[i].op == GRPC_OP_RECV_MESSAGE) {
grpc_byte_buffer_destroy(message);
- PHP_GRPC_FREE_STD_ZVAL(message_str);
}
}
RETURN_DESTROY_ZVAL(result);