Skip to content
This repository was archived by the owner on Jan 13, 2021. It is now read-only.

Commit 17cf3f7

Browse files
committed
Add some HPACK logging.
1 parent afa2482 commit 17cf3f7

File tree

3 files changed

+57
-1
lines changed

3 files changed

+57
-1
lines changed

hyper/__init__.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,7 @@
1717
raise ImportError("hyper only supports Python 3.3 or higher.")
1818

1919
__all__ = [HTTP20Response, HTTP20Connection]
20+
21+
# Set default logging handler.
22+
import logging
23+
logging.getLogger(__name__).addHandler(logging.NullHandler())

hyper/http20/hpack.py

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,23 @@
88
Implements the version dated January 9, 2014.
99
"""
1010
import collections
11+
import logging
1112

1213
from .huffman import HuffmanDecoder, HuffmanEncoder
1314
from hyper.http20.huffman_constants import (
1415
REQUEST_CODES, REQUEST_CODES_LENGTH, RESPONSE_CODES, RESPONSE_CODES_LENGTH
1516
)
1617

18+
log = logging.getLogger(__name__)
19+
1720

1821
def encode_integer(integer, prefix_bits):
1922
"""
2023
This encodes an integer according to the wacky integer encoding rules
2124
defined in the HPACK spec.
2225
"""
26+
log.debug("Encoding %d with %d bits.", integer, prefix_bits)
27+
2328
max_number = (2 ** prefix_bits) - 1
2429

2530
if (integer < max_number):
@@ -63,6 +68,8 @@ def decode_integer(data, prefix_bits):
6368
number += next_byte * multiple(index)
6469
break
6570

71+
log.debug("Decoded %d consuming %d bytes.", number, index + 1)
72+
6673
return (number, index + 1)
6774

6875

@@ -163,6 +170,12 @@ def header_table_size(self):
163170

164171
@header_table_size.setter
165172
def header_table_size(self, value):
173+
log.debug(
174+
"Setting header table size to %d from %d",
175+
value,
176+
self._header_table_size
177+
)
178+
166179
# If the new value is larger than the current one, no worries!
167180
# Otherwise, we may need to shrink the header table.
168181
if value < self._header_table_size:
@@ -178,6 +191,10 @@ def header_table_size(self, value):
178191
# to be removed from the reference set.
179192
self.reference_set.discard((n, v))
180193

194+
log.debug(
195+
"Removed %s: %s from the encoder header table", n, v
196+
)
197+
181198
self._header_table_size = value
182199

183200
def encode(self, headers, huffman=True):
@@ -202,6 +219,8 @@ def encode(self, headers, huffman=True):
202219
Literal text values may optionally be Huffman encoded. For now we don't
203220
do that, because it's an extra bit of complication, but we will later.
204221
"""
222+
log.debug("HPACK encoding %s", headers)
223+
205224
# First, turn the headers into a list of tuples if possible. This is
206225
# the natural way to interact with them in HPACK.
207226
if isinstance(headers, dict):
@@ -225,6 +244,7 @@ def encode(self, headers, huffman=True):
225244
# reference set, just emit an 'empty the reference set' message.
226245
if (len(self.reference_set - incoming_set) >
227246
(len(self.reference_set) // 2)):
247+
log.debug("Emptying the encoder reference set.")
228248
header_block = b'\x80' # Indexed representation of 0.
229249

230250
# Remove everything from the reference set.
@@ -234,6 +254,8 @@ def encode(self, headers, huffman=True):
234254

235255
header_block += self.add(to_add, huffman)
236256

257+
log.debug("Encoded header block to %s", header_block)
258+
237259
return header_block
238260

239261
def remove(self, to_remove):
@@ -242,6 +264,8 @@ def remove(self, to_remove):
242264
them. These must be in the header table, so must be represented as
243265
their indexed form.
244266
"""
267+
log.debug("Removing %s from the header table", to_remove)
268+
245269
encoded = []
246270

247271
for name, value in to_remove:
@@ -274,6 +298,8 @@ def add(self, to_add, huffman=False):
274298
This function takes a set of header key-value tuples and serializes
275299
them for adding to the header table.
276300
"""
301+
log.debug("Adding %s to the header table", to_add)
302+
277303
encoded = []
278304

279305
for name, value in to_add:
@@ -360,6 +386,8 @@ def _add_to_header_table(self, name, value):
360386
# be removed from the reference set.
361387
self.reference_set.discard((n, v))
362388

389+
log.debug("Evicted %s: %s from the header table", n, v)
390+
363391
def _encode_indexed(self, index):
364392
"""
365393
Encodes a header using the indexed representation.
@@ -493,6 +521,12 @@ def header_table_size(self):
493521

494522
@header_table_size.setter
495523
def header_table_size(self, value):
524+
log.debug(
525+
"Resizing decoder header table to %d from %d",
526+
value,
527+
self._header_table_size
528+
)
529+
496530
# If the new value is larger than the current one, no worries!
497531
# Otherwise, we may need to shrink the header table.
498532
if value < self._header_table_size:
@@ -508,12 +542,16 @@ def header_table_size(self, value):
508542
# to be removed from the reference set.
509543
self.reference_set.discard((n, v))
510544

545+
log.debug("Evicting %s: %s from the header table", n, v)
546+
511547
self._header_table_size = value
512548

513549
def decode(self, data):
514550
"""
515551
Takes an HPACK-encoded header block and decodes it into a header set.
516552
"""
553+
log.debug("Decoding %s", data)
554+
517555
headers = set()
518556
data_len = len(data)
519557
current_index = 0
@@ -571,6 +609,8 @@ def _add_to_header_table(self, name, value):
571609
# be removed from the reference set.
572610
self.reference_set.discard((n, v))
573611

612+
log.debug("Evicting %s: %s from the header table", n, v)
613+
574614
def _decode_indexed(self, data):
575615
"""
576616
Decodes a header represented using the indexed representation.
@@ -598,9 +638,15 @@ def _decode_indexed(self, data):
598638
# Since this updates the reference set, don't bother returning the
599639
# header.
600640
if header in self.reference_set:
641+
log.debug(
642+
"Removed %s from the reference set, consumed %d",
643+
header,
644+
consumed
645+
)
601646
self.reference_set.remove(header)
602647
return None, consumed
603648
else:
649+
log.debug("Decoded %s, consumed %d", header, consumed)
604650
self.reference_set.add(header)
605651
return header, consumed
606652

@@ -666,4 +712,11 @@ def _decode_literal(self, data, should_index):
666712

667713
header = (name, value)
668714

715+
log.debug(
716+
"Decoded %s, consumed %d, indexed %s",
717+
header,
718+
consumed,
719+
should_index
720+
)
721+
669722
return header, total_consumed

hyper/http20/tls.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
# to.
1818
_context = None
1919

20-
2120
def wrap_socket(socket, server_hostname):
2221
"""
2322
A vastly simplified SSL wrapping function. We'll probably extend this to

0 commit comments

Comments
 (0)