protected HpackEncoder getHpackEncoder() { if (hpackEncoder == null) { hpackEncoder = new HpackEncoder(); } // Ensure latest agreed table size is used hpackEncoder.setMaxTableSize(remoteSettings.getHeaderTableSize()); return hpackEncoder; }
private void addToDynamicTable(String headerName, String val) { int pos = entryPositionCounter++; DynamicTableEntry d = new DynamicTableEntry(headerName, val, -pos); List<TableEntry> existing = dynamicTable.get(headerName); if (existing == null) { dynamicTable.put(headerName, existing = new ArrayList<>(1)); } existing.add(d); evictionQueue.add(d); currentTableSize += d.getSize(); runEvictionIfRequired(); if (entryPositionCounter == Integer.MAX_VALUE) { //prevent rollover preventPositionRollover(); } }
int it = headersIterator; if (headersIterator == -1) { handleTableSizeChange(target); log.debug(sm.getString("hpackEncoder.encodeHeader", headerName, val)); TableEntry tableEntry = findInTable(headerName, val); writeHuffmanEncodableName(target, headerName); writeHuffmanEncodableValue(target, headerName, val); addToDynamicTable(headerName, val); } else if (tableEntry == null) { writeHuffmanEncodableName(target, headerName); writeHuffmanEncodableValue(target, headerName, val); } else { writeHuffmanEncodableValue(target, headerName, val); addToDynamicTable(headerName, val); writeHuffmanEncodableValue(target, headerName, val);
private void handleTableSizeChange(ByteBuffer target) { if (newMaxHeaderSize == -1) { return; } if (minNewMaxHeaderSize != newMaxHeaderSize) { target.put((byte) (1 << 5)); Hpack.encodeInteger(target, minNewMaxHeaderSize, 5); } target.put((byte) (1 << 5)); Hpack.encodeInteger(target, newMaxHeaderSize, 5); maxTableSize = newMaxHeaderSize; runEvictionIfRequired(); newMaxHeaderSize = -1; minNewMaxHeaderSize = -1; }
headerFrameBuffers.getPayload().put(pushedStreamIdBytes); state = getHpackEncoder().encode(mimeHeaders, headerFrameBuffers.getPayload()); headerFrameBuffers.getPayload().flip(); if (state == State.COMPLETE || headerFrameBuffers.getPayload().limit() > 0) {