(List (= scope=<EAssignScope.GLOBAL 1> flags=0 words=[] bindings=[('default_port', {[DQ [LIT_CHARS 8080]]})]) (= scope=<EAssignScope.GLOBAL 1> flags=0 words=[] bindings=[('http_version', {[DQ [LIT_CHARS HTTP/1.1]]})]) (= scope=<EAssignScope.GLOBAL 1> flags=0 words=[] bindings=[('wwwoosh_fifo', {[DQ [LIT_CHARS /tmp/wwwoosh_fifo]]})]) (= scope=<EAssignScope.GLOBAL 1> flags=0 words=[] bindings=[('CR', {[SQ <LIT_CHARS "\\r">]})]) (= scope=<EAssignScope.GLOBAL 1> flags=0 words=[] bindings=[('LF', {[SQ <LIT_CHARS "\\n">]})]) (= scope=<EAssignScope.GLOBAL 1> flags=0 words=[] bindings=[('CRLF', {[DQ [VarSub CR][VarSub LF]]})]) (FunctionDef handle_request [] (List (= scope=<EAssignScope.GLOBAL 1> flags=0 words=[] bindings=[('app', {[DQ [VarSub 1]]})]) (Com {[LIT_CHARS read]} {[LIT_CHARS request_line]} ) (While (AndOr OP_AND_IF (Com {[LIT_CHARS read]} {[LIT_CHARS header]} ) (Com {[LIT_DBRACKET_LIKE "["]} {[LIT_OTHER "!"]} {[DQ [VarSub header]]} {[LIT_DBRACKET_LIKE "="]} {[SQ <LIT_CHARS "\\r">]} {[LIT_DBRACKET_LIKE "]"]} ) ) (List (= scope=<EAssignScope.GLOBAL 1> flags=0 words=[] bindings=[('header_name', {[DQ [LIT_CHARS HTTP_][ComSub (Pipeline (Com {[LIT_CHARS echo]} {[VarSub header]}) (Com {[LIT_CHARS cut]} {[LIT_CHARS -d]} {[SQ <LIT_CHARS ":">]} {[LIT_CHARS -f]} {[LIT_CHARS 1]}) (Com {[LIT_CHARS tr]} {[SQ <LIT_CHARS a-z->]} {[SQ <LIT_CHARS A-Z_>]}) )]]})]) (= scope=<EAssignScope.GLOBAL 1> flags=1 words=[{[VarSub header_name] [LIT_DBRACKET_LIKE "="] [DQ [ComSub (Pipeline (Com {[LIT_CHARS echo]} {[VarSub header]}) (Com {[LIT_CHARS cut]} {[LIT_CHARS -d]} {[SQ <LIT_CHARS ":">]} {[LIT_CHARS -f]} {[LIT_CHARS 2]}) (Com {[LIT_CHARS sed]} {[SQ <LIT_CHARS "s/^ //">]}) )]]}] bindings=[]) ) ) (= scope=<EAssignScope.GLOBAL 1> flags=1 words=[] bindings=[('REQUEST_METHOD', {[ComSub (Pipeline (Com {[LIT_CHARS echo]} {[VarSub request_line]}) (Com {[LIT_CHARS cut]} {[LIT_CHARS -d]} {[SQ <LIT_CHARS " ">]} {[LIT_CHARS -f]} {[LIT_CHARS 1]}) )]})]) (= scope=<EAssignScope.GLOBAL 1> flags=1 words=[] bindings=[('HTTP_VERSION', {[ComSub (Pipeline (Com {[LIT_CHARS echo]} {[VarSub request_line]}) (Com {[LIT_CHARS cut]} {[LIT_CHARS -d]} {[SQ <LIT_CHARS " ">]} {[LIT_CHARS -f]} {[LIT_CHARS 3]}) (Com {[LIT_CHARS tr]} {[LIT_CHARS -d]} {[SQ <LIT_CHARS "\\r">]}) )]})]) (= scope=<EAssignScope.GLOBAL 1> flags=0 words=[] bindings=[('request_path', {[ComSub (Pipeline (Com {[LIT_CHARS echo]} {[VarSub request_line]}) (Com {[LIT_CHARS cut]} {[LIT_CHARS -d]} {[SQ <LIT_CHARS " ">]} {[LIT_CHARS -f]} {[LIT_CHARS 2]}) )]})]) (= scope=<EAssignScope.GLOBAL 1> flags=1 words=[] bindings=[('PATH_INFO', {[ComSub (Pipeline (Com {[LIT_CHARS echo]} {[VarSub request_path]}) (Com {[LIT_CHARS cut]} {[LIT_CHARS -d]} {[SQ <LIT_CHARS "?">]} {[LIT_CHARS -f]} {[LIT_CHARS 1]}) )]})]) (= scope=<EAssignScope.GLOBAL 1> flags=1 words=[] bindings=[('QUERY_STRING', {[ComSub (Pipeline (Com {[LIT_CHARS echo]} {[VarSub request_path]}) (Com {[LIT_CHARS cut]} {[LIT_CHARS -d]} {[SQ <LIT_CHARS "?">]} {[LIT_CHARS -f]} {[LIT_CHARS 2]}) )]})]) (= scope=<EAssignScope.GLOBAL 1> flags=1 words=[] bindings=[('SCRIPT_NAME', {[DQ ]})]) (= scope=<EAssignScope.GLOBAL 1> flags=1 words=[] bindings=[('SERVER_NAME', {[DQ [LIT_CHARS localhost]]})]) (= scope=<EAssignScope.GLOBAL 1> flags=1 words=[] bindings=[('SERVER_PORT', {[DQ [VarSub port]]})]) (Com {[DQ [VarSub app]]} ) ) ) (FunctionDef handle_response [] (List (= scope=<EAssignScope.GLOBAL 1> flags=0 words=[] bindings=[('response_status', {[DQ [LIT_CHARS "200 OK"]]})]) (= scope=<EAssignScope.GLOBAL 1> flags=0 words=[] bindings=[('response_headers', {[DQ ]})]) (While (AndOr OP_AND_IF (Com {[LIT_CHARS read]} {[LIT_CHARS header]} ) (Com {[LIT_DBRACKET_LIKE "["]} {[LIT_OTHER "!"]} {[DQ [VarSub header]]} {[LIT_DBRACKET_LIKE "="]} {[DQ ]} {[LIT_DBRACKET_LIKE "]"]} ) ) (List (= scope=<EAssignScope.GLOBAL 1> flags=0 words=[] bindings=[('header_name', {[DQ [ComSub (Pipeline (Com {[LIT_CHARS echo]} {[VarSub header]}) (Com {[LIT_CHARS cut]} {[LIT_CHARS -d]} {[SQ <LIT_CHARS ":">]} {[LIT_CHARS -f]} {[LIT_CHARS 1]}) (Com {[LIT_CHARS tr]} {[SQ <LIT_CHARS A-Z>]} {[SQ <LIT_CHARS a-z>]}) )]]})]) (If (Com {[LIT_DBRACKET_LIKE "["]} {[DQ [VarSub header_name]]} {[LIT_DBRACKET_LIKE "="]} {[DQ [LIT_CHARS status]]} {[LIT_DBRACKET_LIKE "]"]} ) (= scope=<EAssignScope.GLOBAL 1> flags=0 words=[] bindings=[('response_status', {[DQ [ComSub (Pipeline (Com {[LIT_CHARS echo]} {[VarSub header]}) (Com {[LIT_CHARS cut]} {[LIT_CHARS -d]} {[SQ <LIT_CHARS ":">]} {[LIT_CHARS -f]} {[LIT_CHARS 2]}) (Com {[LIT_CHARS sed]} {[SQ <LIT_CHARS "s/^ //">]}) )]]})]) (ElseTrue) (If (Com {[LIT_DBRACKET_LIKE "["]} {[DQ [VarSub response_headers]]} {[LIT_DBRACKET_LIKE "]"]} ) (= scope=<EAssignScope.GLOBAL 1> flags=0 words=[] bindings=[('response_headers', {[DQ [VarSub response_headers][VarSub CRLF][VarSub header]]})]) (ElseTrue) (= scope=<EAssignScope.GLOBAL 1> flags=0 words=[] bindings=[('response_headers', {[DQ [VarSub header]]})]) ) ) ) ) (= scope=<EAssignScope.GLOBAL 1> flags=0 words=[] bindings=[('header', {[DQ [LIT_CHARS "Date: "][ComSub (Com {[LIT_CHARS date]} {[LIT_CHARS -u]} {[SQ <LIT_CHARS "+%a, %d %b %Y %R:%S GMT">]})]]})]) (= scope=<EAssignScope.GLOBAL 1> flags=0 words=[] bindings=[('response_headers', {[DQ [VarSub response_headers][VarSub CRLF][VarSub header]]})]) (Com {[LIT_CHARS echo]} {[DQ [VarSub http_version][LIT_CHARS " "][VarSub response_status][VarSub CRLF][VarSub response_headers][VarSub CRLF][VarSub CR]]} ) (Com {[LIT_CHARS cat]} ) ) ) (FunctionDef wwwoosh_run [] (List (= scope=<EAssignScope.GLOBAL 1> flags=0 words=[] bindings=[('app', {[DQ [VarSub 1]]})]) (Com {[LIT_CHARS rm]} {[LIT_CHARS -f]} {[DQ [VarSub wwwoosh_fifo]]} ) (Com {[LIT_CHARS mkfifo]} {[DQ [VarSub wwwoosh_fifo]]} ) (= scope=<EAssignScope.GLOBAL 1> flags=0 words=[] bindings=[('port', {[DQ [VarSub default_port]]})]) (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[VarSub #]} {[LIT_CHARS -gt]} {[LIT_CHARS 1]} {[LIT_DBRACKET_LIKE "]"]} ) (= scope=<EAssignScope.GLOBAL 1> flags=0 words=[] bindings=[('port', {[DQ [VarSub 2]]})]) ) (= scope=<EAssignScope.GLOBAL 1> flags=0 words=[] bindings=[('debug', {[DQ ]})]) (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[VarSub #]} {[LIT_CHARS -gt]} {[LIT_CHARS 2]} {[LIT_DBRACKET_LIKE "]"]} ) (= scope=<EAssignScope.GLOBAL 1> flags=0 words=[] bindings=[('debug', {[DQ [VarSub 3]]})]) ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Starting Wwwoosh on port "][VarSub port][LIT_CHARS ...]]} ) (While (Com {[LIT_CHARS true]} ) (If (Com {[LIT_DBRACKET_LIKE "["]} {[DQ [VarSub debug]]} {[LIT_DBRACKET_LIKE "]"]} ) (Pipeline (Com {[LIT_CHARS nc]} {[LIT_CHARS -l]} {[VarSub port]} < (FilenameRedirectNode filename={[DQ [VarSub wwwoosh_fifo]]} <REDIR_LESS "<"> 0), > ) (Com {[LIT_CHARS tee]} {[LIT_CHARS /dev/stderr]} ) (Com {[LIT_CHARS handle_request]} {[DQ [VarSub app]]} ) (Com {[LIT_CHARS handle_response]} ) (Com {[LIT_CHARS tee]} {[LIT_CHARS /dev/stderr]} < (FilenameRedirectNode filename={[DQ [VarSub wwwoosh_fifo]]} <REDIR_GREAT ">"> 1), > ) ) (ElseTrue) (Pipeline (Com {[LIT_CHARS nc]} {[LIT_CHARS -l]} {[VarSub port]} < (FilenameRedirectNode filename={[DQ [VarSub wwwoosh_fifo]]} <REDIR_LESS "<"> 0), > ) (Com {[LIT_CHARS handle_request]} {[DQ [VarSub app]]} ) (Com {[LIT_CHARS handle_response]} < (FilenameRedirectNode filename={[DQ [VarSub wwwoosh_fifo]]} <REDIR_GREAT ">"> 1), > ) ) ) ) ) ) )