Document the HTTP transport protocols

Signed-off-by: Shawn O. Pearce <spearce@spearce.org> Revised-by: Tay Ray Chuan <rctay89@gmail.com> Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Shawn O. Pearce committed Aug 21, 2013 at 20:45 UTC 4c6fffe2ae3642fa4576c704e2eb443de1d0f8a1
1 file changed +503
Documentation/technical/http-protocol.txt new
+503
@@ -0,0 +1,503 @@
1 +HTTP transfer protocols
2 +=======================
3 +
4 +Git supports two HTTP based transfer protocols. A "dumb" protocol
5 +which requires only a standard HTTP server on the server end of the
6 +connection, and a "smart" protocol which requires a Git aware CGI
7 +(or server module). This document describes both protocols.
8 +
9 +As a design feature smart clients can automatically upgrade "dumb"
10 +protocol URLs to smart URLs. This permits all users to have the
11 +same published URL, and the peers automatically select the most
12 +efficient transport available to them.
13 +
14 +
15 +URL Format
16 +----------
17 +
18 +URLs for Git repositories accessed by HTTP use the standard HTTP
19 +URL syntax documented by RFC 1738, so they are of the form:
20 +
21 + http://<host>:<port>/<path>?<searchpart>
22 +
23 +Within this documentation the placeholder $GIT_URL will stand for
24 +the http:// repository URL entered by the end-user.
25 +
26 +Servers SHOULD handle all requests to locations matching $GIT_URL, as
27 +both the "smart" and "dumb" HTTP protocols used by Git operate
28 +by appending additional path components onto the end of the user
29 +supplied $GIT_URL string.
30 +
31 +An example of a dumb client requesting for a loose object:
32 +
33 + $GIT_URL: http://example.com:8080/git/repo.git
34 + URL request: http://example.com:8080/git/repo.git/objects/d0/49f6c27a2244e12041955e262a404c7faba355
35 +
36 +An example of a smart request to a catch-all gateway:
37 +
38 + $GIT_URL: http://example.com/daemon.cgi?svc=git&q=
39 + URL request: http://example.com/daemon.cgi?svc=git&q=/info/refs&service=git-receive-pack
40 +
41 +An example of a request to a submodule:
42 +
43 + $GIT_URL: http://example.com/git/repo.git/path/submodule.git
44 + URL request: http://example.com/git/repo.git/path/submodule.git/info/refs
45 +
46 +Clients MUST strip a trailing '/', if present, from the user supplied
47 +$GIT_URL string to prevent empty path tokens ('//') from appearing
48 +in any URL sent to a server. Compatible clients MUST expand
49 +'$GIT_URL/info/refs' as 'foo/info/refs' and not 'foo//info/refs'.
50 +
51 +
52 +Authentication
53 +--------------
54 +
55 +Standard HTTP authentication is used if authentication is required
56 +to access a repository, and MAY be configured and enforced by the
57 +HTTP server software.
58 +
59 +Because Git repositories are accessed by standard path components
60 +server administrators MAY use directory based permissions within
61 +their HTTP server to control repository access.
62 +
63 +Clients SHOULD support Basic authentication as described by RFC 2616.
64 +Servers SHOULD support Basic authentication by relying upon the
65 +HTTP server placed in front of the Git server software.
66 +
67 +Servers SHOULD NOT require HTTP cookies for the purposes of
68 +authentication or access control.
69 +
70 +Clients and servers MAY support other common forms of HTTP based
71 +authentication, such as Digest authentication.
72 +
73 +
74 +SSL
75 +---
76 +
77 +Clients and servers SHOULD support SSL, particularly to protect
78 +passwords when relying on Basic HTTP authentication.
79 +
80 +
81 +Session State
82 +-------------
83 +
84 +The Git over HTTP protocol (much like HTTP itself) is stateless
85 +from the perspective of the HTTP server side. All state MUST be
86 +retained and managed by the client process. This permits simple
87 +round-robin load-balancing on the server side, without needing to
88 +worry about state management.
89 +
90 +Clients MUST NOT require state management on the server side in
91 +order to function correctly.
92 +
93 +Servers MUST NOT require HTTP cookies in order to function correctly.
94 +Clients MAY store and forward HTTP cookies during request processing
95 +as described by RFC 2616 (HTTP/1.1). Servers SHOULD ignore any
96 +cookies sent by a client.
97 +
98 +
99 +General Request Processing
100 +--------------------------
101 +
102 +Except where noted, all standard HTTP behavior SHOULD be assumed
103 +by both client and server. This includes (but is not necessarily
104 +limited to):
105 +
106 +If there is no repository at $GIT_URL, or the resource pointed to by a
107 +location matching $GIT_URL does not exist, the server MUST NOT respond
108 +with '200 OK' response. A server SHOULD respond with
109 +'404 Not Found', '410 Gone', or any other suitable HTTP status code
110 +which does not imply the resource exists as requested.
111 +
112 +If there is a repository at $GIT_URL, but access is not currently
113 +permitted, the server MUST respond with the '403 Forbidden' HTTP
114 +status code.
115 +
116 +Servers SHOULD support both HTTP 1.0 and HTTP 1.1.
117 +Servers SHOULD support chunked encoding for both request and response
118 +bodies.
119 +
120 +Clients SHOULD support both HTTP 1.0 and HTTP 1.1.
121 +Clients SHOULD support chunked encoding for both request and response
122 +bodies.
123 +
124 +Servers MAY return ETag and/or Last-Modified headers.
125 +
126 +Clients MAY revalidate cached entities by including If-Modified-Since
127 +and/or If-None-Match request headers.
128 +
129 +Servers MAY return '304 Not Modified' if the relevant headers appear
130 +in the request and the entity has not changed. Clients MUST treat
131 +'304 Not Modified' identical to '200 OK' by reusing the cached entity.
132 +
133 +Clients MAY reuse a cached entity without revalidation if the
134 +Cache-Control and/or Expires header permits caching. Clients and
135 +servers MUST follow RFC 2616 for cache controls.
136 +
137 +
138 +Discovering References
139 +----------------------
140 +
141 +All HTTP clients MUST begin either a fetch or a push exchange by
142 +discovering the references available on the remote repository.
143 +
144 +Dumb Clients
145 +~~~~~~~~~~~~
146 +
147 +HTTP clients that only support the "dumb" protocol MUST discover
148 +references by making a request for the special info/refs file of
149 +the repository.
150 +
151 +Dumb HTTP clients MUST make a GET request to $GIT_URL/info/refs,
152 +without any search/query parameters.
153 +
154 + C: GET $GIT_URL/info/refs HTTP/1.0
155 +
156 + S: 200 OK
157 + S:
158 + S: 95dcfa3633004da0049d3d0fa03f80589cbcaf31 refs/heads/maint
159 + S: d049f6c27a2244e12041955e262a404c7faba355 refs/heads/master
160 + S: 2cb58b79488a98d2721cea644875a8dd0026b115 refs/tags/v1.0
161 + S: a3c2e2402b99163d1d59756e5f207ae21cccba4c refs/tags/v1.0^{}
162 +
163 +The Content-Type of the returned info/refs entity SHOULD be
164 +"text/plain; charset=utf-8", but MAY be any content type.
165 +Clients MUST NOT attempt to validate the returned Content-Type.
166 +Dumb servers MUST NOT return a return type starting with
167 +"application/x-git-".
168 +
169 +Cache-Control headers MAY be returned to disable caching of the
170 +returned entity.
171 +
172 +When examining the response clients SHOULD only examine the HTTP
173 +status code. Valid responses are '200 OK', or '304 Not Modified'.
174 +
175 +The returned content is a UNIX formatted text file describing
176 +each ref and its known value. The file SHOULD be sorted by name
177 +according to the C locale ordering. The file SHOULD NOT include
178 +the default ref named 'HEAD'.
179 +
180 + info_refs = *( ref_record )
181 + ref_record = any_ref / peeled_ref
182 +
183 + any_ref = obj-id HTAB refname LF
184 + peeled_ref = obj-id HTAB refname LF
185 + obj-id HTAB refname "^{}" LF
186 +
187 +Smart Clients
188 +~~~~~~~~~~~~~
189 +
190 +HTTP clients that support the "smart" protocol (or both the
191 +"smart" and "dumb" protocols) MUST discover references by making
192 +a parameterized request for the info/refs file of the repository.
193 +
194 +The request MUST contain exactly one query parameter,
195 +'service=$servicename', where $servicename MUST be the service
196 +name the client wishes to contact to complete the operation.
197 +The request MUST NOT contain additional query parameters.
198 +
199 + C: GET $GIT_URL/info/refs?service=git-upload-pack HTTP/1.0
200 +
201 + dumb server reply:
202 + S: 200 OK
203 + S:
204 + S: 95dcfa3633004da0049d3d0fa03f80589cbcaf31 refs/heads/maint
205 + S: d049f6c27a2244e12041955e262a404c7faba355 refs/heads/master
206 + S: 2cb58b79488a98d2721cea644875a8dd0026b115 refs/tags/v1.0
207 + S: a3c2e2402b99163d1d59756e5f207ae21cccba4c refs/tags/v1.0^{}
208 +
209 + smart server reply:
210 + S: 200 OK
211 + S: Content-Type: application/x-git-upload-pack-advertisement
212 + S: Cache-Control: no-cache
213 + S:
214 + S: 001e# service=git-upload-pack\n
215 + S: 004895dcfa3633004da0049d3d0fa03f80589cbcaf31 refs/heads/maint\0multi_ack\n
216 + S: 0042d049f6c27a2244e12041955e262a404c7faba355 refs/heads/master\n
217 + S: 003c2cb58b79488a98d2721cea644875a8dd0026b115 refs/tags/v1.0\n
218 + S: 003fa3c2e2402b99163d1d59756e5f207ae21cccba4c refs/tags/v1.0^{}\n
219 +
220 +Dumb Server Response
221 +^^^^^^^^^^^^^^^^^^^^
222 +Dumb servers MUST respond with the dumb server reply format.
223 +
224 +See the prior section under dumb clients for a more detailed
225 +description of the dumb server response.
226 +
227 +Smart Server Response
228 +^^^^^^^^^^^^^^^^^^^^^
229 +If the server does not recognize the requested service name, or the
230 +requested service name has been disabled by the server administrator,
231 +the server MUST respond with the '403 Forbidden' HTTP status code.
232 +
233 +Otherwise, smart servers MUST respond with the smart server reply
234 +format for the requested service name.
235 +
236 +Cache-Control headers SHOULD be used to disable caching of the
237 +returned entity.
238 +
239 +The Content-Type MUST be 'application/x-$servicename-advertisement'.
240 +Clients SHOULD fall back to the dumb protocol if another content
241 +type is returned. When falling back to the dumb protocol clients
242 +SHOULD NOT make an additional request to $GIT_URL/info/refs, but
243 +instead SHOULD use the response already in hand. Clients MUST NOT
244 +continue if they do not support the dumb protocol.
245 +
246 +Clients MUST validate the status code is either '200 OK' or
247 +'304 Not Modified'.
248 +
249 +Clients MUST validate the first five bytes of the response entity
250 +matches the regex "^[0-9a-f]{4}#". If this test fails, clients
251 +MUST NOT continue.
252 +
253 +Clients MUST parse the entire response as a sequence of pkt-line
254 +records.
255 +
256 +Clients MUST verify the first pkt-line is "# service=$servicename".
257 +Servers MUST set $servicename to be the request parameter value.
258 +Servers SHOULD include an LF at the end of this line.
259 +Clients MUST ignore an LF at the end of the line.
260 +
261 +Servers MUST terminate the response with the magic "0000" end
262 +pkt-line marker.
263 +
264 +The returned response is a pkt-line stream describing each ref and
265 +its known value. The stream SHOULD be sorted by name according to
266 +the C locale ordering. The stream SHOULD include the default ref
267 +named 'HEAD' as the first ref. The stream MUST include capability
268 +declarations behind a NUL on the first ref.
269 +
270 + smart_reply = PKT-LINE("# service=$servicename" LF)
271 + ref_list
272 + "0000"
273 + ref_list = empty_list / non_empty_list
274 +
275 + empty_list = PKT-LINE(zero-id SP "capabilities^{}" NUL cap-list LF)
276 +
277 + non_empty_list = PKT-LINE(obj-id SP name NUL cap_list LF)
278 + *ref_record
279 +
280 + cap-list = capability *(SP capability)
281 + capability = 1*(LC_ALPHA / DIGIT / "-" / "_")
282 + LC_ALPHA = %x61-7A
283 +
284 + ref_record = any_ref / peeled_ref
285 + any_ref = PKT-LINE(obj-id SP name LF)
286 + peeled_ref = PKT-LINE(obj-id SP name LF)
287 + PKT-LINE(obj-id SP name "^{}" LF
288 +
289 +Smart Service git-upload-pack
290 +------------------------------
291 +This service reads from the repository pointed to by $GIT_URL.
292 +
293 +Clients MUST first perform ref discovery with
294 +'$GIT_URL/info/refs?service=git-upload-pack'.
295 +
296 + C: POST $GIT_URL/git-upload-pack HTTP/1.0
297 + C: Content-Type: application/x-git-upload-pack-request
298 + C:
299 + C: 0032want 0a53e9ddeaddad63ad106860237bbf53411d11a7\n
300 + C: 0032have 441b40d833fdfa93eb2908e52742248faf0ee993\n
301 + C: 0000
302 +
303 + S: 200 OK
304 + S: Content-Type: application/x-git-upload-pack-result
305 + S: Cache-Control: no-cache
306 + S:
307 + S: ....ACK %s, continue
308 + S: ....NAK
309 +
310 +Clients MUST NOT reuse or revalidate a cached reponse.
311 +Servers MUST include sufficient Cache-Control headers
312 +to prevent caching of the response.
313 +
314 +Servers SHOULD support all capabilities defined here.
315 +
316 +Clients MUST send at least one 'want' command in the request body.
317 +Clients MUST NOT reference an id in a 'want' command which did not
318 +appear in the response obtained through ref discovery unless the
319 +server advertises capability "allow-tip-sha1-in-want".
320 +
321 + compute_request = want_list
322 + have_list
323 + request_end
324 + request_end = "0000" / "done"
325 +
326 + want_list = PKT-LINE(want NUL cap_list LF)
327 + *(want_pkt)
328 + want_pkt = PKT-LINE(want LF)
329 + want = "want" SP id
330 + cap_list = *(SP capability) SP
331 +
332 + have_list = *PKT-LINE("have" SP id LF)
333 +
334 +TODO: Document this further.
335 +TODO: Don't use uppercase for variable names below.
336 +
337 +The Negotiation Algorithm
338 +~~~~~~~~~~~~~~~~~~~~~~~~~
339 +The computation to select the minimal pack proceeds as follows
340 +(c = client, s = server):
341 +
342 + init step:
343 + (c) Use ref discovery to obtain the advertised refs.
344 + (c) Place any object seen into set ADVERTISED.
345 +
346 + (c) Build an empty set, COMMON, to hold the objects that are later
347 + determined to be on both ends.
348 + (c) Build a set, WANT, of the objects from ADVERTISED the client
349 + wants to fetch, based on what it saw during ref discovery.
350 +
351 + (c) Start a queue, C_PENDING, ordered by commit time (popping newest
352 + first). Add all client refs. When a commit is popped from
353 + the queue its parents SHOULD be automatically inserted back.
354 + Commits MUST only enter the queue once.
355 +
356 + one compute step:
357 + (c) Send one $GIT_URL/git-upload-pack request:
358 +
359 + C: 0032want <WANT #1>...............................
360 + C: 0032want <WANT #2>...............................
361 + ....
362 + C: 0032have <COMMON #1>.............................
363 + C: 0032have <COMMON #2>.............................
364 + ....
365 + C: 0032have <HAVE #1>...............................
366 + C: 0032have <HAVE #2>...............................
367 + ....
368 + C: 0000
369 +
370 + The stream is organized into "commands", with each command
371 + appearing by itself in a pkt-line. Within a command line
372 + the text leading up to the first space is the command name,
373 + and the remainder of the line to the first LF is the value.
374 + Command lines are terminated with an LF as the last byte of
375 + the pkt-line value.
376 +
377 + Commands MUST appear in the following order, if they appear
378 + at all in the request stream:
379 +
380 + * want
381 + * have
382 +
383 + The stream is terminated by a pkt-line flush ("0000").
384 +
385 + A single "want" or "have" command MUST have one hex formatted
386 + SHA-1 as its value. Multiple SHA-1s MUST be sent by sending
387 + multiple commands.
388 +
389 + The HAVE list is created by popping the first 32 commits
390 + from C_PENDING. Less can be supplied if C_PENDING empties.
391 +
392 + If the client has sent 256 HAVE commits and has not yet
393 + received one of those back from S_COMMON, or the client has
394 + emptied C_PENDING it SHOULD include a "done" command to let
395 + the server know it won't proceed:
396 +
397 + C: 0009done
398 +
399 + (s) Parse the git-upload-pack request:
400 +
401 + Verify all objects in WANT are directly reachable from refs.
402 +
403 + The server MAY walk backwards through history or through
404 + the reflog to permit slightly stale requests.
405 +
406 + If no WANT objects are received, send an error:
407 +
408 +TODO: Define error if no want lines are requested.
409 +
410 + If any WANT object is not reachable, send an error:
411 +
412 +TODO: Define error if an invalid want is requested.
413 +
414 + Create an empty list, S_COMMON.
415 +
416 + If 'have' was sent:
417 +
418 + Loop through the objects in the order supplied by the client.
419 + For each object, if the server has the object reachable from
420 + a ref, add it to S_COMMON. If a commit is added to S_COMMON,
421 + do not add any ancestors, even if they also appear in HAVE.
422 +
423 + (s) Send the git-upload-pack response:
424 +
425 + If the server has found a closed set of objects to pack or the
426 + request ends with "done", it replies with the pack.
427 +
428 +TODO: Document the pack based response
429 + S: PACK...
430 +
431 + The returned stream is the side-band-64k protocol supported
432 + by the git-upload-pack service, and the pack is embedded into
433 + stream 1. Progress messages from the server side MAY appear
434 + in stream 2.
435 +
436 + Here a "closed set of objects" is defined to have at least
437 + one path from every WANT to at least one COMMON object.
438 +
439 + If the server needs more information, it replies with a
440 + status continue response:
441 +
442 +TODO: Document the non-pack response
443 +
444 + (c) Parse the upload-pack response:
445 +
446 +TODO: Document parsing response
447 +
448 + Do another compute step.
449 +
450 +
451 +Smart Service git-receive-pack
452 +------------------------------
453 +This service reads from the repository pointed to by $GIT_URL.
454 +
455 +Clients MUST first perform ref discovery with
456 +'$GIT_URL/info/refs?service=git-receive-pack'.
457 +
458 + C: POST $GIT_URL/git-receive-pack HTTP/1.0
459 + C: Content-Type: application/x-git-receive-pack-request
460 + C:
461 + C: ....0a53e9ddeaddad63ad106860237bbf53411d11a7 441b40d833fdfa93eb2908e52742248faf0ee993 refs/heads/maint\0 report-status
462 + C: 0000
463 + C: PACK....
464 +
465 + S: 200 OK
466 + S: Content-Type: application/x-git-receive-pack-result
467 + S: Cache-Control: no-cache
468 + S:
469 + S: ....
470 +
471 +Clients MUST NOT reuse or revalidate a cached reponse.
472 +Servers MUST include sufficient Cache-Control headers
473 +to prevent caching of the response.
474 +
475 +Servers SHOULD support all capabilities defined here.
476 +
477 +Clients MUST send at least one command in the request body.
478 +Within the command portion of the request body clients SHOULD send
479 +the id obtained through ref discovery as old_id.
480 +
481 + update_request = command_list
482 + "PACK" <binary data>
483 +
484 + command_list = PKT-LINE(command NUL cap_list LF)
485 + *(command_pkt)
486 + command_pkt = PKT-LINE(command LF)
487 + cap_list = *(SP capability) SP
488 +
489 + command = create / delete / update
490 + create = zero-id SP new_id SP name
491 + delete = old_id SP zero-id SP name
492 + update = old_id SP new_id SP name
493 +
494 +TODO: Document this further.
495 +
496 +
497 +References
498 +----------
499 +
500 +link:http://www.ietf.org/rfc/rfc1738.txt[RFC 1738: Uniform Resource Locators (URL)]
501 +link:http://www.ietf.org/rfc/rfc2616.txt[RFC 2616: Hypertext Transfer Protocol -- HTTP/1.1]
502 +link:technical/pack-protocol.txt
503 +link:technical/protocol-capabilities.txt