// // ======================================================================== // Copyright (c) 1995-2017 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // All rights reserved. This program and the accompanying materials // are made available under the terms of the Eclipse Public License v1.0 // and Apache License v2.0 which accompanies this distribution. // // The Eclipse Public License is available at // http://www.eclipse.org/legal/epl-v10.html // // The Apache License v2.0 is available at // http://www.opensource.org/licenses/apache2.0.php // // You may elect to redistribute this code under either of these licenses. // ======================================================================== // package org.eclipse.jetty.http2.hpack; import java.nio.ByteBuffer; import org.eclipse.jetty.http.HttpFieldPreEncoder; import org.eclipse.jetty.http.HttpHeader; import org.eclipse.jetty.http.HttpVersion; import org.eclipse.jetty.util.BufferUtil; /* ------------------------------------------------------------ */ /** */ public class HpackFieldPreEncoder implements HttpFieldPreEncoder { /* ------------------------------------------------------------ */ /** * @see org.eclipse.jetty.http.HttpFieldPreEncoder#getHttpVersion() */ @Override public HttpVersion getHttpVersion() { return HttpVersion.HTTP_2; } /* ------------------------------------------------------------ */ /** * @see org.eclipse.jetty.http.HttpFieldPreEncoder#getEncodedField(org.eclipse.jetty.http.HttpHeader, java.lang.String, java.lang.String) */ @Override public byte[] getEncodedField(HttpHeader header, String name, String value) { boolean not_indexed=HpackEncoder.__DO_NOT_INDEX.contains(header); ByteBuffer buffer = BufferUtil.allocate(name.length()+value.length()+10); BufferUtil.clearToFill(buffer); boolean huffman; int bits; if (not_indexed) { // Non indexed field boolean never_index=HpackEncoder.__NEVER_INDEX.contains(header); huffman=!HpackEncoder.__DO_NOT_HUFFMAN.contains(header); buffer.put(never_index?(byte)0x10:(byte)0x00); bits=4; } else if (header==HttpHeader.CONTENT_LENGTH && value.length()>1) { // Non indexed content length for 2 digits or more buffer.put((byte)0x00); huffman=true; bits=4; } else { // indexed buffer.put((byte)0x40); huffman=!HpackEncoder.__DO_NOT_HUFFMAN.contains(header); bits=6; } int name_idx=HpackContext.staticIndex(header); if (name_idx>0) NBitInteger.encode(buffer,bits,name_idx); else { buffer.put((byte)0x80); NBitInteger.encode(buffer,7,Huffman.octetsNeededLC(name)); Huffman.encodeLC(buffer,name); } HpackEncoder.encodeValue(buffer,huffman,value); BufferUtil.flipToFlush(buffer,0); return BufferUtil.toArray(buffer); } }