HpackContext(int maxDynamicTableSize) { _maxDynamicTableSizeInBytes=maxDynamicTableSize; int guesstimateEntries = 10+maxDynamicTableSize/(32+10+10); _dynamicTable=new DynamicTable(guesstimateEntries); if (LOG.isDebugEnabled()) LOG.debug(String.format("HdrTbl[%x] created max=%d",hashCode(),maxDynamicTableSize)); }
public Entry add(HttpField field) { Entry entry=new Entry(field); int size = entry.getSize(); if (size>_maxDynamicTableSizeInBytes) { if (LOG.isDebugEnabled()) LOG.debug(String.format("HdrTbl[%x] !added size %d>%d",hashCode(),size,_maxDynamicTableSizeInBytes)); _dynamicTable.evictAll(); return null; } _dynamicTableSizeInBytes+=size; _dynamicTable.add(entry); _fieldMap.put(field,entry); _nameMap.put(StringUtil.asciiToLowerCase(field.getName()),entry); if (LOG.isDebugEnabled()) LOG.debug(String.format("HdrTbl[%x] added %s",hashCode(),entry)); _dynamicTable.evict(); return entry; }
private void evict() { while (_dynamicTableSizeInBytes>_maxDynamicTableSizeInBytes) { Entry entry = _entries[_offset]; _entries[_offset]=null; _offset = (_offset+1)%_entries.length; _size--; if (LOG.isDebugEnabled()) LOG.debug(String.format("HdrTbl[%x] evict %s",HpackContext.this.hashCode(),entry)); _dynamicTableSizeInBytes-=entry.getSize(); entry._slot=-1; _fieldMap.remove(entry.getHttpField()); String lc=StringUtil.asciiToLowerCase(entry.getHttpField().getName()); if (entry==_nameMap.get(lc)) _nameMap.remove(lc); } if (LOG.isDebugEnabled()) LOG.debug(String.format("HdrTbl[%x] entries=%d, size=%d, max=%d",HpackContext.this.hashCode(),_dynamicTable.size(),_dynamicTableSizeInBytes,_maxDynamicTableSizeInBytes)); }
/** * @return Current dynamic table size in entries */ public int size() { return _dynamicTable.size(); }
public int index(Entry entry) { if (entry._slot<0) return 0; if (entry.isStatic()) return entry._slot; return _dynamicTable.index(entry); }
public Entry get(int index) { if (index<=STATIC_SIZE) return __staticTable[index]; return _dynamicTable.get(index); }
@Override public String toString() { return String.format("HpackContext@%x{entries=%d,size=%d,max=%d}",hashCode(),_dynamicTable.size(),_dynamicTableSizeInBytes,_maxDynamicTableSizeInBytes); }