public ByteBuffer encode()

in src/main/java/com/twitter/whiskey/net/SpdyHeaderBlockRawEncoder.java [30:78]


    public ByteBuffer encode(Headers headers) throws Exception {
        Set<String> names = headers.keySet();
        int numHeaders = names.size();
        if (numHeaders == 0) {
            return ByteBuffer.allocate(0);
        }
        if (numHeaders > SPDY_MAX_NV_LENGTH) {
            throw new IllegalArgumentException(
                    "header block contains too many headers");
        }

        // TODO: improve allocation
        ByteBuffer headerBlock = ByteBuffer.allocate(32768);
        headerBlock.putInt(numHeaders);

        for (String name : names) {
            byte[] nameBytes = name.getBytes(StandardCharsets.US_ASCII);

            headerBlock.putInt(nameBytes.length);
            headerBlock.put(nameBytes);

            int savedIndex = headerBlock.position();
            int valueLength = 0;
            headerBlock.position(savedIndex + 4);

            for (String value : headers.get(name)) {
                byte[] valueBytes = value.getBytes(StandardCharsets.US_ASCII);
                if (valueBytes.length > 0) {
                    headerBlock.put(valueBytes);
                    headerBlock.put((byte) 0);
                    valueLength += valueBytes.length + 1;
                }
            }
            if (valueLength != 0) {
                valueLength --;
            }
            if (valueLength > SPDY_MAX_NV_LENGTH) {
                throw new IllegalArgumentException(
                        "header exceeds allowable length: " + name);
            }
            if (valueLength > 0) {
                headerBlock.putInt(savedIndex, valueLength);
                headerBlock.position(headerBlock.position() - 1);
            }
        }

        headerBlock.flip();
        return headerBlock;
    }