88Implements the version dated January 9, 2014.
99"""
1010import collections
11+ import logging
1112
1213from .huffman import HuffmanDecoder , HuffmanEncoder
1314from 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
1821def 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
0 commit comments