private static byte[] readHostName(final DatagramReader reader, final InetSocketAddress peerAddress) throws HandshakeException { if (reader.bitsLeft() >= LENGTH_BITS) { int length = reader.read(LENGTH_BITS); if (reader.bytesAvailable(length)) { return reader.readBytes(length); } } throw newDecodeError(peerAddress); }
@Test public void testBitsLeftWorksForByteWiseReading() { givenABuffer(new byte[]{0x01, 0x02, 0x03}); assertThat(reader.bitsLeft(), is(24)); reader.readBytes(1); assertThat(reader.bitsLeft(), is(16)); reader.readBytes(1); assertThat(reader.bitsLeft(), is(8)); reader.readBytes(1); assertThat(reader.bitsLeft(), is(0)); }
@Test public void testBitsLeftWorksForEmptyBuffer() { givenABuffer(new byte[]{}); assertThat(reader.bitsLeft(), is(0)); }
private static ServerNameExtension readServerNameList( final DatagramReader reader, final InetSocketAddress peerAddress) throws HandshakeException { ServerNames serverNames = ServerNames.newInstance(); int listLengthBytes = reader.read(LIST_LENGTH_BITS); while (listLengthBytes > 0) { if (reader.bitsLeft() >= 8) { NameType nameType = NameType.fromCode(reader.readNextByte()); switch (nameType) { case HOST_NAME: byte[] hostname = readHostName(reader, peerAddress); serverNames.add(ServerName.from(nameType, hostname)); listLengthBytes -= (hostname.length + 3); break; default: throw new HandshakeException( "Server Name Indication extension contains unknown name_type", new AlertMessage(AlertLevel.FATAL, AlertDescription.ILLEGAL_PARAMETER, peerAddress)); } } else { throw newDecodeError(peerAddress); } } return new ServerNameExtension(serverNames); }