Subject: Re: Git-aware HTTP transport

From: "Shawn O. Pearce" <[email-masked]>
Date: Tue, 26 Aug 2008 09:14:25 -0700

"Shawn O. Pearce" <[email-masked]> wrote:
> "H. Peter Anvin" <[email-masked]> wrote:
> >
> > I actually suggest embedding the forwarding URL into an ordinary  
> > payload.  Instead of a HEAD request here, then do a GET (or, even  
> > better, POST) and get the redirected URL in return.
> 
> Hmm.  I'm actually thinking the exact opposite here.

Here's the delta from the last draft I emailed.  Its basically just
about this redirect stuff.

diff --git a/Documentation/technical/http-protocol.txt b/Documentation/technical/http-protocol.txt
index 99d7623..a3f7379 100644
--- a/Documentation/technical/http-protocol.txt
+++ b/Documentation/technical/http-protocol.txt
@@ -43,14 +43,40 @@ All requests/responses use "application/x-git" as the content type.
 Action specific subtypes are specified by the parameter "service",
 e.g. "application/x-git; service=upload-pack".
 
+Redirects
+---------
+
+If a POST request results in an HTTP 302 or 303 redirect response
+clients should retry the request by updating the URL and POSTing
+the request to the new location.
+
+If the new request is successful clients should trim off the
+trailing "/backend.git/$service" portion of the new loaction
+and use the remainder as the base URL for future requests in
+the same transaction.
+
+This redirection permits Apache's mod_rewrite (and many other
+servers) to implement a form of round-robin load balancing by
+redirecting all requests to a generic host to a specific host.
+
 Detecting Smart Servers
 -----------------------
 
 HTTP clients can detect a smart Git-aware server by sending
 a request to service "show-ref".
 
-A Git-aware server will respond with a valid response (see below).
-A dumb server should respond with an error message. 
+A Git-aware server will respond with a valid response.  Clients
+must check the following properties to prevent being fooled by
+misconfigured servers:
+
+  * HTTP status code is 200.
+  * Content-Type is "application/x-git; service=show-ref"
+  * The body can be parsed without errors.  The length of
+    each pkt-line must be 4 valid hex digits.
+
+A dumb server will respond with a non-200 HTTP status code.
+A misconfigured server may respond with a normal 200 status
+code, but an incorrect content type.
 
 Service show-ref
 ----------------

-- 
Shawn.