(command.CommandList children: [ (command.ShFunction name: get body: (BraceGroup children:[(C {<route>} {(DQ <GET>)} {($ Id.VSub_At '$@')})]) ) (command.ShFunction name: post body: (BraceGroup children:[(C {<route>} {(DQ <POST>)} {($ Id.VSub_At '$@')})]) ) (command.ShFunction name: delete body: (BraceGroup children:[(C {<route>} {(DQ <DELETE>)} {($ Id.VSub_At '$@')})]) ) (command.ShFunction name: status body: (BraceGroup children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:martin_response_status) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_Number '$1'))} spids: [66] ) ] ) ] ) ) (command.ShFunction name: header body: (BraceGroup children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:martin_response_headers) op: assign_op.Equal rhs: { (DQ ($ Id.VSub_DollarName '$martin_response_headers') ($ Id.VSub_Number '$1') <': '> ($ Id.VSub_Number '$2') ($ Id.VSub_DollarName '$LF') ) } spids: [82] ) ] ) ] ) ) (command.ShFunction name: not_found body: (BraceGroup children: [ (C {<status>} {(DQ <404>)}) (C {<header>} {(DQ <Content-type>)} {(DQ <'text/plain'>)}) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {($ Id.VSub_Pound '$#')} {<-gt>} {<0>} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [(C {<echo>} {(DQ ($ Id.VSub_At '$@'))})] spids: [120 133] ) ] else_action: [(C {<echo>} {(DQ <'Not Found: '> ($ Id.VSub_DollarName '$PATH_INFO'))})] ) ] ) ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:LF) op: assign_op.Equal rhs: { (single_quoted left: <Id.Left_CSingleQuote '$\''> tokens: [<Id.Char_OneChar '\\n'>] multiline: F ) } spids: [159] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:martin_routes) op: assign_op.Equal rhs: {(DQ )} spids: [168] ) ] ) (command.ShFunction name: route body: (BraceGroup children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:martin_routes) op: assign_op.Equal rhs: { (DQ ($ Id.VSub_DollarName '$martin_routes') ($ Id.VSub_Number '$1') <','> ($ Id.VSub_Number '$2') <','> ($ Id.VSub_Number '$3') ($ Id.VSub_DollarName '$LF') ) } spids: [181] ) ] ) ] ) ) (command.ShFunction name: martin_find_route body: (BraceGroup children: [ (command.Pipeline children: [ (C {<echo>} {(DQ ($ Id.VSub_DollarName '$martin_routes'))}) (command.WhileUntil keyword: <Id.KW_While while> cond: (condition.Shell commands: [ (command.Sentence child: (command.Simple words: [{<read>} {<-r>} {<method>} {<path>} {<action>}] more_env: [(env_pair name:IFS val:{(DQ <','>)} spids:[213])] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) body: (command.DoGroup children: [ (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (command.AndOr ops: [Id.Op_DAmp] children: [ (C {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_Number '$1'))} {<Id.Lit_Equals '='>} {(DQ ($ Id.VSub_DollarName '$method'))} {<Id.Lit_RBracket ']'>} ) (C {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_Number '$2'))} {<Id.Lit_Equals '='>} {(DQ ($ Id.VSub_DollarName '$path'))} {<Id.Lit_RBracket ']'>} ) ] ) terminator: <Id.Op_Semi _> ) ] ) action: [ (C {<echo>} {($ Id.VSub_DollarName '$action')}) (command.ControlFlow token: <Id.ControlFlow_Return return> ) ] spids: [232 265] ) ] ) ] ) ) ] negated: F ) ] ) ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:martin_response_headers) op: assign_op.Equal rhs: {(DQ )} spids: [284] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:martin_response_status) op: assign_op.Equal rhs: {(DQ )} spids: [288] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:martin_response_file) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_DollarName '$TMPDIR') <'/martin_response'> ($ Id.VSub_Dollar '$$'))} spids: [292] ) ] ) (command.ShFunction name: martin_reset_response body: (BraceGroup children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:martin_response_status) op: assign_op.Equal rhs: {(DQ <'200 OK'>)} spids: [308] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:martin_response_headers) op: assign_op.Equal rhs: {(DQ )} spids: [314] ) ] ) ] ) ) (command.ShFunction name: martin_dispatch body: (BraceGroup children: [ (C {<local>} {<Id.Lit_VarLike 'action='> (DQ (command_sub left_token: <Id.Left_DollarParen '$('> child: (C {<martin_find_route>} {(DQ ($ Id.VSub_DollarName '$REQUEST_METHOD'))} {(DQ ($ Id.VSub_DollarName '$PATH_INFO'))} ) ) ) } ) (command.AndOr ops: [Id.Op_DAmp] children: [ (C {<Id.Lit_LBracket '['>} {<Id.KW_Bang '!'>} {(DQ ($ Id.VSub_DollarName '$action'))} {<Id.Lit_RBracket ']'>} ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:action) op: assign_op.Equal rhs: {(DQ <not_found>)} spids: [360] ) ] ) ] ) (C {<martin_reset_response>}) (command.Simple words: [{(DQ ($ Id.VSub_DollarName '$action'))}] redirects: [ (redir op: <Id.Redir_Great '>'> loc: (redir_loc.Fd fd:1) arg: {(DQ ($ Id.VSub_DollarName '$martin_response_file'))} ) ] do_fork: T ) (C {<header>} {(DQ <Status>)} {(DQ ($ Id.VSub_DollarName '$martin_response_status'))}) (C {<header>} {(DQ <Content-Length>)} { (DQ (command_sub left_token: <Id.Left_DollarParen '$('> child: (command.Pipeline children: [ (C {<wc>} {<-c>} {(DQ ($ Id.VSub_DollarName '$martin_response_file'))}) (C {<awk>} {(SQ <'{ print $1 }'>)}) ] negated: F ) ) ) } ) (C {<echo>} {(DQ ($ Id.VSub_DollarName '$martin_response_headers'))}) (C {<cat>} {(DQ ($ Id.VSub_DollarName '$martin_response_file'))}) ] ) ) (command.ShFunction name: martin body: (BraceGroup children: [ (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {($ Id.VSub_DollarName '$REQUEST_METHOD')} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [(C {<martin_dispatch>})] spids: [458 467] ) ] else_action: [ (C {<.>} {<'./wwwoosh.sh'>}) (C {<wwwoosh>} {<martin_dispatch>} {($ Id.VSub_DollarName '$PORT')}) ] ) ] ) ) ] )