aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/python
diff options
context:
space:
mode:
Diffstat (limited to 'src/python')
-rw-r--r--src/python/src/_adapter/_c_test.py31
-rw-r--r--src/python/src/_adapter/_low_test.py4
-rw-r--r--src/python/src/_adapter/_server.c24
-rw-r--r--src/python/src/_adapter/fore.py2
4 files changed, 49 insertions, 12 deletions
diff --git a/src/python/src/_adapter/_c_test.py b/src/python/src/_adapter/_c_test.py
index 19c91ffe01..210ac1fff7 100644
--- a/src/python/src/_adapter/_c_test.py
+++ b/src/python/src/_adapter/_c_test.py
@@ -92,7 +92,7 @@ class _CTest(unittest.TestCase):
_c.init()
completion_queue = _c.CompletionQueue()
- server = _c.Server(completion_queue)
+ server = _c.Server(completion_queue, None)
server.add_http2_addr('[::]:0')
server.start()
server.stop()
@@ -102,7 +102,7 @@ class _CTest(unittest.TestCase):
service_tag = object()
completion_queue = _c.CompletionQueue()
- server = _c.Server(completion_queue)
+ server = _c.Server(completion_queue, None)
server.add_http2_addr('[::]:0')
server.start()
server.service(service_tag)
@@ -119,7 +119,7 @@ class _CTest(unittest.TestCase):
del completion_queue
completion_queue = _c.CompletionQueue()
- server = _c.Server(completion_queue)
+ server = _c.Server(completion_queue, None)
server.add_http2_addr('[::]:0')
server.start()
thread = threading.Thread(target=completion_queue.get, args=(_FUTURE,))
@@ -162,6 +162,31 @@ class _CTest(unittest.TestCase):
_c.shut_down()
+ @unittest.skip('TODO(nathaniel): find and use real-enough test credentials')
+ def test_secure_server(self):
+ _c.init()
+
+ server_credentials = _c.ServerCredentials(
+ 'root certificate', (('private key', 'certificate chain'),))
+
+ completion_queue = _c.CompletionQueue()
+ server = _c.Server(completion_queue, server_credentials)
+ server.add_http2_addr('[::]:0')
+ server.start()
+ thread = threading.Thread(target=completion_queue.get, args=(_FUTURE,))
+ thread.start()
+ time.sleep(1)
+ server.stop()
+ completion_queue.stop()
+ for _ in range(_IDEMPOTENCE_DEMONSTRATION):
+ event = completion_queue.get(time.time() + _TIMEOUT)
+ self.assertIs(event.kind, _datatypes.Event.Kind.STOP)
+ thread.join()
+ del server
+ del completion_queue
+
+ _c.shut_down()
+
if __name__ == '__main__':
unittest.main()
diff --git a/src/python/src/_adapter/_low_test.py b/src/python/src/_adapter/_low_test.py
index 57b3be66a0..899ccf53c8 100644
--- a/src/python/src/_adapter/_low_test.py
+++ b/src/python/src/_adapter/_low_test.py
@@ -82,7 +82,7 @@ class EchoTest(unittest.TestCase):
self.host = 'localhost'
self.server_completion_queue = _low.CompletionQueue()
- self.server = _low.Server(self.server_completion_queue)
+ self.server = _low.Server(self.server_completion_queue, None)
port = self.server.add_http2_addr('[::]:0')
self.server.start()
@@ -260,7 +260,7 @@ class CancellationTest(unittest.TestCase):
self.host = 'localhost'
self.server_completion_queue = _low.CompletionQueue()
- self.server = _low.Server(self.server_completion_queue)
+ self.server = _low.Server(self.server_completion_queue, None)
port = self.server.add_http2_addr('[::]:0')
self.server.start()
diff --git a/src/python/src/_adapter/_server.c b/src/python/src/_adapter/_server.c
index d2730d9ae8..503be61ab4 100644
--- a/src/python/src/_adapter/_server.c
+++ b/src/python/src/_adapter/_server.c
@@ -38,18 +38,30 @@
#include "_adapter/_completion_queue.h"
#include "_adapter/_error.h"
+#include "_adapter/_server_credentials.h"
static int pygrpc_server_init(Server *self, PyObject *args, PyObject *kwds) {
const PyObject *completion_queue;
- if (!(PyArg_ParseTuple(args, "O!", &pygrpc_CompletionQueueType,
- &completion_queue))) {
+ PyObject *server_credentials;
+ if (!(PyArg_ParseTuple(args, "O!O", &pygrpc_CompletionQueueType,
+ &completion_queue, &server_credentials))) {
+ self->c_server = NULL;
+ return -1;
+ }
+ if (server_credentials == Py_None) {
+ self->c_server = grpc_server_create(
+ ((CompletionQueue *)completion_queue)->c_completion_queue, NULL);
+ return 0;
+ } else if (PyObject_TypeCheck(server_credentials,
+ &pygrpc_ServerCredentialsType)) {
+ self->c_server = grpc_secure_server_create(
+ ((ServerCredentials *)server_credentials)->c_server_credentials,
+ ((CompletionQueue *)completion_queue)->c_completion_queue, NULL);
+ return 0;
+ } else {
self->c_server = NULL;
return -1;
}
-
- self->c_server = grpc_server_create(
- ((CompletionQueue *)completion_queue)->c_completion_queue, NULL);
- return 0;
}
static void pygrpc_server_dealloc(Server *self) {
diff --git a/src/python/src/_adapter/fore.py b/src/python/src/_adapter/fore.py
index c307e7ce63..2f102751f2 100644
--- a/src/python/src/_adapter/fore.py
+++ b/src/python/src/_adapter/fore.py
@@ -265,7 +265,7 @@ class ForeLink(ticket_interfaces.ForeLink):
"""
with self._condition:
self._completion_queue = _low.CompletionQueue()
- self._server = _low.Server(self._completion_queue)
+ self._server = _low.Server(self._completion_queue, None)
port = self._server.add_http2_addr(
'[::]:%d' % (0 if self._port is None else self._port))
self._server.start()