Show More
@@ -115,6 +115,22 b' args' | |||||
115 | Each command defines its own set of argument names and their expected |
|
115 | Each command defines its own set of argument names and their expected | |
116 | types. |
|
116 | types. | |
117 |
|
117 | |||
|
118 | redirect (optional) | |||
|
119 | (map) Advertises client support for following response *redirects*. | |||
|
120 | ||||
|
121 | This map has the following bytestring keys: | |||
|
122 | ||||
|
123 | targets | |||
|
124 | (array of bytestring) List of named redirect targets supported by | |||
|
125 | this client. The names come from the targets advertised by the | |||
|
126 | server's *capabilities* message. | |||
|
127 | ||||
|
128 | hashes | |||
|
129 | (array of bytestring) List of preferred hashing algorithms that can | |||
|
130 | be used for content integrity verification. | |||
|
131 | ||||
|
132 | See the *Content Redirects* section below for more on content redirects. | |||
|
133 | ||||
118 | This frame type MUST ONLY be sent from clients to servers: it is illegal |
|
134 | This frame type MUST ONLY be sent from clients to servers: it is illegal | |
119 | for a server to send this frame to a client. |
|
135 | for a server to send this frame to a client. | |
120 |
|
136 | |||
@@ -506,6 +522,9 b' status' | |||||
506 | error |
|
522 | error | |
507 | There was an error processing the command. More details about the |
|
523 | There was an error processing the command. More details about the | |
508 | error are encoded in the ``error`` key. |
|
524 | error are encoded in the ``error`` key. | |
|
525 | redirect | |||
|
526 | The response for this command is available elsewhere. Details on | |||
|
527 | where are in the ``location`` key. | |||
509 |
|
528 | |||
510 | error (optional) |
|
529 | error (optional) | |
511 | A map containing information about an encountered error. The map has the |
|
530 | A map containing information about an encountered error. The map has the | |
@@ -515,5 +534,116 b' error (optional)' | |||||
515 | (array of maps) A message describing the error. The message uses the |
|
534 | (array of maps) A message describing the error. The message uses the | |
516 | same format as those in the ``Human Output Side-Channel`` frame. |
|
535 | same format as those in the ``Human Output Side-Channel`` frame. | |
517 |
|
536 | |||
|
537 | location (optional) | |||
|
538 | (map) Presence indicates that a *content redirect* has occurred. The map | |||
|
539 | provides the external location of the content. | |||
|
540 | ||||
|
541 | This map contains the following bytestring keys: | |||
|
542 | ||||
|
543 | url | |||
|
544 | (bytestring) URL from which this content may be requested. | |||
|
545 | ||||
|
546 | mediatype | |||
|
547 | (bytestring) The media type for the fetched content. e.g. | |||
|
548 | ``application/mercurial-*``. | |||
|
549 | ||||
|
550 | In some transports, this value is also advertised by the transport. | |||
|
551 | e.g. as the ``Content-Type`` HTTP header. | |||
|
552 | ||||
|
553 | size (optional) | |||
|
554 | (unsigned integer) Total size of remote object in bytes. This is | |||
|
555 | the raw size of the entity that will be fetched, minus any | |||
|
556 | non-Mercurial protocol encoding (e.g. HTTP content or transfer | |||
|
557 | encoding.) | |||
|
558 | ||||
|
559 | fullhashes (optional) | |||
|
560 | (array of arrays) Content hashes for the entire payload. Each entry | |||
|
561 | is an array of bytestrings containing the hash name and the hash value. | |||
|
562 | ||||
|
563 | fullhashseed (optional) | |||
|
564 | (bytestring) Optional seed value to feed into hasher for full content | |||
|
565 | hash verification. | |||
|
566 | ||||
|
567 | serverdercerts (optional) | |||
|
568 | (array of bytestring) DER encoded x509 certificates for the server. When | |||
|
569 | defined, clients MAY validate that the x509 certificate on the target | |||
|
570 | server exactly matches the certificate used here. | |||
|
571 | ||||
|
572 | servercadercerts (optional) | |||
|
573 | (array of bytestring) DER encoded x509 certificates for the certificate | |||
|
574 | authority of the target server. When defined, clients MAY validate that | |||
|
575 | the x509 on the target server was signed by CA certificate in this set. | |||
|
576 | ||||
|
577 | # TODO support for giving client an x509 certificate pair to be used as a | |||
|
578 | # client certificate. | |||
|
579 | ||||
|
580 | # TODO support common authentication mechanisms (e.g. HTTP basic/digest | |||
|
581 | # auth). | |||
|
582 | ||||
|
583 | # TODO support custom authentication mechanisms. This likely requires | |||
|
584 | # server to advertise required auth mechanism so client can filter. | |||
|
585 | ||||
|
586 | # TODO support chained hashes. e.g. hash for each 1MB segment so client | |||
|
587 | # can iteratively validate data without having to consume all of it first. | |||
|
588 | ||||
518 | TODO formalize when error frames can be seen and how errors can be |
|
589 | TODO formalize when error frames can be seen and how errors can be | |
519 | recognized midway through a command response. |
|
590 | recognized midway through a command response. | |
|
591 | ||||
|
592 | Content Redirects | |||
|
593 | ================= | |||
|
594 | ||||
|
595 | Servers have the ability to respond to ANY command request with a | |||
|
596 | *redirect* to another location. Such a response is referred to as a *redirect | |||
|
597 | response*. (This feature is conceptually similar to HTTP redirects, but is | |||
|
598 | more powerful.) | |||
|
599 | ||||
|
600 | A *redirect response* MUST ONLY be issued if the client advertises support | |||
|
601 | for a redirect *target*. | |||
|
602 | ||||
|
603 | A *redirect response* MUST NOT be issued unless the client advertises support | |||
|
604 | for one. | |||
|
605 | ||||
|
606 | Clients advertise support for *redirect responses* after looking at the server's | |||
|
607 | *capabilities* data, which is fetched during initial server connection | |||
|
608 | handshake. The server's capabilities data advertises named *targets* for | |||
|
609 | potential redirects. | |||
|
610 | ||||
|
611 | Each target is described by a protocol name, connection and protocol features, | |||
|
612 | etc. The server also advertises target-agnostic redirect settings, such as | |||
|
613 | which hash algorithms are supported for content integrity checking. (See | |||
|
614 | the documentation for the *capabilities* command for more.) | |||
|
615 | ||||
|
616 | Clients examine the set of advertised redirect targets for compatibility. | |||
|
617 | When sending a command request, the client advertises the set of redirect | |||
|
618 | target names it is willing to follow, along with some other settings influencing | |||
|
619 | behavior. | |||
|
620 | ||||
|
621 | For example, say the server is advertising a ``cdn`` redirect target that | |||
|
622 | requires SNI and TLS 1.2. If the client supports those features, it will | |||
|
623 | send command requests stating that the ``cdn`` target is acceptable to use. | |||
|
624 | But if the client doesn't support SNI or TLS 1.2 (or maybe it encountered an | |||
|
625 | error using this target from a previous request), then it omits this target | |||
|
626 | name. | |||
|
627 | ||||
|
628 | If the client advertises support for a redirect target, the server MAY | |||
|
629 | substitute the normal, inline response data for a *redirect response* - | |||
|
630 | one where the initial CBOR map has a ``status`` key with value ``redirect``. | |||
|
631 | ||||
|
632 | The *redirect response* at a minimum advertises the URL where the response | |||
|
633 | can be retrieved. | |||
|
634 | ||||
|
635 | The *redirect response* MAY also advertise additional details about that | |||
|
636 | content and how to retrieve it. Notably, the response may contain the | |||
|
637 | x509 public certificates for the server being redirected to or the | |||
|
638 | certificate authority that signed that server's certificate. Unless the | |||
|
639 | client has existing settings that offer stronger trust validation than what | |||
|
640 | the server advertises, the client SHOULD use the server-provided certificates | |||
|
641 | when validating the connection to the remote server in place of any default | |||
|
642 | connection verification checks. This is because certificates coming from | |||
|
643 | the server SHOULD establish a stronger chain of trust than what the default | |||
|
644 | certification validation mechanism in most environments provides. (By default, | |||
|
645 | certificate validation ensures the signer of the cert chains up to a set of | |||
|
646 | trusted root certificates. And if an explicit certificate or CA certificate | |||
|
647 | is presented, that greadly reduces the set of certificates that will be | |||
|
648 | recognized as valid, thus reducing the potential for a "bad" certificate | |||
|
649 | to be used and trusted.) |
@@ -111,6 +111,38 b' rawrepoformats' | |||||
111 | requirements can be used to determine whether a client can read a |
|
111 | requirements can be used to determine whether a client can read a | |
112 | *raw* copy of file data available. |
|
112 | *raw* copy of file data available. | |
113 |
|
113 | |||
|
114 | redirect | |||
|
115 | A map declaring potential *content redirects* that may be used by this | |||
|
116 | server. Contains the following bytestring keys: | |||
|
117 | ||||
|
118 | targets | |||
|
119 | (array of maps) Potential redirect targets. Values are maps describing | |||
|
120 | this target in more detail. Each map has the following bytestring keys: | |||
|
121 | ||||
|
122 | name | |||
|
123 | (bytestring) Identifier for this target. The identifier will be used | |||
|
124 | by clients to uniquely identify this target. | |||
|
125 | ||||
|
126 | protocol | |||
|
127 | (bytestring) High-level network protocol. Values can be | |||
|
128 | ``http``, ```https``, ``ssh``, etc. | |||
|
129 | ||||
|
130 | uris | |||
|
131 | (array of bytestrings) Representative URIs for this target. | |||
|
132 | ||||
|
133 | snirequired (optional) | |||
|
134 | (boolean) Indicates whether Server Name Indication is required | |||
|
135 | to use this target. Defaults to False. | |||
|
136 | ||||
|
137 | tlsversions (optional) | |||
|
138 | (array of bytestring) Indicates which TLS versions are supported by | |||
|
139 | this target. Values are ``1.1``, ``1.2``, ``1.3``, etc. | |||
|
140 | ||||
|
141 | hashes | |||
|
142 | (array of bytestring) Indicates support for hashing algorithms that are | |||
|
143 | used to ensure content integrity. Values include ``sha1``, ``sha256``, | |||
|
144 | etc. | |||
|
145 | ||||
114 | changesetdata |
|
146 | changesetdata | |
115 | ------------- |
|
147 | ------------- | |
116 |
|
148 |
General Comments 0
You need to be logged in to leave comments.
Login now