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"