diff --git a/.spec-results b/.spec-results index ff48968..5a8c810 100644 --- a/.spec-results +++ b/.spec-results @@ -2,119 +2,119 @@ [ "Axon Header Typed Accept Aac does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Aac parses \"audio/aac\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Abw does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Abw parses \"application/x-abiword\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Arc does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Arc parses \"application/x-freearc\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Archive7z does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Archive7z parses \"application/x-7z-compressed\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Avi does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Avi parses \"video/x-msvideo\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Avif does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Avif parses \"image/avif\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Azw does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Azw parses \"application/vnd.amazon.ebook\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Bin does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Bin parses \"application/octet-stream\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Bmp does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], @@ -128,252 +128,252 @@ [ "Axon Header Typed Accept Bmp parses \"image/bmp\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Bz does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Bz parses \"application/x-bzip\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Bz2 does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Bz2 parses \"application/x-bzip2\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Cda does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Cda parses \"application/x-cdf\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Csh does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Csh parses \"application/x-csh\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Css does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Css parses \"text/css\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Csv does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Csv parses \"text/csv\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Doc does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Doc parses \"application/msword\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Docx does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Docx parses \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Eot does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Eot parses \"application/vnd.ms-fontobject\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Epub does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Epub parses \"application/epub+zip\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Gif does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Gif parses \"image/gif\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Gz does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Gz parses \"application/gzip\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Html does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Html parses \"text/html\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Ico does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Ico parses \"image/vnd.microsoft.icon\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Ics does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Ics parses \"text/calendar\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Jar does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Jar parses \"application/java-archive\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Jpeg does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Jpeg parses \"image/jpeg\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Js does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], @@ -387,77 +387,77 @@ [ "Axon Header Typed Accept Js parses \"text/javascript\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Json does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Json parses \"application/json\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Jsonld does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Jsonld parses \"application/ld+json\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept MIME.MIME parses \"application/json\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept MIME.MIME parses \"foo\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept MIME.MIME parses \"text/plain\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept MIME.MIME parses \"text/plain;charset=utf8\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Midi does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Midi parses \"audio/midi\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], @@ -478,294 +478,294 @@ [ "Axon Header Typed Accept Mp3 does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Mp3 parses \"audio/mpeg\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Mp4 does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Mp4 parses \"video/mp4\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Mpeg does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Mpeg parses \"video/mpeg\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Mpkg does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Mpkg parses \"application/vnd.apple.installer+xml\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Odp does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Odp parses \"application/vnd.oasis.opendocument.presentation\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Ods does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Ods parses \"application/vnd.oasis.opendocument.spreadsheet\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Odt does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Odt parses \"application/vnd.oasis.opendocument.text\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Oga does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Oga parses \"audio/ogg\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Ogv does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Ogv parses \"video/ogg\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Ogx does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Ogx parses \"application/ogg\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Opus does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Opus parses \"audio/opus\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Otf does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Otf parses \"font/otf\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Pdf does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Pdf parses \"application/pdf\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Php does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Php parses \"application/x-httpd-php\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Png does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Png parses \"image/png\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Ppt does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Ppt parses \"application/vnd.ms-powerpoint\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Pptx does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Pptx parses \"application/vnd.openxmlformats-officedocument.presentationml.presentation\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Rar does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Rar parses \"application/vnd.rar\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Rtf does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Rtf parses \"application/rtf\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Sh does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Sh parses \"application/x-sh\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept String parses \"\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept String parses \"foo\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], @@ -779,624 +779,736 @@ [ "Axon Header Typed Accept Svg does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Svg parses \"image/svg+xml\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Tar does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Tar parses \"application/x-tar\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Tif does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Tif parses \"image/tiff\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Ts does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Ts parses \"video/mp2t\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Ttf does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Ttf parses \"font/ttf\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Txt does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Txt parses \"text/plain\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Video3g2 does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Video3g2 parses \"video/3gpp2\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Video3gp does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Video3gp parses \"video/3gpp\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Vsd does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Vsd parses \"application/vnd.visio\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Wav does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Wav parses \"audio/wav\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Weba does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Weba parses \"audio/webm\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Webm does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Webm parses \"video/webm\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Webp does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Webp parses \"image/webp\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Woff does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Woff parses \"font/woff\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Woff2 does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Woff2 parses \"font/woff2\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Xhtml does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Xhtml parses \"application/xhtml+xml\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Xls does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Xls parses \"application/vnd.ms-excel\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Xlsx does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Xlsx parses \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Xml does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Xml parses \"application/xml\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Xul does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Xul parses \"application/vnd.mozilla.xul+xml\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Zip does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Accept Zip parses \"application/zip\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed AccessControlAllowCredentials does not parse \"\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed AccessControlAllowCredentials does not parse \"false\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed AccessControlAllowCredentials parses \"true\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", + "success": true + } + ], + [ + "Axon Header Typed AccessControlAllowHeaders does not parse \" Vary\"", + { + "timestamp": "1733418667483.0", + "success": true + } + ], + [ + "Axon Header Typed AccessControlAllowHeaders does not parse \"Vary \"", + { + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed AccessControlAllowHeaders parses \" * \"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed AccessControlAllowHeaders parses \" Vary \"", { - "timestamp": "1733370664343.0", - "success": true + "timestamp": "1733416845003.0", + "success": false } ], [ "Axon Header Typed AccessControlAllowHeaders parses \" Vary\"", { - "timestamp": "1733370664343.0", - "success": true + "timestamp": "1733416845003.0", + "success": false } ], [ "Axon Header Typed AccessControlAllowHeaders parses \"* \"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed AccessControlAllowHeaders parses \"*\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed AccessControlAllowHeaders parses \"Accept, Vary, Content-Type\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], + [ + "Axon Header Typed AccessControlAllowHeaders parses \"Vary \"", + { + "timestamp": "1733417655607.0", + "success": false + } + ], [ "Axon Header Typed AccessControlAllowHeaders parses \"Vary\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", + "success": true + } + ], + [ + "Axon Header Typed AccessControlAllowHeaders parses \"Vary, \"", + { + "timestamp": "1733418667483.0", + "success": true + } + ], + [ + "Axon Header Typed AccessControlAllowMethods does not parse \" GET , PATCH \"", + { + "timestamp": "1733418667483.0", + "success": true + } + ], + [ + "Axon Header Typed AccessControlAllowMethods does not parse \"get\"", + { + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed AccessControlAllowMethods parses \" GET , PATCH \"", { - "timestamp": "1733370664343.0", - "success": true + "timestamp": "1733417704592.0", + "success": false } ], [ "Axon Header Typed AccessControlAllowMethods parses \" * \"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed AccessControlAllowMethods parses \"* \"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed AccessControlAllowMethods parses \"*\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed AccessControlAllowMethods parses \"GET\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed AccessControlAllowMethods parses \"GET, PATCH\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733417704592.0", + "success": true + } + ], + [ + "Axon Header Typed AccessControlAllowMethods parses \"GET,, PATCH\"", + { + "timestamp": "1733417723252.0", + "success": true + } + ], + [ + "Axon Header Typed AccessControlAllowMethods parses \"GET,,,,,, PATCH\"", + { + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed AccessControlAllowMethods parses \"get\"", { - "timestamp": "1733370664343.0", - "success": true + "timestamp": "1733416772946.0", + "success": false } ], [ "Axon Header Typed AccessControlAllowOrigin parses \" foo \"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed AccessControlAllowOrigin parses \" * \"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed AccessControlAllowOrigin parses \"* \"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed AccessControlAllowOrigin parses \"*\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed AccessControlAllowOrigin parses \"foo\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed AccessControlAllowOrigin parses \"https://example.com\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed AccessControlExposeHeaders parses \" * \"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed AccessControlExposeHeaders parses \" Vary \"", { - "timestamp": "1733370664343.0", + "timestamp": "1733416845003.0", "success": true } ], [ "Axon Header Typed AccessControlExposeHeaders parses \" Vary\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733416845003.0", "success": true } ], [ "Axon Header Typed AccessControlExposeHeaders parses \"* \"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed AccessControlExposeHeaders parses \"*\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed AccessControlExposeHeaders parses \"Accept, Vary, Content-Type\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", + "success": true + } + ], + [ + "Axon Header Typed AccessControlExposeHeaders parses \"Vary \"", + { + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed AccessControlExposeHeaders parses \"Vary\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed AccessControlMaxAge parses \" 0\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed AccessControlMaxAge parses \" 123 \"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed AccessControlMaxAge parses \"23190\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed AccessControlRequestHeaders parses \" Vary \"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed AccessControlRequestHeaders parses \" Vary\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed AccessControlRequestHeaders parses \"Accept, Vary, Content-Type\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed AccessControlRequestHeaders parses \"Vary\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], + [ + "Axon Header Typed AccessControlRequestMethod does not parse \" PATCH \"", + { + "timestamp": "1733418667483.0", + "success": true + } + ], + [ + "Axon Header Typed AccessControlRequestMethod does not parse \"PATCh\"", + { + "timestamp": "1733418667483.0", + "success": true + } + ], + [ + "Axon Header Typed AccessControlRequestMethod does not parse \"get\"", + { + "timestamp": "1733418667483.0", + "success": true + } + ], + [ + "Axon Header Typed AccessControlRequestMethod parses \" PATCH \"", + { + "timestamp": "1733417723252.0", + "success": false + } + ], [ "Axon Header Typed AccessControlRequestMethod parses \" patCh \"", { - "timestamp": "1733370664343.0", - "success": true + "timestamp": "1733416714876.0", + "success": false } ], [ "Axon Header Typed AccessControlRequestMethod parses \"GET\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed AccessControlRequestMethod parses \"get\"", { - "timestamp": "1733370664343.0", - "success": true + "timestamp": "1733416714876.0", + "success": false } ], [ "Axon Header Typed Age parses \" 0\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Age parses \" 123 \"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Age parses \"23190\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", + "success": true + } + ], + [ + "Axon Header Typed Allow does not parse \" GET , PATCH \"", + { + "timestamp": "1733418667483.0", + "success": true + } + ], + [ + "Axon Header Typed Allow does not parse \"get\"", + { + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Allow parses \" GET , PATCH \"", { - "timestamp": "1733370664343.0", - "success": true + "timestamp": "1733417723252.0", + "success": false } ], [ "Axon Header Typed Allow parses \"GET\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Allow parses \"GET, PATCH\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", + "success": true + } + ], + [ + "Axon Header Typed Allow parses \"GET,,,,,, , , ,PATCH\"", + { + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Allow parses \"get\"", { - "timestamp": "1733370664343.0", - "success": true + "timestamp": "1733417723252.0", + "success": false } ], [ @@ -1427,171 +1539,241 @@ "success": true } ], + [ + "Axon Header Typed Authorization does not parse \" Bing bar \"", + { + "timestamp": "1733418667483.0", + "success": true + } + ], + [ + "Axon Header Typed Authorization does not parse \" Bing bar\"", + { + "timestamp": "1733418667483.0", + "success": true + } + ], + [ + "Axon Header Typed Authorization does not parse \"Bing bar \"", + { + "timestamp": "1733418148556.0", + "success": false + } + ], [ "Axon Header Typed Authorization does not parse \"bar\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733417763602.0", "success": true } ], [ "Axon Header Typed Authorization parses \" Bing bar \"", { - "timestamp": "1733370664343.0", + "timestamp": "1733417763602.0", + "success": true + } + ], + [ + "Axon Header Typed Authorization parses \"Bar\"", + { + "timestamp": "1733418667483.0", + "success": true + } + ], + [ + "Axon Header Typed Authorization parses \"Bing bar \"", + { + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Authorization parses \"Bing bar\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Authorization parses \"Foo bar\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed BasicAuth does not parse \"Basic foo\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed BasicAuth does not parse \"Bearer ZGVtbzpwQDU1dzByZA==\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed BasicAuth parses \"Basic ZGVtbzpwQDU1dzByZA==\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed BearerAuth does not parse \"Basic foo\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed BearerAuth parses \"Bearer foo \"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed BearerAuth parses \"Bearer foo\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed CacheControl does not parse \" \"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed CacheControl does not parse \" foo \"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed CacheControl does not parse \" foo=bar \"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418483071.0", + "success": true + } + ], + [ + "Axon Header Typed CacheControl does not parse \" max-age=604800\"", + { + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed CacheControl does not parse \"\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418203422.0", "success": true } ], [ "Axon Header Typed CacheControl does not parse \"foo\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418483071.0", + "success": false + } + ], + [ + "Axon Header Typed CacheControl does not parse \"foo=bar \"", + { + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed CacheControl does not parse \"foo=bar\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418510858.0", + "success": false + } + ], + [ + "Axon Header Typed CacheControl does not parse \"max-age=604800 \"", + { + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed CacheControl parses \" \"", { - "timestamp": "1733346704017.0", + "timestamp": "1733418483071.0", "success": false } ], [ "Axon Header Typed CacheControl parses \" max-age=604800 \"", { - "timestamp": "1733370664343.0", - "success": true + "timestamp": "1733418422507.0", + "success": false } ], [ "Axon Header Typed CacheControl parses \"\"", { - "timestamp": "1733346704017.0", - "success": false + "timestamp": "1733418667483.0", + "success": true + } + ], + [ + "Axon Header Typed CacheControl parses \"foo\"", + { + "timestamp": "1733418667483.0", + "success": true + } + ], + [ + "Axon Header Typed CacheControl parses \"foo=bar\"", + { + "timestamp": "1733418667483.0", + "success": true } ], [ "Axon Header Typed CacheControl parses \"max-age=20, s-maxage=10, no-cache, must-revalidate, proxy-revalidate, no-store, private, public, must-understand, no-transform, immutable, stale-while-revalidate, stale-if-error\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed CacheControl parses \"max-age=604800\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed CacheControl parses \"max-age=604800, must-revalidate\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Connection does not parse \" \"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Connection does not parse \"\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], @@ -1605,21 +1787,21 @@ [ "Axon Header Typed Connection parses \" a , b , c,d\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Connection parses \" cLoSe \"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Connection parses \" close \"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], @@ -1633,1232 +1815,1365 @@ [ "Axon Header Typed Connection parses \"close\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed Connection parses \"fuaiowf\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentDisposition parses \" attachment; filename=\\\"foo.txt\\\" \"", { - "timestamp": "1733370664343.0", - "success": true + "timestamp": "1733418667483.0", + "success": false } ], [ "Axon Header Typed ContentDisposition parses \" form-data; filename=\\\"foo.txt\\\" ; name=\\\"foo\\\" \"", { - "timestamp": "1733370664343.0", - "success": true + "timestamp": "1733418667483.0", + "success": false } ], [ "Axon Header Typed ContentDisposition parses \" inline \"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentDisposition parses \"attachment\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentDisposition parses \"attachment; filename=\\\"foo.txt\\\"\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentDisposition parses \"form-data\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentDisposition parses \"form-data; filename=\\\"foo.txt\\\"\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentDisposition parses \"form-data; name=\\\"foo\\\"\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentDisposition parses \"inline \"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentDisposition parses \"inline\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentEncoding parses \" gzip \"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentEncoding parses \" gzip , deflate \"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentEncoding parses \"gzip\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentLength parses \" 0 \"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentLength parses \" 1 \"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentLength parses \" 1212943817 \"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", + "success": true + } + ], + [ + "Axon Header Typed ContentLocation parses \" a \"", + { + "timestamp": "1733418667483.0", + "success": true + } + ], + [ + "Axon Header Typed ContentLocation parses \"\"", + { + "timestamp": "1733418667483.0", + "success": true + } + ], + [ + "Axon Header Typed ContentLocation parses \"a\"", + { + "timestamp": "1733418667483.0", + "success": true + } + ], + [ + "Axon Header Typed ContentLocation parses \"abc\"", + { + "timestamp": "1733418667483.0", + "success": true + } + ], + [ + "Axon Header Typed ContentRange parses \" bytes 0-10/* \"", + { + "timestamp": "1733418667483.0", + "success": true + } + ], + [ + "Axon Header Typed ContentRange parses \" bytes */10 \"", + { + "timestamp": "1733418667483.0", + "success": true + } + ], + [ + "Axon Header Typed ContentRange parses \" bytes 0-0/0 \"", + { + "timestamp": "1733418667483.0", + "success": true + } + ], + [ + "Axon Header Typed ContentRange parses \" bytes 0-10/10 \"", + { + "timestamp": "1733418667483.0", + "success": true + } + ], + [ + "Axon Header Typed ContentRange parses \"bytes */10\"", + { + "timestamp": "1733418667483.0", + "success": true + } + ], + [ + "Axon Header Typed ContentRange parses \"bytes 0-10/*\"", + { + "timestamp": "1733418667483.0", + "success": true + } + ], + [ + "Axon Header Typed ContentRange parses \"bytes 0-10/10\"", + { + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Aac does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Aac parses \"audio/aac\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Abw does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Abw parses \"application/x-abiword\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Arc does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Arc parses \"application/x-freearc\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Archive7z does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Archive7z parses \"application/x-7z-compressed\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Avi does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Avi parses \"video/x-msvideo\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Avif does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Avif parses \"image/avif\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Azw does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Azw parses \"application/vnd.amazon.ebook\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Bin does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Bin parses \"application/octet-stream\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Bmp does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Bmp parses \"image/bmp\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Bz does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Bz parses \"application/x-bzip\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Bz2 does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Bz2 parses \"application/x-bzip2\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Cda does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Cda parses \"application/x-cdf\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Csh does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Csh parses \"application/x-csh\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Css does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Css parses \"text/css\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Csv does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Csv parses \"text/csv\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Doc does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Doc parses \"application/msword\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Docx does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Docx parses \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Eot does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Eot parses \"application/vnd.ms-fontobject\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Epub does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Epub parses \"application/epub+zip\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Gif does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Gif parses \"image/gif\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Gz does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Gz parses \"application/gzip\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Html does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Html parses \"text/html\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Ico does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Ico parses \"image/vnd.microsoft.icon\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Ics does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Ics parses \"text/calendar\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Jar does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Jar parses \"application/java-archive\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Jpeg does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Jpeg parses \"image/jpeg\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Js does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Js parses \"text/javascript\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Json does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Json parses \"application/json\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Jsonld does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Jsonld parses \"application/ld+json\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType MIME.MIME parses \"application/json\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType MIME.MIME parses \"foo\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType MIME.MIME parses \"text/plain\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType MIME.MIME parses \"text/plain;charset=utf8\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Midi does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Midi parses \"audio/midi\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Mp3 does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Mp3 parses \"audio/mpeg\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Mp4 does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Mp4 parses \"video/mp4\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Mpeg does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Mpeg parses \"video/mpeg\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Mpkg does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Mpkg parses \"application/vnd.apple.installer+xml\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Odp does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Odp parses \"application/vnd.oasis.opendocument.presentation\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Ods does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Ods parses \"application/vnd.oasis.opendocument.spreadsheet\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Odt does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Odt parses \"application/vnd.oasis.opendocument.text\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Oga does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Oga parses \"audio/ogg\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Ogv does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Ogv parses \"video/ogg\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Ogx does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Ogx parses \"application/ogg\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Opus does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Opus parses \"audio/opus\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Otf does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Otf parses \"font/otf\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Pdf does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Pdf parses \"application/pdf\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Php does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Php parses \"application/x-httpd-php\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Png does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Png parses \"image/png\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Ppt does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Ppt parses \"application/vnd.ms-powerpoint\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Pptx does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Pptx parses \"application/vnd.openxmlformats-officedocument.presentationml.presentation\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Rar does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Rar parses \"application/vnd.rar\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Rtf does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Rtf parses \"application/rtf\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Sh does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Sh parses \"application/x-sh\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType String parses \"\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType String parses \"foo\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Svg does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Svg parses \"image/svg+xml\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Tar does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Tar parses \"application/x-tar\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Tif does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Tif parses \"image/tiff\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Ts does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Ts parses \"video/mp2t\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Ttf does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Ttf parses \"font/ttf\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Txt does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Txt parses \"text/plain\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Video3g2 does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Video3g2 parses \"video/3gpp2\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Video3gp does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Video3gp parses \"video/3gpp\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Vsd does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Vsd parses \"application/vnd.visio\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Wav does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Wav parses \"audio/wav\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Weba does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Weba parses \"audio/webm\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Webm does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Webm parses \"video/webm\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Webp does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Webp parses \"image/webp\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Woff does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Woff parses \"font/woff\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Woff2 does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Woff2 parses \"font/woff2\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Xhtml does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Xhtml parses \"application/xhtml+xml\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Xls does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Xls parses \"application/vnd.ms-excel\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Xlsx does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Xlsx parses \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Xml does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Xml parses \"application/xml\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Xul does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Xul parses \"application/vnd.mozilla.xul+xml\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Zip does not parse \"unknown\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Header Typed ContentType Zip parses \"application/zip\"", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", + "success": true + } + ], + [ + "Axon Header Typed Cookie parses \" a \"", + { + "timestamp": "1733411908537.0", + "success": true + } + ], + [ + "Axon Header Typed Cookie parses \"\"", + { + "timestamp": "1733411908537.0", + "success": true + } + ], + [ + "Axon Header Typed Cookie parses \"a\"", + { + "timestamp": "1733411908537.0", + "success": true + } + ], + [ + "Axon Header Typed Cookie parses \"abc\"", + { + "timestamp": "1733411908537.0", + "success": true + } + ], + [ + "Axon Header Typed Cookie parses \"foo=\"", + { + "timestamp": "1733418667483.0", + "success": true + } + ], + [ + "Axon Header Typed Cookie parses \"foo=bar\"", + { + "timestamp": "1733418667483.0", + "success": true + } + ], + [ + "Axon Header Typed Cookie parses \"foo=bar; baz=\"", + { + "timestamp": "1733418667483.0", + "success": true + } + ], + [ + "Axon Header Typed Cookie parses \"foo=bar; baz=quux\"", + { + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Request Parts Body extracts a JSON body", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Request Parts Body extracts a string body from a buffer", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Request Parts Body extracts a string body from a cached string", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Request Parts Body extracts a string body from a readable stream", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Request Parts Path ... but does if ends in IgnoreRest", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Request Parts Path does not partially match a route ...", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Request Parts Path extracts an int", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Request Parts Path extracts an int and a string", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Request Parts Path matches a route matching literal", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], [ "Axon Request Parts Path matches a route matching multiple literals", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], @@ -2893,7 +3208,7 @@ [ "Axon Request Parts extracts header, method, path, JSON body", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], @@ -2907,7 +3222,7 @@ [ "Axon Request Parts extracts the whole request", { - "timestamp": "1733370664343.0", + "timestamp": "1733418667483.0", "success": true } ], diff --git a/src/Axon.Header.Typed.purs b/src/Axon.Header.Typed.purs index d71c509..9d39f6a 100644 --- a/src/Axon.Header.Typed.purs +++ b/src/Axon.Header.Typed.purs @@ -17,15 +17,13 @@ import Data.Either (Either(..)) import Data.Either.Nested (type (\/)) import Data.Either.Nested as Either.Nested import Data.Enum (fromEnum, toEnum) -import Data.Filterable (filter) -import Data.Foldable (any, elem) +import Data.Foldable (fold) import Data.Generic.Rep (class Generic) import Data.Int as Int import Data.MIME as MIME import Data.Map as Map -import Data.Maybe (Maybe(..), isJust, maybe) +import Data.Maybe (Maybe(..), fromMaybe, isJust) import Data.Newtype (class Newtype, unwrap, wrap) -import Data.Set as Set import Data.Show.Generic (genericShow) import Data.String as String import Data.String.Base64 as String.Base64 @@ -38,19 +36,86 @@ import Data.String.Regex.Flags as Regex.Flags import Data.Time as Time import Data.Tuple (fst) import Data.Tuple.Nested (type (/\), (/\)) -import Effect.Console (log) import Effect.Exception as Error -import Effect.Unsafe (unsafePerformEffect) import Parsing (Parser) import Parsing (liftMaybe, fail, liftEither) as Parse -import Parsing.Combinators (between, choice, lookAhead, many, optional, sepBy, sepBy1, try) as Parse -import Parsing.String (anyTill, regex, string, eof, rest) as Parse +import Parsing.Combinators (between, choice, optionMaybe, optional, sepBy1, try) as Parse +import Parsing.Combinators.Array (many, many1) as Parse +import Parsing.String (anyTill, eof, regex, rest, string) as Parse import Parsing.String.Basic (whiteSpace, space, intDecimal, alphaNum) as Parse -import Partial.Unsafe (unsafePartial) +import Partial.Unsafe (unsafeCrashWith, unsafePartial) import Prim.Row (class Nub, class Union) import Record as Record import Type.MIME as Type.MIME +-- TODO: this is fine, probably switch to a tokenizer at some point. parsing headers is also probably a solved problem + +rules :: + { char :: Parser String String + , upAlpha :: Parser String String + , loAlpha :: Parser String String + , alpha :: Parser String String + , digit :: Parser String String + , ctl :: Parser String String + , cr :: Parser String String + , lf :: Parser String String + , sp :: Parser String String + , ht :: Parser String String + , dquote :: Parser String String + , crlf :: Parser String String + , lws :: Parser String String + , text :: Parser String String + , separators :: Parser String String + , token :: Parser String String + , quoted :: Parser String String + , cookieChar :: Parser String String + , token68 :: Parser String String + } +rules = + let + un (Left e) = unsafeCrashWith e + un (Right a) = a + char = un $ Parse.regex "[\\x00-\\x7f]" Regex.Flags.noFlags + upAlpha = un $ Parse.regex "[A-Z]" Regex.Flags.noFlags + loAlpha = un $ Parse.regex "[a-z]" Regex.Flags.noFlags + alpha = loAlpha <|> upAlpha + digit = un $ Parse.regex "[0-9]" Regex.Flags.noFlags + ctl = un $ Parse.regex "[\\x00-\\x1f]|\\x7f" Regex.Flags.noFlags + cr = un $ Parse.regex "\\x0d" Regex.Flags.noFlags + lf = un $ Parse.regex "\\x0a" Regex.Flags.noFlags + sp = un $ Parse.regex "\\x20" Regex.Flags.noFlags + ht = un $ Parse.regex "\\x09" Regex.Flags.noFlags + dquote = un $ Parse.regex "\\x22" Regex.Flags.noFlags + crlf = un $ Parse.regex "\\x0d\\x0a" Regex.Flags.noFlags + lws = Parse.optional crlf *> Parse.many1 (Parse.try sp <|> ht) <#> fold + text = un $ Parse.regex "\\x20|\\x09|[^\\x00-\\x1f]" Regex.Flags.noFlags + separators = un $ Parse.regex "[()<>@,;:\\\\\"\\/\\[\\]?={}\\x20\\x09]" Regex.Flags.noFlags + token = un $ Parse.regex "[^\\x00-\\x1f()<>@,;:\\\\\"\\/\\[\\]?={}\\x20\\x09]+" Regex.Flags.noFlags + quoted = un $ Parse.regex "\"(.*)(? Parser String a -> Parser String (Array a) +list sep p = do + head <- Parse.optionMaybe p + tail <- Array.many (Parse.whiteSpace *> sep *> Parse.whiteSpace *> Parse.optionMaybe p) + pure $ Array.catMaybes $ [head] <> tail + +list1 :: forall a sep. Parser String sep -> Parser String a -> Parser String (NonEmptyArray a) +list1 sep p = do + head <- p + tail <- + Array.many (Parse.whiteSpace *> sep *> Parse.whiteSpace *> Parse.optionMaybe p) + <#> Array.catMaybes + pure $ Array.NonEmpty.cons' head tail + commas :: forall a. Parser String a -> Parser String (Array a) -commas p = Parse.sepBy p (Parse.whiteSpace <* Parse.string "," <* Parse.whiteSpace) <#> Array.fromFoldable +commas = list $ Parse.string "," commas1 :: forall a. Parser String a -> Parser String (NonEmptyArray a) -commas1 p = Parse.sepBy1 p (Parse.whiteSpace <* Parse.string "," <* Parse.whiteSpace) <#> Array.NonEmpty.fromFoldable1 +commas1 = list1 $ Parse.string "," semis :: forall a. Parser String a -> Parser String (Array a) -semis p = Parse.sepBy p (Parse.whiteSpace <* Parse.string ";" <* Parse.whiteSpace) <#> Array.fromFoldable +semis = list $ Parse.string ";" + +semis1 :: forall a. Parser String a -> Parser String (NonEmptyArray a) +semis1 = list1 $ Parse.string ";" wildcardParser :: Parser String Wildcard wildcardParser = Parse.whiteSpace *> (Parse.string "*" $> Wildcard) <* Parse.whiteSpace @@ -153,29 +235,20 @@ headerNameParser :: Parser String StringLower headerNameParser = Parse.between Parse.whiteSpace Parse.whiteSpace (headerNameRegexParser <#> String.Lower.fromString) methodParser :: Parser String Method -methodParser = Parse.between Parse.whiteSpace Parse.whiteSpace $ Parse.many Parse.alphaNum <#> Array.fromFoldable <#> String.CodeUnit.fromCharArray >>= (\a -> Parse.liftMaybe (const $ "invalid method " <> a) $ Method.fromString a) +methodParser = + Parse.try (Parse.string "GET" $> Method.GET) + <|> Parse.try (Parse.string "HEAD" $> Method.HEAD) + <|> Parse.try (Parse.string "POST" $> Method.POST) + <|> Parse.try (Parse.string "PUT" $> Method.PUT) + <|> Parse.try (Parse.string "PATCH" $> Method.PATCH) + <|> Parse.try (Parse.string "DELETE" $> Method.DELETE) + <|> Parse.try (Parse.string "CONNECT" $> Method.CONNECT) + <|> Parse.try (Parse.string "OPTIONS" $> Method.OPTIONS) + <|> Parse.string "TRACE" $> Method.TRACE -directiveParser :: Parser String (StringLower /\ Maybe String) +directiveParser :: Parser String (String /\ Maybe String) directiveParser = - let - boundary = Parse.lookAhead $ Parse.try (Parse.string ",") <|> Parse.try (Parse.string ";") <|> Parse.try (Parse.eof *> pure "") - kvSep = Parse.string "=" - kvParser = - pure (\k v -> k /\ Just v) - <*> (Parse.whiteSpace *> Parse.anyTill kvSep <#> fst <#> String.trim <#> String.Lower.fromString) - <*> (Parse.whiteSpace *> Parse.anyTill boundary <#> fst <#> String.trim) - kParser = - Parse.whiteSpace - *> Parse.anyTill boundary - <#> fst - <#> String.trim - <#> String.Lower.fromString - <#> (\k -> k /\ Nothing) - in - (Parse.try kvParser <|> kParser) - <#> Just - <#> filter (\(k /\ v) -> not (String.null $ String.Lower.toString k) && maybe true (not <<< String.null) v) - >>= (Parse.liftMaybe $ const "empty directive") + pure (/\) <*> rules.token <*> Parse.optionMaybe (Parse.string "=" *> (rules.quoted <|> rules.token)) class TypedHeader a where headerName :: String @@ -377,7 +450,7 @@ derive instance Newtype (ContentType a) _ derive instance Eq a => Eq (ContentType a) instance Show a => Show (ContentType a) where show = genericShow -newtype Cookie = Cookie String +newtype Cookie = Cookie (NonEmptyArray (String /\ String)) derive instance Newtype (Cookie) _ derive instance Generic (Cookie) _ instance Show (Cookie) where show = genericShow @@ -1179,7 +1252,7 @@ instance TypedHeader AccessControlAllowHeaders where headerName = "Access-Control-Allow-Headers" headerValueParser = let - headers = commas1 headerNameParser <#> Right <#> AccessControlAllowHeaders + headers = commas1 rules.token <#> map String.Lower.fromString <#> Right <#> AccessControlAllowHeaders in Parse.try (wildcardParser $> AccessControlAllowHeaders (Left Wildcard)) <|> Parse.try headers headerValueEncode (AccessControlAllowHeaders (Left Wildcard)) = "*" @@ -1243,10 +1316,9 @@ instance TypedHeader Allow where instance TypedHeader Authorization where headerName = "Authorization" headerValueParser = - let - scheme = Parse.whiteSpace *> (Parse.anyTill (void (Parse.try Parse.space) <|> Parse.eof) <#> fst <#> String.trim <#> AuthScheme) - in - pure Authorization <*> scheme <*> (Parse.rest <#> String.trim) + pure (\scheme val -> Authorization scheme val) + <*> ((rules.token <#> AuthScheme) <* Parse.whiteSpace) + <*> (Parse.optionMaybe rules.token68 <#> fromMaybe "") headerValueEncode (Authorization (AuthScheme s) v) = s <> " " <> v instance TypedHeader BasicAuth where @@ -1273,29 +1345,7 @@ instance TypedHeader BearerAuth where instance TypedHeader CacheControl where headerName = "Cache-Control" headerValueParser = do - directives <- commas directiveParser <#> map (\(k /\ v) -> String.Lower.toString k /\ v) <#> Map.fromFoldable - let - keys = - [ "max-age" - , "max-stale" - , "min-fresh" - , "s-maxage" - , "no-cache" - , "no-store" - , "no-transform" - , "only-if-cached" - , "must-revalidate" - , "must-understand" - , "proxy-revalidate" - , "private" - , "public" - , "immutable" - , "stale-while-revalidate" - , "stale-if-error" - ] - when - (Map.keys directives # (Set.toUnfoldable :: _ (Array _)) # any (flip elem keys) # not) - (Parse.fail "no directives") + directives <- commas directiveParser <#> Map.fromFoldable pure $ CacheControl { maxAge: Map.lookup "max-age" directives # join >>= Int.fromString , maxStale: Map.lookup "max-stale" directives # join >>= Int.fromString @@ -1359,7 +1409,7 @@ instance TypedHeader ContentDisposition where inline = Parse.whiteSpace *> Parse.string "inline" *> boundary $> ContentDisposition (Either.Nested.in1 ContentDispositionInline) attachment = do void $ Parse.whiteSpace *> Parse.string "attachment" *> boundary *> Parse.whiteSpace - directives <- semis directiveParser <#> map (\(k /\ v) -> String.Lower.toString k /\ v) <#> Map.fromFoldable + directives <- semis directiveParser <#> Map.fromFoldable let filename = (Map.lookup "filename" directives <|> Map.lookup "filename*" directives) @@ -1368,7 +1418,7 @@ instance TypedHeader ContentDisposition where pure $ ContentDisposition $ Either.Nested.in2 $ ContentDispositionAttachment {filename} formData = do void $ Parse.whiteSpace *> Parse.string "form-data" *> boundary *> Parse.whiteSpace - directives <- semis directiveParser <#> map (\(k /\ v) -> String.Lower.toString k /\ v) <#> Map.fromFoldable + directives <- semis directiveParser <#> Map.fromFoldable let filename = Map.lookup "filename" directives # join <#> Regex.replace quotesRe "" name = Map.lookup "name" directives # join <#> Regex.replace quotesRe "" @@ -1398,7 +1448,7 @@ instance TypedHeader ContentLength where instance TypedHeader ContentLocation where headerName = "Content-Location" - headerValueParser = Parse.rest <#> ContentLocation + headerValueParser = Parse.rest <#> String.trim <#> ContentLocation headerValueEncode (ContentLocation a) = a instance TypedHeader ContentRange where @@ -1419,9 +1469,13 @@ instance TypedHeader ContentRange where *> Parse.string "/" *> Parse.intDecimal <#> ByteRangeLength in - Parse.string "bytes" + Parse.whiteSpace + *> Parse.string "bytes" *> Parse.whiteSpace - *> Parse.try (startEndSize <#> Either.Nested.in1) <|> Parse.try (startEnd <#> Either.Nested.in2) <|> Parse.try (size <#> Either.Nested.in3) + *> ( (Parse.try startEndSize <#> Either.Nested.in1) + <|> (Parse.try startEnd <#> Either.Nested.in2) + <|> (Parse.try size <#> Either.Nested.in3) + ) <#> ContentRange headerValueEncode (ContentRange a) = Either.Nested.either3 @@ -1433,8 +1487,16 @@ instance TypedHeader ContentRange where instance TypedHeader Cookie where headerName = "Cookie" - headerValueParser = Parse.rest <#> Cookie - headerValueEncode (Cookie a) = a + headerValueParser = + let + cookieName = rules.token + cookieValue = + (Parse.try (rules.dquote *> Parse.many rules.cookieChar <* rules.dquote) <|> Parse.many rules.cookieChar) + <#> fold + cookiePair = pure (\k v -> k /\ v) <*> (cookieName <* Parse.string "=") <*> cookieValue + in + Parse.sepBy1 cookiePair (Parse.string "; ") <#> Array.NonEmpty.fromFoldable1 <#> Cookie + headerValueEncode (Cookie as) = as <#> (\(k /\ v) -> k <> "=" <> v) # Array.NonEmpty.intercalate "; " instance TypedHeader Date where headerName = "Date" @@ -1649,7 +1711,7 @@ instance TypedHeader SetCookie where instance TypedHeader StrictTransportSecurity where headerName = "Strict-Transport-Security" headerValueParser = do - directives <- commas1 directiveParser <#> map (\(k /\ v) -> String.Lower.toString k /\ v) <#> Map.fromFoldable + directives <- commas1 directiveParser <#> Map.fromFoldable pure $ StrictTransportSecurity { maxAge: Map.lookup "max-age" directives # join >>= Int.fromString , includeSubdomains: Map.lookup "includesubdomains" directives # isJust diff --git a/src/Axon.Request.Method.purs b/src/Axon.Request.Method.purs index 29a5c79..45303db 100644 --- a/src/Axon.Request.Method.purs +++ b/src/Axon.Request.Method.purs @@ -7,7 +7,7 @@ import Data.Maybe (Maybe(..)) import Data.Show.Generic (genericShow) import Data.String as String -data Method = GET | POST | PUT | PATCH | DELETE | OPTIONS | TRACE | CONNECT +data Method = GET | POST | PUT | PATCH | DELETE | OPTIONS | TRACE | CONNECT | HEAD derive instance Generic Method _ derive instance Eq Method @@ -16,6 +16,7 @@ instance Show Method where toString :: Method -> String toString GET = "GET" +toString HEAD = "HEAD" toString POST = "POST" toString PUT = "PUT" toString PATCH = "PATCH" @@ -37,4 +38,4 @@ fromString = go "CONNECT" = Just CONNECT go _ = Nothing in - go <<< String.toUpper + go diff --git a/test/Test/Axon.Header.Typed.purs b/test/Test/Axon.Header.Typed.purs index ec8aa9c..bb3982d 100644 --- a/test/Test/Axon.Header.Typed.purs +++ b/test/Test/Axon.Header.Typed.purs @@ -2,7 +2,7 @@ module Test.Axon.Header.Typed where import Prelude -import Axon.Header.Typed (class TypedHeader, Accept(..), AccessControlAllowCredentials(..), AccessControlAllowHeaders(..), AccessControlAllowMethods(..), AccessControlAllowOrigin(..), AccessControlExposeHeaders(..), AccessControlMaxAge(..), AccessControlRequestHeaders(..), AccessControlRequestMethod(..), Age(..), Allow(..), AuthScheme(..), Authorization(..), BasicAuth(..), BearerAuth(..), CacheControl(..), Connection(..), ConnectionClose(..), ContentDisposition(..), ContentDispositionAttachment(..), ContentDispositionFormData(..), ContentDispositionInline(..), ContentEncoding(..), ContentLength(..), ContentType(..), Wildcard(..), cacheControlDefaults, headerValueParser) +import Axon.Header.Typed (class TypedHeader, Accept(..), AccessControlAllowCredentials(..), AccessControlAllowHeaders(..), AccessControlAllowMethods(..), AccessControlAllowOrigin(..), AccessControlExposeHeaders(..), AccessControlMaxAge(..), AccessControlRequestHeaders(..), AccessControlRequestMethod(..), Age(..), Allow(..), AuthScheme(..), Authorization(..), BasicAuth(..), BearerAuth(..), ByteRangeEnd(..), ByteRangeLength(..), ByteRangeStart(..), CacheControl(..), Connection(..), ConnectionClose(..), ContentDisposition(..), ContentDispositionAttachment(..), ContentDispositionFormData(..), ContentDispositionInline(..), ContentEncoding(..), ContentLength(..), ContentLocation(..), ContentRange(..), ContentType(..), Cookie(..), Wildcard(..), cacheControlDefaults, headerValueParser) import Axon.Request.Method (Method(..)) import Control.Monad.Error.Class (liftEither) import Data.Bifunctor (lmap) @@ -11,6 +11,7 @@ import Data.Either.Nested as Either.Nested import Data.MIME as MIME import Data.Maybe (Maybe(..)) import Data.String.Lower as String.Lower +import Data.Tuple.Nested ((/\)) import Effect.Exception (error) import Parsing (parseErrorMessage, runParser) import Test.Spec (Spec, describe, it) @@ -482,17 +483,18 @@ spec = " * " `is` AccessControlAllowHeaders (Left Wildcard) "* " `is` AccessControlAllowHeaders (Left Wildcard) "Vary" `is` AccessControlAllowHeaders (Right $ pure $ String.Lower.fromString "Vary") - " Vary" `is` AccessControlAllowHeaders (Right $ pure $ String.Lower.fromString "Vary") - " Vary " `is` AccessControlAllowHeaders (Right $ pure $ String.Lower.fromString "Vary") + " Vary" `isnt` AccessControlAllowHeaders (Right $ pure $ String.Lower.fromString "Vary") + "Vary " `isnt` AccessControlAllowHeaders (Right $ pure $ String.Lower.fromString "Vary") + "Vary, " `is` AccessControlAllowHeaders (Right $ pure $ String.Lower.fromString "Vary") "Accept, Vary, Content-Type" `is` AccessControlAllowHeaders (Right $ (pure "Accept" <> pure "Vary" <> pure "Content-Type") <#> String.Lower.fromString) describe "AccessControlAllowMethods" do "*" `is` AccessControlAllowMethods (Left Wildcard) " * " `is` AccessControlAllowMethods (Left Wildcard) "* " `is` AccessControlAllowMethods (Left Wildcard) "GET" `is` AccessControlAllowMethods (Right $ pure GET) - "get" `is` AccessControlAllowMethods (Right $ pure GET) - "GET, PATCH" `is` AccessControlAllowMethods (Right $ pure GET <> pure PATCH) - " GET , PATCH " `is` AccessControlAllowMethods (Right $ pure GET <> pure PATCH) + "get" `isnt` AccessControlAllowMethods (Right $ pure GET) + "GET,,,,,, PATCH" `is` AccessControlAllowMethods (Right $ pure GET <> pure PATCH) + " GET , PATCH " `isnt` AccessControlAllowMethods (Right $ pure GET <> pure PATCH) describe "AccessControlAllowOrigin" do "*" `is` AccessControlAllowOrigin (Left Wildcard) " * " `is` AccessControlAllowOrigin (Left Wildcard) @@ -505,8 +507,8 @@ spec = " * " `is` AccessControlExposeHeaders (Left Wildcard) "* " `is` AccessControlExposeHeaders (Left Wildcard) "Vary" `is` AccessControlExposeHeaders (Right $ pure $ String.Lower.fromString "Vary") - " Vary" `is` AccessControlExposeHeaders (Right $ pure $ String.Lower.fromString "Vary") - " Vary " `is` AccessControlExposeHeaders (Right $ pure $ String.Lower.fromString "Vary") + "Vary" `is` AccessControlExposeHeaders (Right $ pure $ String.Lower.fromString "Vary") + "Vary " `is` AccessControlExposeHeaders (Right $ pure $ String.Lower.fromString "Vary") "Accept, Vary, Content-Type" `is` AccessControlExposeHeaders (Right $ (pure "Accept" <> pure "Vary" <> pure "Content-Type") <#> String.Lower.fromString) describe "AccessControlMaxAge" do " 123 " `is` AccessControlMaxAge 123 @@ -519,22 +521,26 @@ spec = "Accept, Vary, Content-Type" `is` AccessControlRequestHeaders ((pure "Accept" <> pure "Vary" <> pure "Content-Type") <#> String.Lower.fromString) describe "AccessControlRequestMethod" do "GET" `is` AccessControlRequestMethod GET - "get" `is` AccessControlRequestMethod GET - " patCh " `is` AccessControlRequestMethod PATCH + " PATCH " `isnt` AccessControlRequestMethod PATCH + "get" `isnt` AccessControlRequestMethod GET + "PATCh" `isnt` AccessControlRequestMethod PATCH describe "Age" do " 123 " `is` Age 123 " 0" `is` Age 0 "23190" `is` Age 23190 describe "Allow" do "GET" `is` Allow (pure GET) - "get" `is` Allow (pure GET) + "get" `isnt` Allow (pure GET) "GET, PATCH" `is` Allow (pure GET <> pure PATCH) - " GET , PATCH " `is` Allow (pure GET <> pure PATCH) + "GET,,,,,, , , ,PATCH" `is` Allow (pure GET <> pure PATCH) + " GET , PATCH " `isnt` Allow (pure GET <> pure PATCH) describe "Authorization" do "Foo bar" `is` Authorization (AuthScheme "Foo") "bar" "Bing bar" `is` Authorization (AuthScheme "Bing") "bar" - " Bing bar " `is` Authorization (AuthScheme "Bing") "bar" - "bar" `isnt` Authorization (AuthScheme "Foo") "bar" + " Bing bar" `isnt` Authorization (AuthScheme "Bing") "bar" + "Bing bar " `is` Authorization (AuthScheme "Bing") "bar" + " Bing bar " `isnt` Authorization (AuthScheme "Bing") "bar" + "Bar" `is` Authorization (AuthScheme "Bar") "" describe "BasicAuth" do "Basic ZGVtbzpwQDU1dzByZA==" `is` BasicAuth {username: "demo", password: "p@55w0rd"} "Bearer ZGVtbzpwQDU1dzByZA==" `isnt` BasicAuth {username: "demo", password: "p@55w0rd"} @@ -545,16 +551,17 @@ spec = "Bearer foo " `is` BearerAuth "foo" describe "CacheControl" do "max-age=604800" `is` CacheControl (cacheControlDefaults {maxAge = Just 604800}) - " max-age=604800 " `is` CacheControl (cacheControlDefaults {maxAge = Just 604800}) + " max-age=604800" `isnt` CacheControl (cacheControlDefaults {maxAge = Just 604800}) + "max-age=604800 " `isnt` CacheControl (cacheControlDefaults {maxAge = Just 604800}) "max-age=604800, must-revalidate" `is` CacheControl (cacheControlDefaults {maxAge = Just 604800, mustRevalidate = true}) "max-age=20, s-maxage=10, no-cache, must-revalidate, proxy-revalidate, no-store, private, public, must-understand, no-transform, immutable, stale-while-revalidate, stale-if-error" `is` CacheControl (cacheControlDefaults {maxAge = Just 20, sMaxAge = Just 10, noCache = true, mustRevalidate = true, proxyRevalidate = true, noStore = true, private = true, public = true, mustUnderstand = true, noTransform = true, immutable = true, staleWhileRevalidate = true, staleIfError = true}) - "" `isnt` CacheControl cacheControlDefaults + "" `is` CacheControl cacheControlDefaults " " `isnt` CacheControl cacheControlDefaults - "foo=bar" `isnt` CacheControl cacheControlDefaults - "foo" `isnt` CacheControl cacheControlDefaults - " foo=bar " `isnt` CacheControl cacheControlDefaults + "foo=bar" `is` CacheControl cacheControlDefaults + "foo" `is` CacheControl cacheControlDefaults + "foo=bar " `isnt` CacheControl cacheControlDefaults " foo " `isnt` CacheControl cacheControlDefaults describe "Connection" do "" `isnt` Connection (Left ConnectionClose) @@ -568,11 +575,11 @@ spec = "form-data" `is` ContentDisposition (Either.Nested.in3 $ ContentDispositionFormData {filename: Nothing, name: Nothing}) "form-data; name=\"foo\"" `is` ContentDisposition (Either.Nested.in3 $ ContentDispositionFormData {filename: Nothing, name: Just "foo"}) "form-data; filename=\"foo.txt\"" `is` ContentDisposition (Either.Nested.in3 $ ContentDispositionFormData {filename: Just "foo.txt", name: Nothing}) - " form-data; filename=\"foo.txt\" ; name=\"foo\" " `is` ContentDisposition (Either.Nested.in3 $ ContentDispositionFormData {filename: Just "foo.txt", name: Just "foo"}) + " form-data; filename=\"foo.txt\" ; name=\"foo\" " `isnt` ContentDisposition (Either.Nested.in3 $ ContentDispositionFormData {filename: Just "foo.txt", name: Just "foo"}) "attachment" `is` ContentDisposition (Either.Nested.in2 $ ContentDispositionAttachment {filename: Nothing}) "attachment; filename=\"foo.txt\"" `is` ContentDisposition (Either.Nested.in2 $ ContentDispositionAttachment {filename: Just "foo.txt"}) - " attachment; filename=\"foo.txt\" " `is` ContentDisposition (Either.Nested.in2 $ ContentDispositionAttachment {filename: Just "foo.txt"}) + " attachment; filename=\"foo.txt\" " `isnt` ContentDisposition (Either.Nested.in2 $ ContentDispositionAttachment {filename: Just "foo.txt"}) "inline" `is` ContentDisposition (Either.Nested.in1 $ ContentDispositionInline) "inline " `is` ContentDisposition (Either.Nested.in1 $ ContentDispositionInline) @@ -585,9 +592,24 @@ spec = " 0 " `is` ContentLength 0 " 1 " `is` ContentLength 1 " 1212943817 " `is` ContentLength 1212943817 - describe "ContentLocation" $ pure unit - describe "ContentRange" $ pure unit - describe "Cookie" $ pure unit + describe "ContentLocation" do + "" `is` ContentLocation "" + "a" `is` ContentLocation "a" + " a " `is` ContentLocation "a" + "abc" `is` ContentLocation "abc" + describe "ContentRange" do + "bytes 0-10/10" `is` (ContentRange $ Either.Nested.in1 $ ByteRangeStart 0 /\ ByteRangeEnd 10 /\ ByteRangeLength 10) + " bytes 0-10/10 " `is` (ContentRange $ Either.Nested.in1 $ ByteRangeStart 0 /\ ByteRangeEnd 10 /\ ByteRangeLength 10) + " bytes 0-0/0 " `is` (ContentRange $ Either.Nested.in1 $ ByteRangeStart 0 /\ ByteRangeEnd 0 /\ ByteRangeLength 0) + "bytes 0-10/*" `is` (ContentRange $ Either.Nested.in2 $ ByteRangeStart 0 /\ ByteRangeEnd 10) + " bytes 0-10/* " `is` (ContentRange $ Either.Nested.in2 $ ByteRangeStart 0 /\ ByteRangeEnd 10) + "bytes */10" `is` (ContentRange $ Either.Nested.in3 $ ByteRangeLength 10) + " bytes */10 " `is` (ContentRange $ Either.Nested.in3 $ ByteRangeLength 10) + describe "Cookie" do + "foo=" `is` Cookie (pure ("foo" /\ "")) + "foo=bar" `is` Cookie (pure ("foo" /\ "bar")) + "foo=bar; baz=" `is` Cookie (pure ("foo" /\ "bar") <> pure ("baz" /\ "")) + "foo=bar; baz=quux" `is` Cookie (pure ("foo" /\ "bar") <> pure ("baz" /\ "quux")) describe "Date" $ pure unit describe "ETag" $ pure unit describe "ExpectContinue" $ pure unit