python: add get_npn_protocols() function
get_npn_protocols() is high level wrapper for spdylay_npn_get_proto_list() and the returned list can be passed to ssl.SSLContext.set_npn_protocols().
This commit is contained in:
parent
4e5e741907
commit
6b64276c08
|
@ -546,6 +546,15 @@ Session Objects
|
|||
Helper Functions
|
||||
----------------
|
||||
|
||||
.. py:function:: get_npn_protocols()
|
||||
|
||||
Returns SPDY version strings which can be directly passed to
|
||||
``ssl.SSLContext.set_npn_protocols()``. Please note that the
|
||||
returned list only includes SPDY version strings this library
|
||||
supports. If the application intends to support other fallback
|
||||
protocols (e.g., ``http/1.1``), the application should add them to
|
||||
the returned list.
|
||||
|
||||
.. py:function:: npn_get_version(proto)
|
||||
|
||||
Returns SPDY version which spdylay library supports from the given
|
||||
|
|
|
@ -323,5 +323,12 @@ cdef extern from 'spdylay/spdylay.h':
|
|||
int32_t stream_id,
|
||||
int32_t delta_window_size)
|
||||
|
||||
ctypedef struct spdylay_npn_proto:
|
||||
unsigned char *proto
|
||||
uint8_t len
|
||||
uint16_t version
|
||||
|
||||
spdylay_npn_proto* spdylay_npn_get_proto_list(size_t *len_ptr)
|
||||
|
||||
uint16_t spdylay_npn_get_version(unsigned char *proto,
|
||||
size_t protolen)
|
||||
|
|
|
@ -982,6 +982,16 @@ cdef class Session:
|
|||
cdef _strerror(int error_code):
|
||||
return cspdylay.spdylay_strerror(error_code).decode('UTF-8')
|
||||
|
||||
cpdef get_npn_protocols():
|
||||
cdef size_t proto_list_len
|
||||
cdef cspdylay.spdylay_npn_proto *proto_list
|
||||
proto_list = cspdylay.spdylay_npn_get_proto_list(&proto_list_len)
|
||||
res = []
|
||||
for i in range(proto_list_len):
|
||||
res.append((<char*>proto_list[i].proto)[:proto_list[i].len]\
|
||||
.decode('UTF-8'))
|
||||
return res
|
||||
|
||||
cpdef int npn_get_version(proto):
|
||||
cdef char *cproto
|
||||
if proto == None:
|
||||
|
@ -1449,7 +1459,7 @@ try:
|
|||
self.ctx.options = ssl.OP_ALL | ssl.OP_NO_SSLv2 | \
|
||||
ssl.OP_NO_COMPRESSION
|
||||
self.ctx.load_cert_chain(cert_file, key_file)
|
||||
self.ctx.set_npn_protocols(['spdy/3', 'spdy/2'])
|
||||
self.ctx.set_npn_protocols(get_npn_protocols())
|
||||
|
||||
socketserver.TCPServer.__init__(self, server_address,
|
||||
RequestHandlerCalss)
|
||||
|
|
|
@ -338,5 +338,9 @@ class SpdylayTests(unittest.TestCase):
|
|||
self.assertEqual(1, frame.stream_id)
|
||||
self.assertEqual(4096, frame.delta_window_size)
|
||||
|
||||
def test_get_npn_protocols(self):
|
||||
protos = spdylay.get_npn_protocols()
|
||||
self.assertEqual(['spdy/3', 'spdy/2'], protos)
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
|
Loading…
Reference in New Issue