POST /index.html HTTP/1.0 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, SPLAT/SPLAT Accept-Language: en-us Content-Type: application/x-www-form-urlencoded UA-CPU: x86 User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727) Host: 192.168.1.160 Content-Length: 357 Pragma: no-cache Connection: keep-alive Browser reload detected... Posting 357 bytes... Item=Value Item2=Value+SecondToken+++ FoldedInfo%0D%0A++MORE Item+3=HelloHelloHello%0D%0A%0D%0A++++ ++++ There really is no good spec on this. URLFCHAR = Let's be forgiving. 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 e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9 - _ . ~ ! * ' ( ) ; : @ & $ , / ? # [ ] PERCENT = '%' for escape. EQU = '=' for name/value seperation. PLUS = + for space replacement CR | LF = For item termination WS = All other whitespace Flags: !Done = if true, we are done. Set after a terminal closure. [START] -> NULL->$Name -> NULL->$Value -> FALSE->!Done -> NULL->$(Hex)Sixteens -> [OPEN] -> ^RETURN^ [OPEN] - URLFCHAR - push, [NAME] - !OTHER! - [DEPLETE], error(Query line started bad. Must be an allowed character.) - CR - [PENDING_LF] - !EOF! - ^RETURN^ // Done. Nothing to do. [NAME] - % - [ESCAPE] - WS - [DEPLETE], error(broken name in query) - URLFCHAR - push - + - push(" ") - EQU - pop->$Name, [START_VALUE], if (!Done==TRUE) ^RETURN^ - CR - [PENDING_LF], [FOLDNAME_OPEN], if (!Done==TRUE) ^RETURN^ // We're coming out of a fold or line, so start a new name - !OTHER! - [DEPLETE], error(bad characters in query name) - !EOF! - error(Truncated query. Name only.) [FOLDNAME_OPEN] - CR | LF - error(Name broken and without a value.) - WS - [FOLDED_NAME], ^RETURN^ - !OTHER! - [DEPLETE], error(bad folding on name, lines aborted) - !EOF! - error(Truncated query while folding name.) [FOLDED_NAME] - % - [ESCAPE], [NAME], ^RETURN^ // return back to [NAME] - URLFCHAR - push, [NAME],^RETURN^ - + - push(" "), [NAME],^RETURN^ - EQU - pop->$Name, [VALUE], ^RETURN^ - CR - [PENDING_LF], [FOLDNAME_OPEN], ^RETURN^ // Recursion danger! - WS - burn - !OTHER! - [DEPLETE], error(Bad folding on name, lines aborted) - !EOF! - error(Truncated query while folding name.) [VALUE] - % - [ESCAPE] - URLFCHAR - push - WS - [DEPLETE], error(broken value in query) - + - push(" ") - EQU - [DEPLETE], error(Second unencoded '=' found in query.) - CR - [PENDING_LF], [FOLDVALUE_OPEN], ^RETURN^ // Done, so unwind back to OPEN. - LF - [DEPLETE], error(bad character in value-naked LF) - !OTHER! - [DEPLETE], error(bad character in value) - !EOF! - [SAVE], ^RETURN^ // Done, so unwind back to OPEN. [FOLDVALUE_OPEN] - % - [SAVE], [ESCAPE], ^RETURN^ // Closure. Push the char for the NEXT name. - + - [SAVE], push(" "), ^RETURN^ // Closure. Push the char for the NEXT name. - URLFCHAR - [SAVE], push, ^RETURN^ // Closure. Push the char for the NEXT name. - EQU - [SAVE], error(Query entry started with a '='.) // Closure but an error for the next line. - CR - [PENDING_LF], [SAVE], [SEEK_MORE], ^RETURN^ // Closure. Eat until we get characters. - !EOF! - [SAVE], !Done=TRUE, ^RETURN^ // Absolute closure - WS - [FOLDED_VALUE], ^RETURN^ // unwind back to NAME - !OTHER! - [DEPLETE], error(bad folding on value, lines aborted) - error(Truncated query while folding name.) [FOLDED_VALUE] - % - [ESCAPE], [VALUE], ^RETURN^ // return back to [VALUE] - URLFCHAR - push, [VALUE],^RETURN^ - + - push(" "), [VALUE],^RETURN^ - EQU - [DEPLETE], error(Second unencoded '=' found in query.) - CR - [PENDING_LF], [FOLDVALUE_OPEN], ^RETURN^ // Recursion danger! - WS - burn - !OTHER! - [DEPLETE], error(Bad folding on value, lines aborted) - !EOF! - [SAVE], !Done=TRUE, ^RETURN^ // Absolute Closure [SEEK_MORE] - % - [ESCAPE], ^RETURN^ // Push the char for the NEXT name. - URLFCHAR - push, ^RETURN^ // Push the char for the NEXT name. - + - push(" "), ^RETURN^ // Push the char for the NEXT name. - CR - [PENDING_LF] // Eat them - !EOF! - !Done=TRUE, ^RETURN^ // We are already closed. And now we are done. - !OTHER! - [DEPLETE], error(Bad next item in query or a broken fold.) [PENDING_LF] - LF - ^RETURN^ - !EOF! - ^RETURN^ // Let this one slide. - !OTHER! - [DEPLETE], error(broken CR/LF--missing LF) [SAVE] -> pop->$Value -> (Set request NV to $Name/$Value -> ^RETURN^ [ESCAPE] - HEX - ->$Sixteens, ESCAPEONES, ^RETURN^ - !OTHER! - error(broken escape) - !EOF! - error(Truncated line with dangling escape.) [ESCAPEONES] - HEX - push( ($SixteensSPLAT16)+HEX ), ^RETURN^ - !OTHER! - error(broken escape) - !EOF! - error(Truncated line with dangling escape.) [DEPLETE] - CR - [DEPLETE_CR], ^RETURN^ - !OTHER! - burn - !EOF! - error(missing CR at end of line) [DEPLETE_CR] - LF - ^RETURN^ - !EOF! - error(missing LF after CR at end of line: truncated.) - !OTHER! - fault(missing LF after CR at end of line: odd characters found, so stream is unreliable.) [DRAIN] - LF - burn, ^RETURN^ - CR - burn, ^RETURN^ - !EOF! - error(bad CR/LF line termination: truncated.) - !OTHER! - fault(bad CR/LF line termination: odd characters found, so stream is unreliable.)