Livt packages

Livt.Web

Version 1.0.0

Bounded HTTP routing, request parsing, response encoding, and Ethernet application composition for Livt.

Published files (63)

tests/http/RoutingBytes.lvt

namespace Livt.Web.Tests.Http

using Livt.Net
using Livt.Web.Http

/**
 * Application-owned constants plus test-only bounds/lifetime/failure controls.
 */
component RoutingBytes : IPacketData
{
	const BYTES[578] = [
		0x2F, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2F, 0x61, 0x62, 0x6F, 0x75, 0x74, 0x2F, 0x61,
		0x2F, 0x25, 0x36, 0x31, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2F, 0x2F, 0x53, 0x74, 0x61,
		0x74, 0x75, 0x73, 0x2F, 0x6D, 0x69, 0x73, 0x73, 0x69, 0x6E, 0x67, 0x73, 0x74, 0x61, 0x74, 0x75,
		0x73, 0x2F, 0x78, 0x3F, 0x79, 0x2F, 0x78, 0x23, 0x79, 0x2F, 0x25, 0x2F, 0x25, 0x47, 0x30, 0x2F,
		0x78, 0x00, 0x2F, 0x61, 0x25, 0x32, 0x46, 0x62, 0x2F, 0x61, 0x2F, 0x62, 0x2F, 0x73, 0x74, 0x61,
		0x74, 0x75, 0x73, 0x3F, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2F, 0x74, 0x6F, 0x6F, 0x6C, 0x6F, 0x6E,
		0x67, 0x2F, 0x61, 0x62, 0x2F, 0x25, 0x36, 0x61, 0x2F, 0x25, 0x36, 0x41, 0x2F, 0x61, 0x2F, 0x2E,
		0x2E, 0x2F, 0x62, 0x2F, 0x62, 0x2F, 0x61, 0x2F, 0x2F, 0x62, 0x47, 0x45, 0x54, 0x20, 0x2F, 0x20,
		0x48, 0x54, 0x54, 0x50, 0x2F, 0x31, 0x2E, 0x30, 0x0D, 0x0A, 0x0D, 0x0A, 0x47, 0x45, 0x54, 0x20,
		0x2F, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x48, 0x54, 0x54, 0x50, 0x2F, 0x31, 0x2E, 0x30,
		0x0D, 0x0A, 0x0D, 0x0A, 0x47, 0x45, 0x54, 0x20, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3F,
		0x78, 0x3D, 0x31, 0x20, 0x48, 0x54, 0x54, 0x50, 0x2F, 0x31, 0x2E, 0x30, 0x0D, 0x0A, 0x0D, 0x0A,
		0x47, 0x45, 0x54, 0x20, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2F, 0x20, 0x48, 0x54, 0x54,
		0x50, 0x2F, 0x31, 0x2E, 0x30, 0x0D, 0x0A, 0x0D, 0x0A, 0x47, 0x45, 0x54, 0x20, 0x2F, 0x53, 0x74,
		0x61, 0x74, 0x75, 0x73, 0x20, 0x48, 0x54, 0x54, 0x50, 0x2F, 0x31, 0x2E, 0x30, 0x0D, 0x0A, 0x0D,
		0x0A, 0x47, 0x45, 0x54, 0x20, 0x2F, 0x6D, 0x69, 0x73, 0x73, 0x69, 0x6E, 0x67, 0x20, 0x48, 0x54,
		0x54, 0x50, 0x2F, 0x31, 0x2E, 0x30, 0x0D, 0x0A, 0x0D, 0x0A, 0x48, 0x45, 0x41, 0x44, 0x20, 0x2F,
		0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x48, 0x54, 0x54, 0x50, 0x2F, 0x31, 0x2E, 0x30, 0x0D,
		0x0A, 0x0D, 0x0A, 0x50, 0x4F, 0x53, 0x54, 0x20, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20,
		0x48, 0x54, 0x54, 0x50, 0x2F, 0x31, 0x2E, 0x30, 0x0D, 0x0A, 0x0D, 0x0A, 0x50, 0x4F, 0x53, 0x54,
		0x20, 0x2F, 0x61, 0x62, 0x6F, 0x75, 0x74, 0x20, 0x48, 0x54, 0x54, 0x50, 0x2F, 0x31, 0x2E, 0x30,
		0x0D, 0x0A, 0x0D, 0x0A, 0x50, 0x4F, 0x53, 0x54, 0x20, 0x2F, 0x6D, 0x69, 0x73, 0x73, 0x69, 0x6E,
		0x67, 0x20, 0x48, 0x54, 0x54, 0x50, 0x2F, 0x31, 0x2E, 0x30, 0x0D, 0x0A, 0x0D, 0x0A, 0x47, 0x45,
		0x54, 0x20, 0x2F, 0x25, 0x36, 0x31, 0x20, 0x48, 0x54, 0x54, 0x50, 0x2F, 0x31, 0x2E, 0x30, 0x0D,
		0x0A, 0x0D, 0x0A, 0x47, 0x45, 0x54, 0x20, 0x2F, 0x61, 0x20, 0x48, 0x54, 0x54, 0x50, 0x2F, 0x31,
		0x2E, 0x30, 0x0D, 0x0A, 0x0D, 0x0A, 0x47, 0x45, 0x54, 0x20, 0x2F, 0x61, 0x25, 0x32, 0x46, 0x62,
		0x20, 0x48, 0x54, 0x54, 0x50, 0x2F, 0x31, 0x2E, 0x30, 0x0D, 0x0A, 0x0D, 0x0A, 0x47, 0x45, 0x54,
		0x20, 0x2F, 0x61, 0x62, 0x20, 0x48, 0x54, 0x54, 0x50, 0x2F, 0x31, 0x2E, 0x30, 0x0D, 0x0A, 0x0D,
		0x0A, 0x47, 0x45, 0x54, 0x20, 0x2F, 0x25, 0x36, 0x61, 0x20, 0x48, 0x54, 0x54, 0x50, 0x2F, 0x31,
		0x2E, 0x30, 0x0D, 0x0A, 0x0D, 0x0A, 0x47, 0x45, 0x54, 0x20, 0x2F, 0x61, 0x2F, 0x2E, 0x2E, 0x2F,
		0x62, 0x20, 0x48, 0x54, 0x54, 0x50, 0x2F, 0x31, 0x2E, 0x30, 0x0D, 0x0A, 0x0D, 0x0A, 0x47, 0x45,
		0x54, 0x20, 0x2F, 0x61, 0x2F, 0x2F, 0x62, 0x20, 0x48, 0x54, 0x54, 0x50, 0x2F, 0x31, 0x2E, 0x30,
		0x0D, 0x0A, 0x0D, 0x0A, 0x47, 0x45, 0x54, 0x20, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3F,
		0x20, 0x48, 0x54, 0x54, 0x50, 0x2F, 0x31, 0x2E, 0x30, 0x0D, 0x0A, 0x0D, 0x0A, 0x47, 0x45, 0x54,
		0x20, 0x2F, 0x61, 0x62, 0x6F, 0x75, 0x74, 0x20, 0x48, 0x54, 0x54, 0x50, 0x2F, 0x31, 0x2E, 0x30,
		0x0D, 0x0A, 0x0D, 0x0A, 0x48, 0x4F, 0x4D, 0x45, 0x61, 0x62, 0x6F, 0x75, 0x74, 0x6F, 0x74, 0x68,
		0x65, 0x72]
	const OFFSETS[47] = [0, 1, 8, 14, 16, 20, 28, 35, 43, 43, 49, 53, 57, 59, 63, 66, 72, 76, 89, 97, 100, 104, 108, 115, 117, 122, 140, 164, 192, 217, 241, 266, 291, 316, 340, 366, 387, 406, 429, 449, 470, 494, 516, 541, 564, 568, 573]
	const LENGTHS[47] = [1, 7, 6, 2, 4, 8, 7, 8, 0, 6, 4, 4, 2, 4, 3, 6, 4, 13, 8, 3, 4, 4, 7, 2, 5, 18, 24, 28, 25, 24, 25, 25, 25, 24, 26, 21, 19, 23, 20, 21, 24, 22, 25, 23, 4, 5, 5]

	offset: int
	length: int
	actualLength: int
	ready: bool
	failAt: int
	reads: int

	public fn Select(which: int)
	{
		offset = OFFSETS[which]
		length = LENGTHS[which]
		actualLength = length
		ready = true
		failAt = -1
		reads = 0
	}

	public fn Limit(length: int)
	{
		this.length = length
	}

	public fn FailAt(index: int)
	{
		failAt = index
	}

	public fn Release()
	{
		ready = false
	}

	public fn GetReads() int
	{
		return reads
	}

	override fn IsReady() bool
	{
		return ready
	}

	override fn GetAvailableLength() int
	{
		return length
	}

	override fn TryRead(index: int, value: out byte) PacketDataResult
	{
		reads = reads + 1
		value = 0xFF

		if (!ready) {
			return PacketDataResult.NotReady
		}

		if (index < 0 || index >= length || index >= actualLength || index == failAt) {
			return PacketDataResult.Invalid
		}

		value = BYTES[offset + index]
		return PacketDataResult.Success
	}
}