<?xml version="1.0" encoding="US-ASCII"?>
<!DOCTYPE rfc SYSTEM "rfc2629.dtd">
<?rfc toc="yes"?>
<?rfc tocompact="yes"?>
<?rfc tocdepth="4"?>
<?rfc tocindent="yes"?>
<?rfc symrefs="yes"?>
<?rfc sortrefs="yes"?>
<?rfc comments="yes"?>
<?rfc inline="yes"?>
<?rfc compact="yes"?>
<rfc category="std" docName="draft-ietf-cdni-metadata-19" ipr="trust200902">
  <front>
    <title abbrev="CDN Interconnection Metadata">CDN Interconnection
    Metadata</title>

    <author fullname="Ben Niven-Jenkins" initials="B" surname="Niven-Jenkins">
      <organization>Velocix (Alcatel-Lucent)</organization>

      <address>
        <postal>
          <street>3 Ely Road</street>

          <city>Milton</city>

          <region>Cambridge</region>

          <code>CB24 6AA</code>

          <country>UK</country>
        </postal>

        <email>ben@velocix.com</email>
      </address>
    </author>

    <author fullname="Rob Murray" initials="R" surname="Murray">
      <organization>Velocix (Alcatel-Lucent)</organization>

      <address>
        <postal>
          <street>3 Ely Road</street>

          <city>Milton</city>

          <region>Cambridge</region>

          <code>CB24 6AA</code>

          <country>UK</country>
        </postal>

        <email>rmurray@velocix.com</email>
      </address>
    </author>

    <author fullname="Matt Caulfield" initials="M" surname="Caulfield">
      <organization>Cisco Systems</organization>

      <address>
        <postal>
          <street>1414 Massachusetts Avenue</street>

          <city>Boxborough</city>

          <region>MA</region>

          <code>01719</code>

          <country>USA</country>
        </postal>

        <phone>+1 978 936 9307</phone>

        <email>mcaulfie@cisco.com</email>
      </address>
    </author>

    <author fullname="Kevin J. Ma" initials="K.J." surname="Ma">
      <organization>Ericsson</organization>

      <address>
        <postal>
          <street>43 Nagog Park</street>

          <city>Acton</city>

          <region>MA</region>

          <code>01720</code>

          <country>USA</country>
        </postal>

        <phone>+1 978-844-5100</phone>

        <email>kevin.j.ma@ericsson.com</email>
      </address>
    </author>

    <date/>

    <abstract>
      <t>The Content Delivery Networks Interconnection (CDNI) metadata
      interface enables interconnected Content Delivery Networks (CDNs) to
      exchange content distribution metadata in order to enable content
      acquisition and delivery. The CDNI metadata associated with a piece of
      content provides a downstream CDN with sufficient information for the
      downstream CDN to service content requests on behalf of an upstream CDN.
      This document describes both a base set of CDNI metadata and the
      protocol for exchanging that metadata.</t>
    </abstract>

    <note title="Requirements Language">
      <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
      "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
      document are to be interpreted as described in <xref
      target="RFC2119">RFC 2119</xref>.</t>
    </note>
  </front>

  <middle>
    <section title="Introduction">
      <t>Content Delivery Networks Interconnection (CDNI) <xref
      target="RFC6707"/> enables a downstream Content Delivery Network (dCDN)
      to service content requests on behalf of an upstream CDN (uCDN).</t>

      <t>The CDNI metadata interface is discussed in <xref target="RFC7336"/>
      along with four other interfaces that can be used to compose a CDNI
      solution (CDNI Control interface, CDNI Request Routing Redirection
      interface, CDNI Footprint &amp; Capabilities Advertisement interface and
      CDNI Logging interface). <xref target="RFC7336"/> describes each
      interface and the relationships between them. The requirements for the
      CDNI metadata interface are specified in <xref target="RFC7337"/>.</t>

      <t>The CDNI metadata associated with a piece of content (or with a set
      of content) provides a dCDN with sufficient information for servicing
      content requests on behalf of an uCDN, in accordance with the policies
      defined by the uCDN.</t>

      <t>This document defines the CDNI metadata interface which enables a
      dCDN to obtain CDNI metadata from an uCDN so that the dCDN can properly
      process and respond to:</t>

      <t><list style="symbols">
          <t>Redirection requests received over the CDNI Request Routing
          Redirection interface <xref
          target="I-D.ietf-cdni-redirection"/>.</t>

          <t>Content requests received directly from User Agents.</t>
        </list></t>

      <t>Specifically, this document specifies:</t>

      <t><list style="symbols">
          <t>A data structure for mapping content requests and redirection
          requests to CDNI metadata objects (<xref target="data-model"/> and
          <xref target="structural-objects"/>).</t>

          <t>An initial set of CDNI Generic metadata objects (<xref
          target="property-objects"/>).</t>

          <t>A HTTP web service for the transfer of CDNI metadata (<xref
          target="metadata-interface"/>).</t>
        </list></t>

      <section anchor="terminology" title="Terminology">
        <t>This document reuses the terminology defined in <xref
        target="RFC6707"/>.</t>

        <t>Additionally, the following terms are used throughout this document
        and are defined as follows:<list style="symbols">
            <t>Object - a collection of properties.</t>

            <t>Property - a key and value pair where the key is a property
            name and the value is the property value or another object.</t>
          </list>This document uses the phrase "[Object] A contains [Object]
        B" for simplicity when a strictly accurate phrase would be "[Object] A
        contains or references (via a Link object) [Object] B".</t>
      </section>

      <section title="Supported Metadata Capabilities">
        <t>Only the metadata for a small set of initial capabilities is
        specified in this document. This set provides the minimum amount of
        metadata for basic CDN interoperability while still meeting the
        requirements set forth by <xref target="RFC7337"/>.</t>

        <t>The following high-level functionality can be configured via the
        CDNI metadata objects specified in <xref
        target="abstract-metadata-description"/>:</t>

        <t><list style="symbols">
            <t>Acquisition Source: Metadata for allowing a dCDN to fetch
            content from a uCDN.</t>

            <t>Delivery Access Control: Metadata for restricting (or
            permitting) access to content based on any of the following
            factors:<list style="symbols">
                <t>Location</t>

                <t>Time Window</t>

                <t>Delivery Protocol</t>
              </list></t>
          </list><list style="symbols">
            <t>Delivery Authorization: Metadata for authorizing dCDN user
            agent requests.</t>

            <t>Cache Control: Metadata for controlling cache behavior of the
            dCDN.</t>
          </list></t>

        <t>The metadata encoding described by this document is extensible in
        order to allow for future additions to this list.</t>

        <t>The set of metadata specified in this document covers the
        initial capabilities above.  It is only intended to support CDN
        interconnection for the delivery of content by a dCDN using HTTP/1.1
        <xref target="RFC7230"/> and for a dCDN to be able to acquire content
        from a uCDN using either HTTP/1.1 or HTTP/1.1 over TLS <xref
        target="RFC2818"/>.</t>

        <t>Supporting CDN interconnection for the delivery of content using
        unencrypted HTTP/2 <xref target="RFC7540"/> (as well as for a dCDN
        to acquire content using unencrypted HTTP/2 or HTTP/2 over TLS)
        requires the registration of these protocol names in the CDNI Metadata
        Protocol Types registry <xref target="ProtocolReg"/>.</t>

        <t>Delivery of content using HTTP/1.1 over TLS or HTTP/2 over
        TLS SHOULD follow the guidelines set forth in <xref target="RFC7525"/>.
        Offline configuration of TLS parameters between CDNs is
        beyond the scope of this document.</t>
      </section>
    </section>

    <section title="Design Principles">
      <t>The CDNI metadata interface was designed to achieve the following
      objectives:</t>

      <t><list style="numbers">
          <t>Cacheability of CDNI metadata objects;</t>

          <t>Deterministic mapping from redirection requests and content
          requests to CDNI metadata properties;</t>

          <t>Support for DNS redirection as well as application-specific
          redirection (for example HTTP redirection);</t>

          <t>Minimal duplication of CDNI metadata; and</t>

          <t>Leveraging of existing protocols.</t>
        </list></t>

      <t>Cacheability can decrease the latency of acquiring metadata while
      maintaining its freshness, and therefore decrease the latency of serving
      content requests and redirection requests, without sacrificing accuracy.
      The CDNI metadata interface uses HTTP and its existing caching
      mechanisms to achieve CDNI metadata cacheability.</t>

      <t>Deterministic mappings from content to metadata properties eliminates
      ambiguity and ensures that policies are applied consistently by all
      dCDNs.</t>

      <t>Support for both HTTP and DNS redirection ensures that the CDNI
      metadata
      meets the same design principles for both HTTP and DNS based redirection
      schemes.</t>

      <t>Minimal duplication of CDNI metadata improves storage efficiency
      in the CDNs.</t>

      <t>Leveraging existing protocols avoids reinventing common mechanisms
      such as data structure encoding (by leveraging I-JSON <xref
      target="RFC7493"/>) and data transport (by leveraging HTTP <xref
      target="RFC7230"/>).</t>
    </section>

    <section anchor="data-model" title="CDNI Metadata object model">
      <t>The CDNI metadata object model describes a data structure for mapping
      redirection requests and content requests to metadata properties.
      Metadata properties describe how to acquire content from an uCDN,
      authorize access to content, and deliver content from a dCDN. The object
      model relies on the assumption that these metadata properties can be
      grouped based on the hostname of the content and subsequently on the
      resource path (URI) of the content. The object model associates a set of
      CDNI metadata properties with a Hostname to form a default set of
      metadata properties for content delivered on behalf of that Hostname.
      That default set of metadata properties can be overridden by properties
      that apply to specific paths within a URI.</t>

      <t>Different Hostnames and URI paths will be associated with different
      sets of CDNI metadata properties in order to describe the required
      behaviour when a dCDN surrogate or request router is processing User
      Agent requests for content at that Hostname and URI path. As a result of
      this structure, significant commonality could exist between the CDNI
      metadata properties specified for different Hostnames, different URI
      paths within a Hostname and different URI paths on different Hostnames.
      For example the definition of which User Agent IP addresses should be
      grouped together into a single network or geographic
      location is likely to be common for a number of different Hostnames;
      although a uCDN is likely to have several
      different policies configured to express geo-blocking rules, it is
      likely that a single geo-blocking policy could be applied to multiple
      Hostnames delivered through the CDN.</t>

      <t>In order to enable the CDNI metadata for a given Hostname and URI Path
      to be decomposed into reusable sets of CDNI metadata properties,
      the CDNI metadata interface
      splits the CDNI metadata into separate
      objects. Efficiency is improved by enabling a single CDNI metadata
      object (that is shared across Hostname and/or URI paths) to be retrieved
      and stored by a dCDN once, even if it is referenced by the CDNI metadata
      for multiple Hostnames and/or URI paths.</t>

      <t>Important Note: Any CDNI metadata object A that contains another CDNI
      metadata object B can 
      include a Link object specifying a URI that can be
      used to retrieve object B, 
      instead of embedding object B within object A.
      The remainder of this document uses the phrase
      "[Object] A contains [Object] B" for simplicity when a strictly accurate
      phrase would be "[Object] A contains or references (via a Link object)
      [Object] B". It is generally a deployment choice for the uCDN
      implementation to decide when to embed CDNI metadata objects
      and when to reference separate resources via Link objects.</t>

      <t><xref target="hostindex-intro"/> introduces a high level description
      of the HostIndex, HostMatch, HostMetadata, PathMatch, PatternMatch and
      PathMetadata objects, and describes the relationships between them.</t>

      <t><xref target="other-objects-intro"/> introduces a high level
      description of the CDNI GenericMetadata object which represents the
      level at which CDNI metadata override occurs between HostMetadata and
      PathMetadata objects.</t>

      <t><xref target="abstract-metadata-description"/> describes in detail
      the specific CDNI metadata objects and properties specified by this
      document which can be contained within a CDNI GenericMetadata
      object.</t>

      <section anchor="hostindex-intro"
               title="HostIndex, HostMatch, HostMetadata, PathMatch, PatternMatch and PathMetadata objects">
        <t>The relationships between the HostIndex, HostMatch, HostMetadata,
        PathMatch, PatternMatch and PathMetadata objects are described in
        <xref target="metadata-model-figure-top"/>.</t>

        <figure anchor="metadata-model-figure-top"
                title="Relationships between CDNI Metadata Objects (Diagram Representation)">
          <artwork><![CDATA[
+---------+      +---------+      +------------+
|HostIndex+-(*)->|HostMatch+-(1)->|HostMetadata+-------(*)------+
+---------+      +---------+      +------+-----+                |
                                         |                      |
                                        (*)                     |
                                         |                      V
--> Contains or References               V         ******************
(1) One and only one                +---------+    *Generic Metadata*
(*) Zero or more               +--->|PathMatch|    *     Objects    *
                               |    +----+---++    ******************
                               |         |   |                  ^
                              (*)       (1) (1) +------------+  |
                               |         |   +->|PatternMatch|  |
                               |         V      +------------+  |
                               |  +------------+                |
                               +--+PathMetadata+-------(*)------+
                                  +------------+
]]></artwork>
        </figure>

        <t>A HostIndex object (see <xref target="HostIndex"/>)
        contains an array
        of HostMatch objects (see <xref target="HostMatch"/>) that contain
        Hostnames (and/or IP addresses) for which content requests might be
        delegated to the dCDN. The HostIndex is the starting point for
        accessing the uCDN CDNI metadata data store. It enables the dCDN to
        deterministically discover
        which CDNI metadata objects it requires in order to
        deliver a given piece of content.</t>

        <t>The HostIndex links Hostnames (and/or IP addresses) to HostMetadata
        objects (see <xref target="HostMetadata"/>) via HostMatch objects. A
        HostMatch object defines a Hostname (or IP address) to match against a
        requested host and contains a HostMetadata object.</t>

        <t>HostMetadata objects contain the default
        GenericMetadata objects (see <xref target="generic-metadata"/>)
        required to serve content for that host. When looking up CDNI
        metadata, the dCDN looks up the requested Hostname (or IP address)
        against the HostMatch entries in the HostIndex, from there it can find
        HostMetadata which describes the default metadata properties for each host as
        well as PathMetadata objects (see <xref target="PathMetadata"/>), via
        PathMatch objects (see <xref target="PathMatch"/>). PathMatch objects
        define patterns, contained inside PatternMatch objects (see <xref
        target="PatternMatch"/>), to match against the requested URI
        path. PatternMatch objects contain the pattern strings and
        flags that describe the URI path that a PathMatch applies to.
        PathMetadata objects contain the GenericMetadata objects
        that apply to content requests matching the defined URI
        path pattern.  PathMetadata properties override properties
        previously defined in HostMetadata or less specific PathMatch
        paths.  PathMetadata objects can contain additional PathMatch
        objects to recursively define more specific URI paths to which
        GenericMetadata properties might be applied.</t>

        <t>A GenericMetadata object contains individual CDNI metadata objects
        which define the specific policies and attributes needed to properly
        deliver the associated content. For example, a GenericMetadata object
        could describe the source from which a CDN can acquire a piece of
        content. The GenericMetadata object is an atomic unit that can be
        referenced by HostMetadata or PathMetadata objects.</t>

        <t>For example, if "example.com" is a content provider, a HostMatch
        object could include an entry for "example.com" with the URI of the
        associated HostMetadata object. The HostMetadata object for
        "example.com" describes the metadata properties which apply to
        "example.com" and could contain PathMatches for "example.com/movies/*"
        and "example.com/music/*", which in turn reference corresponding
        PathMetadata objects that contain the properties for those
        more specific URI paths. The PathMetadata object for
        "example.com/movies/*" describes the properties which apply to that URI
        path.  It could also contain a PathMatch object for
        "example.com/movies/hd/*" which would reference the corresponding
        PathMetadata object for the "example.com/movies/hd/" path prefix.</t>

        <t>The relationships in <xref target="metadata-model-figure-top"/> are
        also represented in tabular format in <xref
        target="metadata-model-table"/> below.</t>

        <texttable anchor="metadata-model-table"
                   title="Relationships between CDNI Metadata Objects (Table Representation)">
          <ttcol>Data Object</ttcol>
          <ttcol>Objects it contains or references</ttcol>

          <c>HostIndex</c>
          <c>0 or more HostMatch objects.</c>

          <c>HostMatch</c>
          <c>1 HostMetadata object.</c>

          <c>HostMetadata</c>
          <c>0 or more PathMatch objects. 0 or more GenericMetadata
          objects.</c>

          <c>PathMatch</c>
          <c>1 PatternMatch object. 1 PathMetadata object.</c>

          <c>PatternMatch</c>
          <c>Does not contain or reference any other objects.</c>

          <c>PathMetadata</c>
          <c>0 or more PathMatch objects. 0 or more GenericMetadata
          objects.</c>
        </texttable>

        <t/>
      </section>

      <section anchor="other-objects-intro"
               title="Generic CDNI Metadata Objects">
        <t>The HostMetadata and PathMetadata objects contain other CDNI
        metadata objects that contain properties which describe how User Agent
        requests for content should be processed, for example where to acquire
        the content from, authorization rules that should be applied,
        geo-blocking restrictions, and so on. Each such CDNI metadata object is
        a specialization of a CDNI GenericMetadata object. The GenericMetadata
        object abstracts the basic information required for metadata override
        and metadata distribution, from the specifics of any given property
        (i.e., property semantics, enforcement options, etc.).</t>

        <t>The GenericMetadata object defines the properties contained
        within it as well as whether or not the properties are
        "mandatory-to-enforce". If the dCDN does not understand or support a
        "mandatory-to-enforce" property, the
        dCDN MUST NOT serve the content. If the property is
        not "mandatory-to-enforce", then that GenericMetadata object can be
        safely ignored and the content request can be processed in
        accordance with the rest of the CDNI metadata.</t>

        <t>Although a CDN MUST NOT serve content to a User Agent if a
        "mandatory-to-enforce" property cannot be enforced, it could still be
        "safe-to-redistribute" that metadata to another CDN without
        modification. For example, in the cascaded CDN case, a transit CDN
        (tCDN) could pass through "mandatory-to-enforce" metadata to a dCDN. For
        metadata which does not require customization or translation (i.e.,
        metadata that is "safe-to-redistribute"), the data representation
        received off the wire MAY be stored and redistributed without being
        understood or supported by the transit CDN. However, for
        metadata which requires translation, transparent redistribution of the
        uCDN metadata values might not be appropriate. Certain metadata can be
        safely, though perhaps not optimally, redistributed unmodified. For
        example, source acquisition address might not be optimal if
        transparently redistributed, but it might still work.</t>

        <t>Redistribution safety MUST be specified for each
        GenericMetadata property.
        If a CDN does not understand or support a given GenericMetadata
        property that is not "safe-to-redistribute",
        the CDN MUST set the
        "incomprehensible" flag to true for that GenericMetadata object
        before redistributing the metadata. The
        "incomprehensible" flag signals to a dCDN that the metadata was not
        properly transformed by the transit CDN. A CDN MUST NOT attempt to use
        metadata that has been marked as "incomprehensible" by a uCDN.</t>

        <t>Transit CDNs MUST NOT change the value of "mandatory-to-enforce" or
        "safe-to-redistribute" when propagating metadata to a dCDN. Although a
        transit CDN can set the value of "incomprehensible" to true, a transit
        CDN MUST NOT change the value of "incomprehensible" from true to
        false.</t>

        <t><xref target="tcdn-actions"/> describes the action to be taken by a
        transit CDN (tCDN) for the different combinations of
        "mandatory-to-enforce" (MtE) and "safe-to-redistribute" (StR)
        properties, when the tCDN either does or does not understand the
        metadata in question:</t>

        <texttable anchor="tcdn-actions"
                   title="Action to be taken by a tCDN for the different combinations of MtE and StR properties">
          <ttcol>MtE</ttcol>

          <ttcol>StR</ttcol>

          <ttcol>Metadata Understood by tCDN</ttcol>

          <ttcol>Action</ttcol>

          <c>False</c>

          <c>True</c>

          <c>True</c>

          <c>Can serve and redistribute.</c>

          <c>False</c>

          <c>True</c>

          <c>False</c>

          <c>Can serve and redistribute.</c>

          <c>False</c>

          <c>False</c>

          <c>False</c>

          <c>Can serve. MUST set "incomprehensible" to True when
          redistributing.</c>

          <c>False</c>

          <c>False</c>

          <c>True</c>

          <c>Can serve. Can redistribute after transforming the
          metadata (if the CDN knows how to do so safely), otherwise MUST set
          "incomprehensible" to True when redistributing.</c>

          <c>True</c>

          <c>True</c>

          <c>True</c>

          <c>Can serve and redistribute.</c>

          <c>True</c>

          <c>True</c>

          <c>False</c>

          <c>MUST NOT serve but can redistribute.</c>

          <c>True</c>

          <c>False</c>

          <c>True</c>

          <c>Can serve. Can redistribute after transforming the
          metadata (if the CDN knows how to do so safely), otherwise MUST set
          "incomprehensible" to True when redistributing.</c>

          <c>True</c>

          <c>False</c>

          <c>False</c>

          <c>MUST NOT serve. MUST set "incomprehensible" to True when
          redistributing.</c>
        </texttable>

        <t><xref target="dcdn-actions"/> describes the action to be taken by a
        dCDN for the different combinations of "mandatory-to-enforce" (MtE)
        and "incomprehensible" (Incomp) properties, when the dCDN either does
        or does not understand the metadata in question:</t>

        <texttable anchor="dcdn-actions"
                   title="Action to be taken by a dCDN for the different combinations of MtE and Incomp properties">
          <ttcol>MtE</ttcol>
          <ttcol>Incomp</ttcol>
          <ttcol>Metadata Understood by dCDN</ttcol>
          <ttcol>Action</ttcol>

          <c>False</c>
          <c>False</c>
          <c>True</c>
          <c>Can serve.</c>

          <c>False</c>
          <c>True</c>
          <c>True</c>
          <c>Can serve but MUST NOT interpret/apply any metadata marked
          incomprehensible.</c>

          <c>False</c>
          <c>False</c>
          <c>False</c>
          <c>Can serve.</c>

          <c>False</c>
          <c>True</c>
          <c>False</c>
          <c>Can serve but MUST NOT interpret/apply any metadata marked
          incomprehensible.</c>

          <c>True</c>
          <c>False</c>
          <c>True</c>
          <c>Can serve.</c>

          <c>True</c>
          <c>True</c>
          <c>True</c>
          <c>MUST NOT serve.</c>

          <c>True</c>
          <c>False</c>
          <c>False</c>
          <c>MUST NOT serve.</c>

          <c>True</c>
          <c>True</c>
          <c>False</c>
          <c>MUST NOT serve.</c>
        </texttable>

        <t/>
      </section>

      <section anchor="metadata-inheritance"
               title="Metadata Inheritance and Override">
        <t>In the metadata object model, a HostMetadata object can contain
        multiple PathMetadata objects (via PathMatch objects). Each
        PathMetadata object can in turn contain other PathMetadata objects.
        HostMetadata and PathMetadata objects form an inheritance tree where
        each node in the tree inherits or overrides the property values set by
        its parent.</t>

        <t>GenericMetadata objects of a given type override all
        GenericMetadata objects of the same type previously defined by any
        parent object in the tree. GenericMetadata objects of a given type
        previously defined by a parent object in the tree are inherited when
        no object of the same type is defined by the child object. For
        example, if HostMetadata for the host "example.com" contains
        GenericMetadata objects of type LocationACL and TimeWindowACL, while a
        PathMetadata object which applies to "example.com/movies/*" defines an
        alternate GenericMetadata object of type TimeWindowACL, then: <list
            style="symbols">
            <t>the TimeWindowACL defined in the PathMetadata would override
            the TimeWindowACL defined in the HostMetadata for all User Agent
            requests for content under "example.com/movies/", and</t>

            <t>the LocationACL defined in the HostMetadata would be inherited
            for all User Agent requests for content under
            "example.com/movies/".</t>
          </list></t>

        <t>A single HostMetadata or PathMetadata object MUST NOT contain
        multiple GenericMetadata objects of the same type. If an array of
        GenericMetadata contains objects of duplicate types, the receiver MUST
        ignore all but the first object of each type.</t>
      </section>
    </section>

    <section anchor="abstract-metadata-description"
             title="CDNI Metadata objects">
      <t><xref target="structural-objects"/> provides the definitions of each
      metadata object type introduced in <xref target="data-model"/>. These
      metadata objects are described as structural metadata objects as they
      provide the structure for host and URI path-based inheritance and identify which
      GenericMetadata objects apply to a given User Agent content
      request.</t>

      <t><xref target="property-objects"/> provides the definitions for a base
      set of core metadata objects which can be contained within a
      GenericMetadata object. These metadata objects govern how User Agent
      requests for content are handled. GenericMetadata objects can contain
      other GenericMetadata as properties; these can be referred to as
      sub-objects). As with all CDNI metadata objects, the
      value of the GenericMetadata sub-objects can be either a complete
      serialized representation of the sub-object, or a Link object that
      contains a URI that can be dereferenced to retrieve the complete
      serialized representation of the property sub-object.</t>

      <t><xref target="extensibility"/> discusses the ability to extend the
      base set of GenericMetadata objects specified in this document with
      additional standards-based or vendor specific GenericMetadata objects
       that might be defined in the future in separate documents.</t>

      <t>dCDNs and tCDNs MUST support parsing of all CDNI metadata objects
      specified in this document. A dCDN does not have to implement the
      underlying functionality represented by non-structural GenericMetadata objects (though that
      might restrict the content that a given dCDN will be able to
      serve). uCDNs as
      generators of CDNI metadata only need to support generating the CDNI
      metadata that they need in order to express the policies
      required by the content they are describing.
      See <xref target="Encoding"/> for more details on the
      specific encoding rules for CDNI metadata objects.</t>

      <t>Note: In the following sections, the term "mandatory-to-specify" is
      used to convey which properties MUST be included for a given structural
      or GenericMetadata object. When mandatory-to-specify is specified as
      "Yes" for an individual property, it means that if the
      object containing that property is included in a metadata response, then
      the mandatory-to-specify property MUST also be included (directly or by
      reference) in the response, e.g., a HostMatch property object without a
      host to match against does not make sense, therefore, the host property
      is mandatory-to-specify inside a HostMatch object.</t>

      <section anchor="structural-objects"
               title="Definitions of the CDNI structural metadata objects">
        <t>Each of the sub-sections below describe the structural objects
        introduced in <xref target="hostindex-intro"/>.</t>

        <section anchor="HostIndex" title="HostIndex">
          <t>The HostIndex object is the entry point into the CDNI metadata
          hierarchy. It contains an array of HostMatch objects. An incoming
          content request is checked against the Hostname (or IP address)
          specified by each of the listed HostMatch objects to find the
          HostMatch object which applies to the request.</t>

          <t><list style="empty">
              <t>Property: hosts<list style="empty">
                  <t>Description: Array of HostMatch objects. Hosts (HostMatch
                  objects) MUST be evaluated in the order they appear and the
                  first HostMatch object that matches the content request
                  being processed MUST be used.</t>

                  <t>Type: Array of HostMatch objects</t>

                  <t>Mandatory-to-Specify: Yes.</t>
                </list></t>
            </list></t>

          <t>Example HostIndex object containing two HostMatch objects, where
          the first HostMatch object is embedded and the second HostMatch
          object is referenced:</t>

          <figure>
            <artwork><![CDATA[{
  "hosts": [
    {
      <Properties of embedded HostMatch object>
    },
    {
      "type": "MI.HostMatch",
      "href": "https://metadata.ucdn.example/hostmatch1234"
    }
  ]
}]]></artwork>
          </figure>
        </section>

        <section anchor="HostMatch" title="HostMatch">
          <t>The HostMatch object contains a Hostname or IP address to match
          against content requests. The HostMatch object also contains a
          HostMetadata object to apply if a match is found.</t>

          <t><list style="empty">
              <t>Property: host<list style="empty">
                  <t>Description: Hostname or IP address and optional
                  port to match against the requested host, i.e., the 
                  <xref target="RFC3986"/> host and port. In order for
                  a Hostname or IP address in a content request to
                  match the Hostname or IP address in the host
                  property the value from the content request when
                  converted to lowercase MUST be identical to the
                  value of the host property when converted to lowercase.
                  All implementations MUST support IPv4 addresses
                  encoded as specified by the 'IPv4address' rule in
                  Section 3.2.2 of <xref target="RFC3986"/>. IPv6
                  addresses MUST be encoded in one of the IPv6 address
                  formats specified in <xref target="RFC5952"/>
                  although receivers MUST support all IPv6 address
                  formats specified in <xref target="RFC4291"/>. 
                  Hostnames MUST conform to the Domain Name System
                  (DNS) syntax defined in <xref target="RFC1034"/> 
                  and <xref target="RFC1123"/>. Internationalized
                  Domain Names (IDN) must first be transformed to the IDNA
                  encoding as per <xref target="RFC3490"/>.</t>

                  <t>Type: Endpoint</t>

                  <t>Mandatory-to-Specify: Yes.</t>
                </list></t>
            </list> <list style="empty">
              <t>Property: host-metadata<list style="empty">
                  <t>Description: CDNI metadata to apply when delivering
                  content that matches this host.</t>

                  <t>Type: HostMetadata</t>

                  <t>Mandatory-to-Specify: Yes.</t>
                </list></t>
            </list></t>

          <t>Example HostMatch object with an embedded HostMetadata
          object:</t>

          <figure>
            <artwork><![CDATA[{
  "host": "video.example.com",
  "host-metadata" : {
    <Properties of embedded HostMetadata object>
  }
}
]]></artwork>
          </figure>

          <t/>

          <t>Example HostMatch object referencing (via a Link object, see
          <xref target="Link"/>) a HostMetadata object:</t>

          <figure>
            <artwork><![CDATA[{
  "host": "video.example.com",
  "host-metadata" : {
    "type": "MI.HostMetadata",
    "href": "https://metadata.ucdn.example/host1234"
  }
}
]]></artwork>
          </figure>
        </section>

        <section anchor="HostMetadata" title="HostMetadata">
          <t>A HostMetadata object contains the CDNI metadata properties for
          content served for a particular host (defined in the HostMatch
          object) and possibly child PathMatch objects.</t>

          <t><list style="empty">
              <t>Property: metadata<list style="empty">
                  <t>Description: Array of host related metadata.</t>

                  <t>Type: Array of GenericMetadata objects</t>

                  <t>Mandatory-to-Specify: Yes.</t>
                </list></t>
            </list> <list style="empty">
              <t>Property: paths<list style="empty">
                  <t>Description: Path specific rules. Path patterns
                  (PathMatch objects) MUST be evaluated in the order they
                  appear and the first (and only the first) PathMatch object that matches the
                  content request being processed MUST be used.</t>

                  <t>Type: Array of PathMatch objects</t>

                  <t>Mandatory-to-Specify: No.</t>
                </list></t>
            </list></t>

          <t>Example HostMetadata object containing a number of embedded
          GenericMetadata objects that will describe the default metadata for
          the host and an embedded PathMatch object that contains a
          path for which metadata exists that overrides the default metadata
          for the host:</t>

          <figure>
            <artwork><![CDATA[{
  "metadata": [
    {
      <Properties of 1st embedded GenericMetadata object>
    },
    {
      <Properties of 2nd embedded GenericMetadata object>
    },

 ... 

    {
      <Properties of Nth embedded GenericMetadata object>
    }
  ],
  "paths": [
    {
      <Properties of embedded PathMatch object>
    }
  ]
}]]></artwork>
          </figure>
        </section>

        <section anchor="PathMatch" title="PathMatch">
          <t>A PathMatch object contains PatternMatch
          object with a path to match against a resource's URI path,
          as well as a
          PathMetadata object with GenericMetadata to apply if the
          resource's URI path matches the 
          pattern within the PatternMatch object.</t>

          <t><list style="empty">
              <t>Property: path-pattern<list style="empty">
                  <t>Description: Pattern to match against the requested
                  resource's URI path, i.e., against the <xref
                  target="RFC3986"/> path-absolute.</t>

                  <t>Type: PatternMatch</t>

                  <t>Mandatory-to-Specify: Yes.</t>
                </list></t>
            </list> <list style="empty">
              <t>Property: path-metadata<list style="empty">
                  <t>Description: CDNI metadata to apply when delivering
                  content that matches the associated PatternMatch.</t>

                  <t>Type: PathMetadata</t>

                  <t>Mandatory-to-Specify: Yes.</t>
                </list></t>
            </list></t>

          <t>Example PathMatch object referencing the PathMetadata object to
          use for URIs that match the case-sensitive URI path pattern
          "/movies/*" (contained within an embedded PatternMatch object):</t>

          <figure>
            <artwork><![CDATA[{
  "path-pattern": {
    "pattern": "/movies/*",
    "case-sensitive": true
  },
  "path-metadata": {
      "type": "MI.PathMetadata",
      "href": "https://metadata.ucdn.example/host1234/pathDCE"
  }
}
]]></artwork>
          </figure>
        </section>

        <section anchor="PatternMatch" title="PatternMatch">
          <t>A PatternMatch object contains the pattern string and flags that
          describe the pattern expression.</t>

          <t><list style="empty">
              <t>Property: pattern<list style="empty">
                  <t>Description: A pattern for string matching. The pattern
                  can contain the wildcards * and ?, where * matches any
                  sequence of characters (including the empty string) and ?
                  matches exactly one character. The three literals $, * and ?
                  should be escaped as $$, $* and $?
                  (where $ is the designated escape character).
                  All other characters are treated as literals.</t>

                  <t>Type: String</t>

                  <t>Mandatory-to-Specify: Yes.</t>
                </list></t>
            </list> <list style="empty">
              <t>Property: case-sensitive<list style="empty">
                  <t>Description: Flag indicating whether or not
                  case-sensitive matching should be used.  Note:
                  Case-insensitivity applies to ALPHA characters in
                  the URI path prior to percent-decoding 
                  <xref target="RFC3986"/>.</t>

                  <t>Type: Boolean</t>

                  <t>Mandatory-to-Specify: No. Default is case-insensitive
                  match.</t>
                </list></t>
            </list> <list style="empty">
              <t>Property: ignore-query-string<list style="empty">
                  <t>Description: Array of query parameters which should be
                  ignored when searching for a pattern match. Matching against
                  query parameters to ignore MUST be case-insensitive. If all
                  query parameters should be ignored then the list MUST be
                  empty.</t>

                  <t>Type: Array of String</t>

                  <t>Mandatory-to-Specify: No. Default is to include query
                  strings when matching.</t>
                </list></t>
            </list></t>

          <t>Example PatternMatch object that matches the case-sensitive URI
          path pattern "/movies/*". All query parameters will be ignored when
          matching URIs requested from surrogates by content clients against
          this path pattern:</t>

          <figure>
            <artwork><![CDATA[{
  "pattern": "/movies/*",
  "case-sensitive": true,
  "ignore-query-string": []
}
]]></artwork>
          </figure>

          <t/>

          <t>Example PatternMatch object that matches the case-sensitive URI
          path pattern "/movies/*". The query parameter "sessionid" will be
          ignored when matching URIs requested from surrogates by content
          clients against this path pattern:</t>

          <figure>
            <artwork><![CDATA[{
  "pattern": "/movies/*",
  "case-sensitive": true,
  "ignore-query-string": ["sessionid"]
}
]]></artwork>
          </figure>
        </section>

        <section anchor="PathMetadata" title="PathMetadata">
          <t>A PathMetadata object contains the CDNI metadata properties for
          content requests that match against the associated URI path (defined
          in a PathMatch object).</t>

          <t>Note that if DNS-based redirection is employed, then a dCDN will
          be unable to evaluate any metadata at the PathMetadata level or
          below because only the hostname of the content request is available
          at request routing time. dCDNs SHOULD still process all PathMetadata
          for the host before responding to the redirection
          request to detect if any unsupported metadata is specified.
          If any metadata not supported by the dCDN is marked as
          "mandatory-to-enforce", the dCDN SHOULD NOT accept
          the content redirection request, in order to avoid
          receiving content requests that it will not be able to satisfy/serve.</t>

          <t><list style="empty">
              <t>Property: metadata<list style="empty">
                  <t>Description: Array of path related metadata.</t>

                  <t>Type: Array of GenericMetadata objects</t>

                  <t>Mandatory-to-Specify: Yes.</t>
                </list></t>
            </list> <list style="empty">
              <t>Property: paths<list style="empty">
                  <t>Description: Path specific rules. Path patterns
                  (PathMatch objects) MUST be evaluated in the order they
                  appear and the first (and only the first) PathMatch object that matches the
                  content request being processed MUST be used.</t>

                  <t>Type: Array of PathMatch objects</t>

                  <t>Mandatory-to-Specify: No.</t>
                </list></t>
            </list></t>

          <t>Example PathMetadata object containing a number of embedded
          GenericMetadata objects that describe the metadata to apply for the
          URI path defined in the parent PathMatch object, as well as
          a more specific PathMatch object.</t>

          <figure>
            <artwork><![CDATA[{
  "metadata": [
    {
      <Properties of 1st embedded GenericMetadata object>
    },
    {
      <Properties of 2nd embedded GenericMetadata object>
    },

 ... 

    {
      <Properties of Nth embedded GenericMetadata object>
    }
  ],
  "paths": [
    {
      <Properties of embedded PathMatch object>
    }
  ]
}]]></artwork>
          </figure>
        </section>

        <section anchor="generic-metadata" title="GenericMetadata">
          <t>A GenericMetadata object is a wrapper for managing individual
          CDNI metadata properties in an opaque manner.</t>

          <t><list style="empty">
              <t>Property: generic-metadata-type<list style="empty">
                  <t>Description: Case-insensitive CDNI metadata object
                  type.</t>

                  <t>Type: String containing the CDNI Payload Type 
                  <xref target="RFC7736"/> of the object
                  contained in the generic-metadata-value property
                  (see <xref target="metadata-payload-types-table"/>).</t>

                  <t>Mandatory-to-Specify: Yes.</t>
                </list></t>
            </list> <list style="empty">
              <t>Property: generic-metadata-value<list style="empty">
                  <t>Description: CDNI metadata object.</t>

                  <t>Type: Format/Type is defined by the value of
                  generic-metadata-type property above. Note:
                  generic-metadata-values MUST NOT name any properties
                  "href" (see <xref target="Link"/>).</t>

                  <t>Mandatory-to-Specify: Yes.</t>
                </list></t>
            </list> <list style="empty">
              <t>Property: mandatory-to-enforce<list style="empty">
                  <t>Description: Flag identifying whether or not the
                  enforcement of the property metadata is required.</t>

                  <t>Type: Boolean</t>

                  <t>Mandatory-to-Specify: No. Default is to treat metadata as
                  mandatory to enforce (i.e., a value of True).</t>
                </list></t>
            </list> <list style="empty">
              <t>Property: safe-to-redistribute<list style="empty">
                  <t>Description: Flag identifying whether or not the property
                  metadata can be safely redistributed without
                  modification.</t>

                  <t>Type: Boolean</t>

                  <t>Mandatory-to-Specify: No. Default is allow transparent
                  redistribution (i.e., a value of True).</t>
                </list></t>
            </list> <list style="empty">
              <t>Property: incomprehensible<list style="empty">
                  <t>Description: Flag identifying whether or not any CDN in
                  the chain of delegation has failed to understand and/or
                  failed to properly transform this metadata object. Note:
                  This flag only applies to metadata objects whose
                  safe-to-redistribute property has a value of False.</t>

                  <t>Type: Boolean</t>

                  <t>Mandatory-to-Specify: No. Default is comprehensible
                  (i.e., a value of False).</t>
                </list></t>
            </list></t>

          <t>Example GenericMetadata object containing a metadata object that
          applies to the applicable URI path and/or host (within a parent
          PathMetadata and/or HostMetadata object, respectively):</t>

          <figure>
            <artwork><![CDATA[{
  "mandatory-to-enforce": true,
  "safe-to-redistribute": true,
  "incomprehensible": false,
  "generic-metadata-type": <CDNI Payload Type of this metadata object>,
  "generic-metadata-value":
    {
      <Properties of this metadata object>
    }
}]]></artwork>
          </figure>
        </section>
      </section>

      <section anchor="property-objects"
               title="Definitions of the initial set of CDNI Generic Metadata objects">
        <t>The objects defined below are intended to be used in the
        GenericMetadata object generic-metadata-value field as defined in
        <xref target="generic-metadata"/> and their generic-metadata-type
        property MUST be set to the appropriate CDNI Payload Type as defined in <xref
        target="metadata-payload-types-table"/>.</t>

        <section anchor="SourceMetadata" title="SourceMetadata">
          <t>Source metadata provides the dCDN with information about content
          acquisition, i.e., how to contact an uCDN Surrogate or an Origin
          Server to obtain the content to be served. The sources are not
          necessarily the actual Origin Servers operated by the CSP but might
          be a set of Surrogates in the uCDN.</t>

          <t><list style="empty">
              <t>Property: sources<list style="empty">
                  <t>Description: Sources from which the dCDN can acquire
                  content, listed in order of preference.</t>

                  <t>Type: Array of Source objects (see <xref
                  target="Source"/>)</t>

                  <t>Mandatory-to-Specify: No. Default is to use static
                  configuration, out-of-band from the metadata interface.</t>
                </list></t>
            </list></t>

          <t>Example SourceMetadata object (which contains two Source objects)
          that describes which servers the dCDN should use for acquiring
          content for the applicable URI path and/or host:</t>

          <figure>
            <artwork><![CDATA[{
  "generic-metadata-type": "MI.SourceMetadata",
  "generic-metadata-value":
    {
      "sources": [
        {
          "endpoints": [
            "a.service123.ucdn.example",
            "b.service123.ucdn.example"
            ],
          "protocol": "http/1.1"
        },
        {
          "endpoints": ["origin.service123.example"],
          "protocol": "http/1.1"
        }
      ]
    }
}]]></artwork>
          </figure>

          <t/>

          <section anchor="Source" title="Source">
            <t>A Source object describes the source to be used by the dCDN for
            content acquisition (e.g., a Surrogate within the uCDN or an
            alternate Origin Server), the protocol to be used, and any
            authentication method to be used when contacting that source.</t>

            <t>Endpoints within a Source object MUST be treated as
            equivalent/equal.  A uCDN can specify an array of sources in
            preference order within a SourceMetadata object, and then
            for each preference ranked Source object, a uCDN can 
            specify an array of endpoints that are equivalent (e.g., a pool of
            servers that are not behind a load balancer).</t>

            <t><list style="empty">
                <t>Property: acquisition-auth<list style="empty">
                    <t>Description: Authentication method to use when
                    requesting content from this source.</t>

                    <t>Type: Auth (see <xref target="Auth"/>)</t>

                    <t>Mandatory-to-Specify: No. Default is no authentication
                    required.</t>
                  </list></t>
              </list> <list style="empty">
                <t>Property: endpoints<list style="empty">
                    <t>Description: Origins from which the dCDN can acquire
                    content. If multiple endpoints are specified they are all
                    equal, i.e., the list is not in preference order (e.g.,
                    a pool of servers behind a load balancer).</t>

                    <t>Type: Array of Endpoint objects (See <xref
                    target="Endpoint"/>)</t>

                    <t>Mandatory-to-Specify: Yes.</t>
                  </list></t>
              </list> <list style="empty">
                <t>Property: protocol<list style="empty">
                    <t>Description: Network retrieval protocol to use when
                    requesting content from this source.</t>

                    <t>Type: Protocol (see <xref target="Protocol"/>)</t>

                    <t>Mandatory-to-Specify: Yes.</t>
                  </list></t>
              </list></t>

            <t>Example Source object that describes a pair of endpoints
            (servers) the dCDN can use for acquiring content for the
            applicable host and/or URI path:</t>

            <figure>
              <artwork><![CDATA[{
  "endpoints": [
    "a.service123.ucdn.example",
    "b.service123.ucdn.example"
  ],
  "protocol": "http/1.1"
}]]></artwork>
            </figure>

            <t/>
          </section>
        </section>

        <section anchor="LocationACL" title="LocationACL Metadata">
          <t>LocationACL metadata defines which locations a User Agent needs
          to be in, in order to be able to receive the associated content.</t>

          <t>A LocationACL which does not include a locations property results
          in an action of allow all, meaning that delivery can be performed
          regardless of the User Agent's location, otherwise a CDN
          MUST take the action from the first
          footprint to match against the User Agent's location.
          If two or more footprints overlap, the first
          footprint that matches against the User Agent's location determines
          the action a CDN MUST take. If the locations property is included
          but is empty, or if none of the listed footprints matches the User
          Agent's location, then the result is an action of deny.</t>

          <t>Although the LocationACL, TimeWindowACL (see <xref
          target="TimeWindowACL"/>), and ProtocolACL (see <xref
          target="ProtocolACL"/>) are independent GenericMetadata objects,
          they can provide conflicting information to a dCDN, e.g., a content
          request which is simultaneously allowed based on the LocationACL and
          denied based on the TimeWindowACL. The dCDN MUST use the logical AND
          of all ACLs (where 'allow' is true and 'deny' is false) to determine
          whether or not a request should be allowed.</t>

          <t><list style="empty">
              <t>Property: locations<list style="empty">
                  <t>Description: Access control list which allows or denies
                  (blocks) delivery based on the User Agent's location.</t>

                  <t>Type: Array of LocationRule objects (see <xref
                  target="LocationRule"/>)</t>

                  <t>Mandatory-to-Specify: No. Default is allow all
                  locations.</t>
                </list></t>
            </list></t>

          <t>Example LocationACL object that allows the dCDN to deliver
          content to any location/IP address:</t>

          <figure>
            <artwork><![CDATA[{
  "generic-metadata-type": "MI.LocationACL",
  "generic-metadata-value":
    {
    }
}]]></artwork>
          </figure>

          <t/>

          <t>Example LocationACL object (which contains a LocationRule object
          which itself contains a Footprint object) that only allows the dCDN
          to deliver content to User Agents in the USA:</t>

          <figure>
            <artwork><![CDATA[{
  "generic-metadata-type": "MI.LocationACL",
  "generic-metadata-value":
    {
      "locations": [
        {
          "action": "allow",
          "footprints": [
            {
              "footprint-type": "countrycode",
              "footprint-value": ["us"]
            }
          ]
        }
      ]
    }
}]]></artwork>
          </figure>

          <t/>

          <section anchor="LocationRule" title="LocationRule">
            <t>A LocationRule contains or references an array of Footprint
            objects and the corresponding action.</t>

            <t><list style="empty">
                <t>Property: footprints<list style="empty">
                    <t>Description: Array of footprints to which the rule
                    applies.</t>

                    <t>Type: Array of Footprint objects (see <xref
                    target="Footprint"/>)</t>

                    <t>Mandatory-to-Specify: Yes.</t>
                  </list></t>
              </list> <list style="empty">
                <t>Property: action<list style="empty">
                    <t>Description: Defines whether the rule specifies
                    locations to allow or deny.</t>

                    <t>Type: Enumeration [allow|deny] encoded as a lowercase
                    string</t>

                    <t>Mandatory-to-Specify: No. Default is deny.</t>
                  </list></t>
              </list></t>

            <t>Example LocationRule object (which contains a Footprint object)
            that allows the dCDN to deliver content to clients in the USA:</t>

            <figure>
              <artwork><![CDATA[{
  "action": "allow",
  "footprints": [
    {
      "footprint-type": "countrycode",
      "footprint-value": ["us"]
    }
  ]
}]]></artwork>
            </figure>
          </section>

          <section anchor="Footprint" title="Footprint">
            <t>A Footprint object describes the footprint to which a
            LocationRule can be applied to, e.g., an IPv4 address range or a
            geographic location.</t>

            <t><list style="empty">
                <t>Property: footprint-type<list style="empty">
                    <t>Description: Registered footprint type (see
                    <xref target="FootprintReg"/>). The footprint
                    types specified by this document are: "ipv4cidr"
                    (IPv4CIDR, see <xref target="IPv4CIDR"/>), "ipv6cidr"
                    (IPv6CIDR, see <xref target="IPv6CIDR"/>), "asn"
                    (Autonomous System Number, see <xref target="ASN"/>) and
                    "countrycode" (Country Code, see <xref
                    target="CountryCode"/>).</t>

                    <t>Type: Lowercase String</t>

                    <t>Mandatory-to-Specify: Yes.</t>
                  </list></t>
              </list> <list style="empty">
                <t>Property: footprint-value<list style="empty">
                    <t>Description: Array of footprint values conforming to the
                    specification associated with the registered footprint
                    type.  Footprint values can be simple strings
                    (e.g., IPv4CIDR, IPv6CIDR, ASN, and CountryCode),
                    however, other Footprint objects can be defined in
                    the future, along with a more complex encoding
                    (e.g., GPS coordinate tuples).</t>

                    <t>Type: Array of footprints</t>

                    <t>Mandatory-to-Specify: Yes.</t>
                  </list></t>
              </list></t>

            <t>Example Footprint object describing a footprint covering the
            USA:</t>

            <figure>
              <artwork><![CDATA[{
  "footprint-type": "countrycode",
  "footprint-value": ["us"]
}]]></artwork>
            </figure>

            <t/>

            <t>Example Footprint object describing a footprint covering the IP
            address ranges 192.0.2.0/24 and 198.51.100.0/24:</t>

            <figure>
              <artwork><![CDATA[{
  "footprint-type": "ipv4cidr",
  "footprint-value": ["192.0.2.0/24", "198.51.100.0/24"]
}]]></artwork>
            </figure>

            <t/>

            <t>Example Footprint object describing a footprint covering the IP
            address ranges 2001:db8::/32:</t>

            <figure>
              <artwork><![CDATA[{
  "footprint-type": "ipv6cidr",
  "footprint-value": ["2001:db8::/32"]
}]]></artwork>
            </figure>

            <t/>

            <t>Example Footprint object describing a footprint covering the
            autonomous system 64496:</t>

            <figure>
              <artwork><![CDATA[{
  "footprint-type": "asn",
  "footprint-value": ["as64496"]
}]]></artwork>
            </figure>
          </section>
        </section>

        <section anchor="TimeWindowACL" title="TimeWindowACL">
          <t>TimeWindowACL metadata defines time-based restrictions.</t>

          <t>A TimeWindowACL which does not include a times property results
          in an action of allow all, meaning that delivery can be performed
          regardless of the time of the User Agent's request,
          otherwise a CDN MUST take the action from
          the first window to match against the current time.
          If two or more windows overlap, the first window that
          matches against the current time determines the action a CDN MUST
          take. If the times property is included but is empty, or if none of
          the listed windows matches the current time, then the result is an
          action of deny.</t>

          <t>Although the LocationACL (see <xref
          target="LocationACL"/>), TimeWindowACL, and ProtocolACL (see <xref
          target="ProtocolACL"/>) are
          independent GenericMetadata objects, they can provide conflicting
          information to a dCDN, e.g., a content request which is
          simultaneously allowed based on the LocationACL and denied based on
          the TimeWindowACL. The dCDN MUST use the logical AND of all ACLs
          (where 'allow' is true and 'deny' is false) to determine whether or
          not a request should be allowed.</t>

          <t><list style="empty">
              <t>Property: times<list style="empty">
                  <t>Description: Access control list which allows or denies
                  (blocks) delivery based on the time of a User Agent's
                  request.</t>

                  <t>Type: Array of TimeWindowRule objects (see <xref
                  target="TimeWindowRule"/>)</t>

                  <t>Mandatory-to-Specify: No. Default is allow all time
                  windows.</t>
                </list></t>
            </list></t>

          <t>Example TimeWIndowACL object (which contains a TimeWindowRule
          object which itself contains a TimeWIndow object) that only allows
          the dCDN to deliver content to clients between 09:00 01/01/2000
          UTC and 17:00 01/01/2000 UTC:</t>

          <figure>
            <artwork><![CDATA[{
  "generic-metadata-type": "MI.TimeWindowACL",
  "generic-metadata-value":
    {
      "times": [
        {
          "action": "allow",
          "windows": [
            {
              "start": 946717200,
              "end": 946746000
            }
          ]
        }
      ]
    }
}]]></artwork>
          </figure>

          <section anchor="TimeWindowRule" title="TimeWindowRule">
            <t>A TimeWindowRule contains or references an array of TimeWindow
            objects and the corresponding action.</t>

            <t><list style="empty">
                <t>Property: windows<list style="empty">
                    <t>Description: Array of time windows to which the rule
                    applies.</t>

                    <t>Type: Array of TimeWindow objects (see <xref
                    target="TimeWindow"/>)</t>

                    <t>Mandatory-to-Specify: Yes.</t>
                  </list></t>
              </list> <list style="empty">
                <t>Property: action<list style="empty">
                    <t>Description: Defines whether the rule specifies time
                    windows to allow or deny.</t>

                    <t>Type: Enumeration [allow|deny] encoded as a lowercase
                    string</t>

                    <t>Mandatory-to-Specify: No. Default is deny.</t>
                  </list></t>
              </list></t>

            <t>Example TimeWIndowRule object (which contains a TimeWIndow
            object) that only allows the dCDN to deliver content to clients
            between 09:00 01/01/2000 UTC and 17:00 01/01/2000 UTC:</t>

            <figure>
              <artwork><![CDATA[{
  "action": "allow",
  "windows": [
    {
      "start": 946717200,
      "end": 946746000
    }
  ]
}]]></artwork>
            </figure>
          </section>

          <section anchor="TimeWindow" title="TimeWindow">
            <t>A TimeWindow object describes a time range which can be applied
            by an TimeWindowACL, e.g., start 946717200 (i.e., 09:00
            01/01/2000 UTC), end: 946746000 (i.e., 17:00 01/01/2000
            UTC).</t>

            <t><list style="empty">
                <t>Property: start<list style="empty">
                    <t>Description: The start time of the window.</t>

                    <t>Type: Time (see <xref target="Time"/>)</t>

                    <t>Mandatory-to-Specify: Yes.</t>
                  </list></t>
              </list> <list style="empty">
                <t>Property: end<list style="empty">
                    <t>Description: The end time of the window.</t>

                    <t>Type: Time (see <xref target="Time"/>)</t>

                    <t>Mandatory-to-Specify: Yes.</t>
                  </list></t>
              </list></t>

            <t>Example TimeWIndow object that describes a time window from
            09:00 01/01/2000 UTC to 17:00 01/01/2000 UTC:</t>

            <figure>
              <artwork><![CDATA[{
  "start": 946717200,
  "end": 946746000
}
]]></artwork>
            </figure>
          </section>
        </section>

        <section anchor="ProtocolACL" title="ProtocolACL Metadata">
          <t>ProtocolACL metadata defines delivery protocol restrictions.</t>

          <t>A ProtocolACL which does not include a protocol-acl property
          results in an action of allow all, meaning that delivery can be
          performed regardless of the protocol in the User Agent's request,
          otherwise a CDN MUST take the action from the first protocol
          to match against the request protocol.
          If two or more request
          protocols overlap, the first protocol that matches the request
          protocol determines the action a CDN MUST take. If the protocol-acl
          property is included but is empty, or if none of the listed protocol
          matches the request protocol, then the result is an action of
          deny.</t>

          <t>Although the LocationACL, TimeWindowACL, and ProtocolACL are
          independent GenericMetadata objects, they can provide conflicting
          information to a dCDN, e.g., a content request which is
          simultaneously allowed based on the ProtocolACL and denied based on
          the TimeWindowACL. The dCDN MUST use the logical AND of all ACLs
          (where 'allow' is true and 'deny' is false) to determine whether or
          not a request should be allowed.</t>

          <t><list style="empty">
              <t>Property: protocol-acl<list style="empty">
                  <t>Description: Description: Access control list which
                  allows or denies (blocks) delivery based on delivery
                  protocol.</t>

                  <t>Type: Array of ProtocolRule objects (see <xref
                  target="ProtocolRule"/>)</t>

                  <t>Mandatory-to-Specify: No. Default is allow all
                  protocols.</t>
                </list></t>
            </list></t>

          <t>Example ProtocolACL object (which contains a ProtocolRule object)
          that only allows the dCDN to deliver content using HTTP/1.1:</t>

          <figure>
            <artwork><![CDATA[{
  "generic-metadata-type": "MI.ProtocolACL",
  "generic-metadata-value":
    {
      "protocol-acl": [
        {
          "action": "allow",
          "protocols": ["http/1.1"]
        }
      ]
    }
}]]></artwork>
          </figure>

          <section anchor="ProtocolRule" title="ProtocolRule">
            <t>A ProtocolRule contains or references an array of Protocol
            objects and the corresponding action.</t>

            <t><list style="empty">
                <t>Property: protocols<list style="empty">
                    <t>Description: Array of protocols to which the rule
                    applies.</t>

                    <t>Type: Array of Protocols (see <xref
                    target="Protocol"/>)</t>

                    <t>Mandatory-to-Specify: Yes.</t>
                  </list></t>
              </list> <list style="empty">
                <t>Property: action<list style="empty">
                    <t>Description: Defines whether the rule specifies
                    protocols to allow or deny.</t>

                    <t>Type: Enumeration [allow|deny] encoded as a lowercase
                    string</t>

                    <t>Mandatory-to-Specify: No. Default is deny.</t>
                  </list></t>
              </list></t>

            <t>Example ProtocolRule object (which contains a ProtocolRule
            object) that allows the dCDN to deliver content using HTTP/1.1:</t>

            <figure>
              <artwork><![CDATA[{
  "action": "allow",
  "protocols": ["http/1.1"]
}
]]></artwork>
            </figure>
          </section>
        </section>

        <section anchor="DeliveryAuthorization"
                 title="DeliveryAuthorization Metadata">
          <t>Delivery Authorization defines authorization methods for the
          delivery of content to User Agents.</t>

          <t><list style="empty">
              <t>Property: delivery-auth-methods<list style="empty">
                  <t>Description: Options for authorizing content requests.
                  Delivery for a content request is authorized if any of the
                  authorization methods in the list is satisfied for that
                  request.</t>

                  <t>Type: Array of Auth objects (see <xref
                  target="Auth"/>)</t>

                  <t>Mandatory-to-Specify: No. Default is no authorization
                  required.</t>
                </list></t>
            </list></t>

          <t>Example DeliveryAuthorization object (which contains an Auth object):</t>

          <figure>
            <artwork><![CDATA[{
  "generic-metadata-type": "MI.DeliveryAuthorization",
  "generic-metadata-value":
    {
      "delivery-auth-methods": [
        {
          "auth-type": <CDNI Payload Type of this Auth object>,
          "auth-value":
          {
            <Properties of this Auth object>
          }
        }
      ]
    }
}]]></artwork>
          </figure>
        </section>

        <section anchor="Cache" title="Cache">
          <t>A Cache object describes the cache control parameters to be
          applied to the content by intermediate caches.</t>

          <t><list style="empty">
              <t>Property: ignore-query-string<list style="empty">
                  <t>Description: Allows a Surrogate to ignore URI query
                  string parameters <xref target="RFC3986"/>
                  when comparing the requested URI against
                  the URIs in its cache for equivalence. Matching
                  query parameters to ignore MUST be case-insensitive. Each
                  query parameter to ignore is specified in the list. If all
                  query parameters should be ignored, then the list MUST be
                  specified and MUST be empty.</t>

                  <t>Type: Array of String</t>

                  <t>Mandatory-to-Specify: No. Default is to consider query
                  string parameters when comparing URIs.</t>
                </list></t>
            </list></t>

          <t>Example Cache object that instructs the dCDN to ignore all query
          parameters:</t>

          <figure>
            <artwork><![CDATA[{
  "generic-metadata-type": "MI.Cache",
  "generic-metadata-value":
  {
    "ignore-query-string": []
  }
}
]]></artwork>
          </figure>

          <t/>

          <t>Example Cache object that instructs the dCDN to ignore the
          (case-insensitive) query parameters named "sessionid" and
          "random":</t>

          <figure>
            <artwork><![CDATA[{
  "generic-metadata-type": "MI.Cache",
  "generic-metadata-value":
  {
    "ignore-query-string": ["sessionid", "random"]
  }
}
]]></artwork>
          </figure>
        </section>

        <section anchor="Auth" title="Auth">
          <t>An Auth object defines authentication and authorization methods
          to be used during content acquisition and content delivery,
          respectively.</t>

          <t>Note: This document does not define any Auth methods.
          Individual Auth methods are being defined separately (e.g.,
          URI Signing <xref target="I-D.ietf-cdni-uri-signing"/>).
          The GenericMetadata which contain Auth objects
          is defined herein for convenience and so as not to be
          specific to any particular Auth method.</t>

          <t><list style="empty">
              <t>Property: auth-type<list style="empty">
                  <t>Description: Auth type (The CDNI Payload Type 
                  <xref target="RFC7736"/> of the GenericMetadata
                  object contained in the auth-value property).</t>

                  <t>Type: String</t>

                  <t>Mandatory-to-Specify: Yes.</t>
                </list></t>
            </list> <list style="empty">
              <t>Property: auth-value<list style="empty">
                  <t>Description: An object conforming to the specification
                  associated with the Auth type.</t>

                  <t>Type: GenericMetadata Object</t>

                  <t>Mandatory-to-Specify: Yes.</t>
                </list></t>
            </list></t>

          <t>Example Auth object:</t>

          <figure>
            <artwork><![CDATA[{
  "generic-metadata-type": "MI.Auth",
  "generic-metadata-value":
  {
    "auth-type": <CDNI Payload Type of this Auth object>,
    "auth-value":
      {
        <Properties of this Auth object>
      }
  }
}
]]></artwork>
          </figure>

        </section>

        <section anchor="Grouping" title="Grouping">
          <t>A Grouping object identifies a group of content to which a
          given asset belongs.</t>

          <t><list style="empty">
              <t>Property: ccid<list style="empty">
                  <t>Description: Content Collection identifier for an
                  application-specific purpose such as logging aggregation.</t>

                  <t>Type: String</t>

                  <t>Mandatory-to-Specify: No. Default is an empty string.</t>
                </list></t>
            </list></t>

          <t>Example Grouping object that specifies a Content Collection
          Identifier for the content associated with
          the Grouping object's parent HostMetadata and PathMetadata:</t>

          <figure>
            <artwork><![CDATA[{
  "generic-metadata-type": "MI.Grouping",
  "generic-metadata-value":
  {
    "ccid": "ABCD"
  }
}
]]></artwork>
          </figure>
        </section>
      </section>

      <section anchor="simple-data-types"
               title="CDNI Metadata Simple Data Type Descriptions">
        <t>This section describes the simple data types that are used for
        properties of CDNI metadata objects.</t>

        <section anchor="Link" title="Link">
          <t>A Link object can be used in place of any of the objects or
          properties described above. Link objects can be used to avoid
          duplication if the same metadata information is repeated within the
          metadata tree. When a Link object replaces another object, its href
          property is set to the URI of the resource and its type property is
          set to the CDNI Payload Type of the object it is replacing.</t>

          <t>dCDNs can detect the presence of a Link object
          by detecting the presence of a property named "href"
          within the object. This means that GenericMetadata types MUST NOT
          contain a property named "href" because doing so would conflict with
          the ability for dCDNs to detect Link objects being used to reference
          a GenericMetadata object.</t>

          <t><list style="empty">
              <t>Property: href<list style="empty">
                  <t>Description: The URI of the addressable object being
                  referenced.</t>

                  <t>Type: String</t>

                  <t>Mandatory-to-Specify: Yes.</t>
                </list></t>
            </list> <list style="empty">
              <t>Property: type<list style="empty">
                  <t>Description: The type of the object being referenced.</t>

                  <t>Type: String</t>

                  <t>Mandatory-to-Specify: No. If the container
                  specifies the type (e.g., the HostIndex object
                  contains an array
                  of HostMatch objects, so a Link object in the list of
                  HostMatch objects must reference a HostMatch), then
                  it is not necessary to explicitly specify a type.</t>
                </list></t>
            </list></t>

          <t>Example Link object referencing a HostMatch object:</t>

          <figure>
            <artwork><![CDATA[{
  "type": "MI.HostMatch",
  "href": "https://metadata.ucdn.example/hostmatch1234"
}
]]></artwork>
          </figure>

          <t/>

          <t>Example Link object referencing a HostMatch object,
          without an explicit type, inside a HostIndex object:</t>

          <figure>
            <artwork><![CDATA[{
  "hosts": [
    {
      <Properties of embedded HostMatch object>
    },
    {
      "href": "https://metadata.ucdn.example/hostmatch1234"
    }
  ]
}
]]></artwork>
          </figure>
        </section>

        <section anchor="Protocol" title="Protocol">
          <t>Protocol objects are used to specify registered protocols for
          content acquisition or delivery (see <xref
          target="ProtocolReg"/>).</t>

          <t>Type: String</t>

          <t>Example:</t>

          <figure>
            <artwork><![CDATA["http/1.1"]]></artwork>
          </figure>
        </section>

        <section anchor="Endpoint" title="Endpoint">
          <t>A Hostname (with optional port) or an IP address (with optional
          port).</t>

          <t>All implementations MUST support IPv4 addresses encoded as
          specified by the 'IPv4address' rule in Section 3.2.2 of <xref
          target="RFC3986"/>. IPv6 addresses MUST be encoded in one of the
          IPv6 address formats specified in <xref target="RFC5952"/> although
          receivers MUST support all IPv6 address formats specified in <xref
          target="RFC4291"/>. Hostnames MUST conform to the Domain
          Name System (DNS) syntax defined in <xref target="RFC1034"/>  
          and <xref target="RFC1123"/>. Internationalized Domain Names
          (IDN) must first be transformed to the IDNA encoding as per
          <xref target="RFC3490"/>.</t>

          <t>Type: String</t>

          <t>Example Hostname:</t>

          <figure>
            <artwork><![CDATA["metadata.ucdn.example"]]></artwork>
          </figure>

          <t/>

          <t>Example IPv4 address:</t>

          <figure>
            <artwork><![CDATA["192.0.2.1"]]></artwork>
          </figure>

          <t/>

          <t>Example IPv6 address (with port number):</t>

          <figure>
            <artwork><![CDATA["[2001:db8::1]:81"]]></artwork>
          </figure>
        </section>

        <section anchor="Time" title="Time">
          <t>A time value expressed in seconds since the Unix epoch
          (i.e., zero hours, zero minutes, zero seconds, on January 1,
          1970) Coordinated Universal Time (UTC) <xref target="POSIX"/>.</t>

          <t>Type: Integer</t>

          <t>Example Time representing 09:00:00 01/01/2000 UTC:</t>

          <figure>
            <artwork><![CDATA[946717200]]></artwork>
          </figure>
        </section>

        <section anchor="IPv4CIDR" title="IPv4CIDR">
          <t>An IPv4address CIDR block encoded as specified by the
          'IPv4address' rule in Section 3.2.2 of <xref target="RFC3986"/>
          followed by a / followed by an unsigned integer representing the
          leading bits of the routing prefix (i.e., IPv4 CIDR notation). Single
          IP addresses can be expressed as /32.</t>

          <t>Type: String</t>

          <t>Example IPv4 CIDR:</t>

          <figure>
            <artwork><![CDATA["192.0.2.0/24"]]></artwork>
          </figure>
        </section>

        <section anchor="IPv6CIDR" title="IPv6CIDR">
          <t>An IPv6address CIDR block encoded in one of the IPv6 address
          formats specified in <xref target="RFC5952"/> followed by a /
          followed by an unsigned integer representing the leading bits of the
          routing prefix (i.e., IPv6 CIDR notation). Single IP addresses can be
          expressed as /128.</t>

          <t>Type: String</t>

          <t>Example IPv6 CIDR:</t>

          <figure>
            <artwork><![CDATA["2001:db8::/32"]]></artwork>
          </figure>
        </section>

        <section anchor="ASN" title="ASN">
          <t>An Autonomous System Number encoded as a string consisting of the
          characters "as" (in lowercase) followed by the Autonomous System
          number <xref target="RFC6793"/>.</t>

          <t>Type: String</t>

          <t>Example ASN:</t>

          <figure>
            <artwork><![CDATA["as64496"]]></artwork>
          </figure>
        </section>

        <section anchor="CountryCode" title="CountryCode">
          <t>An ISO 3166-1 alpha-2 code <xref target="ISO3166-1"/> in
          lowercase.</t>

          <t>Type: String</t>

          <t>Example Country Code representing the USA:</t>

          <figure>
            <artwork><![CDATA["us"]]></artwork>
          </figure>
        </section>
      </section>
    </section>

    <section anchor="metadata-capabilities" title="CDNI Metadata Capabilities">
      <t>CDNI metadata is used to convey information pertaining to content
      delivery from uCDN to dCDN. For optional metadata, it can be useful for
      the uCDN to know if the dCDN supports the underlying functionality
      described by the metadata, prior to delegating any content requests to
      the dCDN. If some metadata is "mandatory-to-enforce", and the dCDN does
      not support it, any delegated requests for content that requires that
      metadata will fail. The uCDN will likely want to avoid delegating those
      requests to that dCDN. Likewise, for any metadata which might be assigned
      optional values, it could be useful for the uCDN to know which values a
      dCDN supports, prior to delegating any content requests to that dCDN. If
      the optional value assigned to a given piece of content's metadata is
      not supported by the dCDN, any delegated requests for that content can
      fail, so again the uCDN is likely to want to avoid delegating those
      requests to that dCDN.</t>

      <t>The CDNI Footprint and Capabilities Interface (FCI)
      provides a means of advertising capabilities from
      dCDN to uCDN <xref target="RFC7336"/>.
      Support for optional metadata types and values
      can be advertised using the FCI.</t>
    </section>

    <section anchor="metadata-interface" title="CDNI Metadata interface">
      <t>This section specifies an interface to enable a dCDN to retrieve CDNI
      metadata objects from a uCDN.</t>

      <t>The interface can be used by a dCDN to retrieve CDNI metadata objects
      either:</t>

      <t><list style="symbols">
          <t>Dynamically as required by the dCDN to process received requests.
          For example in response to a query from an uCDN over the CDNI
          Request Routing Redirection interface (RI) <xref
          target="I-D.ietf-cdni-redirection"/> or in response to receiving a
          request for content from a User Agent. Or;</t>

          <t>In advance of being required. For example in the case of
          pre-positioned CDNI metadata acquisition, initiated through
          the "CDNI Control interface / Triggers" (CI/T) interface
          <xref target="I-D.ietf-cdni-control-triggers"/>.</t>
        </list></t>

      <t>The CDNI metadata interface is built on the principles of HTTP web
      services. In particular, this means that requests and responses over the
      interface are built around the transfer of representations of
      hyperlinked resources. A resource in the context of the CDNI metadata
      interface is any object in the object model (as described in <xref
      target="data-model"/> and <xref
      target="abstract-metadata-description"/>).</t>

      <t>To retrieve CDNI metadata, a CDNI metadata client (i.e., a client in
      the dCDN) first makes a HTTP GET request for the URI of the HostIndex
      which provides the CDNI metadata client with an array of Hostnames for
      which the uCDN can delegate content delivery to the dCDN. The CDNI
      metadata client can then obtain any other CDNI metadata objects by
      making a HTTP GET requests for any linked metadata objects it
      requires.</t>

      <t>CDNI metadata servers (i.e., servers in the uCDN) are free to assign
      whatever structure they desire to the URIs for CDNI metadata objects and
      CDNI metadata clients MUST NOT make any assumptions regarding the
      structure of CDNI metadata URIs or the mapping between CDNI metadata
      objects and their associated URIs. Therefore any URIs present in the
      examples in this document are purely illustrative and are not intended
      to impose a definitive structure on CDNI metadata interface
      implementations.</t>

      <section title="Transport">
        <t>The CDNI metadata interface uses HTTP as the underlying protocol
        transport <xref target="RFC7230"/>.</t>

        <t>The HTTP Method in the request defines the operation the request
        would like to perform. A server implementation of the CDNI metadata
        interface MUST support the HTTP GET and HEAD methods.</t>

        <t>The corresponding HTTP Response returns the status of the operation
        in the HTTP Status Code and returns the current representation of the
        resource (if appropriate) in the Response Body. HTTP Responses that contain a
        response body SHOULD include an ETag to enable validation of cached
        versions of returned resources.</t>

        <t>The CDNI metadata interface specified in this document is a
        read-only interface. A server implementation of the CDNI
        metadata interface MUST reject attempts by a CDNI metadata
        client to update the CDNI metadata, including all requests
        with HTTP Method PUT, POST or DELETE.</t>

        <t>As the CDNI metadata interface builds on top of HTTP, CDNI metadata
        server implementations MAY make use of any HTTP feature when
        implementing the CDNI metadata interface, for example, a CDNI metadata
        server MAY make use of HTTP's caching mechanisms to indicate that the
        returned response/representation can be reused without re-contacting
        the CDNI metadata server.</t>
      </section>

      <section title="Retrieval of CDNI Metadata resources">
        <t>In the general case, a CDNI metadata server makes CDNI metadata
        objects available via a unique URIs and thus, in order to retrieve
        CDNI metadata, a CDNI metadata client first makes a HTTP GET request
        for the URI of the HostIndex which provides
        an array of Hostnames for which the uCDN can delegate content
        delivery to the dCDN.</t>

        <t>In order to retrieve the CDNI metadata for a particular request the
        CDNI metadata client processes the received HostIndex object and finds
        the corresponding HostMetadata entry (by matching the hostname in the
        request against the hostnames listed in the HostMatch objects). If the
        HostMetadata is linked (rather than embedded), the CDNI metadata
        client then makes a GET request for the URI specified in the href
        property of the Link object which points to the HostMetadata object
        itself.</t>

        <t>In order to retrieve the most specific metadata for a particular
        request, the CDNI metadata client inspects the HostMetadata for
        references to more specific PathMetadata objects (by matching the URI
        path in the request against the path-patterns in any PathMatch
        objects listed in the HostMetadata object). If
        any PathMetadata are found to match (and are linked rather than
        embedded), the CDNI metadata client makes another GET request for the
        PathMetadata. Each PathMetadata object can also include references to
        yet more specific metadata. If this is the case, the CDNI metadata
        client continues requesting PathMatch and PathMetadata objects
        recursively. The CDNI metadata client repeats this approach of
        processing metadata objects and retrieving (via HTTP GETs) any linked
        objects until it has all the metadata objects it requires in order to
        process the redirection request from an uCDN or the content request from a
        User Agent.</t>

        <t>In cases where a dCDN is not able to retrieve the entire set of CDNI
   metadata associated with a User Agent request, or it has retrieved
   that metadata but it is stale according to standard HTTP caching
   rules and cannot be revalidated, for example because
   the uCDN is unreachable or returns a HTTP 4xx or 5xx status in
   response to some or all of the dCDN's CDNI metadata requests, the
   dCDN MUST NOT serve the requested content.</t>

        <t>Where a dCDN is interconnected with multiple uCDNs, the dCDN needs
        to determine which uCDN's CDNI metadata should be used to handle a
        particular User Agent request.</t>

        <t>When application level redirection (e.g., HTTP 302 redirects) is
        being used between CDNs, it is expected that the dCDN will be able to
        determine the uCDN that redirected a particular request from
        information contained in the received request (e.g., via the URI).
        With knowledge of which uCDN routed the request, the dCDN can choose
        the correct uCDN from which to obtain the HostIndex. Note that the
        HostIndexes served by each uCDN can be unique.</t>

        <t>In the case of DNS redirection there is not always sufficient
        information carried in the DNS request from User Agents to determine
        the uCDN that redirected a particular request (e.g., when content from
        a given host is redirected to a given dCDN by more than one uCDN) and
        therefore dCDNs will have to apply local policy when deciding which
        uCDN's metadata to apply.</t>
      </section>

      <section title="Bootstrapping">
        <t>The URI for the HostIndex object of a given uCDN needs to be
        configured in the dCDN. All other objects/resources
        are then discoverable from the HostIndex object by following any links
        in the HostIndex object and through the referenced HostMetadata and
        PathMetadata objects and their GenericMetadata sub-objects.</t>

        <t>Manual configuration of the URI for the HostIndex object is outside the
        scope of this document.</t>
      </section>

      <section anchor="Encoding" title="Encoding">
        <t>CDNI metadata objects MUST be encoded as I-JSON objects <xref
        target="RFC7493"/> containing a dictionary of (key,value) pairs where
        the keys are the property names and the values are the associated
        property values.</t>

        <t>The keys of the dictionary are the names of the properties
        associated with the object and are therefore dependent on the specific
        object being encoded (i.e., dependent on the CDNI Payload Type of the
        returned resource). Likewise, the values associated with each property
        (dictionary key) are dependent on the specific object being encoded
        (i.e., dependent on the CDNI Payload Type of the returned resource).</t>

        <t>Dictionary keys (properties) in I-JSON are case sensitive. By
        convention, any dictionary key (property) defined by this document (for
        example, the names of CDNI metadata object properties) MUST be
        lowercase.</t>
      </section>

      <section anchor="extensibility" title="Extensibility">
        <t>The set of GenericMetadata objects can be extended with additional
        (standards based or vendor specific) metadata objects through the
        specification of new GenericMetadata objects. The GenericMetadata
        object defined in <xref target="generic-metadata"/> specifies a type
        field and a type-specific value field that allows any metadata to be
        included in either the HostMetadata or PathMetadata arrays.</t>

        <t>As with the initial GenericMetadata types defined in <xref
        target="property-objects"/>, future GenericMetadata types MUST specify
        the information necessary for constructing and decoding the
        GenericMetadata object.</t>

        <t>Any document which defines a new GenericMetadata type MUST:</t>

        <t><list style="numbers">
            <t>Specify and register the CDNI Payload Type 
            <xref target="RFC7736"/> used to identify the new GenericMetadata
            type being specified.</t>

            <t>Define the set of properties associated with the new
            GenericMetadata object. GenericMetadata
            MUST NOT contain a property named "href" because doing so would
            conflict with the ability to detect Link objects
            (see <xref target="Link"/>).</t>

            <t>Define a name, description, type, and
            whether or not the property is mandatory-to-specify.</t>

            <t>Describe the semantics of the new type including its purpose
            and example of a use case to which it applies including an example
            encoded in I-JSON.</t>

            <t>Describe the security and privacy consequences, for
            both the user-agent and the CDN, of the new
            GenericMetadata object.</t>

            <t>Describe any relation to, conflict with, or obsolescence of
            other existing CDNI metadata objects.</t>
          </list></t>

        <t>Note: In the case of vendor specific extensions,
        vendor-identifying CDNI Payload Type names will decrease the
        possibility of GenericMetadata type collisions.</t>
      </section>

      <section title="Metadata Enforcement">
        <t>At any given time, the set of GenericMetadata types supported by
        the uCDN might not match the set of GenericMetadata types supported by
        the dCDN.</t>

        <t>In cases where a uCDN sends metadata containing a
        GenericMetadata type that a dCDN does not support, the dCDN MUST
        enforce the semantics of the "mandatory-to-enforce" property. If
        a dCDN does not understand or is unable to perform the functions
        associated with any "mandatory-to-enforce" metadata, the dCDN
        MUST NOT service any requests for the corresponding content.</t>

        <t>Note: Ideally, uCDNs would not delegate content requests to a dCDN
        that does not support the "mandatory-to-enforce" metadata associated
        with the content being requested. However, even if the uCDN has a
        priori knowledge of the metadata supported by the dCDN (e.g., via the
        FCI or through out-of-band negotiation between
        CDN operators), metadata support can fluctuate or be inconsistent
        (e.g., due to mis-communication, mis-configuration, or temporary
        outage). Thus, the dCDN MUST always evaluate all metadata associated
        with redirection and content requests and reject any requests
        where "mandatory-to-enforce" metadata associated with the content
        cannot be enforced.</t>
      </section>

      <section title="Metadata Conflicts">
        <t>It is possible that new metadata definitions will obsolete or
        conflict with existing GenericMetadata (e.g., a future revision of the
        CDNI metadata interface could redefine the Auth GenericMetadata object
        or a custom vendor extension could implement an alternate Auth metadata
        option). If multiple metadata (e.g., MI.Auth.v2, vendor1.Auth, and
        vendor2.Auth) all conflict with an existing GenericMetadata object
        (i.e., MI.Auth) and all are marked as "mandatory-to-enforce", it could
        be ambiguous which metadata should be applied, especially if the
        functionality of the metadata overlap.</t>

        <t>As described in <xref target="metadata-inheritance"/>, metadata
        override only applies to metadata objects of the same exact type
        found in HostMetadata and nested PathMetadata structures. The CDNI
        metadata interface does not support enforcement of dependencies
        between different metadata types. It is the responsibility of the CSP
        and the CDN operators to ensure that metadata assigned to a given
        piece of content do not conflict.</t>

        <t>Note: Because metadata is inherently ordered in
        HostMetadata and PathMetadata
        arrays, as well as in the PathMatch hierarchy,
        multiple conflicting metadata types MAY be used, however, metadata
        hierarchies SHOULD ensure that independent PathMatch root objects are
        used to prevent ambiguous or conflicting metadata definitions.</t>
      </section>

      <section title="Versioning">
        <t>The version of CDNI metadata objects is conveyed inside the
        CDNI Payload Type that is included in either the HTTP Content-Type
        header, for example: "Content-Type: application/cdni;
        ptype=MI.HostIndex", when retrieved via a link, or in the link
        type (<xref target="Link"/>), generic-metadata-type
        (<xref target="generic-metadata"/>), or auth-type
        (<xref target="Auth"/>) properties in the
        JSON payload.  The CDNI Payload Type uniquely identifies the
        specification defining that object, including any relation to,
        conflicts with, or obsolescence of other metadata.  There is
        no explicit version mapping requirement, however, for ease of
        understanding, metadata creators SHOULD make new versions of
        metadata easily visible via the CDNI Payload Type, e.g., by
        appending a version string.  Note: A version string is
        optional on the first version, e.g., MI.HostIndex, but could
        be added for subsequent versions, e.g.,
        MI.HostIndex.v2, MI.HostIndex.v3, etc.</t> 

        <t>In some cases, structural metadata
        <xref target="structural-objects"/> may be included without
        explicit type designation. [Ed. Note: There are a couple
        options here: 1) require that all structural metadata is
        referenced via link, so that the link type is present, or 2)
        require that all structural metadata be versioned together, so
        that one can always tell the version of an embedded structural
        object based on the version of the outer-most structural
        object, referenced in the Content-Type.]</t>

        <t>HTTP requests sent to a metadata server SHOULD include
        an Accept header with the CDNI Payload Type of
        the expected object. Metadata clients can specify multiple CDNI Payload Types
        in the Accept header, for example, if a metadata client is capable of
        processing two different versions of the same type of object (defined
        by different CDNI Payload Types) it might decide to include both in the Accept
        header.</t>
      </section>

      <section anchor="media-types" title="Media Types">
        <t>All CDNI metadata objects use the Media Type 
        "application/cdni". The CDNI Payload Type for each object then contains the
        object name of that object as defined by this document,
        prefixed with "MI.". <xref target="metadata-payload-types-table"/> lists the CDNI
        Payload Type for the metadata objects (resources) specified in this
        document.</t>

        <texttable anchor="metadata-payload-types-table"
                   title="CDNI Payload Types for CDNI Metadata objects">
          <ttcol>Data Object</ttcol>
          <ttcol>CDNI Payload Type</ttcol>

          <c>HostIndex</c>
          <c>MI.HostIndex</c>

          <c>HostMatch</c>
          <c>MI.HostMatch</c>

          <c>HostMetadata</c>
          <c>MI.HostMetadata</c>

          <c>PathMatch</c>
          <c>MI.PathMatch</c>

          <c>PatternMatch</c>
          <c>MI.PatternMatch</c>

          <c>PathMetadata</c>
          <c>MI.PathMetadata</c>

          <c>SourceMetadata</c>
          <c>MI.SourceMetadata</c>

          <c>Source</c>
          <c>MI.Source</c>

          <c>LocationACL</c>
          <c>MI.LocationACL</c>

          <c>LocationRule</c>
          <c>MI.LocationRule</c>

          <c>Footprint</c>
          <c>MI.Footprint</c>

          <c>TimeWindowACL</c>
          <c>MI.TimeWindowACL</c>

          <c>TimeWindowRule</c>
          <c>MI.TimeWindowRule</c>

          <c>TimeWindow</c>
          <c>MI.TimeWindow</c>

          <c>ProtocolACL</c>
          <c>MI.ProtocolACL</c>

          <c>ProtocolRule</c>
          <c>MI.ProtocolRule</c>

          <c>DeliveryAuthorization</c>
          <c>MI.DeliveryAuthorization</c>

          <c>Cache</c>
          <c>MI.Cache</c>

          <c>Auth</c>
          <c>MI.Auth</c>

          <c>Grouping</c>
          <c>MI.Grouping</c>
        </texttable>

        <t/>
      </section>

      <section title="Complete CDNI Metadata Example">
        <t>A dCDN requests the HostIndex and receive the following object
        with a CDNI payload type of "MI.HostIndex":</t>

        <figure>
          <artwork><![CDATA[{
  "hosts": [
    {
      "host": "video.example.com",
      "host-metadata" : {
        "type": "MI.HostMetadata",
        "href": "https://metadata.ucdn.example/host1234"
      }
    },
    {
      "host": "images.example.com",
      "host-metadata" : {
        "type": "MI.HostMetadata",
        "href": "https://metadata.ucdn.example/host5678"
      }
    }
  ]
}]]></artwork>
        </figure>

        <t>If the incoming request has a Host header with "video.example.com"
        then the dCDN would fetch the HostMetadata object from
        "https://metadata.ucdn.example/host1234" expecting a CDNI payload type of
        "MI.HostMetadata":</t>

        <figure>
          <artwork><![CDATA[{
  "metadata": [
    {
      "generic-metadata-type": "MI.SourceMetadata",
      "generic-metadata-value": {
        "sources": [
          {
            "endpoint": ["acq1.ucdn.example"],
            "protocol": "http/1.1"
          },
          {
            "endpoint": ["acq2.ucdn.example"],
            "protocol": "http/1.1"
          }
        ]
      }
    },
    {
      "generic-metadata-type": "MI.LocationACL",
      "generic-metadata-value": {
        "locations": [
          {
            "footprints": [
              {
                "footprint-type": "ipv4cidr",
                "footprint-value": ["192.0.2.0/24"]
              },
              {
                "footprint-type": "ipv6cidr",
                "footprint-value": ["2001:db8::/32"]
              },
              {
                "footprint-type": "countrycode",
                "footprint-value": ["us"]
              },
              {
                "footprint-type": "asn",
                "footprint-value": ["as64496"]
              }
            ],
            "action": "deny"
          }
        ]
      }
    },
    {
      "generic-metadata-type": "MI.ProtocolACL",
      "generic-metadata-value": {
        "protocol-acl": [
          {
            "protocols": [
              "http/1.1"
            ],
            "action": "allow"
          }
        ]
      }
    }
  ],
  "paths": [
    {
      "path-pattern": {
        "pattern": "/video/trailers/*"
      },
      "path-metadata": {
        "type": "MI.PathMetadata",
        "href": "https://metadata.ucdn.example/host1234/pathABC"
      }
    },
    {
      "path-pattern": {
        "pattern": "/video/movies/*"
      },
      "path-metadata": {
        "type": "MI.PathMetadata",
        "href": "https://metadata.ucdn.example/host1234/pathDEF"
      }
    }
  ]
}]]></artwork>
        </figure>

        <t>Suppose the path of the requested resource matches the
        "/video/movies/*" pattern, the next metadata requested would be for
        "https://metadata.ucdn.example/host1234/pathDCE" with an
        expected CDNI payload type
        of "MI.PathMetadata":</t>

        <figure>
          <artwork><![CDATA[{
  "metadata": [],
  "paths": [
    {
      "path-pattern": {
        "pattern": "/videos/movies/hd/*"
      },
      "path-metadata": {
        "type": "MI.PathMetadata",
        "href": 
          "https://metadata.ucdn.example/host1234/pathDEF/path123"
      }
    }
  ]
}]]></artwork>
        </figure>

        <t>Finally, if the path of the requested resource also matches the
        "/videos/movies/hd/*" pattern, the dCDN would also fetch the following
        object from "https://metadata.ucdn.example/host1234/pathDEF/path123" with
        CDNI payload type "MI.PathMetadata":</t>

        <figure>
          <artwork><![CDATA[{
  "metadata": [
    {
      "generic-metadata-type": "MI.TimeWindowACL",
      "generic-metadata-value": {
        "times": [
          "windows": [
            {
              "start": "1213948800",
              "end": "1327393200"
            }
          ],
          "action": "allow"
        ]
      }
    }
  ]
}]]></artwork>
        </figure>

        <t>The final set of metadata which applies to the requested
        resource includes a SourceMetadata, a LocationACL, a ProtocolACL,
        and a TimeWindowACL.</t>

      </section>
    </section>

    <section anchor="IANA" title="IANA Considerations">

      <section anchor="IANA.payload" title="CDNI Payload Types">

        <t>This document requests the registration of the following CDNI
        Payload Types under the IANA CDNI Payload Type registry:</t>

        <texttable>
          <ttcol align="left">Payload Type</ttcol>
          <ttcol align="left">Specification</ttcol>

          <c>MI.HostIndex</c>
          <c>RFCthis</c>

          <c>MI.HostMatch</c>
          <c>RFCthis</c>

          <c>MI.HostMetadata</c>
          <c>RFCthis</c>

          <c>MI.PathMatch</c>
          <c>RFCthis</c>

          <c>MI.PatternMatch</c>
          <c>RFCthis</c>

          <c>MI.PathMetadata</c>
          <c>RFCthis</c>

          <c>MI.SourceMetadata</c>
          <c>RFCthis</c>

          <c>MI.Source</c>
          <c>RFCthis</c>

          <c>MI.LocationACL</c>
          <c>RFCthis</c>

          <c>MI.LocationRule</c>
          <c>RFCthis</c>

          <c>MI.Footprint</c>
          <c>RFCthis</c>

          <c>MI.TimeWindowACL</c>
          <c>RFCthis</c>

          <c>MI.TimeWindowRule</c>
          <c>RFCthis</c>

          <c>MI.TimeWindow</c>
          <c>RFCthis</c>

          <c>MI.ProtocolACL</c>
          <c>RFCthis</c>

          <c>MI.ProtocolRule</c>
          <c>RFCthis</c>

          <c>MI.DeliveryAuthorization</c>
          <c>RFCthis</c>

          <c>MI.Cache</c>
          <c>RFCthis</c>

          <c>MI.Auth</c>
          <c>RFCthis</c>

          <c>MI.Grouping</c>
          <c>RFCthis</c>
        </texttable>

        <t>[RFC Editor: Please replace RFCthis with the published RFC
        number for this document.]</t>

        <section anchor="IANA.payload.HostIndex" title="CDNI MI HostIndex Payload Type">
          <t>Purpose: The purpose of this payload type is to
          distinguish HostIndex MI objects (and any associated capability
          advertisement)</t>
          <t>Interface: MI/FCI</t>
          <t>Encoding: see <xref target="HostIndex"/></t>
        </section>
        <section anchor="IANA.payload.HostMatch" title="CDNI MI HostMatch Payload Type">
          <t>Purpose: The purpose of this payload type is to
          distinguish HostMatch MI objects (and any associated capability
          advertisement)</t>
          <t>Interface: MI/FCI</t>
          <t>Encoding: see <xref target="HostMatch"/></t>
        </section>
        <section anchor="IANA.payload.HostMetadata" title="CDNI MI HostMetadata Payload Type">
          <t>Purpose: The purpose of this payload type is to
          distinguish HostMetadata MI objects (and any associated capability
          advertisement)</t>
          <t>Interface: MI/FCI</t>
          <t>Encoding: see <xref target="HostMetadata"/></t>
        </section>
        <section anchor="IANA.payload.PathMatch" title="CDNI MI PathMatch Payload Type">
          <t>Purpose: The purpose of this payload type is to
          distinguish PathMatch MI objects (and any associated capability
          advertisement)</t>
          <t>Interface: MI/FCI</t>
          <t>Encoding: see <xref target="PathMatch"/></t>
        </section>
        <section anchor="IANA.payload.PatternMatch" title="CDNI MI PatternMatch Payload Type">
          <t>Purpose: The purpose of this payload type is to
          distinguish PatternMatch MI objects (and any associated capability
          advertisement)</t>
          <t>Interface: MI/FCI</t>
          <t>Encoding: see <xref target="PatternMatch"/></t>
        </section>
        <section anchor="IANA.payload.PathMetadata" title="CDNI MI PathMetadata Payload Type">
          <t>Purpose: The purpose of this payload type is to
          distinguish PathMetadata MI objects (and any associated capability
          advertisement)</t>
          <t>Interface: MI/FCI</t>
          <t>Encoding: see <xref target="PathMetadata"/></t>
        </section>
        <section anchor="IANA.payload.SourceMetadata" title="CDNI MI SourceMetadata Payload Type">
          <t>Purpose: The purpose of this payload type is to
          distinguish SourceMetadata MI objects (and any associated capability
          advertisement)</t>
          <t>Interface: MI/FCI</t>
          <t>Encoding: see <xref target="SourceMetadata"/></t>
        </section>
        <section anchor="IANA.payload.Source" title="CDNI MI Source Payload Type">
          <t>Purpose: The purpose of this payload type is to
          distinguish Source MI objects (and any associated capability
          advertisement)</t>
          <t>Interface: MI/FCI</t>
          <t>Encoding: see <xref target="Source"/></t>
        </section>
        <section anchor="IANA.payload.LocationACL" title="CDNI MI LocationACL Payload Type">
          <t>Purpose: The purpose of this payload type is to
          distinguish LocationACL MI objects (and any associated capability
          advertisement)</t>
          <t>Interface: MI/FCI</t>
          <t>Encoding: see <xref target="LocationACL"/></t>
        </section>
        <section anchor="IANA.payload.LocationRule" title="CDNI MI LocationRule Payload Type">
          <t>Purpose: The purpose of this payload type is to
          distinguish LocationRule MI objects (and any associated capability
          advertisement)</t>
          <t>Interface: MI/FCI</t>
          <t>Encoding: see <xref target="LocationRule"/></t>
        </section>
        <section anchor="IANA.payload.Footprint" title="CDNI MI Footprint Payload Type">
          <t>Purpose: The purpose of this payload type is to
          distinguish Footprint MI objects (and any associated capability
          advertisement)</t>
          <t>Interface: MI/FCI</t>
          <t>Encoding: see <xref target="Footprint"/></t>
        </section>
        <section anchor="IANA.payload.TimeWindowACL" title="CDNI MI TimeWindowACL Payload Type">
          <t>Purpose: The purpose of this payload type is to
          distinguish TimeWindowACL MI objects (and any associated capability
          advertisement)</t>
          <t>Interface: MI/FCI</t>
          <t>Encoding: see <xref target="TimeWindowACL"/></t>
        </section>
        <section anchor="IANA.payload.TimeWindowRule" title="CDNI MI TimeWindowRule Payload Type">
          <t>Purpose: The purpose of this payload type is to
          distinguish TimeWindowRule MI objects (and any associated capability
          advertisement)</t>
          <t>Interface: MI/FCI</t>
          <t>Encoding: see <xref target="TimeWindowRule"/></t>
        </section>
        <section anchor="IANA.payload.TimeWindow" title="CDNI MI TimeWindow Payload Type">
          <t>Purpose: The purpose of this payload type is to
          distinguish TimeWindow MI objects (and any associated capability
          advertisement)</t>
          <t>Interface: MI/FCI</t>
          <t>Encoding: see <xref target="TimeWindow"/></t>
        </section>
        <section anchor="IANA.payload.ProtocolACL" title="CDNI MI ProtocolACL Payload Type">
          <t>Purpose: The purpose of this payload type is to
          distinguish ProtocolACL MI objects (and any associated capability
          advertisement)</t>
          <t>Interface: MI/FCI</t>
          <t>Encoding: see <xref target="ProtocolACL"/></t>
        </section>
        <section anchor="IANA.payload.ProtocolRule" title="CDNI MI ProtocolRule Payload Type">
          <t>Purpose: The purpose of this payload type is to
          distinguish ProtocolRule MI objects (and any associated capability
          advertisement)</t>
          <t>Interface: MI/FCI</t>
          <t>Encoding: see <xref target="ProtocolRule"/></t>
        </section>
        <section anchor="IANA.payload.DeliveryAuthorization" title="CDNI MI DeliveryAuthorization Payload Type">
          <t>Purpose: The purpose of this payload type is to
          distinguish DeliveryAuthorization MI objects (and any associated capability
          advertisement)</t>
          <t>Interface: MI/FCI</t>
          <t>Encoding: see <xref target="DeliveryAuthorization"/></t>
        </section>
        <section anchor="IANA.payload.Cache" title="CDNI MI Cache Payload Type">
          <t>Purpose: The purpose of this payload type is to
          distinguish Cache MI objects (and any associated capability
          advertisement)</t>
          <t>Interface: MI/FCI</t>
          <t>Encoding: see <xref target="Cache"/></t>
        </section>
        <section anchor="IANA.payload.Auth" title="CDNI MI Auth Payload Type">
          <t>Purpose: The purpose of this payload type is to
          distinguish Auth MI objects (and any associated capability
          advertisement)</t>
          <t>Interface: MI/FCI</t>
          <t>Encoding: see <xref target="Auth"/></t>
        </section>
        <section anchor="IANA.payload.Grouping" title="CDNI MI Grouping Payload Type">
          <t>Purpose: The purpose of this payload type is to
          distinguish Grouping MI objects (and any associated capability
          advertisement)</t>
          <t>Interface: MI/FCI</t>
          <t>Encoding: see <xref target="Grouping"/></t>
        </section>

      </section>

      <section anchor="FootprintReg"
               title="CDNI Metadata Footprint Types Registry">
        <t>The IANA is requested to create a new "CDNI Metadata Footprint
        Types" subregistry in the "Content Delivery Networks
        Interconnection (CDNI) Parameters" registry. The "CDNI
        Metadata Footprint Types" namespace defines the valid
        Footprint object type values used by the Footprint object in
        <xref target="Footprint"/>. Additions to the Footprint type namespace
        conform to the "Specification Required" policy as defined in <xref
        target="RFC5226"/>. The designated expert will verify that new type
        definitions do not duplicate existing type definitions and prevent
        gratuitous additions to the namespace. New registrations are
        required to provide a clear description of how to interpret
        new footprint types.</t>

        <t>The following table defines the initial Footprint Registry
        values:</t>

        <texttable>
          <ttcol align="left">Footprint Type</ttcol>
          <ttcol align="left">Description</ttcol>
          <ttcol align="left">Specification</ttcol>

          <c>ipv4cidr</c>
          <c>IPv4 CIDR address block</c>
          <c>RFCthis</c>

          <c>ipv6cidr</c>
          <c>IPv6 CIDR address block</c>
          <c>RFCthis</c>

          <c>asn</c>
          <c>Autonomous System (AS) Number</c>
          <c>RFCthis</c>

          <c>countrycode</c>
          <c>ISO 3166-1 alpha-2 code</c>

          <c>RFCthis</c>
        </texttable>

        <t>[RFC Editor: Please replace RFCthis with the published RFC
        number for this document.]</t>
      </section>

      <section anchor="ProtocolReg"
               title="CDNI Metadata Protocol Types Registry">
        <t>The IANA is requested to create a new "CDNI Metadata Protocol
        Types" subregistry in the "Content Delivery Networks
        Interconnection (CDNI) Parameters" registry. The "CDNI
        Metadata Protocol Types" namespace defines the valid Protocol
        object values in <xref target="Protocol"/>, used by the
        SourceMetadata and ProtocolACL objects. Additions to the Protocol
        namespace conform to the "Specification Required" policy as
        defined in <xref target="RFC5226"/>, where the specification
        defines the Protocol Type and the protocol to which it is
        associated. The designated expert will
        verify that new protocol definitions do not duplicate
        existing protocol definitions and prevent gratuitous additions
        to the namespace.</t>

        <t>The following table defines the initial Protocol values
        corresponding to the HTTP and HTTPS protocols:</t>

        <texttable>
          <ttcol align="left">Protocol Type</ttcol>
          <ttcol align="left">Description</ttcol>
          <ttcol align="left">Type Specification</ttcol>
          <ttcol align="left">Protocol Specifications</ttcol>

          <c>http/1.1</c>
          <c>Hypertext Transfer Protocol -- HTTP/1.1</c>
          <c>RFCthis</c>
          <c>RFC7230</c>

          <c>https/1.1</c>
          <c>HTTP/1.1 Over TLS</c>
          <c>RFCthis</c>
          <c>RFC7230, RFC2818</c>
        </texttable>

        <t>[RFC Editor: Please replace RFCthis with the published RFC
        number for this document.]</t>
      </section>
    </section>

    <section anchor="Security" title="Security Considerations">
      <t/>

      <section anchor="SecurityAuthentication" title="Authentication and Integrity">
        <t>A malicious metadata server, proxy server, or attacker,
        impersonating an authentic uCDN metadata interface without
        being detected, could provide false metadata to a dCDN
        that either:</t>

        <t><list style="symbols">
            <t>Denies service for one or more pieces of content to one or more
            User Agents; </t>

            <t>Directs dCDNs to contact malicious origin servers instead of
            the actual origin servers, and substitute legitimate
            content with malware or slanderous alternate content; or</t>

            <t>Removes delivery restrictions (e.g., LocationACL,
            TimeWindowACL, ProtocolACL, or Auth metadata), allowing
            access to content that would otherwise be denied, and thus
            possibly violating license restrictions and incurring
            unwarranted delivery costs.</t>
          </list></t>

        <t>Unauthorized access to metadata could also enable a malicious
        metadata client to continuously issue metadata requests in order
        to overload a uCDN's metadata server(s).</t>

        <t>Unauthorized access to metadata could further result in
        leakage of private information. A malicious metadata client
        could request metadata in order to gain access to origin
        servers, as well as information pertaining to content restrictions.</t>

        <t>An implementation of the CDNI metadata interface MUST use mutual
        authentication and message authentication codes to prevent
        unauthorized access to and undetected modification of metadata (see
        <xref target="SecurityImplementation"/>).</t>
      </section>

      <section anchor="SecurityConfidentiality" title="Confidentiality and Privacy">
        <t>Unauthorized viewing of metadata could result in leakage of private
        information. Content provider origin and policy information is
        conveyed through the CDNI metadata interface. A third party
        could intercept metadata transactions in order to gain access
        to origin servers, as well as information pertaining to
        content restrictions and usage patterns.</t>

        <t>Note: The distribution of metadata by a uCDN to dCDNs could
        introduce privacy concerns for some content providers, e.g.,
        dCDNs accepting content requests for a content provider's
        content might be able to obtain additional information and
        usage patterns relating to the users of a content provider's
        services. Content providers with concerns about divulging
        information to dCDNs can instruct their uCDN partners not to
        use CDNI when delivering their content.</t>

        <t>An implementation of the CDNI metadata interface MUST use strong
        encryption to prevent unauthorized interception or monitoring
        of metadata (see <xref target="SecurityImplementation"/>).</t>
      </section>

      <section anchor="SecurityImplementation" title="Securing the CDNI Metadata interface">
        <t>An implementation of the CDNI metadata interface MUST support TLS
        transport as per <xref target="RFC2818"/> and <xref
        target="RFC7230"/>.</t>

        <t>TLS MUST be used by the server-side (dCDN) and the
        client-side (uCDN) of the CDNI metadata interface, including
        authentication of the remote end, unless alternate methods are
        used for ensuring the security of the information in the CDNI
        metadata interface requests and responses (such as setting up
        an IPsec tunnel between the two CDNs or using a physically
        secured internal network between two CDNs that are owned by
        the same corporate entity).</t>

        <t>The use of TLS for transport of the CDNI metadata
        interface messages allows:</t>

        <t><list style="symbols">
            <t>The dCDN and uCDN to authenticate each other.</t>
          </list>and, once they have mutually authenticated each other, it
        allows:<list style="symbols">
            <t>The dCDN and uCDN to authorize each other (to ensure they are
            transmitting/receiving CDNI metadata requests and responses from
            an authorized CDN);</t>

            <t>CDNI metadata interface requests and responses to be
            transmitted with confidentiality; and</t>

            <t>The integrity of the CDNI metadata interface requests and
            responses to be protected during the exchange.</t>
          </list></t>

        <t>When TLS is used, the general TLS usage guidance in <xref
        target="RFC7525"/> MUST be followed.</t>
      </section>
    </section>

    <section anchor="Acknowledgements" title="Acknowledgements">
      <t>The authors would like to thank David Ferguson, Francois Le Faucheur,
      Jan Seedorf and Matt Miller for their valuable comments and input to
      this document.</t>
    </section>

    <section title="Contributing Authors">
      <t>[RFC Editor Note: Please move the contents of this section to the
      Authors' Addresses section prior to publication as an RFC.]</t>

      <figure>
        <artwork><![CDATA[Grant Watson
Velocix (Alcatel-Lucent)
3 Ely Road
Milton, Cambridge  CB24 6AA
UK

Email: gwatson@velocix.com

Kent Leung
Cisco Systems
3625 Cisco Way
San Jose, 95134
USA

Email: kleung@cisco.com
]]></artwork>
      </figure>
    </section>
  </middle>

  <back>
    <references title="Normative References">
      <?rfc include="reference.RFC.1034" ?>

      <?rfc include="reference.RFC.1123" ?>

      <?rfc include="reference.RFC.2119" ?>

      <?rfc include="reference.RFC.3490" ?>

      <?rfc include="reference.RFC.3986" ?>

      <?rfc include="reference.RFC.4291" ?>

      <?rfc include="reference.RFC.5226" ?>

      <?rfc include="reference.RFC.5952" ?>

      <?rfc include="reference.RFC.6707" ?>

      <?rfc include="reference.RFC.7525"?>

      <?rfc include="reference.RFC.7230" ?>

      <reference anchor="ISO3166-1">
        <front>
          <title>Codes for the representation of names of countries and their subdivisions -- Part 1: Country codes</title>

          <author>
            <organization abbrev="ISO">The International Organization for Standardization</organization>
          </author>

          <date year="2013"/>
        </front>
        <seriesInfo name="ISO" value="3166-1:2013"/>
      </reference>

      <reference anchor="POSIX">
        <front>
          <title>Information Technology Portable Operating System Interface (POSIX) Part 1: System Application Program Interface (API) [C Language]</title>

          <author>
            <organization abbrev="IEEE">Institute of Electrical and Electronics Engineers</organization>
          </author>

          <date year="1990"/>
        </front>
        <seriesInfo name="IEEE" value="P1003.1"/>
      </reference>

      <?rfc include="reference.RFC.7493" ?>
    </references>

    <references title="Informative References">
      <?rfc include="reference.RFC.7337"?>

      <?rfc include="reference.RFC.7336"?>

      <?rfc include="reference.RFC.7736"?>

      <?rfc include="reference.RFC.2818" ?>

      <?rfc include="reference.RFC.7540" ?>

      <?rfc include="reference.RFC.6793" ?>

      <?rfc include="reference.I-D.ietf-cdni-redirection"?>

      <?rfc include="reference.I-D.ietf-cdni-control-triggers"?>

      <?rfc include="reference.I-D.ietf-cdni-uri-signing"?>

    </references>
  </back>
</rfc>
