(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)}) ] )