Subject: Re: [RFC 2/2] Add Git-aware CGI for Git-aware smart HTTP transport

From: Rogan Dawes <[email-masked]>
Date: Mon, 04 Aug 2008 17:45:59 +0200

Shawn O. Pearce wrote:
> Rogan Dawes <[email-masked]> wrote:
>> Shawn O. Pearce wrote:
>>> 	Smart Server Detection
>>> 	----------------------
>>>
>>> 	To detect a smart (Git-aware) server a client sends an
>>> 	empty POST request to info/refs; [...]
>>>
>>> 		C: POST /repository.git/info/refs HTTP/1.0
>>> 		C: Content-Length: 0
>> I don't understand why you would want to keep the commands in the URL  
>> when you are doing a POST?
> 
> Well, as Dscho pointed out this partly has to do with caching and
> the transparent dumb server functionality.  By using the command in
> the URL, and having the command match that of the dumb server file,
> its easier to emulate a dumb server and also to permit caching.
> 
> Currently git-http-backend requests no caching for info/refs, but
> I could see us tweaking that to permit several minutes of caching,
> especially on big public sites like kernel.org.  Having info/refs
> report stale by 5 minutes is not an issue when writes to there
> already have a lag due to the master-slave mirroring system in use.

Fair enough, but what about the quote from RFC2616 that I posted in 
rebuttal to Dscho?

 > 13.10 Invalidation After Updates or Deletions
 >
 > ...
 >
 > Some HTTP methods MUST cause a cache to invalidate an entity. This is
 > either the entity referred to by the Request-URI, or by the Location
 > or Content-Location headers (if present). These methods are:
 >
 >       - PUT
 >       - DELETE
 >       - POST

This doesn't seem negotiable to me.

For those resources that are expected to be cacheable, the request 
should be made using a GET.

> Because git-http-backend emulates a dumb server there is a command
> dispatch table based upon the URL submitted.  Thus we already have
> the command dispatch behavior implemented in the URL and doing it
> in the POST body would only complicate the code further.

Not by a huge amount, surely?

if (method == "GET") command = ...
else if (method == "POST") command = ...
dispatch(command);

Rogan