Header parsing is usually invisible to the user. But still, this is quite an important tasks. The first version of this was very buggy, so we decided to create a correct version using a parser. This document describes the rules that were used for the parser.
header = statusline newline dataline {dataline} newline
statusline = "HTTP/" version space statuscode space statusword
version = "0.9"|"1.0"|"1.1"
statuscode = number number number
statusword = token {token}
token = (any character except newline)
dataline = name ":" space data newline {folding}
name = nametoken {nametoken}
nametoken = letter|number|dash
data = datatoken {datatoken}
datatoken = (any character except newline)
folding = space {space} data newline
newline = "\n"
space = " "|"\t"
number = "0"|"1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9"
letter = "A"|"B"|"C"|"D"|"E"|"F"|"G"|"H"|"I"|"J"|"K"|"L"|"M"|"N"|"O"|"P"|
"Q"|"R"|"S"|"T"|"U"|"V"|"W"|"X"|"Y"|"Z"|"a"|"b"|"c"|"d"|"f"|"g"|
"h"|"i"|"j"|"k"|"l"|"m"|"n"|"o"|"p"|"q"|"r"|"s"|"t"|"u"|"v"|"w"|
"x"|"y"|"z"