<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc SYSTEM "rfc2629.dtd">
<rfc docName="draft-rousskov-icap-trailers-00" updates="3507" ipr="trust200902" category="info" obsoletes="" submissionType="IETF" xml:lang="en">
  <front>
    <title>ICAP Trailers</title>
    <!--?xml version="1.0"? -->
    <author fullname="Alex Rousskov" initials="A." surname="Rousskov">
      <organization>The Measurement Factory</organization>
      <address>
        <!--<postal> <street>1200 Pearl Street, Suite 70</street> <city>Boulder</city> <region>CO</region> <code>80302</code> <country>US</country> </postal> -->
        <!--<email>rousskov@measurement-factory.com</email> -->
        <uri>http://www.measurement-factory.com/</uri>
      </address>
    </author>
    <date day="4" month="August" year="2016"/>
    <area>Applications</area>
    <keyword>ICAP</keyword>
    <keyword>I-D</keyword>
    <keyword>Internet-Draft</keyword>
    <keyword>Trailer</keyword>
    <abstract>
      <t>This document defines an ICAP trailer feature which allows ICAP agents to reliably send message metadata after the message body. The ICAP trailer is independent from the HTTP trailer that might also be encapsulated in an ICAP message. ICAP changes defined here are backward compatible and address a long-standing ICAP specification errata entry.</t>
    </abstract>
  </front>
  <middle>
    <section anchor="design" title="Motivation and Design Choices" toc="default">
      <t><xref target="RFC3507" pageno="false" format="default">ICAP</xref> specification says that the Trailer header field is "defined in ICAP the same as [...] in HTTP". Unfortunately, that phrase alone is not enough for trailer-related interoperability in the ICAP context because of the following conflicting interpretations, requirements, and needs: <list style="symbols"><t>Both ICAP and HTTP message headers might contain a Trailer field.</t><t>HTTP messages might contain HTTP trailers (that ICAP servers could be interested in receiving or even sending). An HTTP trailer can be present with or without an HTTP Trailer header field.</t><t>ICAP agents need to distinguish an HTTP trailer from an ICAP trailer.</t><t>HTTP uses <xref target="RFC7230" pageno="false" format="default">Chunked Transfer Coding</xref> to transmit trailers. The chunked coding is applied to the entire HTTP message body. This choice places an HTTP trailer inside an HTTP message body.</t><t>It is possible to interpret the ICAP specification as placing the ICAP trailer either inside the HTTP message body or inside the ICAP message body.</t><t>ICAP does not chunk-encode ICAP message bodies. Instead, ICAP message bodies contain a combination of zero, one, or two HTTP headers possibly followed by a chunked-encoded HTTP message body.</t><t>Chunked coding does not support multiple trailers: Chunked HTTP messages always contain exactly one (but possibly empty) trailer part.</t><t>HTTP effectively restricts trailers usage to messages with bodies, presumably because, without a body, the information in the trailer can usually be placed in the message header. In ICAP context, it is not obvious whether trailers ought to be restricted to messages with HTTP bodies (embedded in ICAP bodies) or to messages with ICAP bodies (that might only contain HTTP headers and no HTTP body).</t></list></t>
      <t>These problems led to a <xref target="Errata" pageno="false" format="default">ban on ICAP trailers</xref>.</t>
      <t>Several designs were considered for introducing proper ICAP trailers support: <list style="numbers"><t>Extend chunked coding to support multiple trailers (one for HTTP and one for ICAP). This option was rejected because many ICAP agents use existing HTTP-focused libraries to parse embedded HTTP bodies. As anecdotal evidence related to the ICAP-only "ieof" chunk extension support shows, it would be difficult to extend those libraries to handle a complicated ICAP-only extension. Also, this design would make it difficult to send an ICAP trailer when processing large HTTP messages without bodies.</t><t>Embed ICAP trailer fields inside the chunked HTTP message body trailer, using an ICAP-specific field name prefix (e.g., "ICAP-"). This option was rejected because it would either allow malicious HTTP messages to inject ICAP trailers or require ICAP clients to hide conflicting HTTP trailer fields from the ICAP server. This design also badly violates layering boundaries by mixing HTTP- and ICAP-level information in the same protocol structure.</t><t>Extend Encapsulated header with a "trailer" token. This option was rejected because the Encapsulated header describes embedded HTTP message parts and an ICAP trailer is not a part of any HTTP message. In other words, ICAP trailers do not get encapsulated.</t><t>Clarify the ICAP Trailer semantics (and transfer mechanism) without introducing any new trailer support-negotiation mechanism. This option was rejected because trailers affect message framing and many existing ICAP agent implementations cannot parse any form of trailers.</t><t>Add a new trailer support-negotiation mechanism (e.g., "Allow: trailers") and a new trailer presence-signaling mechanism (e.g., Trailer2) while leaving the poorly defined Trailer header semantics as is. This option was narrowly rejected because a new trailer support-negotiation mechanism alone was deemed sufficient to resolve conflicts between this specification and any reasonable existing implementation of the poorly defined Trailer semantics.</t><t>Add a new trailer support-negotiation mechanism and only clarify Trailer header semantics (and transfer mechanism) upon successful negotiation, while reusing the well-known Trailer header field name as the trailer presence-signaling mechanism (requiring successful support negotiation). This specification documents this design.</t></list></t>
    </section>
    <section anchor="uses" title="Use Cases" toc="default">
      <t>Trailers allow an ICAP agent to transmit metadata after the message body.  Such delayed transmission is useful when the same information was not available at the start of the message transmission. For example: <list style="symbols"><t>A client uses an ICAP trailer to relay the current HTTP/1.1 connection or HTTP/2 stream status after transmitting a large HTTP message. A server uses that information to optimize message analysis (e.g., skip or abort analysis of HTTP requests sent by already disconnected HTTP clients).</t><t>A server uses an ICAP trailer to relay audit information about viruses present at the end of a large HTTP message.</t><t>A server uses an ICAP trailer to relay prefetching information about HTML parts referenced from a large HTTP message.</t></list></t>
    </section>
    <section anchor="overall" title="Overall Operation" toc="default">
      <t>This section informally describes the overall feature operation. This description is deliberately imprecise and cannot be used to build compliant implementations. The following sections contain actual protocol requirements.</t>
      <t>To announce feature support, ICAP agents exchange "Allow: trailers" settings during an OPTIONS transaction. To send a trailer at the end of a particular REQMOD or RESPMOD transaction, the agent first sends both "Allow: trailers" and "Trailer" header fields. The Trailer field lists header field names expected in the message trailer section. After sending the entire ICAP message body, the agent sends the trailer section (a.k.a. "trailer"). The trailer section is syntactically equivalent to the ICAP message header section. The trailer section does not have to contain any of the promised fields and might even have no fields at all.</t>
      <t>A trailer makes sense only in an ICAP message with a body. However, a trailer could be sent if the ICAP message body encapsulates just HTTP headers.</t>
      <t>If a trailer is sent, its bytes are always the last bytes sent during the entire ICAP transaction. Thus, a client never sends a trailer at the end of Preview unless it sent the "ieof" chunk extension as well. Similarly, a server never a sends trailer with a 100 (Continue) control message.</t>
    </section>
    <section anchor="notations" title="Notations" toc="default">
      <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" pageno="false" format="default"/>.  Conformance criteria and error handling considerations are defined in Section 2.5 of <xref target="RFC7230" pageno="false" format="default"/>.</t>
      <t>This specification uses the Augmented Backus-Naur Form (ABNF) notation of <xref target="RFC5234" pageno="false" format="default"/> with a list extension defined in Section 7 of <xref target="RFC7230" pageno="false" format="default"/>. All syntax rules not explicitly defined in this specification (e.g., header-field and CRLF) are defined in (or included by reference from) <xref target="RFC7230" pageno="false" format="default"/>.</t>
      <t>The "Allow/X" notation is defined in <xref target="allow" pageno="false" format="default"/>.</t>
    </section>
    <section anchor="allow" title="Extended Use of the Allow Header Field" toc="default">
      <t>The use of the Allow header field defined in sections 4.6 and 4.10.2 of <xref target="RFC3507" pageno="false" format="default"/> is extended while preserving its original syntax and general semantics (i.e., a comma-separated list of tokens, each identifying an ICAP feature supported by the sending agent): <figure title="" suppress-title="false" align="left" alt="" width="" height=""><artwork xml:space="preserve" name="" type="" align="left" alt="" width="" height="">      Allow = 1#token</artwork></figure> <xref target="RFC3507" pageno="false" format="default"/> defines Allow usage in OPTIONS requests and responses. This specification extends Allow usage to other messages and adds "trailers" to the list of possible Allow value tokens.</t>
      <t>An agent MUST treat multiple Allow header fields as one Allow field with a comma-separated list of individual field value tokens, concatenated in the order of their appearance in the ICAP header. An ICAP agent MUST ignore Allow header tokens it does not understand. This document does not specify the significance of Allow tokens order and impact of repeated tokens.</t>
      <t>An agent MAY send an Allow header in any message. Such header contains a list of ICAP features supported by the sending agent. For example, a client could send an "Allow: trailers" in a REQMOD request and receive an "Allow: 204, trailers, 206" header field in response. The exact meaning of each Allow token in a context of its message is defined by the corresponding feature specification. By sending Allow, the agent indicates compliance with each listed feature's specification but does not necessarily commit to offer or use any of the listed features during future transactions.</t>
      <t>To keep this specification succinct, we introduce "Allow/X" notation to mean an ICAP Allow header field which value contains an "X" token, possibly among other tokens.  For example, "Allow/trailers" stands for an Allow header field with a "trailers" token and possibly other tokens. This notation covers multi-field Allow headers as well because they are equivalent to a combined single-field Allow header.</t>
      <t>The same approach to extending Allow header usage was successfully applied to the ICAP 206 extension (XXX: reference our expired ICAP icap-ext-partial-content draft). This specification is compatible with the ICAP 206 extension.</t>
    </section>
    <section anchor="syntax-message" title="Message Syntax" toc="default">
      <t>An ICAP message with a trailer is a concatenation of a regular ICAP message and an trailer section. The trailer section syntax is identical to the ICAP header syntax:</t>
      <figure title="" suppress-title="false" align="left" alt="" width="" height="">
        <artwork xml:space="preserve" name="" type="" align="left" alt="" width="" height="">      ICAP-message-without-trailer = &lt;see [RFC3507]&gt;
      ICAP-message-with-trailer    = ICAP-message-without-trailer
                                     trailer-section

      trailer-section = *( trailer-field CRLF )
                        CRLF
      trailer-field   = header-field</artwork>
      </figure>
      <t>Note that any trailer, even a trailer without fields, ends with CRLF.  That terminating sequence is essential for proper message framing on persistent ICAP connections.</t>
      <t>A sender MUST NOT generate a trailer section that contains a field necessary for message framing (e.g., Encapsulated, Preview, and Trailer), routing (e.g., Host), or authentication.</t>
    </section>
    <section anchor="syntax-trailer-field" title="Trailer Field Syntax" toc="default">
      <t>The ICAP Trailer header value syntax is identical to the <xref target="RFC7230" pageno="false" format="default">HTTP Trailer syntax</xref>:</t>
      <figure title="" suppress-title="false" align="left" alt="" width="" height="">
        <artwork xml:space="preserve" name="" type="" align="left" alt="" width="" height="">      Trailer = 1#field-name</artwork>
      </figure>
      <t>A Trailer header field sender SHOULD enumerate the names of all expected trailer fields. This a priori knowledge of trailer fields might help the recipient with trailer processing (e.g., certain message annotation actions could be delayed in anticipation of the trailer section). However, enumerating all expected trailer fields can be impractical or even impossible in some environments. A Trailer sender MAY send a trailer section with a set of field names that differs from the set of field names listed in the Trailer header field.</t>
      <t>This specification does not place any restriction on the order of field names in the Trailer header field. Senders SHOULD NOT generate duplicate names for the Trailer header field.</t>
    </section>
    <section anchor="client" title="Client Requirements" toc="default">
      <t>A client compliant with this specification SHOULD send Allow/trailers in each OPTIONS request. A non-authenticating server cannot be expected to mark an Allow/trailers-sending client specially, but this support announcement requirement is meant to minimize interoperability problems associated with servers sending Allow/trailers in OPTIONS responses. Some servers that do not support trailers might not be  able to ignore Allow/trailers in OPTIONS requests; therefore, a client SHOULD offer a configuration option or other means of disabling sending Allow/trailers in OPTIONS requests.</t>
      <t>An ICAP service sending Allow/trailers in OPTIONS response is called a trailers-supporting service. That service designation, maintained by the client, starts upon receiving the OPTIONS service response carrying Allow/trailers and lasts until OPTIONS expiration or a new OPTIONS response from that service.</t>
      <t>A client compliant with this specification SHOULD send Allow/trailers in each request to a trailers-supporting service. Doing so allows the service to respond with a trailer (and is also necessary for sending a client trailer, as detailed further below).</t>
      <t>A client receiving both a Trailer header field and Allow/trailers in the response MUST expect a trailer section in that response. In all other cases, a client MUST use the usual trailer-free ICAP response syntax. A client receiving a Trailer header field without Allow/trailers in a response MAY treat the response as syntactically malformed and MUST NOT reuse the connection for any other messages (including pending pipelined requests, if any).</t>
      <t>A client MAY send a trailer in any request that satisfies all of these conditions: <list style="numbers"><t>the request is sent to a trailers-supporting service;</t><t>the request has a body.</t></list> A client MUST NOT send a trailer in any other request.</t>
      <t>To send a trailer, the client MUST send Allow/trailers and a Trailer header field in the same request. A client MUST NOT send a combination of those two header fields without sending a trailer.</t>
    </section>
    <section anchor="server" title="Server Requirements" toc="default">
      <t>A server compliant with this specification SHOULD send Allow/trailers in each successful response to an OPTIONS request carrying Allow/trailers.  Although <xref target="RFC3507" pageno="false" format="default">ICAP/1.0</xref> allows a list of features in the Allow header, some ICAP clients might not be able to handle an Allow header other than "Allow: 204"; therefore, a server SHOULD NOT send Allow/trailers in a response to a request without Allow/trailers.</t>
      <t>A server compliant with this specification MAY send Allow/trailers in a response without a trailer to a request with Allow/trailers. The client receiving a no-trailer REQMOD or RESPMOD response with Allow/trailers ought to ignore Allow/trailers. Nevertheless, the server is allowed to respond with Allow/trailers in this context because doing so might simplify server implementation and configuration.</t>
      <t>A server receiving both a Trailer header field and Allow/trailers in the request MUST expect a trailer in that request. In all other cases, a server MUST use the usual trailer-free ICAP request syntax. A server receiving a Trailer header field without Allow/trailers in a request MAY treat the request as syntactically malformed and MUST NOT reuse the connection for any future requests.</t>
      <t>A server MAY send a trailer in any response that satisfies all of these conditions: <list style="numbers"><t>the response is for a request containing Allow/trailers;</t><t>the response has a body.</t></list> A server MUST NOT send a trailer in any other response.</t>
      <t>To send a trailer, the server MUST send Allow/trailers and a Trailer header field in the same response. A server MUST NOT send a combination of those two header fields without sending a trailer.</t>
    </section>
    <section anchor="examples" title="Examples" toc="default">
      <t>The following examples illustrate trailer exchanges between ICAP agents compliant with this specification. To show important details, all CRLF sequences after major message parts are shown as "\r\n" lines. CRLF sequences at the end of other lines are implied.</t>
      <t>All REQMOD and RESPMOD messages in these examples share the context of the following OPTIONS handshake.</t>
      <figure anchor="fig_options" title="OPTIONS handshake" suppress-title="false" align="left" alt="" width="" height="">
        <preamble><xref target="fig_options" pageno="false" format="default"/> shows an OPTIONS request and response when both the client and the server are compliant with this specification. The client also supports the ICAP 206 extension, but the server does not.</preamble>
        <artwork xml:space="preserve" name="" type="" align="left" alt="" width="" height="">      OPTIONS icap://example.net/sample-service ICAP/1.0
      Host: example.net
      User-Agent: Example-ICAP-Client/1.2
      Allow: 204, trailers, 206
      \r\n
      ICAP/1.0 200 OK
      Date: Sat, 13 Aug 2016 12:17:21 GMT
      Methods: RESPMOD
      Service: FOO Tech Server 1.0
      ISTag: "W3E4R7U9-L2E4-2"
      Encapsulated: null-body=0
      Max-Connections: 1000
      Options-TTL: 7200
      Allow: 204
      Allow: trailers
      Preview: 0
      Transfer-Complete: asp, bat, exe, com
      Transfer-Ignore: html
      Transfer-Preview: *
      \r\n</artwork>
      </figure>
      <t>The OPTIONS response in <xref target="fig_options" pageno="false" format="default"/> contains two Allow headers to illustrate one of several possible implementations. A compliant server can also send a single Allow header with a list of values, just like the client does in the above example.</t>
      <figure anchor="fig_request_trailer" title="Request Trailer" suppress-title="false" align="left" alt="" width="" height="">
        <preamble><xref target="fig_request_trailer" pageno="false" format="default"/> is a RESPMOD request with an ICAP trailer that the client can send after receiving an OPTIONS response with Allow/trailers shown in <xref target="fig_options" pageno="false" format="default"/>. Note that Trailer field value does not match the actual fields in the trailer.</preamble>
        <artwork xml:space="preserve" name="" type="" align="left" alt="" width="" height="">      RESPMOD icap://example.net/sample-service ICAP/1.0
      Host: example.net
      User-Agent: Example-ICAP-Client/1.2
      Allow: 204, trailers
      Trailer: TBD
      Encapsulated: req-hdr=0, res-hdr=131, res-body=292
      \r\n
      GET /origin-resource HTTP/1.1
      Host: www.example.com
      Accept: text/html, text/plain, image/gif
      Accept-Encoding: gzip, compress
      \r\n
      HTTP/1.1 200 OK
      Date: Sat, 13 Aug 2016 12:17:22 GMT
      Server: Testserver/1.0 (Unix)
      ETag: "63840-1ab7-378d415b"
      Content-Type: text/html
      Content-Length: 24
      \r\n
      18
      Origin server sent this.
      0
      \r\n
      X-Client-Log-Lineno: 15612570
      X-Client-Status: disconnected (at 1470262108)
      \r\n</artwork>
      </figure>
      <figure anchor="fig_two_trailers" title="Two Trailers" suppress-title="false" align="left" alt="" width="" height="">
        <preamble><xref target="fig_two_trailers" pageno="false" format="default"/> is a RESPMOD response with an HTTP and ICAP trailers. The ICAP trailer contains X-Threat-Found and Connection field. To respond with an ICAP trailer, the server ought to receive Allow/trailers in the corresponding ICAP request.</preamble>
        <artwork xml:space="preserve" name="" type="" align="left" alt="" width="" height="">      ICAP/1.0 200 OK
      Date: Sat, 13 Aug 2016 12:17:23 GMT
      Server: ICAP-Server-Software/1.0
      Connection: keep-alive
      ISTag: "W3E4R7U9-L2E4-2"
      Encapsulated: res-hdr=0, res-body=276
      Allow: trailers
      Trailer: X-ICAP-Log-Lineno, X-Threat-Found
      \r\n
      HTTP/1.1 200 OK
      Date: Sat, 13 Aug 2016 12:17:22 GMT
      Server: Testserver/1.0 (Unix)
      ETag: "63840-1ab7-378d415b"
      Content-Type: text/html
      Content-Length: 24
      Trailer: X-Content-Checksum
      \r\n
      18
      Origin server sent this.
      0
      X-Content-Checksum: sha-short=366bc24373b
      \r\n
      X-Threat-Found: Type=0; Resolution=1; Threat=plain-text
      Connection: close
      \r\n</artwork>
      </figure>
      <t>XXX: Polish and validate offsets, lengths, etc. TODO: Figure out how to keep figure descriptions and figures on the same page without inserting empty space into HTML rendering of the draft.</t>
    </section>
    <section anchor="sec" title="Security Considerations" toc="default">
      <t>Proper trailer support reduces old <xref target="RFC3507" pageno="false" format="default">ICAP</xref> security concerns because implementations unaware of trailer complexities are arguably more likely to misbehave when receiving HTTP or ICAP trailers.</t>
      <t>Sending request headers with multiple Allow tokens could crash poor-quality ICAP servers unaware of this specification. Trailer support negotiation rules partially mitigate that risk by restricting unaware implementations exposure; such implementations are exposed only during OPTIONS exchanges. Since OPTIONS transaction has to precede any HTTP message processing, and since virtually all ICAP client-server relationships are stable, most poor-quality implementations would be detected early and reliably.</t>
      <t>A naive implementation of trailer interpretation logic might update an already "frozen" or "committed" (at header parsing time) state of the ICAP transaction or connection, resulting in crashes and other problems. For example, such an implementation could panic after discovering a Connection trailer field value that contradicts the Connection header field value that has already been received and processed at the beginning of the same transaction.</t>
    </section>
  </middle>
  <back>
    <references title="Normative References">
      <!--?xml version='1.0' encoding='UTF-8'? -->
      <reference anchor="RFC2119" target="http://www.rfc-editor.org/info/rfc2119">
        <front>
          <title>Key words for use in RFCs to Indicate Requirement Levels</title>
          <author initials="S." surname="Bradner" fullname="S. Bradner">
            <organization/>
          </author>
          <date year="1997" month="March"/>
          <abstract>
            <t>In many standards track documents several words are used to signify the requirements in the specification.  These words are often capitalized. This document defines these words as they should be interpreted in IETF documents.  This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
          </abstract>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="2119"/>
        <seriesInfo name="DOI" value="10.17487/RFC2119"/>
      </reference>
      <!--?xml version='1.0' encoding='UTF-8'? -->
      <reference anchor="RFC3507" target="http://www.rfc-editor.org/info/rfc3507">
        <front>
          <title>Internet Content Adaptation Protocol (ICAP)</title>
          <author initials="J." surname="Elson" fullname="J. Elson">
            <organization/>
          </author>
          <author initials="A." surname="Cerpa" fullname="A. Cerpa">
            <organization/>
          </author>
          <date year="2003" month="April"/>
          <abstract>
            <t>ICAP, the Internet Content Adaption Protocol, is a protocol aimed at providing simple object-based content vectoring for HTTP services.  ICAP is, in essence, a lightweight protocol for executing a "remote procedure call" on HTTP messages.  It allows ICAP clients to pass HTTP messages to ICAP servers for some sort of transformation or other processing ("adaptation").  The server executes its transformation service on messages and sends back responses to the client, usually with modified messages.  Typically, the adapted messages are either HTTP requests or HTTP responses.  This memo provides information for the Internet community.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="3507"/>
        <seriesInfo name="DOI" value="10.17487/RFC3507"/>
      </reference>
      <!--?xml version='1.0' encoding='UTF-8'? -->
      <reference anchor="RFC5234" target="http://www.rfc-editor.org/info/rfc5234">
        <front>
          <title>Augmented BNF for Syntax Specifications: ABNF</title>
          <author initials="D." surname="Crocker" fullname="D. Crocker" role="editor">
            <organization/>
          </author>
          <author initials="P." surname="Overell" fullname="P. Overell">
            <organization/>
          </author>
          <date year="2008" month="January"/>
          <abstract>
            <t>Internet technical specifications often need to define a formal syntax.  Over the years, a modified version of Backus-Naur Form (BNF), called Augmented BNF (ABNF), has been popular among many Internet specifications.  The current specification documents ABNF. It balances compactness and simplicity with reasonable representational power.  The differences between standard BNF and ABNF involve naming rules, repetition, alternatives, order-independence, and value ranges.  This specification also supplies additional rule definitions and encoding for a core lexical analyzer of the type common to several Internet specifications.  [STANDARDS-TRACK]</t>
          </abstract>
        </front>
        <seriesInfo name="STD" value="68"/>
        <seriesInfo name="RFC" value="5234"/>
        <seriesInfo name="DOI" value="10.17487/RFC5234"/>
      </reference>
      <!--?xml version='1.0' encoding='UTF-8'? -->
      <reference anchor="RFC7230" target="http://www.rfc-editor.org/info/rfc7230">
        <front>
          <title>Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing</title>
          <author initials="R." surname="Fielding" fullname="R. Fielding" role="editor">
            <organization/>
          </author>
          <author initials="J." surname="Reschke" fullname="J. Reschke" role="editor">
            <organization/>
          </author>
          <date year="2014" month="June"/>
          <abstract>
            <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems.  This document provides an overview of HTTP architecture and its associated terminology, defines the "http" and "https" Uniform Resource Identifier (URI) schemes, defines the HTTP/1.1 message syntax and parsing requirements, and describes related security concerns for implementations.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="7230"/>
        <seriesInfo name="DOI" value="10.17487/RFC7230"/>
      </reference>
      <reference anchor="Errata" target="http://www.measurement-factory.com/std/icap/">
        <front>
          <title>RFC 3507 Errata</title>
          <author fullname="Various Authors" initials="" surname="Various Authors">
            <organization/>
          </author>
          <date/>
        </front>
        <!--format type='HTML' target='http://www.measurement-factory.com/std/icap/' -->
      </reference>
    </references>
    <!--<references title="Informative References"> <reference anchor='Forum' target="http://tech.groups.yahoo.com/group/ICAP-Discussions/messages"> <front> <title>Discussion list, messages 570-579.</title> <author fullname="ICAP Forum" initials="" surname="ICAP Forum"/> <date /> </front> </reference> </references> -->
  </back>
</rfc>
