t / t5560-http-backend.shon commit Git 1.6.6 (902f235)
   1#!/bin/sh
   2
   3test_description='test git-http-backend'
   4. ./test-lib.sh
   5
   6if test -n "$NO_CURL"; then
   7        say 'skipping test, git built without http support'
   8        test_done
   9fi
  10
  11LIB_HTTPD_PORT=${LIB_HTTPD_PORT-'5560'}
  12. "$TEST_DIRECTORY"/lib-httpd.sh
  13start_httpd
  14
  15find_file() {
  16        cd "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" &&
  17        find $1 -type f |
  18        sed -e 1q
  19}
  20
  21config() {
  22        git --git-dir="$HTTPD_DOCUMENT_ROOT_PATH/repo.git" config $1 $2
  23}
  24
  25GET() {
  26        curl --include "$HTTPD_URL/smart/repo.git/$1" >out 2>/dev/null &&
  27        tr '\015' Q <out |
  28        sed '
  29                s/Q$//
  30                1q
  31        ' >act &&
  32        echo "HTTP/1.1 $2" >exp &&
  33        test_cmp exp act
  34}
  35
  36POST() {
  37        curl --include --data "$2" \
  38        --header "Content-Type: application/x-$1-request" \
  39        "$HTTPD_URL/smart/repo.git/$1" >out 2>/dev/null &&
  40        tr '\015' Q <out |
  41        sed '
  42                s/Q$//
  43                1q
  44        ' >act &&
  45        echo "HTTP/1.1 $3" >exp &&
  46        test_cmp exp act
  47}
  48
  49log_div() {
  50        echo >>"$HTTPD_ROOT_PATH"/access.log
  51        echo "###  $1" >>"$HTTPD_ROOT_PATH"/access.log
  52        echo "###" >>"$HTTPD_ROOT_PATH"/access.log
  53}
  54
  55test_expect_success 'setup repository' '
  56        echo content >file &&
  57        git add file &&
  58        git commit -m one &&
  59
  60        mkdir "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" &&
  61        (cd "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" &&
  62         git --bare init &&
  63         : >objects/info/alternates &&
  64         : >objects/info/http-alternates
  65        ) &&
  66        git remote add public "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" &&
  67        git push public master:master &&
  68
  69        (cd "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" &&
  70         git repack -a -d
  71        ) &&
  72
  73        echo other >file &&
  74        git add file &&
  75        git commit -m two &&
  76        git push public master:master &&
  77
  78        LOOSE_URL=$(find_file objects/??) &&
  79        PACK_URL=$(find_file objects/pack/*.pack) &&
  80        IDX_URL=$(find_file objects/pack/*.idx)
  81'
  82
  83get_static_files() {
  84        GET HEAD "$1" &&
  85        GET info/refs "$1" &&
  86        GET objects/info/packs "$1" &&
  87        GET objects/info/alternates "$1" &&
  88        GET objects/info/http-alternates "$1" &&
  89        GET $LOOSE_URL "$1" &&
  90        GET $PACK_URL "$1" &&
  91        GET $IDX_URL "$1"
  92}
  93
  94test_expect_success 'direct refs/heads/master not found' '
  95        log_div "refs/heads/master"
  96        GET refs/heads/master "404 Not Found"
  97'
  98test_expect_success 'static file is ok' '
  99        log_div "getanyfile default"
 100        get_static_files "200 OK"
 101'
 102test_expect_success 'static file if http.getanyfile true is ok' '
 103        log_div "getanyfile true"
 104        config http.getanyfile true &&
 105        get_static_files "200 OK"
 106'
 107test_expect_success 'static file if http.getanyfile false fails' '
 108        log_div "getanyfile false"
 109        config http.getanyfile false &&
 110        get_static_files "403 Forbidden"
 111'
 112
 113test_expect_success 'http.uploadpack default enabled' '
 114        log_div "uploadpack default"
 115        GET info/refs?service=git-upload-pack "200 OK"  &&
 116        POST git-upload-pack 0000 "200 OK"
 117'
 118test_expect_success 'http.uploadpack true' '
 119        log_div "uploadpack true"
 120        config http.uploadpack true &&
 121        GET info/refs?service=git-upload-pack "200 OK" &&
 122        POST git-upload-pack 0000 "200 OK"
 123'
 124test_expect_success 'http.uploadpack false' '
 125        log_div "uploadpack false"
 126        config http.uploadpack false &&
 127        GET info/refs?service=git-upload-pack "403 Forbidden" &&
 128        POST git-upload-pack 0000 "403 Forbidden"
 129'
 130
 131test_expect_success 'http.receivepack default disabled' '
 132        log_div "receivepack default"
 133        GET info/refs?service=git-receive-pack "403 Forbidden"  &&
 134        POST git-receive-pack 0000 "403 Forbidden"
 135'
 136test_expect_success 'http.receivepack true' '
 137        log_div "receivepack true"
 138        config http.receivepack true &&
 139        GET info/refs?service=git-receive-pack "200 OK" &&
 140        POST git-receive-pack 0000 "200 OK"
 141'
 142test_expect_success 'http.receivepack false' '
 143        log_div "receivepack false"
 144        config http.receivepack false &&
 145        GET info/refs?service=git-receive-pack "403 Forbidden" &&
 146        POST git-receive-pack 0000 "403 Forbidden"
 147'
 148
 149run_backend() {
 150        REQUEST_METHOD=GET \
 151        GIT_PROJECT_ROOT="$HTTPD_DOCUMENT_ROOT_PATH" \
 152        PATH_INFO="$2" \
 153        git http-backend >act.out 2>act.err
 154}
 155
 156path_info() {
 157        if test $1 = 0; then
 158                run_backend "$2"
 159        else
 160                test_must_fail run_backend "$2" &&
 161                echo "fatal: '$2': aliased" >exp.err &&
 162                test_cmp exp.err act.err
 163        fi
 164}
 165
 166test_expect_success 'http-backend blocks bad PATH_INFO' '
 167        config http.getanyfile true &&
 168
 169        run_backend 0 /repo.git/HEAD &&
 170
 171        run_backend 1 /repo.git/../HEAD &&
 172        run_backend 1 /../etc/passwd &&
 173        run_backend 1 ../etc/passwd &&
 174        run_backend 1 /etc//passwd &&
 175        run_backend 1 /etc/./passwd &&
 176        run_backend 1 /etc/.../passwd &&
 177        run_backend 1 //domain/data.txt
 178'
 179
 180cat >exp <<EOF
 181
 182###  refs/heads/master
 183###
 184GET  /smart/repo.git/refs/heads/master HTTP/1.1 404 -
 185
 186###  getanyfile default
 187###
 188GET  /smart/repo.git/HEAD HTTP/1.1 200
 189GET  /smart/repo.git/info/refs HTTP/1.1 200
 190GET  /smart/repo.git/objects/info/packs HTTP/1.1 200
 191GET  /smart/repo.git/objects/info/alternates HTTP/1.1 200 -
 192GET  /smart/repo.git/objects/info/http-alternates HTTP/1.1 200 -
 193GET  /smart/repo.git/$LOOSE_URL HTTP/1.1 200
 194GET  /smart/repo.git/$PACK_URL HTTP/1.1 200
 195GET  /smart/repo.git/$IDX_URL HTTP/1.1 200
 196
 197###  getanyfile true
 198###
 199GET  /smart/repo.git/HEAD HTTP/1.1 200
 200GET  /smart/repo.git/info/refs HTTP/1.1 200
 201GET  /smart/repo.git/objects/info/packs HTTP/1.1 200
 202GET  /smart/repo.git/objects/info/alternates HTTP/1.1 200 -
 203GET  /smart/repo.git/objects/info/http-alternates HTTP/1.1 200 -
 204GET  /smart/repo.git/$LOOSE_URL HTTP/1.1 200
 205GET  /smart/repo.git/$PACK_URL HTTP/1.1 200
 206GET  /smart/repo.git/$IDX_URL HTTP/1.1 200
 207
 208###  getanyfile false
 209###
 210GET  /smart/repo.git/HEAD HTTP/1.1 403 -
 211GET  /smart/repo.git/info/refs HTTP/1.1 403 -
 212GET  /smart/repo.git/objects/info/packs HTTP/1.1 403 -
 213GET  /smart/repo.git/objects/info/alternates HTTP/1.1 403 -
 214GET  /smart/repo.git/objects/info/http-alternates HTTP/1.1 403 -
 215GET  /smart/repo.git/$LOOSE_URL HTTP/1.1 403 -
 216GET  /smart/repo.git/$PACK_URL HTTP/1.1 403 -
 217GET  /smart/repo.git/$IDX_URL HTTP/1.1 403 -
 218
 219###  uploadpack default
 220###
 221GET  /smart/repo.git/info/refs?service=git-upload-pack HTTP/1.1 200
 222POST /smart/repo.git/git-upload-pack HTTP/1.1 200 -
 223
 224###  uploadpack true
 225###
 226GET  /smart/repo.git/info/refs?service=git-upload-pack HTTP/1.1 200
 227POST /smart/repo.git/git-upload-pack HTTP/1.1 200 -
 228
 229###  uploadpack false
 230###
 231GET  /smart/repo.git/info/refs?service=git-upload-pack HTTP/1.1 403 -
 232POST /smart/repo.git/git-upload-pack HTTP/1.1 403 -
 233
 234###  receivepack default
 235###
 236GET  /smart/repo.git/info/refs?service=git-receive-pack HTTP/1.1 403 -
 237POST /smart/repo.git/git-receive-pack HTTP/1.1 403 -
 238
 239###  receivepack true
 240###
 241GET  /smart/repo.git/info/refs?service=git-receive-pack HTTP/1.1 200
 242POST /smart/repo.git/git-receive-pack HTTP/1.1 200 -
 243
 244###  receivepack false
 245###
 246GET  /smart/repo.git/info/refs?service=git-receive-pack HTTP/1.1 403 -
 247POST /smart/repo.git/git-receive-pack HTTP/1.1 403 -
 248EOF
 249test_expect_success 'server request log matches test results' '
 250        sed -e "
 251                s/^.* \"//
 252                s/\"//
 253                s/ [1-9][0-9]*\$//
 254                s/^GET /GET  /
 255        " >act <"$HTTPD_ROOT_PATH"/access.log &&
 256        test_cmp exp act
 257'
 258
 259stop_httpd
 260test_done