package com.webpieces.http2parser.impl; import java.util.List; import org.webpieces.data.api.DataWrapper; import org.webpieces.data.api.DataWrapperGenerator; import org.webpieces.data.api.DataWrapperGeneratorFactory; import com.webpieces.http2parser.api.ConnectionException; import com.webpieces.http2parser.api.ParseFailReason; public class PaddingUtil { private static final DataWrapperGenerator dataGen = DataWrapperGeneratorFactory.createDataWrapperGenerator(); public static DataSplit extractPayloadAndPadding(boolean isPadded, DataWrapper data, int streamId) { if(!isPadded) { return new DataSplit(data, DataWrapperGeneratorFactory.EMPTY); } short padLength = (short) (data.readByteAt(0) & 0xFF); if(padLength > data.getReadableSize()) { throw new ConnectionException(ParseFailReason.NOT_ENOUGH_PAD_DATA, streamId, "expected padLenth of="+padLength+" but only found="+data.getReadableSize()); } List<? extends DataWrapper> split1 = dataGen.split(data, 1); List<? extends DataWrapper> split2 = dataGen.split(split1.get(1), split1.get(1).getReadableSize() - padLength); return new DataSplit(split2.get(0), split2.get(1)); } public static DataWrapper padDataIfNeeded(DataWrapper data, DataWrapper padding) { if(padding.getReadableSize() > 0) { byte[] length = {(byte) padding.getReadableSize()}; DataWrapper lengthDW = dataGen.wrapByteArray(length); return dataGen.chainDataWrappers(dataGen.chainDataWrappers(lengthDW, data), padding); } else return data; } }