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/HttpResponseEncoderTest.lvt

namespace Livt.Web.Tests.Http

using Livt.Net
using Livt.Web.Http

@Test
component HttpResponseEncoderTest
{
	// Independent literal HTTP headers; never derived from production helpers.
	const EXPECTED[3336] = [
		0x48, 0x54, 0x54, 0x50, 0x2F, 0x31, 0x2E, 0x30, 0x20, 0x32, 0x30, 0x30, 0x20, 0x4F, 0x4B, 0x0D,
		0x0A, 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x54, 0x79, 0x70, 0x65, 0x3A, 0x20, 0x74,
		0x65, 0x78, 0x74, 0x2F, 0x68, 0x74, 0x6D, 0x6C, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x6E,
		0x74, 0x2D, 0x4C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x3A, 0x20, 0x30, 0x0D, 0x0A, 0x43, 0x6F, 0x6E,
		0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3A, 0x20, 0x63, 0x6C, 0x6F, 0x73, 0x65, 0x0D, 0x0A,
		0x0D, 0x0A, 0x48, 0x54, 0x54, 0x50, 0x2F, 0x31, 0x2E, 0x30, 0x20, 0x32, 0x30, 0x30, 0x20, 0x4F,
		0x4B, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x54, 0x79, 0x70, 0x65, 0x3A,
		0x20, 0x74, 0x65, 0x78, 0x74, 0x2F, 0x70, 0x6C, 0x61, 0x69, 0x6E, 0x0D, 0x0A, 0x43, 0x6F, 0x6E,
		0x74, 0x65, 0x6E, 0x74, 0x2D, 0x4C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x3A, 0x20, 0x31, 0x0D, 0x0A,
		0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3A, 0x20, 0x63, 0x6C, 0x6F, 0x73,
		0x65, 0x0D, 0x0A, 0x0D, 0x0A, 0x48, 0x54, 0x54, 0x50, 0x2F, 0x31, 0x2E, 0x30, 0x20, 0x32, 0x30,
		0x30, 0x20, 0x4F, 0x4B, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x54, 0x79,
		0x70, 0x65, 0x3A, 0x20, 0x61, 0x70, 0x70, 0x6C, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x2F,
		0x6A, 0x73, 0x6F, 0x6E, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x4C, 0x65,
		0x6E, 0x67, 0x74, 0x68, 0x3A, 0x20, 0x32, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74,
		0x69, 0x6F, 0x6E, 0x3A, 0x20, 0x63, 0x6C, 0x6F, 0x73, 0x65, 0x0D, 0x0A, 0x0D, 0x0A, 0x48, 0x54,
		0x54, 0x50, 0x2F, 0x31, 0x2E, 0x30, 0x20, 0x34, 0x30, 0x30, 0x20, 0x42, 0x61, 0x64, 0x20, 0x52,
		0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x2D,
		0x54, 0x79, 0x70, 0x65, 0x3A, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2F, 0x68, 0x74, 0x6D, 0x6C, 0x0D,
		0x0A, 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x4C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x3A,
		0x20, 0x30, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3A, 0x20,
		0x63, 0x6C, 0x6F, 0x73, 0x65, 0x0D, 0x0A, 0x0D, 0x0A, 0x48, 0x54, 0x54, 0x50, 0x2F, 0x31, 0x2E,
		0x30, 0x20, 0x34, 0x30, 0x30, 0x20, 0x42, 0x61, 0x64, 0x20, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
		0x74, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x54, 0x79, 0x70, 0x65, 0x3A,
		0x20, 0x74, 0x65, 0x78, 0x74, 0x2F, 0x70, 0x6C, 0x61, 0x69, 0x6E, 0x0D, 0x0A, 0x43, 0x6F, 0x6E,
		0x74, 0x65, 0x6E, 0x74, 0x2D, 0x4C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x3A, 0x20, 0x31, 0x0D, 0x0A,
		0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3A, 0x20, 0x63, 0x6C, 0x6F, 0x73,
		0x65, 0x0D, 0x0A, 0x0D, 0x0A, 0x48, 0x54, 0x54, 0x50, 0x2F, 0x31, 0x2E, 0x30, 0x20, 0x34, 0x30,
		0x30, 0x20, 0x42, 0x61, 0x64, 0x20, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x0D, 0x0A, 0x43,
		0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x54, 0x79, 0x70, 0x65, 0x3A, 0x20, 0x61, 0x70, 0x70,
		0x6C, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x2F, 0x6A, 0x73, 0x6F, 0x6E, 0x0D, 0x0A, 0x43,
		0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x4C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x3A, 0x20, 0x32,
		0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3A, 0x20, 0x63, 0x6C,
		0x6F, 0x73, 0x65, 0x0D, 0x0A, 0x0D, 0x0A, 0x48, 0x54, 0x54, 0x50, 0x2F, 0x31, 0x2E, 0x30, 0x20,
		0x34, 0x30, 0x34, 0x20, 0x4E, 0x6F, 0x74, 0x20, 0x46, 0x6F, 0x75, 0x6E, 0x64, 0x0D, 0x0A, 0x43,
		0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x54, 0x79, 0x70, 0x65, 0x3A, 0x20, 0x74, 0x65, 0x78,
		0x74, 0x2F, 0x68, 0x74, 0x6D, 0x6C, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x2D,
		0x4C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x3A, 0x20, 0x30, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x6E, 0x65,
		0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3A, 0x20, 0x63, 0x6C, 0x6F, 0x73, 0x65, 0x0D, 0x0A, 0x0D, 0x0A,
		0x48, 0x54, 0x54, 0x50, 0x2F, 0x31, 0x2E, 0x30, 0x20, 0x34, 0x30, 0x34, 0x20, 0x4E, 0x6F, 0x74,
		0x20, 0x46, 0x6F, 0x75, 0x6E, 0x64, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x2D,
		0x54, 0x79, 0x70, 0x65, 0x3A, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2F, 0x70, 0x6C, 0x61, 0x69, 0x6E,
		0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x4C, 0x65, 0x6E, 0x67, 0x74, 0x68,
		0x3A, 0x20, 0x31, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3A,
		0x20, 0x63, 0x6C, 0x6F, 0x73, 0x65, 0x0D, 0x0A, 0x0D, 0x0A, 0x48, 0x54, 0x54, 0x50, 0x2F, 0x31,
		0x2E, 0x30, 0x20, 0x34, 0x30, 0x34, 0x20, 0x4E, 0x6F, 0x74, 0x20, 0x46, 0x6F, 0x75, 0x6E, 0x64,
		0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x54, 0x79, 0x70, 0x65, 0x3A, 0x20,
		0x61, 0x70, 0x70, 0x6C, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x2F, 0x6A, 0x73, 0x6F, 0x6E,
		0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x4C, 0x65, 0x6E, 0x67, 0x74, 0x68,
		0x3A, 0x20, 0x32, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3A,
		0x20, 0x63, 0x6C, 0x6F, 0x73, 0x65, 0x0D, 0x0A, 0x0D, 0x0A, 0x48, 0x54, 0x54, 0x50, 0x2F, 0x31,
		0x2E, 0x30, 0x20, 0x34, 0x30, 0x35, 0x20, 0x4D, 0x65, 0x74, 0x68, 0x6F, 0x64, 0x20, 0x4E, 0x6F,
		0x74, 0x20, 0x41, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x74, 0x65,
		0x6E, 0x74, 0x2D, 0x54, 0x79, 0x70, 0x65, 0x3A, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2F, 0x68, 0x74,
		0x6D, 0x6C, 0x0D, 0x0A, 0x41, 0x6C, 0x6C, 0x6F, 0x77, 0x3A, 0x20, 0x47, 0x45, 0x54, 0x0D, 0x0A,
		0x43, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x4C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x3A, 0x20,
		0x30, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3A, 0x20, 0x63,
		0x6C, 0x6F, 0x73, 0x65, 0x0D, 0x0A, 0x0D, 0x0A, 0x48, 0x54, 0x54, 0x50, 0x2F, 0x31, 0x2E, 0x30,
		0x20, 0x34, 0x30, 0x35, 0x20, 0x4D, 0x65, 0x74, 0x68, 0x6F, 0x64, 0x20, 0x4E, 0x6F, 0x74, 0x20,
		0x41, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74,
		0x2D, 0x54, 0x79, 0x70, 0x65, 0x3A, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2F, 0x70, 0x6C, 0x61, 0x69,
		0x6E, 0x0D, 0x0A, 0x41, 0x6C, 0x6C, 0x6F, 0x77, 0x3A, 0x20, 0x47, 0x45, 0x54, 0x0D, 0x0A, 0x43,
		0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x4C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x3A, 0x20, 0x31,
		0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3A, 0x20, 0x63, 0x6C,
		0x6F, 0x73, 0x65, 0x0D, 0x0A, 0x0D, 0x0A, 0x48, 0x54, 0x54, 0x50, 0x2F, 0x31, 0x2E, 0x30, 0x20,
		0x34, 0x30, 0x35, 0x20, 0x4D, 0x65, 0x74, 0x68, 0x6F, 0x64, 0x20, 0x4E, 0x6F, 0x74, 0x20, 0x41,
		0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x2D,
		0x54, 0x79, 0x70, 0x65, 0x3A, 0x20, 0x61, 0x70, 0x70, 0x6C, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F,
		0x6E, 0x2F, 0x6A, 0x73, 0x6F, 0x6E, 0x0D, 0x0A, 0x41, 0x6C, 0x6C, 0x6F, 0x77, 0x3A, 0x20, 0x47,
		0x45, 0x54, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x4C, 0x65, 0x6E, 0x67,
		0x74, 0x68, 0x3A, 0x20, 0x32, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F,
		0x6E, 0x3A, 0x20, 0x63, 0x6C, 0x6F, 0x73, 0x65, 0x0D, 0x0A, 0x0D, 0x0A, 0x48, 0x54, 0x54, 0x50,
		0x2F, 0x31, 0x2E, 0x30, 0x20, 0x35, 0x30, 0x30, 0x20, 0x49, 0x6E, 0x74, 0x65, 0x72, 0x6E, 0x61,
		0x6C, 0x20, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x45, 0x72, 0x72, 0x6F, 0x72, 0x0D, 0x0A,
		0x43, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x54, 0x79, 0x70, 0x65, 0x3A, 0x20, 0x74, 0x65,
		0x78, 0x74, 0x2F, 0x68, 0x74, 0x6D, 0x6C, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74,
		0x2D, 0x4C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x3A, 0x20, 0x30, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x6E,
		0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3A, 0x20, 0x63, 0x6C, 0x6F, 0x73, 0x65, 0x0D, 0x0A, 0x0D,
		0x0A, 0x48, 0x54, 0x54, 0x50, 0x2F, 0x31, 0x2E, 0x30, 0x20, 0x35, 0x30, 0x30, 0x20, 0x49, 0x6E,
		0x74, 0x65, 0x72, 0x6E, 0x61, 0x6C, 0x20, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x45, 0x72,
		0x72, 0x6F, 0x72, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x54, 0x79, 0x70,
		0x65, 0x3A, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2F, 0x70, 0x6C, 0x61, 0x69, 0x6E, 0x0D, 0x0A, 0x43,
		0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x4C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x3A, 0x20, 0x31,
		0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3A, 0x20, 0x63, 0x6C,
		0x6F, 0x73, 0x65, 0x0D, 0x0A, 0x0D, 0x0A, 0x48, 0x54, 0x54, 0x50, 0x2F, 0x31, 0x2E, 0x30, 0x20,
		0x35, 0x30, 0x30, 0x20, 0x49, 0x6E, 0x74, 0x65, 0x72, 0x6E, 0x61, 0x6C, 0x20, 0x53, 0x65, 0x72,
		0x76, 0x65, 0x72, 0x20, 0x45, 0x72, 0x72, 0x6F, 0x72, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x74, 0x65,
		0x6E, 0x74, 0x2D, 0x54, 0x79, 0x70, 0x65, 0x3A, 0x20, 0x61, 0x70, 0x70, 0x6C, 0x69, 0x63, 0x61,
		0x74, 0x69, 0x6F, 0x6E, 0x2F, 0x6A, 0x73, 0x6F, 0x6E, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x74, 0x65,
		0x6E, 0x74, 0x2D, 0x4C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x3A, 0x20, 0x32, 0x0D, 0x0A, 0x43, 0x6F,
		0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3A, 0x20, 0x63, 0x6C, 0x6F, 0x73, 0x65, 0x0D,
		0x0A, 0x0D, 0x0A, 0x48, 0x54, 0x54, 0x50, 0x2F, 0x31, 0x2E, 0x30, 0x20, 0x34, 0x30, 0x35, 0x20,
		0x4D, 0x65, 0x74, 0x68, 0x6F, 0x64, 0x20, 0x4E, 0x6F, 0x74, 0x20, 0x41, 0x6C, 0x6C, 0x6F, 0x77,
		0x65, 0x64, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x54, 0x79, 0x70, 0x65,
		0x3A, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2F, 0x70, 0x6C, 0x61, 0x69, 0x6E, 0x0D, 0x0A, 0x41, 0x6C,
		0x6C, 0x6F, 0x77, 0x3A, 0x20, 0x48, 0x45, 0x41, 0x44, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x74, 0x65,
		0x6E, 0x74, 0x2D, 0x4C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x3A, 0x20, 0x32, 0x0D, 0x0A, 0x43, 0x6F,
		0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3A, 0x20, 0x63, 0x6C, 0x6F, 0x73, 0x65, 0x0D,
		0x0A, 0x0D, 0x0A, 0x48, 0x54, 0x54, 0x50, 0x2F, 0x31, 0x2E, 0x30, 0x20, 0x34, 0x30, 0x35, 0x20,
		0x4D, 0x65, 0x74, 0x68, 0x6F, 0x64, 0x20, 0x4E, 0x6F, 0x74, 0x20, 0x41, 0x6C, 0x6C, 0x6F, 0x77,
		0x65, 0x64, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x54, 0x79, 0x70, 0x65,
		0x3A, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2F, 0x70, 0x6C, 0x61, 0x69, 0x6E, 0x0D, 0x0A, 0x41, 0x6C,
		0x6C, 0x6F, 0x77, 0x3A, 0x20, 0x47, 0x45, 0x54, 0x2C, 0x20, 0x48, 0x45, 0x41, 0x44, 0x0D, 0x0A,
		0x43, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x4C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x3A, 0x20,
		0x32, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3A, 0x20, 0x63,
		0x6C, 0x6F, 0x73, 0x65, 0x0D, 0x0A, 0x0D, 0x0A, 0x48, 0x54, 0x54, 0x50, 0x2F, 0x31, 0x2E, 0x30,
		0x20, 0x32, 0x30, 0x30, 0x20, 0x4F, 0x4B, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74,
		0x2D, 0x54, 0x79, 0x70, 0x65, 0x3A, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2F, 0x68, 0x74, 0x6D, 0x6C,
		0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x4C, 0x65, 0x6E, 0x67, 0x74, 0x68,
		0x3A, 0x20, 0x39, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3A,
		0x20, 0x63, 0x6C, 0x6F, 0x73, 0x65, 0x0D, 0x0A, 0x0D, 0x0A, 0x48, 0x54, 0x54, 0x50, 0x2F, 0x31,
		0x2E, 0x30, 0x20, 0x32, 0x30, 0x30, 0x20, 0x4F, 0x4B, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x74, 0x65,
		0x6E, 0x74, 0x2D, 0x54, 0x79, 0x70, 0x65, 0x3A, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2F, 0x68, 0x74,
		0x6D, 0x6C, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x4C, 0x65, 0x6E, 0x67,
		0x74, 0x68, 0x3A, 0x20, 0x31, 0x30, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69,
		0x6F, 0x6E, 0x3A, 0x20, 0x63, 0x6C, 0x6F, 0x73, 0x65, 0x0D, 0x0A, 0x0D, 0x0A, 0x48, 0x54, 0x54,
		0x50, 0x2F, 0x31, 0x2E, 0x30, 0x20, 0x32, 0x30, 0x30, 0x20, 0x4F, 0x4B, 0x0D, 0x0A, 0x43, 0x6F,
		0x6E, 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x54, 0x79, 0x70, 0x65, 0x3A, 0x20, 0x74, 0x65, 0x78, 0x74,
		0x2F, 0x68, 0x74, 0x6D, 0x6C, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x4C,
		0x65, 0x6E, 0x67, 0x74, 0x68, 0x3A, 0x20, 0x39, 0x39, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x6E, 0x65,
		0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3A, 0x20, 0x63, 0x6C, 0x6F, 0x73, 0x65, 0x0D, 0x0A, 0x0D, 0x0A,
		0x48, 0x54, 0x54, 0x50, 0x2F, 0x31, 0x2E, 0x30, 0x20, 0x32, 0x30, 0x30, 0x20, 0x4F, 0x4B, 0x0D,
		0x0A, 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x54, 0x79, 0x70, 0x65, 0x3A, 0x20, 0x74,
		0x65, 0x78, 0x74, 0x2F, 0x68, 0x74, 0x6D, 0x6C, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x6E,
		0x74, 0x2D, 0x4C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x3A, 0x20, 0x31, 0x30, 0x30, 0x0D, 0x0A, 0x43,
		0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3A, 0x20, 0x63, 0x6C, 0x6F, 0x73, 0x65,
		0x0D, 0x0A, 0x0D, 0x0A, 0x48, 0x54, 0x54, 0x50, 0x2F, 0x31, 0x2E, 0x30, 0x20, 0x32, 0x30, 0x30,
		0x20, 0x4F, 0x4B, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x54, 0x79, 0x70,
		0x65, 0x3A, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2F, 0x68, 0x74, 0x6D, 0x6C, 0x0D, 0x0A, 0x43, 0x6F,
		0x6E, 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x4C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x3A, 0x20, 0x39, 0x39,
		0x39, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3A, 0x20, 0x63,
		0x6C, 0x6F, 0x73, 0x65, 0x0D, 0x0A, 0x0D, 0x0A, 0x48, 0x54, 0x54, 0x50, 0x2F, 0x31, 0x2E, 0x30,
		0x20, 0x32, 0x30, 0x30, 0x20, 0x4F, 0x4B, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74,
		0x2D, 0x54, 0x79, 0x70, 0x65, 0x3A, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2F, 0x68, 0x74, 0x6D, 0x6C,
		0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x4C, 0x65, 0x6E, 0x67, 0x74, 0x68,
		0x3A, 0x20, 0x31, 0x30, 0x30, 0x30, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69,
		0x6F, 0x6E, 0x3A, 0x20, 0x63, 0x6C, 0x6F, 0x73, 0x65, 0x0D, 0x0A, 0x0D, 0x0A, 0x48, 0x54, 0x54,
		0x50, 0x2F, 0x31, 0x2E, 0x30, 0x20, 0x32, 0x30, 0x30, 0x20, 0x4F, 0x4B, 0x0D, 0x0A, 0x43, 0x6F,
		0x6E, 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x54, 0x79, 0x70, 0x65, 0x3A, 0x20, 0x74, 0x65, 0x78, 0x74,
		0x2F, 0x68, 0x74, 0x6D, 0x6C, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x4C,
		0x65, 0x6E, 0x67, 0x74, 0x68, 0x3A, 0x20, 0x39, 0x39, 0x39, 0x39, 0x0D, 0x0A, 0x43, 0x6F, 0x6E,
		0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3A, 0x20, 0x63, 0x6C, 0x6F, 0x73, 0x65, 0x0D, 0x0A,
		0x0D, 0x0A, 0x48, 0x54, 0x54, 0x50, 0x2F, 0x31, 0x2E, 0x30, 0x20, 0x32, 0x30, 0x30, 0x20, 0x4F,
		0x4B, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x54, 0x79, 0x70, 0x65, 0x3A,
		0x20, 0x74, 0x65, 0x78, 0x74, 0x2F, 0x68, 0x74, 0x6D, 0x6C, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x74,
		0x65, 0x6E, 0x74, 0x2D, 0x4C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x3A, 0x20, 0x31, 0x30, 0x30, 0x30,
		0x30, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3A, 0x20, 0x63,
		0x6C, 0x6F, 0x73, 0x65, 0x0D, 0x0A, 0x0D, 0x0A, 0x48, 0x54, 0x54, 0x50, 0x2F, 0x31, 0x2E, 0x30,
		0x20, 0x32, 0x30, 0x30, 0x20, 0x4F, 0x4B, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74,
		0x2D, 0x54, 0x79, 0x70, 0x65, 0x3A, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2F, 0x68, 0x74, 0x6D, 0x6C,
		0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x4C, 0x65, 0x6E, 0x67, 0x74, 0x68,
		0x3A, 0x20, 0x39, 0x39, 0x39, 0x39, 0x39, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74,
		0x69, 0x6F, 0x6E, 0x3A, 0x20, 0x63, 0x6C, 0x6F, 0x73, 0x65, 0x0D, 0x0A, 0x0D, 0x0A, 0x48, 0x54,
		0x54, 0x50, 0x2F, 0x31, 0x2E, 0x30, 0x20, 0x32, 0x30, 0x30, 0x20, 0x4F, 0x4B, 0x0D, 0x0A, 0x43,
		0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x54, 0x79, 0x70, 0x65, 0x3A, 0x20, 0x74, 0x65, 0x78,
		0x74, 0x2F, 0x68, 0x74, 0x6D, 0x6C, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x2D,
		0x4C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x3A, 0x20, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0D, 0x0A,
		0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3A, 0x20, 0x63, 0x6C, 0x6F, 0x73,
		0x65, 0x0D, 0x0A, 0x0D, 0x0A, 0x48, 0x54, 0x54, 0x50, 0x2F, 0x31, 0x2E, 0x30, 0x20, 0x32, 0x30,
		0x30, 0x20, 0x4F, 0x4B, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x54, 0x79,
		0x70, 0x65, 0x3A, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2F, 0x68, 0x74, 0x6D, 0x6C, 0x0D, 0x0A, 0x43,
		0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x4C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x3A, 0x20, 0x39,
		0x39, 0x39, 0x39, 0x39, 0x39, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F,
		0x6E, 0x3A, 0x20, 0x63, 0x6C, 0x6F, 0x73, 0x65, 0x0D, 0x0A, 0x0D, 0x0A, 0x48, 0x54, 0x54, 0x50,
		0x2F, 0x31, 0x2E, 0x30, 0x20, 0x32, 0x30, 0x30, 0x20, 0x4F, 0x4B, 0x0D, 0x0A, 0x43, 0x6F, 0x6E,
		0x74, 0x65, 0x6E, 0x74, 0x2D, 0x54, 0x79, 0x70, 0x65, 0x3A, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2F,
		0x68, 0x74, 0x6D, 0x6C, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x4C, 0x65,
		0x6E, 0x67, 0x74, 0x68, 0x3A, 0x20, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0D, 0x0A, 0x43,
		0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3A, 0x20, 0x63, 0x6C, 0x6F, 0x73, 0x65,
		0x0D, 0x0A, 0x0D, 0x0A, 0x48, 0x54, 0x54, 0x50, 0x2F, 0x31, 0x2E, 0x30, 0x20, 0x32, 0x30, 0x30,
		0x20, 0x4F, 0x4B, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x54, 0x79, 0x70,
		0x65, 0x3A, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2F, 0x68, 0x74, 0x6D, 0x6C, 0x0D, 0x0A, 0x43, 0x6F,
		0x6E, 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x4C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x3A, 0x20, 0x39, 0x39,
		0x39, 0x39, 0x39, 0x39, 0x39, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F,
		0x6E, 0x3A, 0x20, 0x63, 0x6C, 0x6F, 0x73, 0x65, 0x0D, 0x0A, 0x0D, 0x0A, 0x48, 0x54, 0x54, 0x50,
		0x2F, 0x31, 0x2E, 0x30, 0x20, 0x32, 0x30, 0x30, 0x20, 0x4F, 0x4B, 0x0D, 0x0A, 0x43, 0x6F, 0x6E,
		0x74, 0x65, 0x6E, 0x74, 0x2D, 0x54, 0x79, 0x70, 0x65, 0x3A, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2F,
		0x68, 0x74, 0x6D, 0x6C, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x4C, 0x65,
		0x6E, 0x67, 0x74, 0x68, 0x3A, 0x20, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0D, 0x0A,
		0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3A, 0x20, 0x63, 0x6C, 0x6F, 0x73,
		0x65, 0x0D, 0x0A, 0x0D, 0x0A, 0x48, 0x54, 0x54, 0x50, 0x2F, 0x31, 0x2E, 0x30, 0x20, 0x32, 0x30,
		0x30, 0x20, 0x4F, 0x4B, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x54, 0x79,
		0x70, 0x65, 0x3A, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2F, 0x68, 0x74, 0x6D, 0x6C, 0x0D, 0x0A, 0x43,
		0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x4C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x3A, 0x20, 0x39,
		0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74,
		0x69, 0x6F, 0x6E, 0x3A, 0x20, 0x63, 0x6C, 0x6F, 0x73, 0x65, 0x0D, 0x0A, 0x0D, 0x0A, 0x48, 0x54,
		0x54, 0x50, 0x2F, 0x31, 0x2E, 0x30, 0x20, 0x32, 0x30, 0x30, 0x20, 0x4F, 0x4B, 0x0D, 0x0A, 0x43,
		0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x54, 0x79, 0x70, 0x65, 0x3A, 0x20, 0x74, 0x65, 0x78,
		0x74, 0x2F, 0x68, 0x74, 0x6D, 0x6C, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x2D,
		0x4C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x3A, 0x20, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
		0x30, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3A, 0x20, 0x63,
		0x6C, 0x6F, 0x73, 0x65, 0x0D, 0x0A, 0x0D, 0x0A, 0x48, 0x54, 0x54, 0x50, 0x2F, 0x31, 0x2E, 0x30,
		0x20, 0x32, 0x30, 0x30, 0x20, 0x4F, 0x4B, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74,
		0x2D, 0x54, 0x79, 0x70, 0x65, 0x3A, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2F, 0x68, 0x74, 0x6D, 0x6C,
		0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x4C, 0x65, 0x6E, 0x67, 0x74, 0x68,
		0x3A, 0x20, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x39, 0x0D, 0x0A, 0x43, 0x6F, 0x6E,
		0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3A, 0x20, 0x63, 0x6C, 0x6F, 0x73, 0x65, 0x0D, 0x0A,
		0x0D, 0x0A, 0x48, 0x54, 0x54, 0x50, 0x2F, 0x31, 0x2E, 0x30, 0x20, 0x32, 0x30, 0x30, 0x20, 0x4F,
		0x4B, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x54, 0x79, 0x70, 0x65, 0x3A,
		0x20, 0x74, 0x65, 0x78, 0x74, 0x2F, 0x68, 0x74, 0x6D, 0x6C, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x74,
		0x65, 0x6E, 0x74, 0x2D, 0x4C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x3A, 0x20, 0x31, 0x30, 0x30, 0x30,
		0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69,
		0x6F, 0x6E, 0x3A, 0x20, 0x63, 0x6C, 0x6F, 0x73, 0x65, 0x0D, 0x0A, 0x0D, 0x0A, 0x48, 0x54, 0x54,
		0x50, 0x2F, 0x31, 0x2E, 0x30, 0x20, 0x32, 0x30, 0x30, 0x20, 0x4F, 0x4B, 0x0D, 0x0A, 0x43, 0x6F,
		0x6E, 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x54, 0x79, 0x70, 0x65, 0x3A, 0x20, 0x74, 0x65, 0x78, 0x74,
		0x2F, 0x68, 0x74, 0x6D, 0x6C, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x2D, 0x4C,
		0x65, 0x6E, 0x67, 0x74, 0x68, 0x3A, 0x20, 0x32, 0x31, 0x34, 0x37, 0x34, 0x38, 0x33, 0x35, 0x30,
		0x30, 0x0D, 0x0A, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3A, 0x20, 0x63,
		0x6C, 0x6F, 0x73, 0x65, 0x0D, 0x0A, 0x0D, 0x0A]

	data: HttpResponseTestData
	response: HttpResponse<HttpResponseTestData>
	encoder: HttpResponseEncoder<HttpResponse<HttpResponseTestData>>
	direct: HttpResponseEncoder<HttpResponseTestData>

	new()
	{
		data = new HttpResponseTestData()
		response = new HttpResponse<HttpResponseTestData>(data)
		encoder = new HttpResponseEncoder<HttpResponse<HttpResponseTestData>>(response)
		direct = new HttpResponseEncoder<HttpResponseTestData>(data)
	}

	fn Select(length: int)
	{
		encoder.Invalidate()
		direct.Invalidate()
		response.Invalidate()
		data.Select(length)
	}

	fn Check(offset: int, headerLength: int, bodyLength: int, full: bool)
	{
		assert encoder.TryPrepare(2147483647)
		assert encoder.GetHeaderLength() == headerLength
		assert encoder.GetAvailableLength() == headerLength + bodyLength
		assert data.GetReads() == 0

		for (var i: int = 0; i < headerLength; i++) {
			var headerByte: byte = 0xFF
			assert encoder.TryRead(i, headerByte) == PacketDataResult.Success
			assert headerByte == EXPECTED[offset + i]
		}

		assert data.GetReads() == 0

		if (full) {
			for (var i: int = 0; i < bodyLength; i++) {
				var bodyByte: byte = 0xFF
				assert encoder.TryRead(headerLength + i, bodyByte) == PacketDataResult.Success
				assert bodyByte == ((i % 256) as byte)
			}
		}
		elif (bodyLength > 0) {
			var edgeByte: byte = 0xFF
			assert encoder.TryRead(headerLength, edgeByte) == PacketDataResult.Success
			assert edgeByte == 0x00
			assert encoder.TryRead(headerLength + bodyLength - 1, edgeByte) == PacketDataResult.Success
			assert edgeByte == (((bodyLength - 1) % 256) as byte)
		}

		var value: byte = 0xFF
		assert encoder.TryRead(-1, value) == PacketDataResult.Invalid
		assert value == 0x00
		assert encoder.TryRead(headerLength + bodyLength, value) == PacketDataResult.Invalid
		assert value == 0x00
		assert encoder.IsReady()
	}

	@Test
	fn Wire0_Ok_Html_0()
	{
		this.Select(0)
		assert response.TryPrepare(HttpStatus.Ok, HttpContentType.Html, HttpAllowedMethods.None)
		assert response.GetStatus() == HttpStatus.Ok
		assert response.GetContentType() == HttpContentType.Html
		assert response.GetAllowedMethods() == HttpAllowedMethods.None
		this.Check(0, 82, 0, true)
	}

	@Test
	fn Wire1_Ok_PlainText_1()
	{
		this.Select(1)
		assert response.TryPrepare(HttpStatus.Ok, HttpContentType.PlainText, HttpAllowedMethods.None)
		assert response.GetStatus() == HttpStatus.Ok
		assert response.GetContentType() == HttpContentType.PlainText
		assert response.GetAllowedMethods() == HttpAllowedMethods.None
		this.Check(82, 83, 1, true)
	}

	@Test
	fn Wire2_Ok_Json_2()
	{
		this.Select(2)
		assert response.TryPrepare(HttpStatus.Ok, HttpContentType.Json, HttpAllowedMethods.None)
		assert response.GetStatus() == HttpStatus.Ok
		assert response.GetContentType() == HttpContentType.Json
		assert response.GetAllowedMethods() == HttpAllowedMethods.None
		this.Check(165, 89, 2, true)
	}

	@Test
	fn Wire3_BadRequest_Html_0()
	{
		this.Select(0)
		assert response.TryPrepare(HttpStatus.BadRequest, HttpContentType.Html, HttpAllowedMethods.None)
		assert response.GetStatus() == HttpStatus.BadRequest
		assert response.GetContentType() == HttpContentType.Html
		assert response.GetAllowedMethods() == HttpAllowedMethods.None
		this.Check(254, 91, 0, true)
	}

	@Test
	fn Wire4_BadRequest_PlainText_1()
	{
		this.Select(1)
		assert response.TryPrepare(HttpStatus.BadRequest, HttpContentType.PlainText, HttpAllowedMethods.None)
		assert response.GetStatus() == HttpStatus.BadRequest
		assert response.GetContentType() == HttpContentType.PlainText
		assert response.GetAllowedMethods() == HttpAllowedMethods.None
		this.Check(345, 92, 1, true)
	}

	@Test
	fn Wire5_BadRequest_Json_2()
	{
		this.Select(2)
		assert response.TryPrepare(HttpStatus.BadRequest, HttpContentType.Json, HttpAllowedMethods.None)
		assert response.GetStatus() == HttpStatus.BadRequest
		assert response.GetContentType() == HttpContentType.Json
		assert response.GetAllowedMethods() == HttpAllowedMethods.None
		this.Check(437, 98, 2, true)
	}

	@Test
	fn Wire6_NotFound_Html_0()
	{
		this.Select(0)
		assert response.TryPrepare(HttpStatus.NotFound, HttpContentType.Html, HttpAllowedMethods.None)
		assert response.GetStatus() == HttpStatus.NotFound
		assert response.GetContentType() == HttpContentType.Html
		assert response.GetAllowedMethods() == HttpAllowedMethods.None
		this.Check(535, 89, 0, true)
	}

	@Test
	fn Wire7_NotFound_PlainText_1()
	{
		this.Select(1)
		assert response.TryPrepare(HttpStatus.NotFound, HttpContentType.PlainText, HttpAllowedMethods.None)
		assert response.GetStatus() == HttpStatus.NotFound
		assert response.GetContentType() == HttpContentType.PlainText
		assert response.GetAllowedMethods() == HttpAllowedMethods.None
		this.Check(624, 90, 1, true)
	}

	@Test
	fn Wire8_NotFound_Json_2()
	{
		this.Select(2)
		assert response.TryPrepare(HttpStatus.NotFound, HttpContentType.Json, HttpAllowedMethods.None)
		assert response.GetStatus() == HttpStatus.NotFound
		assert response.GetContentType() == HttpContentType.Json
		assert response.GetAllowedMethods() == HttpAllowedMethods.None
		this.Check(714, 96, 2, true)
	}

	@Test
	fn Wire9_MethodNotAllowed_Html_0()
	{
		this.Select(0)
		assert response.TryPrepare(HttpStatus.MethodNotAllowed, HttpContentType.Html, HttpAllowedMethods.Get)
		assert response.GetStatus() == HttpStatus.MethodNotAllowed
		assert response.GetContentType() == HttpContentType.Html
		assert response.GetAllowedMethods() == HttpAllowedMethods.Get
		this.Check(810, 110, 0, true)
	}

	@Test
	fn Wire10_MethodNotAllowed_PlainText_1()
	{
		this.Select(1)
		assert response.TryPrepare(HttpStatus.MethodNotAllowed, HttpContentType.PlainText, HttpAllowedMethods.Get)
		assert response.GetStatus() == HttpStatus.MethodNotAllowed
		assert response.GetContentType() == HttpContentType.PlainText
		assert response.GetAllowedMethods() == HttpAllowedMethods.Get
		this.Check(920, 111, 1, true)
	}

	@Test
	fn Wire11_MethodNotAllowed_Json_2()
	{
		this.Select(2)
		assert response.TryPrepare(HttpStatus.MethodNotAllowed, HttpContentType.Json, HttpAllowedMethods.Get)
		assert response.GetStatus() == HttpStatus.MethodNotAllowed
		assert response.GetContentType() == HttpContentType.Json
		assert response.GetAllowedMethods() == HttpAllowedMethods.Get
		this.Check(1031, 117, 2, true)
	}

	@Test
	fn Wire12_InternalServerError_Html_0()
	{
		this.Select(0)
		assert response.TryPrepare(HttpStatus.InternalServerError, HttpContentType.Html, HttpAllowedMethods.None)
		assert response.GetStatus() == HttpStatus.InternalServerError
		assert response.GetContentType() == HttpContentType.Html
		assert response.GetAllowedMethods() == HttpAllowedMethods.None
		this.Check(1148, 101, 0, true)
	}

	@Test
	fn Wire13_InternalServerError_PlainText_1()
	{
		this.Select(1)
		assert response.TryPrepare(HttpStatus.InternalServerError, HttpContentType.PlainText, HttpAllowedMethods.None)
		assert response.GetStatus() == HttpStatus.InternalServerError
		assert response.GetContentType() == HttpContentType.PlainText
		assert response.GetAllowedMethods() == HttpAllowedMethods.None
		this.Check(1249, 102, 1, true)
	}

	@Test
	fn Wire14_InternalServerError_Json_2()
	{
		this.Select(2)
		assert response.TryPrepare(HttpStatus.InternalServerError, HttpContentType.Json, HttpAllowedMethods.None)
		assert response.GetStatus() == HttpStatus.InternalServerError
		assert response.GetContentType() == HttpContentType.Json
		assert response.GetAllowedMethods() == HttpAllowedMethods.None
		this.Check(1351, 108, 2, true)
	}

	@Test
	fn Wire15_MethodNotAllowed_PlainText_2()
	{
		this.Select(2)
		assert response.TryPrepare(HttpStatus.MethodNotAllowed, HttpContentType.PlainText, HttpAllowedMethods.Head)
		assert response.GetStatus() == HttpStatus.MethodNotAllowed
		assert response.GetContentType() == HttpContentType.PlainText
		assert response.GetAllowedMethods() == HttpAllowedMethods.Head
		this.Check(1459, 112, 2, true)
	}

	@Test
	fn Wire16_MethodNotAllowed_PlainText_2()
	{
		this.Select(2)
		assert response.TryPrepare(HttpStatus.MethodNotAllowed, HttpContentType.PlainText, HttpAllowedMethods.GetAndHead)
		assert response.GetStatus() == HttpStatus.MethodNotAllowed
		assert response.GetContentType() == HttpContentType.PlainText
		assert response.GetAllowedMethods() == HttpAllowedMethods.GetAndHead
		this.Check(1571, 117, 2, true)
	}

	@Test
	fn Wire17_Ok_Html_9()
	{
		this.Select(9)
		assert response.TryPrepare(HttpStatus.Ok, HttpContentType.Html, HttpAllowedMethods.None)
		assert response.GetStatus() == HttpStatus.Ok
		assert response.GetContentType() == HttpContentType.Html
		assert response.GetAllowedMethods() == HttpAllowedMethods.None
		this.Check(1688, 82, 9, true)
	}

	@Test
	fn Wire18_Ok_Html_10()
	{
		this.Select(10)
		assert response.TryPrepare(HttpStatus.Ok, HttpContentType.Html, HttpAllowedMethods.None)
		assert response.GetStatus() == HttpStatus.Ok
		assert response.GetContentType() == HttpContentType.Html
		assert response.GetAllowedMethods() == HttpAllowedMethods.None
		this.Check(1770, 83, 10, true)
	}

	@Test
	fn Wire19_Ok_Html_99()
	{
		this.Select(99)
		assert response.TryPrepare(HttpStatus.Ok, HttpContentType.Html, HttpAllowedMethods.None)
		assert response.GetStatus() == HttpStatus.Ok
		assert response.GetContentType() == HttpContentType.Html
		assert response.GetAllowedMethods() == HttpAllowedMethods.None
		this.Check(1853, 83, 99, true)
	}

	@Test
	fn Wire20_Ok_Html_100()
	{
		this.Select(100)
		assert response.TryPrepare(HttpStatus.Ok, HttpContentType.Html, HttpAllowedMethods.None)
		assert response.GetStatus() == HttpStatus.Ok
		assert response.GetContentType() == HttpContentType.Html
		assert response.GetAllowedMethods() == HttpAllowedMethods.None
		this.Check(1936, 84, 100, true)
	}

	@Test
	fn Wire21_Ok_Html_999()
	{
		this.Select(999)
		assert response.TryPrepare(HttpStatus.Ok, HttpContentType.Html, HttpAllowedMethods.None)
		assert response.GetStatus() == HttpStatus.Ok
		assert response.GetContentType() == HttpContentType.Html
		assert response.GetAllowedMethods() == HttpAllowedMethods.None
		this.Check(2020, 84, 999, true)
	}

	@Test
	fn Wire22_Ok_Html_1000()
	{
		this.Select(1000)
		assert response.TryPrepare(HttpStatus.Ok, HttpContentType.Html, HttpAllowedMethods.None)
		assert response.GetStatus() == HttpStatus.Ok
		assert response.GetContentType() == HttpContentType.Html
		assert response.GetAllowedMethods() == HttpAllowedMethods.None
		this.Check(2104, 85, 1000, true)
	}

	@Test
	fn Wire23_Ok_Html_9999()
	{
		this.Select(9999)
		assert response.TryPrepare(HttpStatus.Ok, HttpContentType.Html, HttpAllowedMethods.None)
		assert response.GetStatus() == HttpStatus.Ok
		assert response.GetContentType() == HttpContentType.Html
		assert response.GetAllowedMethods() == HttpAllowedMethods.None
		this.Check(2189, 85, 9999, false)
	}

	@Test
	fn Wire24_Ok_Html_10000()
	{
		this.Select(10000)
		assert response.TryPrepare(HttpStatus.Ok, HttpContentType.Html, HttpAllowedMethods.None)
		assert response.GetStatus() == HttpStatus.Ok
		assert response.GetContentType() == HttpContentType.Html
		assert response.GetAllowedMethods() == HttpAllowedMethods.None
		this.Check(2274, 86, 10000, false)
	}

	@Test
	fn Wire25_Ok_Html_99999()
	{
		this.Select(99999)
		assert response.TryPrepare(HttpStatus.Ok, HttpContentType.Html, HttpAllowedMethods.None)
		assert response.GetStatus() == HttpStatus.Ok
		assert response.GetContentType() == HttpContentType.Html
		assert response.GetAllowedMethods() == HttpAllowedMethods.None
		this.Check(2360, 86, 99999, false)
	}

	@Test
	fn Wire26_Ok_Html_100000()
	{
		this.Select(100000)
		assert response.TryPrepare(HttpStatus.Ok, HttpContentType.Html, HttpAllowedMethods.None)
		assert response.GetStatus() == HttpStatus.Ok
		assert response.GetContentType() == HttpContentType.Html
		assert response.GetAllowedMethods() == HttpAllowedMethods.None
		this.Check(2446, 87, 100000, false)
	}

	@Test
	fn Wire27_Ok_Html_999999()
	{
		this.Select(999999)
		assert response.TryPrepare(HttpStatus.Ok, HttpContentType.Html, HttpAllowedMethods.None)
		assert response.GetStatus() == HttpStatus.Ok
		assert response.GetContentType() == HttpContentType.Html
		assert response.GetAllowedMethods() == HttpAllowedMethods.None
		this.Check(2533, 87, 999999, false)
	}

	@Test
	fn Wire28_Ok_Html_1000000()
	{
		this.Select(1000000)
		assert response.TryPrepare(HttpStatus.Ok, HttpContentType.Html, HttpAllowedMethods.None)
		assert response.GetStatus() == HttpStatus.Ok
		assert response.GetContentType() == HttpContentType.Html
		assert response.GetAllowedMethods() == HttpAllowedMethods.None
		this.Check(2620, 88, 1000000, false)
	}

	@Test
	fn Wire29_Ok_Html_9999999()
	{
		this.Select(9999999)
		assert response.TryPrepare(HttpStatus.Ok, HttpContentType.Html, HttpAllowedMethods.None)
		assert response.GetStatus() == HttpStatus.Ok
		assert response.GetContentType() == HttpContentType.Html
		assert response.GetAllowedMethods() == HttpAllowedMethods.None
		this.Check(2708, 88, 9999999, false)
	}

	@Test
	fn Wire30_Ok_Html_10000000()
	{
		this.Select(10000000)
		assert response.TryPrepare(HttpStatus.Ok, HttpContentType.Html, HttpAllowedMethods.None)
		assert response.GetStatus() == HttpStatus.Ok
		assert response.GetContentType() == HttpContentType.Html
		assert response.GetAllowedMethods() == HttpAllowedMethods.None
		this.Check(2796, 89, 10000000, false)
	}

	@Test
	fn Wire31_Ok_Html_99999999()
	{
		this.Select(99999999)
		assert response.TryPrepare(HttpStatus.Ok, HttpContentType.Html, HttpAllowedMethods.None)
		assert response.GetStatus() == HttpStatus.Ok
		assert response.GetContentType() == HttpContentType.Html
		assert response.GetAllowedMethods() == HttpAllowedMethods.None
		this.Check(2885, 89, 99999999, false)
	}

	@Test
	fn Wire32_Ok_Html_100000000()
	{
		this.Select(100000000)
		assert response.TryPrepare(HttpStatus.Ok, HttpContentType.Html, HttpAllowedMethods.None)
		assert response.GetStatus() == HttpStatus.Ok
		assert response.GetContentType() == HttpContentType.Html
		assert response.GetAllowedMethods() == HttpAllowedMethods.None
		this.Check(2974, 90, 100000000, false)
	}

	@Test
	fn Wire33_Ok_Html_999999999()
	{
		this.Select(999999999)
		assert response.TryPrepare(HttpStatus.Ok, HttpContentType.Html, HttpAllowedMethods.None)
		assert response.GetStatus() == HttpStatus.Ok
		assert response.GetContentType() == HttpContentType.Html
		assert response.GetAllowedMethods() == HttpAllowedMethods.None
		this.Check(3064, 90, 999999999, false)
	}

	@Test
	fn Wire34_Ok_Html_1000000000()
	{
		this.Select(1000000000)
		assert response.TryPrepare(HttpStatus.Ok, HttpContentType.Html, HttpAllowedMethods.None)
		assert response.GetStatus() == HttpStatus.Ok
		assert response.GetContentType() == HttpContentType.Html
		assert response.GetAllowedMethods() == HttpAllowedMethods.None
		this.Check(3154, 91, 1000000000, false)
	}

	@Test
	fn Wire35_Ok_Html_2147483500()
	{
		this.Select(2147483500)
		assert response.TryPrepare(HttpStatus.Ok, HttpContentType.Html, HttpAllowedMethods.None)
		assert response.GetStatus() == HttpStatus.Ok
		assert response.GetContentType() == HttpContentType.Html
		assert response.GetAllowedMethods() == HttpAllowedMethods.None
		this.Check(3245, 91, 2147483500, false)
	}

	@Test
	fn BudgetAndReprepare()
	{
		this.Select(0)
		assert response.TryPrepare(HttpStatus.Ok, HttpContentType.Html, HttpAllowedMethods.None)
		assert encoder.TryPrepare(82)
		assert encoder.GetAvailableLength() == 82
		assert !encoder.TryPrepare(81)
		assert !encoder.IsReady()
		assert encoder.GetAvailableLength() == 0
		assert encoder.GetHeaderLength() == 0
		var value: byte = 0xFF
		assert encoder.TryRead(0, value) == PacketDataResult.NotReady
		assert value == 0x00
		assert !encoder.TryPrepare(0)
		assert !encoder.TryPrepare(-1)
		assert encoder.TryPrepare(82)
		assert data.GetReads() == 0
	}

	@Test
	fn NonemptyExactBudget()
	{
		this.Select(1000)
		assert response.TryPrepare(HttpStatus.Ok, HttpContentType.Html, HttpAllowedMethods.None)
		assert !encoder.TryPrepare(1084)
		assert encoder.TryPrepare(1085)
		assert encoder.GetAvailableLength() == 1085
	}

	@Test
	fn OverflowAndNegativeLength()
	{
		this.Select(2147483647)
		assert response.TryPrepare(HttpStatus.Ok, HttpContentType.Html, HttpAllowedMethods.None)
		assert !encoder.TryPrepare(2147483647)
		assert !encoder.IsReady()
		assert encoder.GetAvailableLength() == 0
		this.Select(-1)
		assert !response.TryPrepare(HttpStatus.Ok, HttpContentType.Html, HttpAllowedMethods.None)
		assert !direct.TryPrepare(2147483647)
		assert !direct.IsReady()
		assert data.GetReads() == 0
	}

	fn Reject(status: HttpStatus, contentType: HttpContentType, allowed: HttpAllowedMethods)
	{
		this.Select(1)
		assert response.TryPrepare(HttpStatus.Ok, HttpContentType.Html, HttpAllowedMethods.None)
		assert encoder.TryPrepare(1000)
		encoder.Invalidate()
		assert !response.TryPrepare(status, contentType, allowed)
		assert !response.IsReady()
		assert response.GetAvailableLength() == 0
		assert response.GetStatus() == HttpStatus.Unknown
		assert response.GetContentType() == HttpContentType.Unknown
		assert response.GetAllowedMethods() == HttpAllowedMethods.None
		assert !encoder.TryPrepare(1000)
		data.Metadata(status, contentType, allowed)
		assert !direct.TryPrepare(1000)
		assert !direct.IsReady()
		assert direct.GetAvailableLength() == 0
	}

	@Test
	fn UnsupportedMetadata()
	{
		this.Reject(HttpStatus.Unknown, HttpContentType.Html, HttpAllowedMethods.None)
		this.Reject(HttpStatus.Ok, HttpContentType.Unknown, HttpAllowedMethods.None)
		this.Reject(HttpStatus.MethodNotAllowed, HttpContentType.Html, HttpAllowedMethods.None)
		this.Reject(HttpStatus.Ok, HttpContentType.Html, HttpAllowedMethods.Get)
	}

	@Test
	fn UnpublishedAndReleasedSource()
	{
		this.Select(2)
		assert !encoder.IsReady()
		assert !encoder.TryPrepare(1000)
		assert response.TryPrepare(HttpStatus.Ok, HttpContentType.Html, HttpAllowedMethods.None)
		assert encoder.TryPrepare(1000)
		data.Release()
		assert !encoder.IsReady()
		assert !response.IsReady()
		assert encoder.GetAvailableLength() == 0
		assert !response.TryPrepare(HttpStatus.Ok, HttpContentType.Html, HttpAllowedMethods.None)
		assert !direct.TryPrepare(1000)
		data.Select(2)
		assert !response.IsReady()
		assert !encoder.IsReady()
	}

	fn Failure(failure: PacketDataResult)
	{
		this.Select(2)
		assert response.TryPrepare(HttpStatus.Ok, HttpContentType.Html, HttpAllowedMethods.None)
		assert encoder.TryPrepare(1000)
		data.FailAt(1, failure)
		var value: byte = 0xFF
		assert encoder.TryRead(82, value) == PacketDataResult.Success
		assert value == 0x00
		assert encoder.TryRead(83, value) == failure
		assert value == 0x00
		assert !encoder.IsReady()
		assert !response.IsReady()
		assert encoder.GetAvailableLength() == 0
		assert encoder.TryRead(0, value) == PacketDataResult.NotReady
		assert value == 0x00
		this.Select(2)
		assert response.TryPrepare(HttpStatus.Ok, HttpContentType.Html, HttpAllowedMethods.None)
		assert encoder.TryPrepare(1000)
		assert encoder.TryRead(83, value) == PacketDataResult.Success
		assert value == 0x01
	}

	@Test
	fn InvalidProviderRead()
	{
		this.Failure(PacketDataResult.Invalid)
	}

	@Test
	fn BusyProviderRead()
	{
		this.Failure(PacketDataResult.Busy)
	}

	@Test
	fn NotReadyProviderRead()
	{
		this.Failure(PacketDataResult.NotReady)
	}

	@Test
	fn DirectProviderFailure()
	{
		this.Select(1)
		assert direct.TryPrepare(1000)
		data.FailAt(0, PacketDataResult.Invalid)
		var value: byte = 0xFF
		assert direct.TryRead(82, value) == PacketDataResult.Invalid
		assert value == 0x00
		assert !direct.IsReady()
		assert data.IsReady()
	}

	@Test
	fn BorrowedBodyAndBounds()
	{
		this.Select(2)
		assert response.TryPrepare(HttpStatus.Ok, HttpContentType.Html, HttpAllowedMethods.None)
		var value: byte = 0xFF
		assert response.TryRead(-1, value) == PacketDataResult.Invalid
		assert value == 0x00
		assert response.TryRead(2, value) == PacketDataResult.Invalid
		assert value == 0x00
		assert response.IsReady()
		assert data.GetReads() == 0
		assert response.TryRead(1, value) == PacketDataResult.Success
		assert value == 0x01
		encoder.Invalidate()
		response.Invalidate()
		assert data.IsReady()
		assert response.TryRead(0, value) == PacketDataResult.NotReady
		assert value == 0x00
	}
}