diff --git a/hpack/table.py b/hpack/table.py index 08eff98..705728e 100644 --- a/hpack/table.py +++ b/hpack/table.py @@ -131,7 +131,7 @@ def get_by_index(self, index): index -= HeaderTable.STATIC_TABLE_LENGTH if index < len(self.dynamic_entries): - return self.dynamic_entries[index] + return self.dynamic_entries[index][:2] raise InvalidTableIndex("Invalid table index %d" % original_index) @@ -156,7 +156,7 @@ def add(self, name, value): self._current_size = 0 else: # Add new entry - self.dynamic_entries.appendleft((name, value)) + self.dynamic_entries.appendleft((name, value, size)) self._current_size += size self._shrink() @@ -171,17 +171,13 @@ def search(self, name, value): - ``(index, name, value)`` for perfect matches. """ partial = None - - header_name_search_result = HeaderTable.STATIC_TABLE_MAPPING.get(name) - if header_name_search_result: - index = header_name_search_result[1].get(value) - if index is not None: - return index, name, value - else: - partial = (header_name_search_result[0], name, None) - - offset = HeaderTable.STATIC_TABLE_LENGTH + 1 - for (i, (n, v)) in enumerate(self.dynamic_entries): + for (i, (n, v)) in enumerate(HeaderTable.STATIC_TABLE): + if n == name: + if v == value: + return i + 1, n, v + elif partial is None: + partial = (i + 1, n, None) + for (i, (n, v, _)) in enumerate(self.dynamic_entries): if n == name: if v == value: return i + offset, n, v @@ -212,8 +208,8 @@ def _shrink(self): """ cursize = self._current_size while cursize > self._maxsize: - name, value = self.dynamic_entries.pop() - cursize -= table_entry_size(name, value) + name, value, size = self.dynamic_entries.pop() + cursize -= size log.debug("Evicting %s: %s from the header table", name, value) self._current_size = cursize