|
|
|
@ -29,6 +29,26 @@ |
|
|
|
|
|
|
|
|
|
from libc.stdint cimport intptr_t |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
cdef bytes _slice_bytes(grpc_slice slice): |
|
|
|
|
cdef void *start = grpc_slice_start_ptr(slice) |
|
|
|
|
cdef size_t length = grpc_slice_length(slice) |
|
|
|
|
return (<const char *>start)[:length] |
|
|
|
|
|
|
|
|
|
cdef grpc_slice _copy_slice(grpc_slice slice) nogil: |
|
|
|
|
cdef void *start = grpc_slice_start_ptr(slice) |
|
|
|
|
cdef size_t length = grpc_slice_length(slice) |
|
|
|
|
return grpc_slice_from_copied_buffer(<const char *>start, length) |
|
|
|
|
|
|
|
|
|
cdef grpc_slice _slice_from_bytes(bytes value) nogil: |
|
|
|
|
cdef const char *value_ptr |
|
|
|
|
cdef size_t length |
|
|
|
|
with gil: |
|
|
|
|
value_ptr = <const char *>value |
|
|
|
|
length = len(value) |
|
|
|
|
return grpc_slice_from_copied_buffer(value_ptr, length) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ConnectivityState: |
|
|
|
|
idle = GRPC_CHANNEL_IDLE |
|
|
|
|
connecting = GRPC_CHANNEL_CONNECTING |
|
|
|
@ -189,11 +209,11 @@ cdef class CallDetails: |
|
|
|
|
|
|
|
|
|
@property |
|
|
|
|
def method(self): |
|
|
|
|
return Slice.bytes_from_slice(self.c_details.method) |
|
|
|
|
return _slice_bytes(self.c_details.method) |
|
|
|
|
|
|
|
|
|
@property |
|
|
|
|
def host(self): |
|
|
|
|
return Slice.bytes_from_slice(self.c_details.host) |
|
|
|
|
return _slice_bytes(self.c_details.host) |
|
|
|
|
|
|
|
|
|
@property |
|
|
|
|
def deadline(self): |
|
|
|
@ -227,46 +247,6 @@ cdef class Event: |
|
|
|
|
self.is_new_request = is_new_request |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
cdef class Slice: |
|
|
|
|
|
|
|
|
|
def __cinit__(self): |
|
|
|
|
with nogil: |
|
|
|
|
grpc_init() |
|
|
|
|
self.c_slice = grpc_empty_slice() |
|
|
|
|
|
|
|
|
|
cdef void _assign_slice(self, grpc_slice new_slice) nogil: |
|
|
|
|
grpc_slice_unref(self.c_slice) |
|
|
|
|
self.c_slice = new_slice |
|
|
|
|
|
|
|
|
|
@staticmethod |
|
|
|
|
def from_bytes(bytes data): |
|
|
|
|
cdef Slice self = Slice() |
|
|
|
|
self._assign_slice(grpc_slice_from_copied_buffer(data, len(data))) |
|
|
|
|
return self |
|
|
|
|
|
|
|
|
|
@staticmethod |
|
|
|
|
cdef Slice from_slice(grpc_slice slice): |
|
|
|
|
cdef Slice self = Slice() |
|
|
|
|
grpc_slice_ref(slice) |
|
|
|
|
self._assign_slice(slice) |
|
|
|
|
return self |
|
|
|
|
|
|
|
|
|
@staticmethod |
|
|
|
|
cdef bytes bytes_from_slice(grpc_slice slice): |
|
|
|
|
with nogil: |
|
|
|
|
pointer = grpc_slice_start_ptr(slice) |
|
|
|
|
length = grpc_slice_length(slice) |
|
|
|
|
return (<char *>pointer)[:length] |
|
|
|
|
|
|
|
|
|
def bytes(self): |
|
|
|
|
return Slice.bytes_from_slice(self.c_slice) |
|
|
|
|
|
|
|
|
|
def __dealloc__(self): |
|
|
|
|
with nogil: |
|
|
|
|
grpc_slice_unref(self.c_slice) |
|
|
|
|
grpc_shutdown() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
cdef class ByteBuffer: |
|
|
|
|
|
|
|
|
|
def __cinit__(self, bytes data): |
|
|
|
@ -416,20 +396,21 @@ cdef class ChannelArgs: |
|
|
|
|
|
|
|
|
|
cdef class Metadatum: |
|
|
|
|
|
|
|
|
|
# TODO(atash) this should just accept Slice objects. |
|
|
|
|
def __cinit__(self, bytes key, bytes value): |
|
|
|
|
self._key = Slice.from_bytes(key) |
|
|
|
|
self._value = Slice.from_bytes(value) |
|
|
|
|
self.c_metadata.key = self._key.c_slice |
|
|
|
|
self.c_metadata.value = self._value.c_slice |
|
|
|
|
self.c_metadata.key = _slice_from_bytes(key) |
|
|
|
|
self.c_metadata.value = _slice_from_bytes(value) |
|
|
|
|
|
|
|
|
|
cdef void _copy_metadatum(self, grpc_metadata *destination) nogil: |
|
|
|
|
destination[0].key = _copy_slice(self.c_metadata.key) |
|
|
|
|
destination[0].value = _copy_slice(self.c_metadata.value) |
|
|
|
|
|
|
|
|
|
@property |
|
|
|
|
def key(self): |
|
|
|
|
return self._key.bytes() |
|
|
|
|
return _slice_bytes(self.c_metadata.key) |
|
|
|
|
|
|
|
|
|
@property |
|
|
|
|
def value(self): |
|
|
|
|
return self._value.bytes() |
|
|
|
|
return _slice_bytes(self.c_metadata.value) |
|
|
|
|
|
|
|
|
|
def __len__(self): |
|
|
|
|
return 2 |
|
|
|
@ -445,6 +426,9 @@ cdef class Metadatum: |
|
|
|
|
def __iter__(self): |
|
|
|
|
return iter((self.key, self.value)) |
|
|
|
|
|
|
|
|
|
def __dealloc__(self): |
|
|
|
|
grpc_slice_unref(self.c_metadata.key) |
|
|
|
|
grpc_slice_unref(self.c_metadata.value) |
|
|
|
|
|
|
|
|
|
cdef class _MetadataIterator: |
|
|
|
|
|
|
|
|
@ -466,34 +450,27 @@ cdef class _MetadataIterator: |
|
|
|
|
else: |
|
|
|
|
raise StopIteration |
|
|
|
|
|
|
|
|
|
cdef grpc_slice _copy_slice(grpc_slice slice) nogil: |
|
|
|
|
cdef void *start = grpc_slice_start_ptr(slice) |
|
|
|
|
cdef size_t length = grpc_slice_length(slice) |
|
|
|
|
return grpc_slice_from_copied_buffer(<const char *>start, length) |
|
|
|
|
|
|
|
|
|
cdef class Metadata: |
|
|
|
|
|
|
|
|
|
def __cinit__(self, metadata): |
|
|
|
|
def __cinit__(self, metadata_iterable): |
|
|
|
|
with nogil: |
|
|
|
|
grpc_init() |
|
|
|
|
grpc_metadata_array_init(&self.c_metadata_array) |
|
|
|
|
self.owns_metadata_slices = False |
|
|
|
|
self.metadata = list(metadata) |
|
|
|
|
for metadatum in self.metadata: |
|
|
|
|
metadata = list(metadata_iterable) |
|
|
|
|
for metadatum in metadata: |
|
|
|
|
if not isinstance(metadatum, Metadatum): |
|
|
|
|
raise TypeError("expected list of Metadatum") |
|
|
|
|
self.c_metadata_array.count = len(self.metadata) |
|
|
|
|
self.c_metadata_array.capacity = len(self.metadata) |
|
|
|
|
self.c_metadata_array.count = len(metadata) |
|
|
|
|
self.c_metadata_array.capacity = len(metadata) |
|
|
|
|
with nogil: |
|
|
|
|
self.c_metadata_array.metadata = <grpc_metadata *>gpr_malloc( |
|
|
|
|
self.c_metadata_array.count*sizeof(grpc_metadata) |
|
|
|
|
) |
|
|
|
|
for i in range(self.c_metadata_array.count): |
|
|
|
|
self.c_metadata_array.metadata[i] = ( |
|
|
|
|
(<Metadatum>self.metadata[i]).c_metadata) |
|
|
|
|
(<Metadatum>metadata[i])._copy_metadatum(&self.c_metadata_array.metadata[i]) |
|
|
|
|
|
|
|
|
|
def __dealloc__(self): |
|
|
|
|
self._drop_slice_ownership() |
|
|
|
|
with nogil: |
|
|
|
|
# this frees the allocated memory for the grpc_metadata_array (although |
|
|
|
|
# it'd be nice if that were documented somewhere...) |
|
|
|
@ -507,30 +484,26 @@ cdef class Metadata: |
|
|
|
|
def __getitem__(self, size_t i): |
|
|
|
|
if i >= self.c_metadata_array.count: |
|
|
|
|
raise IndexError |
|
|
|
|
return Metadatum( |
|
|
|
|
key=Slice.bytes_from_slice(self.c_metadata_array.metadata[i].key), |
|
|
|
|
value=Slice.bytes_from_slice(self.c_metadata_array.metadata[i].value)) |
|
|
|
|
key = _slice_bytes(self.c_metadata_array.metadata[i].key) |
|
|
|
|
value = _slice_bytes(self.c_metadata_array.metadata[i].value) |
|
|
|
|
return Metadatum(key=key, value=value) |
|
|
|
|
|
|
|
|
|
def __iter__(self): |
|
|
|
|
return _MetadataIterator(self) |
|
|
|
|
|
|
|
|
|
cdef void _claim_slice_ownership(self): |
|
|
|
|
if self.owns_metadata_slices: |
|
|
|
|
return |
|
|
|
|
cdef grpc_metadata_array new_c_metadata_array |
|
|
|
|
grpc_metadata_array_init(&new_c_metadata_array) |
|
|
|
|
new_c_metadata_array.metadata = <grpc_metadata *>gpr_malloc( |
|
|
|
|
self.c_metadata_array.count*sizeof(grpc_metadata)) |
|
|
|
|
new_c_metadata_array.count = self.c_metadata_array.count |
|
|
|
|
for i in range(self.c_metadata_array.count): |
|
|
|
|
self.c_metadata_array.metadata[i].key = _copy_slice( |
|
|
|
|
new_c_metadata_array.metadata[i].key = _copy_slice( |
|
|
|
|
self.c_metadata_array.metadata[i].key) |
|
|
|
|
self.c_metadata_array.metadata[i].value = _copy_slice( |
|
|
|
|
new_c_metadata_array.metadata[i].value = _copy_slice( |
|
|
|
|
self.c_metadata_array.metadata[i].value) |
|
|
|
|
self.owns_metadata_slices = True |
|
|
|
|
|
|
|
|
|
cdef void _drop_slice_ownership(self): |
|
|
|
|
if not self.owns_metadata_slices: |
|
|
|
|
return |
|
|
|
|
for i in range(self.c_metadata_array.count): |
|
|
|
|
grpc_slice_unref(self.c_metadata_array.metadata[i].key) |
|
|
|
|
grpc_slice_unref(self.c_metadata_array.metadata[i].value) |
|
|
|
|
self.owns_metadata_slices = False |
|
|
|
|
grpc_metadata_array_destroy(&self.c_metadata_array) |
|
|
|
|
self.c_metadata_array = new_c_metadata_array |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
cdef class Operation: |
|
|
|
@ -538,7 +511,7 @@ cdef class Operation: |
|
|
|
|
def __cinit__(self): |
|
|
|
|
grpc_init() |
|
|
|
|
self.references = [] |
|
|
|
|
self._received_status_details = Slice() |
|
|
|
|
self._status_details = grpc_empty_slice() |
|
|
|
|
self.is_valid = False |
|
|
|
|
|
|
|
|
|
@property |
|
|
|
@ -595,13 +568,13 @@ cdef class Operation: |
|
|
|
|
def received_status_details(self): |
|
|
|
|
if self.c_op.type != GRPC_OP_RECV_STATUS_ON_CLIENT: |
|
|
|
|
raise TypeError("self must be an operation receiving status details") |
|
|
|
|
return self._received_status_details.bytes() |
|
|
|
|
return _slice_bytes(self._status_details) |
|
|
|
|
|
|
|
|
|
@property |
|
|
|
|
def received_status_details_or_none(self): |
|
|
|
|
if self.c_op.type != GRPC_OP_RECV_STATUS_ON_CLIENT: |
|
|
|
|
return None |
|
|
|
|
return self._received_status_details.bytes() |
|
|
|
|
return _slice_bytes(self._status_details) |
|
|
|
|
|
|
|
|
|
@property |
|
|
|
|
def received_cancelled(self): |
|
|
|
@ -617,6 +590,7 @@ cdef class Operation: |
|
|
|
|
return False if self._received_cancelled == 0 else True |
|
|
|
|
|
|
|
|
|
def __dealloc__(self): |
|
|
|
|
grpc_slice_unref(self._status_details) |
|
|
|
|
grpc_shutdown() |
|
|
|
|
|
|
|
|
|
def operation_send_initial_metadata(Metadata metadata, int flags): |
|
|
|
@ -657,10 +631,10 @@ def operation_send_status_from_server( |
|
|
|
|
op.c_op.data.send_status_from_server.trailing_metadata = ( |
|
|
|
|
metadata.c_metadata_array.metadata) |
|
|
|
|
op.c_op.data.send_status_from_server.status = code |
|
|
|
|
cdef Slice details_slice = Slice.from_bytes(details) |
|
|
|
|
op.c_op.data.send_status_from_server.status_details = &details_slice.c_slice |
|
|
|
|
grpc_slice_unref(op._status_details) |
|
|
|
|
op._status_details = _slice_from_bytes(details) |
|
|
|
|
op.c_op.data.send_status_from_server.status_details = &op._status_details |
|
|
|
|
op.references.append(metadata) |
|
|
|
|
op.references.append(details_slice) |
|
|
|
|
op.is_valid = True |
|
|
|
|
return op |
|
|
|
|
|
|
|
|
@ -696,7 +670,7 @@ def operation_receive_status_on_client(int flags): |
|
|
|
|
op.c_op.data.receive_status_on_client.status = ( |
|
|
|
|
&op._received_status_code) |
|
|
|
|
op.c_op.data.receive_status_on_client.status_details = ( |
|
|
|
|
&op._received_status_details.c_slice) |
|
|
|
|
&op._status_details) |
|
|
|
|
op.is_valid = True |
|
|
|
|
return op |
|
|
|
|
|
|
|
|
|