(CommandList
  children: [
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:test_description)
          op: Equal
          rhs: {(SQ <'test smart fetching over http via http-backend'>)}
          spids: [4]
        )
      ]
      spids: [4]
    )
    (C {(.)} {(./test-lib.sh)})
    (C {(.)} {(DQ ($ VSub_Name '$TEST_DIRECTORY')) (/lib-httpd.sh)})
    (C {(start_httpd)})
    (C {(test_expect_success)} {(SQ <'setup repository'>)} 
      {
        (SQ <'\n'> <'\tgit config push.default matching &&\n'> <'\techo content >file &&\n'> 
          <'\tgit add file &&\n'> <'\tgit commit -m one\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'create http-accessible bare repository'>)} 
      {
        (SQ <'\n'> <'\tmkdir "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" &&\n'> 
          <'\t(cd "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" &&\n'> <'\t git --bare init\n'> <'\t) &&\n'> 
          <'\tgit remote add public "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" &&\n'> <'\tgit push public master:master\n'>
        )
      }
    )
    (C {(setup_askpass_helper)})
    (SimpleCommand
      words: [{(cat)}]
      redirects: [
        (Redir op_id:Redir_Great fd:-1 arg_word:{(exp)} spids:[60])
        (HereDoc
          op_id: Redir_DLess
          fd: -1
          body: 
            {
              (DQ ('> GET /smart/repo.git/info/refs?service=git-upload-pack HTTP/1.1\n') 
                ('> Accept: */*\n') ('> Accept-Encoding: gzip\n') ('> Pragma: no-cache\n') ('< HTTP/1.1 200 OK\n') ('< Pragma: no-cache\n') 
                ('< Cache-Control: no-cache, max-age=0, must-revalidate\n') ('< Content-Type: application/x-git-upload-pack-advertisement\n') 
                ('> POST /smart/repo.git/git-upload-pack HTTP/1.1\n') ('> Accept-Encoding: gzip\n') ('> Content-Type: application/x-git-upload-pack-request\n') 
                ('> Accept: application/x-git-upload-pack-result\n') ('> Content-Length: xxx\n') ('< HTTP/1.1 200 OK\n') ('< Pragma: no-cache\n') 
                ('< Cache-Control: no-cache, max-age=0, must-revalidate\n') ('< Content-Type: application/x-git-upload-pack-result\n')
              )
            }
          do_expansion: True
          here_end: EOF
          was_filled: True
          spids: [63]
        )
      ]
    )
    (C {(test_expect_success)} {(SQ <'clone http repository'>)} 
      {
        (SQ <'\n'> 
          <'\tGIT_TRACE_CURL=true git clone --quiet $HTTPD_URL/smart/repo.git clone 2>err &&\n'> <'\ttest_cmp file clone/file &&\n'> <'\ttr '>
        ) (EscapedLiteralPart token:<Lit_EscapedChar "\\'">) (SQ <'\\015'>) 
        (EscapedLiteralPart token:<Lit_EscapedChar "\\'">) 
        (SQ <' Q <err |\n'> <'\tsed -e "\n'> <'\t\ts/Q\\$//\n'> <'\t\t/^[*] /d\n'> <'\t\t/^== Info:/d\n'> 
          <'\t\t/^=> Send header, /d\n'> <'\t\t/^=> Send header:$/d\n'> <'\t\t/^<= Recv header, /d\n'> <'\t\t/^<= Recv header:$/d\n'> 
          <'\t\ts/=> Send header: //\n'> <'\t\ts/= Recv header://\n'> <'\t\t/^<= Recv data/d\n'> <'\t\t/^=> Send data/d\n'> <'\t\t/^$/d\n'> 
          <'\t\t/^< $/d\n'> <'\n'> <'\t\t/^[^><]/{\n'> <'\t\t\ts/^/> /\n'> <'\t\t}\n'> <'\n'> <'\t\t/^> User-Agent: /d\n'> 
          <'\t\t/^> Host: /d\n'> <'\t\t/^> POST /,$ {\n'> <'\t\t\t/^> Accept: [*]\\\\/[*]/d\n'> <'\t\t}\n'> 
          <'\t\ts/^> Content-Length: .*/> Content-Length: xxx/\n'> <'\t\t/^> 00..want /d\n'> <'\t\t/^> 00.*done/d\n'> <'\n'> <'\t\t/^< Server: /d\n'> 
          <'\t\t/^< Expires: /d\n'> <'\t\t/^< Date: /d\n'> <'\t\t/^< Content-Length: /d\n'> <'\t\t/^< Transfer-Encoding: /d\n'> 
          <'\t" >act &&\n'> <'\ttest_cmp exp act\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'fetch changes via http'>)} 
      {
        (SQ <'\n'> <'\techo content >>file &&\n'> <'\tgit commit -a -m two &&\n'> 
          <'\tgit push public &&\n'> <'\t(cd clone && git pull) &&\n'> <'\ttest_cmp file clone/file\n'>
        )
      }
    )
    (SimpleCommand
      words: [{(cat)}]
      redirects: [
        (Redir op_id:Redir_Great fd:-1 arg_word:{(exp)} spids:[158])
        (HereDoc
          op_id: Redir_DLess
          fd: -1
          body: 
            {
              (DQ ('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') ('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')
              )
            }
          do_expansion: True
          here_end: EOF
          was_filled: True
          spids: [161]
        )
      ]
    )
    (C {(test_expect_success)} {(SQ <'used upload-pack service'>)} 
      {
        (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 {(test_expect_success)} {(SQ <'follow redirects (301)'>)} 
      {(SQ <'\n'> <'\tgit clone $HTTPD_URL/smart-redir-perm/repo.git --quiet repo-p\n'>)}
    )
    (C {(test_expect_success)} {(SQ <'follow redirects (302)'>)} 
      {(SQ <'\n'> <'\tgit clone $HTTPD_URL/smart-redir-temp/repo.git --quiet repo-t\n'>)}
    )
    (C {(test_expect_success)} {(SQ <'redirects re-root further requests'>)} 
      {(SQ <'\n'> <'\tgit clone $HTTPD_URL/smart-redir-limited/repo.git repo-redir-limited\n'>)}
    )
    (C {(test_expect_success)} {(SQ <'clone from password-protected repository'>)} 
      {
        (SQ <'\n'> <'\techo two >expect &&\n'> <'\tset_askpass user@host pass@host &&\n'> 
          <'\tgit clone --bare "$HTTPD_URL/auth/smart/repo.git" smart-auth &&\n'> <'\texpect_askpass both user@host &&\n'> 
          <'\tgit --git-dir=smart-auth log -1 --format=%s >actual &&\n'> <'\ttest_cmp expect actual\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'clone from auth-only-for-push repository'>)} 
      {
        (SQ <'\n'> <'\techo two >expect &&\n'> <'\tset_askpass wrong &&\n'> 
          <'\tgit clone --bare "$HTTPD_URL/auth-push/smart/repo.git" smart-noauth &&\n'> <'\texpect_askpass none &&\n'> <'\tgit --git-dir=smart-noauth log -1 --format=%s >actual &&\n'> 
          <'\ttest_cmp expect actual\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'clone from auth-only-for-objects repository'>)} 
      {
        (SQ <'\n'> <'\techo two >expect &&\n'> <'\tset_askpass user@host pass@host &&\n'> 
          <'\tgit clone --bare "$HTTPD_URL/auth-fetch/smart/repo.git" half-auth &&\n'> <'\texpect_askpass both user@host &&\n'> <'\tgit --git-dir=half-auth log -1 --format=%s >actual &&\n'> 
          <'\ttest_cmp expect actual\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'no-op half-auth fetch does not require a password'>)} 
      {
        (SQ <'\n'> <'\tset_askpass wrong &&\n'> <'\tgit --git-dir=half-auth fetch &&\n'> 
          <'\texpect_askpass none\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'redirects send auth to new location'>)} 
      {
        (SQ <'\n'> <'\tset_askpass user@host pass@host &&\n'> 
          <'\tgit -c credential.useHttpPath=true \\\n'> <'\t  clone $HTTPD_URL/smart-redir-auth/repo.git repo-redir-auth &&\n'> 
          <'\texpect_askpass both user@host auth/smart/repo.git\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'disable dumb http on server'>)} 
      {
        (SQ <'\n'> <'\tgit --git-dir="$HTTPD_DOCUMENT_ROOT_PATH/repo.git" \\\n'> 
          <'\t\tconfig http.getanyfile false\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'GIT_SMART_HTTP can disable smart http'>)} 
      {
        (SQ <'\n'> <'\t(GIT_SMART_HTTP=0 &&\n'> <'\t export GIT_SMART_HTTP &&\n'> <'\t cd clone &&\n'> 
          <'\t test_must_fail git fetch)\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'invalid Content-Type rejected'>)} 
      {
        (SQ <'\n'> <'\ttest_must_fail git clone $HTTPD_URL/broken_smart/repo.git 2>actual &&\n'> 
          <'\tgrep "not valid:" actual\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'create namespaced refs'>)} 
      {
        (SQ <'\n'> <'\ttest_commit namespaced &&\n'> 
          <'\tgit push public HEAD:refs/namespaces/ns/refs/heads/master &&\n'> <'\tgit --git-dir="$HTTPD_DOCUMENT_ROOT_PATH/repo.git" \\\n'> 
          <'\t\tsymbolic-ref refs/namespaces/ns/HEAD refs/namespaces/ns/refs/heads/master\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'smart clone respects namespace'>)} 
      {
        (SQ <'\n'> <'\tgit clone "$HTTPD_URL/smart_namespace/repo.git" ns-smart &&\n'> 
          <'\techo namespaced >expect &&\n'> <'\tgit --git-dir=ns-smart/.git log -1 --format=%s >actual &&\n'> <'\ttest_cmp expect actual\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'dumb clone via http-backend respects namespace'>)} 
      {
        (SQ <'\n'> <'\tgit --git-dir="$HTTPD_DOCUMENT_ROOT_PATH/repo.git" \\\n'> 
          <'\t\tconfig http.getanyfile true &&\n'> <'\tGIT_SMART_HTTP=0 git clone \\\n'> <'\t\t"$HTTPD_URL/smart_namespace/repo.git" ns-dumb &&\n'> 
          <'\techo namespaced >expect &&\n'> <'\tgit --git-dir=ns-dumb/.git log -1 --format=%s >actual &&\n'> <'\ttest_cmp expect actual\n'>
        )
      }
    )
    (SimpleCommand
      words: [{(cat)}]
      redirects: [
        (Redir op_id:Redir_Great fd:-1 arg_word:{(cookies.txt)} spids:[393])
        (HereDoc
          op_id: Redir_DLess
          fd: -1
          body: {(DQ ('127.0.0.1\tFALSE\t/smart_cookies/\tFALSE\t0\tothername\tothervalue\n'))}
          do_expansion: True
          here_end: EOF
          was_filled: True
          spids: [396]
        )
      ]
    )
    (SimpleCommand
      words: [{(cat)}]
      redirects: [
        (Redir op_id:Redir_Great fd:-1 arg_word:{(expect_cookies.txt)} spids:[402])
        (HereDoc
          op_id: Redir_DLess
          fd: -1
          body: 
            {
              (DQ ('\n') ('127.0.0.1\tFALSE\t/smart_cookies/\tFALSE\t0\tothername\tothervalue\n') 
                ('127.0.0.1\tFALSE\t/smart_cookies/repo.git/info/\tFALSE\t0\tname\tvalue\n')
              )
            }
          do_expansion: True
          here_end: EOF
          was_filled: True
          spids: [405]
        )
      ]
    )
    (C {(test_expect_success)} {(SQ <'cookies stored in http.cookiefile when http.savecookies set'>)} 
      {
        (SQ <'\n'> <'\tgit config http.cookiefile cookies.txt &&\n'> 
          <'\tgit config http.savecookies true &&\n'> <'\tgit ls-remote $HTTPD_URL/smart_cookies/repo.git master &&\n'> 
          <'\ttail -3 cookies.txt >cookies_tail.txt &&\n'> <'\ttest_cmp expect_cookies.txt cookies_tail.txt\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'transfer.hiderefs works over smart-http'>)} 
      {
        (SQ <'\n'> <'\ttest_commit hidden &&\n'> <'\ttest_commit visible &&\n'> 
          <'\tgit push public HEAD^:refs/heads/a HEAD:refs/heads/b &&\n'> <'\tgit --git-dir="$HTTPD_DOCUMENT_ROOT_PATH/repo.git" \\\n'> 
          <'\t\tconfig transfer.hiderefs refs/heads/a &&\n'> <'\tgit clone --bare "$HTTPD_URL/smart/repo.git" hidden.git &&\n'> 
          <'\ttest_must_fail git -C hidden.git rev-parse --verify a &&\n'> <'\tgit -C hidden.git rev-parse --verify b\n'>
        )
      }
    )
    (FuncDef
      name: create_tags
      body: 
        (BraceGroup
          children: [
            (AndOr
              children: [
                (C {(rm)} {(-f)} {(marks)})
                (AndOr
                  children: [
                    (Pipeline
                      children: [
                        (ForEach
                          iter_name: i
                          iter_words: [
                            {
                              (CommandSubPart
                                command_list: 
                                  (CommandList
                                    children: [
                                      (C {(test_seq)} {(DQ ($ VSub_Number '$1'))} 
                                        {(DQ ($ VSub_Number '$2'))}
                                      )
                                    ]
                                  )
                                left_token: <Left_CommandSub '$('>
                                spids: [472 482]
                              )
                            }
                          ]
                          do_arg_iter: False
                          body: 
                            (DoGroup
                              children: [
                                (AndOr
                                  children: [
                                    (C {(echo)} 
                                      {
                                        (DQ ('commit refs/heads/too-many-refs-') ($ VSub_Number '$1'))
                                      }
                                    )
                                    (AndOr
                                      children: [
                                        (C {(echo)} {(DQ ('mark :') ($ VSub_Name '$i'))})
                                        (AndOr
                                          children: [
                                            (C {(echo)} 
                                              {
                                                (DQ ('committer git <git@example.com> ') 
                                                  ($ VSub_Name '$i') (' +0000')
                                                )
                                              }
                                            )
                                            (AndOr
                                              children: [
                                                (C {(echo)} {(DQ ('data 0'))})
                                                (AndOr
                                                  children: [
                                                    (C {(echo)} {(DQ ('M 644 inline bla.txt'))})
                                                    (AndOr
                                                      children: [
                                                        (C {(echo)} {(DQ ('data 4'))})
                                                        (AndOr
                                                          children: [
                                                            (C {(echo)} {(DQ (bla))})
                                                            (AndOr
                                                              children: [
                                                                (C {(echo)} 
                                                                  {
                                                                    (DQ 
                                                                      (
'reset refs/heads/too-many-refs-'
                                                                      ) ($ VSub_Number '$1')
                                                                    )
                                                                  }
                                                                )
                                                                (C {(echo)} 
                                                                  {
                                                                    (DQ ('from :') 
                                                                      ($ VSub_Number '$1')
                                                                    )
                                                                  }
                                                                )
                                                              ]
                                                              op_id: Op_DAmp
                                                            )
                                                          ]
                                                          op_id: Op_DAmp
                                                        )
                                                      ]
                                                      op_id: Op_DAmp
                                                    )
                                                  ]
                                                  op_id: Op_DAmp
                                                )
                                              ]
                                              op_id: Op_DAmp
                                            )
                                          ]
                                          op_id: Op_DAmp
                                        )
                                      ]
                                      op_id: Op_DAmp
                                    )
                                  ]
                                  op_id: Op_DAmp
                                )
                              ]
                              spids: [485 589]
                            )
                          spids: [471 -1]
                        )
                        (C {(git)} {(fast-import)} {(--export-marks) (Lit_Other '=') (marks)})
                      ]
                      negated: False
                    )
                    (AndOr
                      children: [
                        (Assignment
                          keyword: Assign_None
                          pairs: [
                            (assign_pair
                              lhs: (LhsName name:tag)
                              op: Equal
                              rhs: 
                                {
                                  (CommandSubPart
                                    command_list: 
                                      (CommandList
                                        children: [
                                          (C {(perl)} {(-e)} 
                                            {
                                              (DQ ('print ') 
                                                (EscapedLiteralPart
                                                  token: <Lit_EscapedChar '\\"'>
                                                ) (bla) (EscapedLiteralPart token:<Lit_EscapedChar '\\"'>) (' x 30')
                                              )
                                            }
                                          )
                                        ]
                                      )
                                    left_token: <Left_CommandSub '$('>
                                    spids: [610 622]
                                  )
                                }
                              spids: [609]
                            )
                          ]
                          spids: [609]
                        )
                        (SimpleCommand
                          words: [
                            {(sed)}
                            {(-e)}
                            {
                              (DQ ('s|^:') (EscapedLiteralPart token:<Lit_EscapedChar '\\('>) ('[^ ]*') 
                                (EscapedLiteralPart
                                  token: <Lit_EscapedChar '\\)'>
                                ) (' ') (EscapedLiteralPart token:<Lit_EscapedChar '\\('>) ('.*') 
                                (EscapedLiteralPart
                                  token: <Lit_EscapedChar '\\)'>
                                ) (Lit_Other '$') ('|') (EscapedLiteralPart token:<Lit_EscapedChar '\\2'>) (' refs/tags/') 
                                ($ VSub_Name '$tag') (-) (EscapedLiteralPart token:<Lit_EscapedChar '\\1'>) ('|')
                              )
                            }
                          ]
                          redirects: [
                            (Redir
                              op_id: Redir_Less
                              fd: -1
                              arg_word: {(marks)}
                              spids: [650]
                            )
                            (Redir
                              op_id: Redir_DGreat
                              fd: -1
                              arg_word: {(packed-refs)}
                              spids: [653]
                            )
                          ]
                        )
                      ]
                      op_id: Op_DAmp
                    )
                  ]
                  op_id: Op_DAmp
                )
              ]
              op_id: Op_DAmp
            )
          ]
          spids: [454]
        )
      spids: [449 453]
    )
    (C {(test_expect_success)} {(SQ <'create 2,000 tags in the repo'>)} 
      {
        (SQ <'\n'> <'\t(\n'> <'\t\tcd "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" &&\n'> 
          <'\t\tcreate_tags 1 2000\n'> <'\t)\n'>
        )
      }
    )
    (C {(test_expect_success)} {(CMDLINE_LIMIT)} 
      {(SQ <'clone the 2,000 tag repo to check OS command line overflow'>)} 
      {
        (SQ <'\n'> 
          <'\trun_with_limited_cmdline git clone $HTTPD_URL/smart/repo.git too-many-refs &&\n'> <'\t(\n'> <'\t\tcd too-many-refs &&\n'> <'\t\tgit for-each-ref refs/tags >actual &&\n'> 
          <'\t\ttest_line_count = 2000 actual\n'> <'\t)\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'large fetch-pack requests can be split across POSTs'>)} 
      {
        (SQ <'\n'> <'\tGIT_TRACE_CURL=true git -c http.postbuffer=65536 \\\n'> 
          <'\t\tclone --bare "$HTTPD_URL/smart/repo.git" split.git 2>err &&\n'> <'\tgrep "^=> Send header: POST" err >posts &&\n'> <'\ttest_line_count = 2 posts\n'>
        )
      }
    )
    (C {(test_expect_success)} {(EXPENSIVE)} {(SQ <'http can handle enormous ref negotiation'>)} 
      {
        (SQ <'\n'> <'\t(\n'> <'\t\tcd "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" &&\n'> 
          <'\t\tcreate_tags 2001 50000\n'> <'\t) &&\n'> <'\tgit -C too-many-refs fetch -q --tags &&\n'> <'\t(\n'> 
          <'\t\tcd "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" &&\n'> <'\t\tcreate_tags 50001 100000\n'> <'\t) &&\n'> <'\tgit -C too-many-refs fetch -q --tags &&\n'> 
          <'\tgit -C too-many-refs for-each-ref refs/tags >tags &&\n'> <'\ttest_line_count = 100000 tags\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'custom http headers'>)} 
      {
        (SQ <'\n'> <'\ttest_must_fail git -c http.extraheader="x-magic-two: cadabra" \\\n'> 
          <'\t\tfetch "$HTTPD_URL/smart_headers/repo.git" &&\n'> <'\tgit -c http.extraheader="x-magic-one: abra" \\\n'> 
          <'\t    -c http.extraheader="x-magic-two: cadabra" \\\n'> <'\t    fetch "$HTTPD_URL/smart_headers/repo.git" &&\n'> 
          <'\tgit update-index --add --cacheinfo 160000,$(git rev-parse HEAD),sub &&\n'> <'\tgit config -f .gitmodules submodule.sub.path sub &&\n'> 
          <'\tgit config -f .gitmodules submodule.sub.url \\\n'> <'\t\t"$HTTPD_URL/smart_headers/repo.git" &&\n'> <'\tgit submodule init sub &&\n'> 
          <'\ttest_must_fail git submodule update sub &&\n'> <'\tgit -c http.extraheader="x-magic-one: abra" \\\n'> 
          <'\t    -c http.extraheader="x-magic-two: cadabra" \\\n'> <'\t\tsubmodule update sub\n'>
        )
      }
    )
    (C {(stop_httpd)})
    (C {(test_done)})
  ]
)