From e517ff6534bb972ba7f68c301b1a2e04158488a9 Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Mon, 30 Jun 2014 22:45:18 +0900 Subject: [PATCH] python: Use public HPACK API --- python/cnghttp2.pxd | 29 +++++++++++++++------------- python/nghttp2.pyx | 47 ++++++++++++++++++++------------------------- 2 files changed, 37 insertions(+), 39 deletions(-) diff --git a/python/cnghttp2.pxd b/python/cnghttp2.pxd index 888fd495..12c5612e 100644 --- a/python/cnghttp2.pxd +++ b/python/cnghttp2.pxd @@ -247,12 +247,28 @@ cdef extern from 'nghttp2/nghttp2.h': const char* nghttp2_strerror(int lib_error_code) + int nghttp2_hd_deflate_new(nghttp2_hd_deflater **deflater_ptr, + size_t deflate_hd_table_bufsize_max) + + void nghttp2_hd_deflate_del(nghttp2_hd_deflater *deflater) + void nghttp2_hd_deflate_set_no_refset(nghttp2_hd_deflater *deflater, uint8_t no_refset) int nghttp2_hd_deflate_change_table_size(nghttp2_hd_deflater *deflater, size_t hd_table_bufsize_max) + ssize_t nghttp2_hd_deflate_hd(nghttp2_hd_deflater *deflater, + uint8_t *buf, size_t buflen, + const nghttp2_nv *nva, size_t nvlen) + + size_t nghttp2_hd_deflate_bound(nghttp2_hd_deflater *deflater, + const nghttp2_nv *nva, size_t nvlen) + + int nghttp2_hd_inflate_new(nghttp2_hd_inflater **inflater_ptr) + + void nghttp2_hd_inflate_del(nghttp2_hd_inflater *inflater) + int nghttp2_hd_inflate_change_table_size(nghttp2_hd_inflater *inflater, size_t hd_table_bufsize_max) @@ -298,19 +314,6 @@ cdef extern from 'nghttp2_hd.h': ctypedef struct nghttp2_hd_inflater: nghttp2_hd_context ctx - int nghttp2_hd_deflate_init2(nghttp2_hd_deflater *deflater, - size_t deflate_hd_table_bufsize_max) - - int nghttp2_hd_inflate_init(nghttp2_hd_inflater *inflater) - - void nghttp2_hd_deflate_free(nghttp2_hd_deflater *deflater) - - void nghttp2_hd_inflate_free(nghttp2_hd_inflater *inflater) - - int nghttp2_hd_deflate_hd_bufs(nghttp2_hd_deflater *deflater, - nghttp2_bufs *bufs, - const nghttp2_nv *nva, size_t nvlen) - nghttp2_hd_entry* nghttp2_hd_table_get(nghttp2_hd_context *context, size_t index) diff --git a/python/nghttp2.pyx b/python/nghttp2.pyx index e061dfd0..fad8e99b 100644 --- a/python/nghttp2.pyx +++ b/python/nghttp2.pyx @@ -82,16 +82,16 @@ cdef class HDDeflater: ''' - cdef cnghttp2.nghttp2_hd_deflater _deflater + cdef cnghttp2.nghttp2_hd_deflater *_deflater def __cinit__(self, hd_table_bufsize_max = DEFLATE_MAX_HEADER_TABLE_SIZE): - rv = cnghttp2.nghttp2_hd_deflate_init2(&self._deflater, - hd_table_bufsize_max) + rv = cnghttp2.nghttp2_hd_deflate_new(&self._deflater, + hd_table_bufsize_max) if rv != 0: raise Exception(_strerror(rv)) def __dealloc__(self): - cnghttp2.nghttp2_hd_deflate_free(&self._deflater) + cnghttp2.nghttp2_hd_deflate_del(self._deflater) def deflate(self, headers): '''Compresses the |headers|. The |headers| must be sequence of tuple @@ -115,26 +115,22 @@ cdef class HDDeflater: nvap[0].flags = cnghttp2.NGHTTP2_NV_FLAG_NONE nvap += 1 - cdef cnghttp2.nghttp2_bufs bufs cdef size_t outcap = 0 cdef ssize_t rv cdef uint8_t *out + cdef size_t outlen - cnghttp2.nghttp2_bufs_init(&bufs, 4096, 16) + outlen = cnghttp2.nghttp2_hd_deflate_bound(self._deflater, + nva, len(headers)) - rv = cnghttp2.nghttp2_hd_deflate_hd_bufs(&self._deflater, &bufs, - nva, len(headers)) + out = malloc(outlen) + + rv = cnghttp2.nghttp2_hd_deflate_hd(self._deflater, out, outlen, + nva, len(headers)) free(nva) if rv < 0: - cnghttp2.nghttp2_bufs_free(&bufs); - - raise Exception(_strerror(rv)) - - rv = cnghttp2.nghttp2_bufs_remove(&bufs, &out) - - if rv < 0: - cnghttp2.nghttp2_bufs_free(&bufs); + free(out) raise Exception(_strerror(rv)) @@ -143,8 +139,7 @@ cdef class HDDeflater: try: res = out[:rv] finally: - cnghttp2.nghttp2_free(out) - cnghttp2.nghttp2_bufs_free(&bufs) + free(out) return res @@ -155,7 +150,7 @@ cdef class HDDeflater: reference set. ''' - cnghttp2.nghttp2_hd_deflate_set_no_refset(&self._deflater, no_refset) + cnghttp2.nghttp2_hd_deflate_set_no_refset(self._deflater, no_refset) def change_table_size(self, hd_table_bufsize_max): '''Changes header table size to |hd_table_bufsize_max| byte. @@ -164,7 +159,7 @@ cdef class HDDeflater: ''' cdef int rv - rv = cnghttp2.nghttp2_hd_deflate_change_table_size(&self._deflater, + rv = cnghttp2.nghttp2_hd_deflate_change_table_size(self._deflater, hd_table_bufsize_max) if rv != 0: raise Exception(_strerror(rv)) @@ -185,15 +180,15 @@ cdef class HDInflater: ''' - cdef cnghttp2.nghttp2_hd_inflater _inflater + cdef cnghttp2.nghttp2_hd_inflater *_inflater def __cinit__(self): - rv = cnghttp2.nghttp2_hd_inflate_init(&self._inflater) + rv = cnghttp2.nghttp2_hd_inflate_new(&self._inflater) if rv != 0: raise Exception(_strerror(rv)) def __dealloc__(self): - cnghttp2.nghttp2_hd_inflate_free(&self._inflater) + cnghttp2.nghttp2_hd_inflate_del(self._inflater) def inflate(self, data): '''Decompresses the compressed header block |data|. The |data| must be @@ -208,7 +203,7 @@ cdef class HDInflater: res = [] while True: inflate_flags = 0 - rv = cnghttp2.nghttp2_hd_inflate_hd(&self._inflater, &nv, + rv = cnghttp2.nghttp2_hd_inflate_hd(self._inflater, &nv, &inflate_flags, buf, buflen, 1) if rv < 0: @@ -221,7 +216,7 @@ cdef class HDInflater: if inflate_flags & cnghttp2.NGHTTP2_HD_INFLATE_FINAL: break - cnghttp2.nghttp2_hd_inflate_end_headers(&self._inflater) + cnghttp2.nghttp2_hd_inflate_end_headers(self._inflater) return res def change_table_size(self, hd_table_bufsize_max): @@ -231,7 +226,7 @@ cdef class HDInflater: ''' cdef int rv - rv = cnghttp2.nghttp2_hd_inflate_change_table_size(&self._inflater, + rv = cnghttp2.nghttp2_hd_inflate_change_table_size(self._inflater, hd_table_bufsize_max) if rv != 0: raise Exception(_strerror(rv))