# Git dumb HTTP protocol should use WebDAV PROPFIND method

3 messages from 2025-09-08 to 2025-09-08. Participants: Milan Hauth, Junio C Hamano.
Thread: https://gitlist.dev/t/64111

## Milan Hauth, 2025-09-08 12:10

Subject: Git dumb HTTP protocol should use WebDAV PROPFIND method
Message-ID: <CAGiEHCv7kXSB5v8Pi6gDYaC2O3m5qEM8dYW3vKvNm6sXQ_Vuhw@mail.gmail.com>
URL: https://gitlist.dev/e/CAGiEHCv7kXSB5v8Pi6gDYaC2O3m5qEM8dYW3vKvNm6sXQ_Vuhw%40mail.gmail.com

```
i am serving git repos over http with webdav extensions

read operations like git ls-remote, git fetch, git pull
should work with such an http remote
but currently (with git 2.49.0) this fails with

$ git ls-remote http://localhost/src/somerepo/
fatal: repository 'http://localhost/src/somerepo/' not found

$ git ls-remote http://localhost/src/somerepo/.git/
fatal: repository 'http://localhost/src/somerepo/.git/' not found



http server: nginx

nginx webdav module:
https://github.com/mid1221213/nginx-dav-ext-module

nginx config:

> http {
>   server {
>     listen 0.0.0.0:80;
>     root /var/www/nginx/htdocs;
>     location /src/ {
>       # PROPFIND allows directory listing
>       dav_ext_methods PROPFIND OPTIONS;
>       dav_access user:r group:r all:r;
>       autoindex on;
>       # disable index.html
>       index this_file_should_never_exist_DsMSIsKgBk;
>     }
>   }
> }

available methods can be fetched with the OPTIONS method

curl -s -i -X OPTIONS http://localhost/src/somerepo/ | grep -i ^allow:

directory listings can be fetched with the PROPFIND method

curl -s -X PROPFIND -H "Depth: 1"  http://localhost/src/somerepo/ |
grep -F 'D:displayname' | sed -E 's|.*>(.*)<.*|\1|' | LANG=C sort



workaround:

pushd /path/to/repo/.git/
git --bare update-server-info
mv hooks/post-update.sample hooks/post-update
popd
git ls-remote http://localhost/src/somerepo/.git/



continue:

Git dumb HTTP protocol should work without update-server-info
https://lore.kernel.org/git/CAGiEHCtP29bQRsEyLabNrLuiP96P-o7EEGi88B7pJbP0tfprxw@mail.gmail.com/

> reading directories is only possible with WebDAV since
> HTTP doesn't offer native directory listing.  However, we don't use
> WebDAV for fetches and other read operations and not all web servers
> support it.  We get better web server support in many cases by requiring
> that the server side do the work of updating the lists of packs and
> refs.

```

## Junio C Hamano, 2025-09-08 18:47

Subject: Re: Git dumb HTTP protocol should use WebDAV PROPFIND method
Message-ID: <xmqqikhswzl7.fsf@gitster.g>
URL: https://gitlist.dev/e/xmqqikhswzl7.fsf%40gitster.g
In-Reply-To: <CAGiEHCv7kXSB5v8Pi6gDYaC2O3m5qEM8dYW3vKvNm6sXQ_Vuhw@mail.gmail.com>

```
Milan Hauth <milahu@gmail.com> writes:

> workaround:
>
> pushd /path/to/repo/.git/
> git --bare update-server-info
> mv hooks/post-update.sample hooks/post-update
> popd
> git ls-remote http://localhost/src/somerepo/.git/

That is not a workaround, but the proper way the system was designed
to be used.

After all, the "dumb HTTP" support is just that.  It is known to be
ultra inefficient relative to other transport methods like "git
protocol over ssh connection", and "smart HTTP stateless
connection", and the WHOLE point of supporting "dumb HTTP" transport
is to allow a truly dumb HTTP serving infrastructure.  Letting the
clients assume that WebDAV exists on the server side defeats its
reason to exist.

```

## Milan Hauth, 2025-09-08 19:09

Subject: Re: Git dumb HTTP protocol should use WebDAV PROPFIND method
Message-ID: <CAGiEHCuaqu0ia7H8FKAPLcL3Gi_b0gKYe6ugjYAbyVkbd266_w@mail.gmail.com>
URL: https://gitlist.dev/e/CAGiEHCuaqu0ia7H8FKAPLcL3Gi_b0gKYe6ugjYAbyVkbd266_w%40mail.gmail.com
In-Reply-To: <xmqqikhswzl7.fsf@gitster.g>

```
> assume that WebDAV exists on the server side

no

plan A:
q: GET $url/info/refs
r: HTTP 404

plan B:
q: GET $url/.git/info/refs
r: HTTP 404

plan C:
q: OPTIONS
r: Allow: GET,HEAD,PROPFIND,OPTIONS
q: PROPFIND $url
r: ...

plan D:
q: PROPFIND $url/.git/
r: ...

(q = query, r = response)

so instead of throwing

> fatal: repository '$url' not found

git should try plan A, B, C, D, ...
to fetch data from the repo

currently, git gives up after plan A



> the WHOLE point of supporting "dumb HTTP" transport
> is to allow a truly dumb HTTP serving infrastructure

there are at least 2 variants of "dumb HTTP servers":
HTTP servers without WebDAV
HTTP servers with WebDAV



> assume that WebDAV exists on the server side

for HTTP servers without WebDAV
see my other thread

Git dumb HTTP protocol should work without update-server-info
https://lore.kernel.org/git/CAGiEHCtP29bQRsEyLabNrLuiP96P-o7EEGi88B7pJbP0tfprxw@mail.gmail.com/

```
