(command.CommandList
  children: [
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:test_description)
          op: assign_op.Equal
          rhs: {(SQ <'test git-http-backend'>)}
          spids: [4]
        )
      ]
    )
    (C {<.>} {<'./test-lib.sh'>})
    (C {<.>} {(DQ ($ Id.VSub_DollarName '$TEST_DIRECTORY')) <'/lib-httpd.sh'>})
    (C {<start_httpd>})
    (command.ShFunction
      name: GET
      body: 
        (BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp]
              children: [
                (command.Simple
                  words: [
                    {<curl>}
                    {<--include>}
                    {
                      (DQ ($ Id.VSub_DollarName '$HTTPD_URL') <'/'> ($ Id.VSub_DollarName '$SMART') 
                        <'/repo.git/'> ($ Id.VSub_Number '$1')
                      )
                    }
                  ]
                  redirects: [
                    (redir
                      op: <Id.Redir_Great '>'>
                      loc: (redir_loc.Fd fd:1)
                      arg: {<out>}
                    )
                    (redir
                      op: <Id.Redir_Great '2>'>
                      loc: (redir_loc.Fd fd:2)
                      arg: {<'/dev/null'>}
                    )
                  ]
                  do_fork: T
                )
                (command.Pipeline
                  children: [
                    (command.Simple
                      words: [{<tr>} {(SQ <'\\015'>)} {<Q>}]
                      redirects: [(redir op:<Id.Redir_Less '<'> loc:(redir_loc.Fd fd:0) arg:{<out>})]
                      do_fork: T
                    )
                    (command.Simple
                      words: [{<sed>} {(SQ <'\n'> <'\t\ts/Q$//\n'> <'\t\t1q\n'> <'\t'>)}]
                      redirects: [(redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<act>})]
                      do_fork: T
                    )
                  ]
                  negated: F
                )
                (command.Simple
                  words: [{<echo>} {(DQ <'HTTP/1.1 '> ($ Id.VSub_Number '$2'))}]
                  redirects: [(redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<exp>})]
                  do_fork: T
                )
                (C {<test_cmp>} {<exp>} {<act>})
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: POST
      body: 
        (BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp]
              children: [
                (command.Simple
                  words: [
                    {<curl>}
                    {<--include>}
                    {<--data>}
                    {(DQ ($ Id.VSub_Number '$2'))}
                    {<--header>}
                    {(DQ <'Content-Type: application/x-'> ($ Id.VSub_Number '$1') <-request>)}
                    {
                      (DQ ($ Id.VSub_DollarName '$HTTPD_URL') <'/smart/repo.git/'> 
                        ($ Id.VSub_Number '$1')
                      )
                    }
                  ]
                  redirects: [
                    (redir
                      op: <Id.Redir_Great '>'>
                      loc: (redir_loc.Fd fd:1)
                      arg: {<out>}
                    )
                    (redir
                      op: <Id.Redir_Great '2>'>
                      loc: (redir_loc.Fd fd:2)
                      arg: {<'/dev/null'>}
                    )
                  ]
                  do_fork: T
                )
                (command.Pipeline
                  children: [
                    (command.Simple
                      words: [{<tr>} {(SQ <'\\015'>)} {<Q>}]
                      redirects: [(redir op:<Id.Redir_Less '<'> loc:(redir_loc.Fd fd:0) arg:{<out>})]
                      do_fork: T
                    )
                    (command.Simple
                      words: [{<sed>} {(SQ <'\n'> <'\t\ts/Q$//\n'> <'\t\t1q\n'> <'\t'>)}]
                      redirects: [(redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<act>})]
                      do_fork: T
                    )
                  ]
                  negated: F
                )
                (command.Simple
                  words: [{<echo>} {(DQ <'HTTP/1.1 '> ($ Id.VSub_Number '$3'))}]
                  redirects: [(redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<exp>})]
                  do_fork: T
                )
                (C {<test_cmp>} {<exp>} {<act>})
              ]
            )
          ]
        )
    )
    (C {<.>} {(DQ ($ Id.VSub_DollarName '$TEST_DIRECTORY')) <'/t556x_common'>})
    (command.Simple
      words: [{<grep>} {(SQ <'^[^#]'>)}]
      redirects: [
        (redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<exp>})
        (redir
          op: <Id.Redir_DLess '<<'>
          loc: (redir_loc.Fd fd:0)
          arg: 
            (redir_param.HereDoc
              here_begin: {<EOF>}
              here_end_span_id: 337
              stdin_parts: [
                <'\n'>
                <'###  refs/heads/master\n'>
                <'###\n'>
                <'GET  /smart/repo.git/refs/heads/master HTTP/1.1 404 -\n'>
                <'\n'>
                <'###  getanyfile default\n'>
                <'###\n'>
                <'GET  /smart/repo.git/HEAD HTTP/1.1 200\n'>
                <'GET  /smart/repo.git/info/refs HTTP/1.1 200\n'>
                <'GET  /smart/repo.git/objects/info/packs HTTP/1.1 200\n'>
                <'GET  /smart/repo.git/objects/info/alternates HTTP/1.1 200 -\n'>
                <'GET  /smart/repo.git/objects/info/http-alternates HTTP/1.1 200 -\n'>
                <'GET  /smart/repo.git/'>
                ($ Id.VSub_DollarName '$LOOSE_URL')
                <' HTTP/1.1 200\n'>
                <'GET  /smart/repo.git/'>
                ($ Id.VSub_DollarName '$PACK_URL')
                <' HTTP/1.1 200\n'>
                <'GET  /smart/repo.git/'>
                ($ Id.VSub_DollarName '$IDX_URL')
                <' HTTP/1.1 200\n'>
                <'\n'>
                <'###  no git-daemon-export-ok\n'>
                <'###\n'>
                <'GET  /smart_noexport/repo.git/HEAD HTTP/1.1 404 -\n'>
                <'GET  /smart_noexport/repo.git/info/refs HTTP/1.1 404 -\n'>
                <'GET  /smart_noexport/repo.git/objects/info/packs HTTP/1.1 404 -\n'>
                <'GET  /smart_noexport/repo.git/objects/info/alternates HTTP/1.1 404 -\n'>
                <'GET  /smart_noexport/repo.git/objects/info/http-alternates HTTP/1.1 404 -\n'>
                <'GET  /smart_noexport/repo.git/'>
                ($ Id.VSub_DollarName '$LOOSE_URL')
                <' HTTP/1.1 404 -\n'>
                <'GET  /smart_noexport/repo.git/'>
                ($ Id.VSub_DollarName '$PACK_URL')
                <' HTTP/1.1 404 -\n'>
                <'GET  /smart_noexport/repo.git/'>
                ($ Id.VSub_DollarName '$IDX_URL')
                <' HTTP/1.1 404 -\n'>
                <'\n'>
                <'###  git-daemon-export-ok\n'>
                <'###\n'>
                <'GET  /smart_noexport/repo.git/HEAD HTTP/1.1 200\n'>
                <'GET  /smart_noexport/repo.git/info/refs HTTP/1.1 200\n'>
                <'GET  /smart_noexport/repo.git/objects/info/packs HTTP/1.1 200\n'>
                <'GET  /smart_noexport/repo.git/objects/info/alternates HTTP/1.1 200 -\n'>
                <'GET  /smart_noexport/repo.git/objects/info/http-alternates HTTP/1.1 200 -\n'>
                <'GET  /smart_noexport/repo.git/'>
                ($ Id.VSub_DollarName '$LOOSE_URL')
                <' HTTP/1.1 200\n'>
                <'GET  /smart_noexport/repo.git/'>
                ($ Id.VSub_DollarName '$PACK_URL')
                <' HTTP/1.1 200\n'>
                <'GET  /smart_noexport/repo.git/'>
                ($ Id.VSub_DollarName '$IDX_URL')
                <' HTTP/1.1 200\n'>
                <'\n'>
                <'###  getanyfile true\n'>
                <'###\n'>
                <'GET  /smart/repo.git/HEAD HTTP/1.1 200\n'>
                <'GET  /smart/repo.git/info/refs HTTP/1.1 200\n'>
                <'GET  /smart/repo.git/objects/info/packs HTTP/1.1 200\n'>
                <'GET  /smart/repo.git/objects/info/alternates HTTP/1.1 200 -\n'>
                <'GET  /smart/repo.git/objects/info/http-alternates HTTP/1.1 200 -\n'>
                <'GET  /smart/repo.git/'>
                ($ Id.VSub_DollarName '$LOOSE_URL')
                <' HTTP/1.1 200\n'>
                <'GET  /smart/repo.git/'>
                ($ Id.VSub_DollarName '$PACK_URL')
                <' HTTP/1.1 200\n'>
                <'GET  /smart/repo.git/'>
                ($ Id.VSub_DollarName '$IDX_URL')
                <' HTTP/1.1 200\n'>
                <'\n'>
                <'###  getanyfile false\n'>
                <'###\n'>
                <'GET  /smart/repo.git/HEAD HTTP/1.1 403 -\n'>
                <'GET  /smart/repo.git/info/refs HTTP/1.1 403 -\n'>
                <'GET  /smart/repo.git/objects/info/packs HTTP/1.1 403 -\n'>
                <'GET  /smart/repo.git/objects/info/alternates HTTP/1.1 403 -\n'>
                <'GET  /smart/repo.git/objects/info/http-alternates HTTP/1.1 403 -\n'>
                <'GET  /smart/repo.git/'>
                ($ Id.VSub_DollarName '$LOOSE_URL')
                <' HTTP/1.1 403 -\n'>
                <'GET  /smart/repo.git/'>
                ($ Id.VSub_DollarName '$PACK_URL')
                <' HTTP/1.1 403 -\n'>
                <'GET  /smart/repo.git/'>
                ($ Id.VSub_DollarName '$IDX_URL')
                <' HTTP/1.1 403 -\n'>
                <'\n'>
                <'###  uploadpack default\n'>
                <'###\n'>
                <'GET  /smart/repo.git/info/refs?service=git-upload-pack HTTP/1.1 200\n'>
                <'POST /smart/repo.git/git-upload-pack HTTP/1.1 200 -\n'>
                <'\n'>
                <'###  uploadpack true\n'>
                <'###\n'>
                <'GET  /smart/repo.git/info/refs?service=git-upload-pack HTTP/1.1 200\n'>
                <'POST /smart/repo.git/git-upload-pack HTTP/1.1 200 -\n'>
                <'\n'>
                <'###  uploadpack false\n'>
                <'###\n'>
                <'GET  /smart/repo.git/info/refs?service=git-upload-pack HTTP/1.1 403 -\n'>
                <'POST /smart/repo.git/git-upload-pack HTTP/1.1 403 -\n'>
                <'\n'>
                <'###  receivepack default\n'>
                <'###\n'>
                <'GET  /smart/repo.git/info/refs?service=git-receive-pack HTTP/1.1 403 -\n'>
                <'POST /smart/repo.git/git-receive-pack HTTP/1.1 403 -\n'>
                <'\n'>
                <'###  receivepack true\n'>
                <'###\n'>
                <'GET  /smart/repo.git/info/refs?service=git-receive-pack HTTP/1.1 200\n'>
                <'POST /smart/repo.git/git-receive-pack HTTP/1.1 200 -\n'>
                <'\n'>
                <'###  receivepack false\n'>
                <'###\n'>
                <'GET  /smart/repo.git/info/refs?service=git-receive-pack HTTP/1.1 403 -\n'>
                <'POST /smart/repo.git/git-receive-pack HTTP/1.1 403 -\n'>
              ]
            )
        )
      ]
      do_fork: T
    )
    (C {<test_expect_success>} {(SQ <'server request log matches test results'>)} 
      {
        (SQ <'\n'> <'\tsed -e "\n'> <'\t\ts/^.* \\"//\n'> <'\t\ts/\\"//\n'> <'\t\ts/ [1-9][0-9]*\\$//\n'> 
          <'\t\ts/^GET /GET  /\n'> <'\t" >act <"$HTTPD_ROOT_PATH"/access.log &&\n'> <'\ttest_cmp exp act\n'>
        )
      }
    )
    (C {<stop_httpd>})
    (C {<test_done>})
  ]
)