/** * @param localMaxDynamicTableSize The maximum allowed size of the local dynamic header field table. * @param maxHeaderSize The maximum allowed size of a headers block, expressed as total of all name and value characters, plus 32 per field */ public HpackDecoder(int localMaxDynamicTableSize, int maxHeaderSize) { _context=new HpackContext(localMaxDynamicTableSize); _localMaxDynamicTableSize=localMaxDynamicTableSize; _builder = new MetaDataBuilder(maxHeaderSize); }
public Entry get(HttpHeader header) { Entry e = __staticTableByHeader[header.ordinal()]; if (e==null) return get(header.asString()); return e; }
public void encodeMaxDynamicTableSize(ByteBuffer buffer, int maxDynamicTableSize) { if (maxDynamicTableSize>_remoteMaxDynamicTableSize) throw new IllegalArgumentException(); buffer.put((byte)0x20); NBitInteger.encode(buffer,5,maxDynamicTableSize); _context.resize(maxDynamicTableSize); }
Entry entry = _context.get(field); if (entry!=null) int index=_context.index(entry); buffer.put((byte)0x80); NBitInteger.encode(buffer,7,index); Entry name = _context.get(field.getName()); Entry name = _context.get(header); ((name==null)?"HuffN":("IdxN"+(name.isStatic()?"S":"")+(1+NBitInteger.octectsNeeded(4,_context.index(name)))))+ (huffman?"HuffV":"LitV")+ (never_index?"!!Idx":"!Idx"); else if (field_size>=_context.getMaxDynamicTableSize() || header==HttpHeader.CONTENT_LENGTH && field.getValue().length()>2) encodeValue(buffer,true,field.getValue()); if (_debug) encoding="LitIdxNS"+(1+NBitInteger.octectsNeeded(4,_context.index(name)))+"HuffV!Idx"; encodeValue(buffer,huffman,field.getValue()); if (_debug) encoding=((name==null)?"LitHuffN":("LitIdxN"+(name.isStatic()?"S":"")+(1+NBitInteger.octectsNeeded(6,_context.index(name)))))+ (huffman?"HuffVIdx":"LitVIdx"); _context.add(field);
Entry entry=_context.get(index); if (entry==null) throw new HpackException.SessionException("Unknown index %d",index); if (emitted) throw new HpackException.CompressionException("Dynamic table resize after fields"); _context.resize(size); continue; Entry name_entry=_context.get(name_index); name=name_entry.getHttpField().getName(); header=name_entry.getHttpField().getHeader(); _context.add(field);
private void encodeName(ByteBuffer buffer, byte mask, int bits, String name, Entry entry) { buffer.put(mask); if (entry==null) { // leave name index bits as 0 // Encode the name always with lowercase huffman buffer.put((byte)0x80); NBitInteger.encode(buffer,7,Huffman.octetsNeededLC(name)); Huffman.encodeLC(buffer,name); } else { NBitInteger.encode(buffer,bits,_context.index(entry)); } }
int name_idx=HpackContext.staticIndex(header); if (name_idx>0) NBitInteger.encode(buffer,bits,name_idx);
if (maxDynamicTableSize!=_context.getMaxDynamicTableSize()) encodeMaxDynamicTableSize(buffer,maxDynamicTableSize);
public HpackEncoder(int localMaxDynamicTableSize,int remoteMaxDynamicTableSize, int maxHeaderListSize) { _context=new HpackContext(remoteMaxDynamicTableSize); _remoteMaxDynamicTableSize=remoteMaxDynamicTableSize; _localMaxDynamicTableSize=localMaxDynamicTableSize; _maxHeaderListSize=maxHeaderListSize; _debug=LOG.isDebugEnabled(); }