(CommandList children: [ (FuncDef name: warn body: (BraceGroup children: [ (Sentence child: (SimpleCommand words: [{(echo)} {(DQ ('WARNING: ') ($ VSub_At '$@'))}] redirects: [(Redir op_id:Redir_GreatAnd fd:-1 arg_word:{(2)} spids:[38])] ) terminator: <Op_Semi ';'> ) ] spids: [29] ) spids: [25 28] ) (AndOr children: [ (C {(Lit_Other '[')} {(-r)} {(bashttpd.conf)} {(Lit_Other ']')}) (BraceGroup children: [ (SimpleCommand words: [{(cat)}] redirects: [ (Redir op_id:Redir_Great fd:-1 arg_word:{(bashttpd.conf)} spids:[60]) (HereDoc op_id: Redir_DLess fd: -1 body: {('#\n') ('# bashttpd.conf - configuration for bashttpd\n') ('#\n') ('# The behavior of bashttpd is dictated by the evaluation\n') ('# of rules specified in this configuration file. Each rule\n') ('# is evaluated until one is matched. If no rule is matched,\n') ('# bashttpd will serve a 500 Internal Server Error.\n') ('#\n') ('# The format of the rules are:\n') ('# on_uri_match REGEX command [args]\n') ('# unconditionally command [args]\n') ('#\n') ('# on_uri_match:\n') ('# On an incoming request, the URI is checked against the specified\n') ('# (bash-supported extended) regular expression, and if encounters a match the\n') ('# specified command is executed with the specified arguments.\n') ('#\n') ('# For additional flexibility, on_uri_match will also pass the results of the\n') ( '# regular expression match, ${BASH_REMATCH[@]} as additional arguments to the\n' ) ('# command.\n') ('#\n') ('# unconditionally:\n') ('# Always serve via the specified command. Useful for catchall rules.\n') ('#\n') ('# The following commands are available for use:\n') ('#\n') ('# serve_file FILE\n') ('# Statically serves a single file.\n') ('#\n') ('# serve_dir_with_tree DIRECTORY\n') ( "# Statically serves the specified directory using 'tree'. It must be\n" ) ('# installed and in the PATH.\n') ('#\n') ('# serve_dir_with_ls DIRECTORY\n') ("# Statically serves the specified directory using 'ls -al'.\n") ('#\n') ('# serve_dir DIRECTORY\n') ( "# Statically serves a single directory listing. Will use 'tree' if it is\n" ) ("# installed and in the PATH, otherwise, 'ls -al'\n") ('#\n') ('# serve_dir_or_file_from DIRECTORY\n') ('# Serves either a directory listing (using serve_dir) or a file (using\n') ( '# serve_file). Constructs local path by appending the specified root\n' ) ('# directory, and the URI portion of the client request.\n') ('#\n') ('# serve_static_string STRING\n') ('# Serves the specified static string with Content-Type text/plain.\n') ('#\n') ('# Examples of rules:\n') ('#\n') ('# on_uri_match \'^/issue$\' serve_file "/etc/issue"\n') ('#\n') ( "# When a client's requested URI matches the string '/issue', serve them the\n" ) ('# contents of /etc/issue\n') ('#\n') ("# on_uri_match 'root' serve_dir /\n") ('#\n') ("# When a client's requested URI has the word 'root' in it, serve up\n") ('# a directory listing of /\n') ('#\n') ('# DOCROOT=/var/www/html\n') ('# on_uri_match \'/(.*)\' serve_dir_or_file_from "$DOCROOT"\n') ('# When any URI request is made, attempt to serve a directory listing\n') ("# or file content based on the request URI, by mapping URI's to local\n") ('# paths relative to the specified "$DOCROOT"\n') ('#\n') ('\n') ( "unconditionally serve_static_string 'Hello, world! You can configure bashttpd by modifying bashttpd.conf.'\n" ) ('\n') ('# More about commands:\n') ('#\n') ( '# It is possible to somewhat easily write your own commands. An example\n' ) ('# may help. The following example will serve "Hello, $x!" whenever\n') ('# a client sends a request with the URI /say_hello_to/$x:\n') ('#\n') ('# serve_hello() {\n') ('# add_response_header "Content-Type" "text/plain"\n') ('# send_response_ok_exit <<< "Hello, $2!"\n') ('# }\n') ("# on_uri_match '^/say_hello_to/(.*)$' serve_hello\n") ('#\n') ('# Like mentioned before, the contents of ${BASH_REMATCH[@]} are passed\n') ('# to your command, so its possible to use regular expression groups\n') ('# to pull out info.\n') ('#\n') ('# With this example, when the requested URI is /say_hello_to/Josh, serve_hello\n') ("# is invoked with the arguments '/say_hello_to/Josh' 'Josh',\n") ('# (${BASH_REMATCH[0]} is always the full match)\n') } do_expansion: False here_end: EOF was_filled: True spids: [63] ) ] ) (C {(warn)} { (DQ ( 'Created bashttpd.conf using defaults. Please review it/configure before running bashttpd again.' ) ) } ) (C {(exit)} {(1)}) ] spids: [55] ) ] op_id: Op_DPipe ) (FuncDef name: recv body: (BraceGroup children: [ (Sentence child: (SimpleCommand words: [{(echo)} {(DQ ('< ') ($ VSub_At '$@'))}] redirects: [(Redir op_id:Redir_GreatAnd fd:-1 arg_word:{(2)} spids:[96])] ) terminator: <Op_Semi ';'> ) ] spids: [87] ) spids: [83 86] ) (FuncDef name: send body: (BraceGroup children: [ (Sentence child: (SimpleCommand words: [{(echo)} {(DQ ('> ') ($ VSub_At '$@'))}] redirects: [(Redir op_id:Redir_GreatAnd fd:-1 arg_word:{(2)} spids:[115])] ) terminator: <Op_Semi ';'> ) (Sentence child: (C {(printf)} {(SQ <'%s\\r\\n'>)} {(DQ ($ VSub_Star '$*'))}) terminator: <Op_Semi ';'> ) ] spids: [106] ) spids: [102 105] ) (AndOr children: [ (DBracket expr: (BoolBinary op_id:BoolBinary_GlobEqual left:{($ VSub_Name '$UID')} right:{(0)}) ) (C {(warn)} {(DQ ('It is not recommended to run bashttpd as root.'))}) ] op_id: Op_DAmp ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:DATE) op: Equal rhs: { (CommandSubPart command_list: (CommandList children: [(C {(date)} {(Lit_Other '+') (DQ ('%a, %d %b %Y %H:%M:%S %Z'))})] ) left_token: <Left_CommandSub '$('> spids: [154 161] ) } spids: [153] ) ] spids: [153] ) (Assignment keyword: Assign_Declare flags: ["'-a'"] pairs: [ (assign_pair lhs: (LhsName name:RESPONSE_HEADERS) op: Equal rhs: { (ArrayLiteralPart words: [ {(DQ ('Date: ') ($ VSub_Name '$DATE'))} {(DQ ('Expires: ') ($ VSub_Name '$DATE'))} {(DQ ('Server: Slash Bin Slash Bash'))} ] ) } spids: [167] ) ] spids: [163] ) (FuncDef name: add_response_header body: (BraceGroup children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:RESPONSE_HEADERS) op: PlusEqual rhs: { (ArrayLiteralPart words: [{(DQ ($ VSub_Number '$1') (': ') ($ VSub_Number '$2'))}] ) } spids: [197] ) ] spids: [197] ) ] spids: [194] ) spids: [190 193] ) (Assignment keyword: Assign_Declare flags: ["'-a'"] pairs: [ (assign_pair lhs: (LhsName name:HTTP_RESPONSE) op: Equal rhs: { (ArrayLiteralPart words: [ {(Lit_Other '[') (200) (Lit_Other ']') (Lit_Other '=') (DQ (OK))} {(Lit_Other '[') (400) (Lit_Other ']') (Lit_Other '=') (DQ ('Bad Request'))} {(Lit_Other '[') (403) (Lit_Other ']') (Lit_Other '=') (DQ (Forbidden))} {(Lit_Other '[') (404) (Lit_Other ']') (Lit_Other '=') (DQ ('Not Found'))} {(Lit_Other '[') (405) (Lit_Other ']') (Lit_Other '=') (DQ ('Method Not Allowed'))} {(Lit_Other '[') (500) (Lit_Other ']') (Lit_Other '=') (DQ ('Internal Server Error'))} ] ) } spids: [213] ) ] spids: [209] ) (FuncDef name: send_response body: (BraceGroup children: [ (Assignment keyword: Assign_Local pairs: [ (assign_pair lhs: (LhsName name:code) op: Equal rhs: {($ VSub_Number '$1')} spids: [282] ) ] spids: [280] ) (C {(send)} { (DQ ('HTTP/1.0 ') ($ VSub_Number '$1') (' ') (BracedVarSub token: <VSub_Name HTTP_RESPONSE> bracket_op: (ArrayIndex expr:(ArithWord w:{($ VSub_Number '$1')})) spids: [292 297] ) ) } ) (ForEach iter_name: i iter_words: [ { (DQ (BracedVarSub token: <VSub_Name RESPONSE_HEADERS> bracket_op: (WholeArray op_id:Lit_At) spids: [308 313] ) ) } ] do_arg_iter: False body: (DoGroup children:[(C {(send)} {(DQ ($ VSub_Name '$i'))})] spids:[317327]) spids: [306 315] ) (C {(send)}) (While cond: [(Sentence child:(C {(read)} {(-r)} {(line)}) terminator:<Op_Semi ';'>)] body: (DoGroup children:[(C {(send)} {(DQ ($ VSub_Name '$line'))})] spids:[342352]) ) ] spids: [277] ) spids: [273 276] ) (FuncDef name: send_response_ok_exit body: (BraceGroup children: [ (Sentence child:(C {(send_response)} {(200)}) terminator:<Op_Semi ';'>) (Sentence child:(C {(exit)} {(0)}) terminator:<Op_Semi ';'>) ] spids: [361] ) spids: [357 360] ) (FuncDef name: fail_with body: (BraceGroup children: [ (SimpleCommand words: [{(send_response)} {(DQ ($ VSub_Number '$1'))}] redirects: [ (Redir op_id: Redir_TLess fd: -1 arg_word: { (DQ ($ VSub_Number '$1') (' ') (BracedVarSub token: <VSub_Name HTTP_RESPONSE> bracket_op: (ArrayIndex expr:(ArithWord w:{($ VSub_Number '$1')})) spids: [394 399] ) ) } spids: [389] ) ] ) (C {(exit)} {(1)}) ] spids: [380] ) spids: [376 379] ) (FuncDef name: serve_file body: (BraceGroup children: [ (Assignment keyword: Assign_Local pairs: [ (assign_pair lhs: (LhsName name:file) op: Equal rhs: {($ VSub_Number '$1')} spids: [419] ) ] spids: [417] ) (Assignment keyword: Assign_None pairs: [(assign_pair lhs:(LhsName name:CONTENT_TYPE) op:Equal rhs:{(SQ )} spids:[424])] spids: [424] ) (Case to_match: {(DQ ($ VSub_Name '$file'))} arms: [ (case_arm pat_list: [ {(Lit_Other '*') (EscapedLiteralPart token:<Lit_EscapedChar '\\.'>) (css)} ] action: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:CONTENT_TYPE) op: Equal rhs: {(DQ (text/css))} spids: [442] ) ] spids: [442] ) ] spids: [436 439 448 -1] ) (case_arm pat_list: [{(Lit_Other '*') (EscapedLiteralPart token:<Lit_EscapedChar '\\.'>) (js)}] action: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:CONTENT_TYPE) op: Equal rhs: {(DQ (text/javascript))} spids: [457] ) ] spids: [457] ) ] spids: [451 454 463 -1] ) (case_arm pat_list: [{(Lit_Other '*')}] action: [ (SimpleCommand words: [{(read)} {(-r)} {(CONTENT_TYPE)}] redirects: [ (Redir op_id: Redir_Less fd: -1 arg_word: { (CommandSubPart command_list: (CommandList children: [ (C {(file)} {(-b)} {(--mime-type)} {(DQ ($ VSub_Name '$file'))}) ] ) left_token: <Left_ProcSubIn '<('> spids: [478 488] ) } spids: [476] ) ] ) ] spids: [466 467 491 -1] ) ] spids: [427 433 494] ) (Sentence child: (C {(add_response_header)} {(DQ (Content-Type))} {(DQ ($ VSub_Name '$CONTENT_TYPE'))}) terminator: <Op_Semi ';'> ) (AndOr children: [ (SimpleCommand words: [{(read)} {(-r)} {(CONTENT_LENGTH)}] redirects: [ (Redir op_id: Redir_Less fd: -1 arg_word: { (CommandSubPart command_list: (CommandList children: [(C {(stat)} {(-c) (SQ <'%s'>)} {(DQ ($ VSub_Name '$file'))})] ) left_token: <Left_ProcSubIn '<('> spids: [519 530] ) } spids: [517] ) ] ) (C {(add_response_header)} {(DQ (Content-Length))} {(DQ ($ VSub_Name '$CONTENT_LENGTH'))}) ] op_id: Op_DAmp ) (SimpleCommand words: [{(send_response_ok_exit)}] redirects: [ (Redir op_id: Redir_Less fd: -1 arg_word: {(DQ ($ VSub_Name '$file'))} spids: [550] ) ] ) ] spids: [414] ) spids: [410 413] ) (FuncDef name: serve_dir_with_tree body: (BraceGroup children: [ (Assignment keyword: Assign_Local pairs: [ (assign_pair lhs: (LhsName name:dir) op: Equal rhs: {(DQ ($ VSub_Number '$1'))} spids: [568] ) (assign_pair lhs:(LhsName name:tree_vers) op:Equal spids:[573]) (assign_pair lhs:(LhsName name:tree_opts) op:Equal spids:[575]) (assign_pair lhs:(LhsName name:basehref) op:Equal spids:[577]) (assign_pair lhs:(LhsName name:x) op:Equal spids:[579]) ] spids: [566] ) (C {(add_response_header)} {(DQ (Content-Type))} {(DQ (text/html))}) (SimpleCommand words: [{(read)} {(x)} {(tree_vers)} {(x)}] redirects: [ (Redir op_id: Redir_Less fd: -1 arg_word: { (CommandSubPart command_list: (CommandList children:[(C {(tree)} {(--version)})]) left_token: <Left_ProcSubIn '<('> spids: [609 613] ) } spids: [607] ) ] ) (AndOr children: [ (DBracket expr: (BoolBinary op_id: BoolBinary_GlobDEqual left: {($ VSub_Name '$tree_vers')} right: {(v1.6) (Lit_Other '*')} ) ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:tree_opts) op: Equal rhs: {(DQ (--du))} spids: [629] ) ] spids: [629] ) ] op_id: Op_DAmp ) (SimpleCommand words: [{(send_response_ok_exit)}] redirects: [ (Redir op_id: Redir_Less fd: -1 arg_word: { (CommandSubPart command_list: (CommandList children: [ (C {(tree)} {(-H)} {(DQ ($ VSub_Number '$2'))} {(-L)} {(1)} {(DQ ($ VSub_Name '$tree_opts'))} {(-D)} {(DQ ($ VSub_Name '$dir'))} ) ] ) left_token: <Left_ProcSubIn '<('> spids: [642 664] ) } spids: [638] ) ] ) ] spids: [563] ) spids: [559 562] ) (FuncDef name: serve_dir_with_ls body: (BraceGroup children: [ (Assignment keyword: Assign_Local pairs: [ (assign_pair lhs: (LhsName name:dir) op: Equal rhs: {($ VSub_Number '$1')} spids: [678] ) ] spids: [676] ) (C {(add_response_header)} {(DQ (Content-Type))} {(DQ (text/plain))}) (SimpleCommand words: [{(send_response_ok_exit)}] redirects: [ (Redir op_id: Redir_Less fd: -1 arg_word: { (CommandSubPart command_list: (CommandList children: [(C {(ls)} {(-la)} {(DQ ($ VSub_Name '$dir'))})] ) left_token: <Left_ProcSubIn '<('> spids: [701 709] ) } spids: [697] ) ] ) ] spids: [673] ) spids: [669 672] ) (FuncDef name: serve_dir body: (BraceGroup children: [ (Assignment keyword: Assign_Local pairs: [ (assign_pair lhs: (LhsName name:dir) op: Equal rhs: {($ VSub_Number '$1')} spids: [723] ) ] spids: [721] ) (Sentence child:(C {(which)} {(tree)}) terminator:<Op_Amp '&'>) (AndOr children: [ (SimpleCommand redirects: [(Redir op_id:Redir_Great fd:-1 arg_word:{(/dev/null)} spids:[737])] ) (C {(serve_dir_with_tree)} {(DQ ($ VSub_At '$@'))}) ] op_id: Op_DAmp ) (C {(serve_dir_with_ls)} {(DQ ($ VSub_At '$@'))}) (C {(fail_with)} {(500)}) ] spids: [718] ) spids: [714 717] ) (FuncDef name: serve_dir_or_file_from body: (BraceGroup children: [ (Assignment keyword: Assign_Local pairs: [ (assign_pair lhs: (LhsName name:URL_PATH) op: Equal rhs: {($ VSub_Number '$1') (/) ($ VSub_Number '$3')} spids: [776] ) ] spids: [774] ) (C {(shift)}) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:URL_PATH) op: Equal rhs: { (BracedVarSub token: <VSub_Name URL_PATH> suffix_op: (PatSub pat: {('[^a-zA-Z0-9_~') (EscapedLiteralPart token:<Lit_EscapedChar '\\-'>) (EscapedLiteralPart token: <Lit_EscapedChar '\\.'> ) (EscapedLiteralPart token:<Lit_EscapedChar '\\/'>) (']') } replace: {} do_all: True do_prefix: False do_suffix: False ) spids: [791 801] ) } spids: [790] ) ] spids: [790] ) (AndOr children: [ (DBracket expr: (BoolBinary op_id: BoolBinary_GlobDEqual left: {($ VSub_Name '$URL_PATH')} right: {(Lit_Other '*') (..) (Lit_Other '*')} ) ) (C {(fail_with)} {(400)}) ] op_id: Op_DAmp ) (AndOr children: [ (DBracket expr: (LogicalAnd left: (BoolUnary op_id:BoolUnary_d child:{($ VSub_Name '$URL_PATH')}) right: (LogicalAnd left: (BoolUnary op_id: BoolUnary_f child: {($ VSub_Name '$URL_PATH') (/index.html)} ) right: (BoolUnary op_id: BoolUnary_r child: {($ VSub_Name '$URL_PATH') (/index.html)} ) ) ) ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:URL_PATH) op: Equal rhs: {(DQ ($ VSub_Name '$URL_PATH') (/index.html))} spids: [854] ) ] spids: [854] ) ] op_id: Op_DAmp ) (If arms: [ (if_arm cond: [ (Sentence child: (DBracket expr: (BoolUnary op_id:BoolUnary_f child:{($ VSub_Name '$URL_PATH')}) ) terminator: <Op_Semi ';'> ) ] action: [ (AndOr children: [ (DBracket expr: (BoolUnary op_id:BoolUnary_r child:{($ VSub_Name '$URL_PATH')}) ) (AndOr children: [ (C {(serve_file)} {(DQ ($ VSub_Name '$URL_PATH'))} {(DQ ($ VSub_At '$@'))}) (C {(fail_with)} {(403)}) ] op_id: Op_DPipe ) ] op_id: Op_DAmp ) ] spids: [-1 873] ) (if_arm cond: [ (Sentence child: (DBracket expr: (BoolUnary op_id:BoolUnary_d child:{($ VSub_Name '$URL_PATH')}) ) terminator: <Op_Semi ';'> ) ] action: [ (AndOr children: [ (DBracket expr: (BoolUnary op_id:BoolUnary_x child:{($ VSub_Name '$URL_PATH')}) ) (AndOr children: [ (C {(serve_dir)} {(DQ ($ VSub_Name '$URL_PATH'))} {(DQ ($ VSub_At '$@'))}) (C {(fail_with)} {(403)}) ] op_id: Op_DPipe ) ] op_id: Op_DAmp ) ] spids: [905 916] ) ] spids: [-1 948] ) (C {(fail_with)} {(404)}) ] spids: [771] ) spids: [767 770] ) (FuncDef name: serve_static_string body: (BraceGroup children: [ (C {(add_response_header)} {(DQ (Content-Type))} {(DQ (text/plain))}) (SimpleCommand words: [{(send_response_ok_exit)}] redirects: [ (Redir op_id: Redir_TLess fd: -1 arg_word: {(DQ ($ VSub_Number '$1'))} spids: [979] ) ] ) ] spids: [963] ) spids: [959 962] ) (FuncDef name: on_uri_match body: (BraceGroup children: [ (Assignment keyword: Assign_Local pairs: [ (assign_pair lhs: (LhsName name:regex) op: Equal rhs: {($ VSub_Number '$1')} spids: [997] ) ] spids: [995] ) (C {(shift)}) (AndOr children: [ (DBracket expr: (BoolBinary op_id: BoolBinary_EqualTilde left: {($ VSub_Name '$REQUEST_URI')} right: {($ VSub_Name '$regex')} ) ) (C {(DQ ($ VSub_At '$@'))} { (DQ (BracedVarSub token: <VSub_Name BASH_REMATCH> bracket_op: (WholeArray op_id:Lit_At) spids: [1024 1029] ) ) } ) ] op_id: Op_DAmp ) ] spids: [992] ) spids: [988 991] ) (FuncDef name: unconditionally body: (BraceGroup children: [(C {(DQ ($ VSub_At '$@'))} {(DQ ($ VSub_Name '$REQUEST_URI'))})] spids: [1039] ) spids: [1035 1038] ) (AndOr children:[(C {(read)} {(-r)} {(line)})(C {(fail_with)} {(400)})] op_id:Op_DPipe) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:line) op: Equal rhs: { (BracedVarSub token: <VSub_Name line> suffix_op: (StringUnary op_id:VOp1_DPercent arg_word:{(SQ <Lit_EscapedChar '\\r'>)}) spids: [1073 1079] ) } spids: [1072] ) ] spids: [1072] ) (C {(recv)} {(DQ ($ VSub_Name '$line'))}) (SimpleCommand words: [{(read)} {(-r)} {(REQUEST_METHOD)} {(REQUEST_URI)} {(REQUEST_HTTP_VERSION)}] redirects: [(Redir op_id:Redir_TLess fd:-1 arg_word:{(DQ ($ VSub_Name '$line'))} spids:[1098])] ) (AndOr children: [ (C {(Lit_Other '[')} {(-n)} {(DQ ($ VSub_Name '$REQUEST_METHOD'))} {(Lit_Other ']')}) (AndOr children: [ (C {(Lit_Other '[')} {(-n)} {(DQ ($ VSub_Name '$REQUEST_URI'))} {(Lit_Other ']')}) (AndOr children: [ (C {(Lit_Other '[')} {(-n)} {(DQ ($ VSub_Name '$REQUEST_HTTP_VERSION'))} {(Lit_Other ']')} ) (C {(fail_with)} {(400)}) ] op_id: Op_DPipe ) ] op_id: Op_DAmp ) ] op_id: Op_DAmp ) (AndOr children: [ (C {(Lit_Other '[')} {(DQ ($ VSub_Name '$REQUEST_METHOD'))} {(Lit_Other '=')} {(DQ (GET))} {(Lit_Other ']')} ) (C {(fail_with)} {(405)}) ] op_id: Op_DPipe ) (Assignment keyword: Assign_Declare flags: ["'-a'"] pairs: [(assign_pair lhs:(LhsName name:REQUEST_HEADERS) op:Equal spids:[1177])] spids: [1173] ) (While cond: [(Sentence child:(C {(read)} {(-r)} {(line)}) terminator:<Op_Semi ';'>)] body: (DoGroup children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:line) op: Equal rhs: { (BracedVarSub token: <VSub_Name line> suffix_op: (StringUnary op_id: VOp1_DPercent arg_word: {(SQ <Lit_EscapedChar '\\r'>)} ) spids: [1193 1199] ) } spids: [1192] ) ] spids: [1192] ) (C {(recv)} {(DQ ($ VSub_Name '$line'))}) (AndOr children: [ (C {(Lit_Other '[')} {(-z)} {(DQ ($ VSub_Name '$line'))} {(Lit_Other ']')}) (ControlFlow token:<ControlFlow_Break break>) ] op_id: Op_DAmp ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:REQUEST_HEADERS) op: PlusEqual rhs: {(ArrayLiteralPart words:[{(DQ ($ VSub_Name '$line'))}])} spids: [1230] ) ] spids: [1230] ) ] spids: [1189 1237] ) ) (C {(source)} { (DQ (BracedVarSub token: <VSub_Name BASH_SOURCE> bracket_op: (ArrayIndex expr:(ArithWord w:{(Lit_Digits 0)})) suffix_op: (StringUnary op_id:VOp1_Percent arg_word:{(Lit_Slash /) ('*')}) spids: [1243 1251] ) ) (/bashttpd.conf) } ) (C {(fail_with)} {(500)}) ] )