<?xml version="1.0"?>
<?xml-stylesheet type='text/xsl'
	href='http://xml.resource.org/authoring/rfc2629.xslt' ?>

<?rfc strict='yes' ?>
<?rfc toc='yes' ?>
<?rfc symrefs='yes' ?>
<?rfc editing='no' ?>

<?rfc include='ocp-core-entities.xml' ?>

<!DOCTYPE rfc SYSTEM "rfc2629.dtd">

<rfc ipr="full2026" docName="draft-ietf-opes-http-02">

<front>
	<title>HTTP adaptation with OPES</title>

	<?rfc include='author.rousskov.xml' ?>
	<?rfc include='author.stecher.xml' ?>

	<date day="14" month="January" year="2004" />

	<area>Applications</area>
	<workgroup>Open Pluggable Edge Services</workgroup>
	<keyword>Internet-Draft</keyword>
	<keyword>HTTP</keyword>
	<keyword>callout protocol</keyword>
	<keyword>adaptation</keyword>
	<keyword>OCP</keyword>
	<keyword>OPES tracing</keyword>
	<keyword>OPES bypass</keyword>

	<abstract>

		<t>Open Pluggable Edge Services (OPES) framework documents several
		application-agnostic mechanisms such as OPES tracing, OPES bypass, and
		OPES callout protocol. This document extends those generic mechanisms
		for Hypertext Transfer Protocol (HTTP) adaptation.  Together,
		application-agnostic OPES documents and this HTTP profile constitute a
		complete specification for HTTP adaptation with OPES.</t>

	</abstract>

</front>

<middle>

<section anchor="intro" title="Scope">

	<t>The Open Pluggable Edge Services (OPES) framework documents several
	application-agnostic mechanisms such as <xref
	target="I-D.ietf-opes-end-comm"> OPES processor and endpoints
	communications</xref> or <xref target="I-D.ietf-opes-ocp-core">OPES
	callout protocol</xref>.  This document extends those generic mechanisms
	for adaptation of a specific application protocol, <xref
	target="RFC2616">HTTP</xref>. Together, application-agnostic OPES
	documents and this HTTP profile constitute a complete specification for
	HTTP adaptation with OPES.</t>

	<t>The primary sections of this document specify HTTP-specific extensions
	for the corresponding application-agnostic mechanisms documented
	elsewhere.</t>

</section>

<section anchor="section_opes-map" title="OPES Document Map">

	<t>This document belongs to a large set of OPES specifications produced by
	the IETF OPES Working Group. Familiarity with the overall OPES approach
	and typical scenarios is often essential when trying to comprehend
	isolated OPES documents. This section provides an index of OPES documents
	to assist the reader with finding "missing" information.</t>

	<t><list style="symbols">

		<t>The document on <xref target="I-D.ietf-opes-scenarios">"OPES
		Use Cases and Deployment Scenarios"</xref> describes a set of services
		and applications that are considered in scope for OPES and have been
		used as a motivation and guidance in designing the OPES
		architecture.</t>

		<t>The OPES architecture and common terminology are described in <xref
		target="I-D.ietf-opes-architecture">"An Architecture for Open
		Pluggable Edge Services (OPES)"</xref>.</t>

		<t><xref target="I-D.ietf-opes-authorization">"Policy,
		Authorization and Enforcement Requirements of OPES"</xref> outlines
		requirements and assumptions on the policy framework, without
		specifying concrete authorization and enforcement methods.</t>

		<t><xref target="I-D.ietf-opes-threats">"Security Threats and
		Risks for OPES"</xref> provides OPES risk analysis, without
		recommending specific solutions.</t>

		<t><xref target="I-D.ietf-opes-iab">"OPES Treatment of IAB Considerations"</xref> 
		addresses all architecture-level considerations expressed by the IETF
		Internet Architecture Board (IAB) when the OPES WG was chartered.</t>

		<t>At the core of the OPES architecture are the OPES processor and the
		callout server, two network elements that communicate with each other
		via an OPES Callout Protocol (OCP). The requirements for such protocol
		are discussed in <xref
		target="I-D.ietf-opes-protocol-reqs">"Requirements for OPES
		Callout Protocols"</xref>.</t>

		<t><xref target="I-D.ietf-opes-ocp-core">"OPES Callout Protocol
		Core"</xref> specifies an application agnostic protocol core to be
		used for the communication between OPES processor and callout
		server.</t>

		<t><xref target="I-D.ietf-opes-end-comm">"OPES entities and
		end points communications"</xref> specifies generic tracing and bypass
		mechanisms for OPES.</t>

		<t>The OCP Core and Communications documents are independent from the
		application protocol being adapted by OPES entities. Their generic
		mechanisms have to be complemented by application-specific profiles.
		This document, HTTP adaptation with
		OPES, is such an application profile for HTTP.  It specifies
		how application-agnostic OPES mechanisms are to be used and augmented
		in order to support adaptation of HTTP messages.</t>

		<t>Finally, <xref target="I-D.ietf-opes-rules-p">"P: Message
		Processing Language"</xref> defines a language for specifying what
		OPES adaptations (e.g, translation) must be applied to what
		application messages (e.g., e-mail from bob@example.com). P language
		is meant for configuring application proxies (OPES processors).</t>

	</list></t>

</section> <!-- section_opes-map -->


<section anchor="section_ocp" title="Callout Protocol">

	<t>This section documents the HTTP profile for the OPES Callout Protocol
	(OCP) Core <xref target="I-D.ietf-opes-ocp-core" />.  Familiarity with OCP
	Core is required to understand the HTTP profile. This section uses OCP
	Core conventions, terminology, and mechanisms.</t>

	<t>OPES processor communicates its desire to adapt HTTP messages via a
	&NO_t; message with HTTP-specific feature identifiers documented in <xref
	target="section_ocp-app-profile" />. HTTP-specific OCP optimization
	mechanisms can be negotiated at the same time.  A callout server that
	supports adaptation of HTTP messages has a chance to negotiate what HTTP
	message parts will participate in adaptation, including negotiation of HTTP
	request parts as metadata for HTTP response adaptation. Negotiable HTTP
	message parts are documented in <xref target="section_ocp-msg-parts"
	/>.</t>

	<t>HTTP profile introduces a new parameter for the &AMS_t; message to
	communicate known HTTP message length (HTTP headers often do not convey
	length information reliably or at all). This parameter is documented in
	<xref target="section_ams-messages" />. <xref
	target="section_dum-messages" /> documents a mechanism to report HTTP
	message part with &DUM_t; messages.</t>

	<t>The remaining OCP sections document various OCP marshaling corner cases
	such as handling of HTTP transfer encodings and 100 Continue
	responses.</t>

<section anchor="section_ocp-msg-parts" title="Application Message Parts">

	<t>An HTTP message may have several well-known parts: headers, body, and
	trailers. HTTP OPES processors are likely to have information about HTTP
	message parts because they have to isolate and interpret HTTP headers and
	find HTTP message boundaries. Callout servers may either not care about
	certain parts or may benefit from reusing HTTP OPES processor work on
	isolating and categorizing interesting parts.</t>

	<t>The following is the declaration of am-part (application message part)
	type using OCP Core Protocol Element Type Declaration Mnemonic
	(PETDM):</t>

	<t><figure anchor="figure_am-part">
		<artwork trimspace="yes">
			am-part:  extends atom;
			am-parts: extends list of am-part;
		</artwork>
	</figure></t>

	<t>The following six "am-part" atoms are valid values:</t>

	<t><list style="hanging">

	<t hangText="request-header:">The start-line of an HTTP request message,
	all request message headers, and the CRLF separator at the end of HTTP
	headers (compare with section 4.1 of <xref target="RFC2616" />).</t>

	<t hangText="request-body:">The message body of an HTTP request message as
	defined in section 4.3 of <xref target="RFC2616" /> but not including the
	trailer.</t>

	<t hangText="request-trailer:">The entity headers of the trailer of an
	HTTP request message in chunked transfer encoding.  This part follows the
	same syntax as the trailer defined in section 3.6.1 of <xref
	target="RFC2616" />.</t>

	<t hangText="response-header:">The start-line of an HTTP response message,
	all response message headers, and the CRLF separator at the end of HTTP
	headers (compare with section 4.1 of <xref target="RFC2616" />).</t>

	<t hangText="response-body:">The message body of an HTTP response message
	as defined in section 4.3 of <xref target="RFC2616" /> but not including
	the trailer.</t>

	<t hangText="response-trailer:">The entity headers of the trailer of an
	HTTP response message in chunked transfer encoding.  This part follows the
	same syntax as the trailer defined in section 3.6.1 of <xref
	target="RFC2616" />.</t>

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

<section anchor="section_ocp-app-profile" title="Application Profile Features">

	<t>This document defines two HTTP profiles for OCP: request and response
	profiles. These two profiles are described below. Each profile has a
	unique feature identifier, a list of original application message parts,
	and a list of adapted application message parts:</t>
	
	<t><list style="hanging">

		<t hangText="profile ID:">http://iana.org/opes/ocp/HTTP/request<list
		style="hanging">

			<t hangText="original request parts:">request-header,
			request-body, request-trailer</t>

			<t hangText="adapted request parts:">request-header, request-body,
			request-trailer</t>

			<t hangText="adapted response parts:">response-header,
			response-body, response-trailer</t>

		</list></t>

		<t hangText="profile ID:">http://iana.org/opes/ocp/HTTP/response<list
		style="hanging">

			<t hangText="original transaction parts:">request-header (aux),
			request-body (aux), request-trailer (aux), response-header,
			response-body, response-trailer</t>

			<t hangText="adapted response parts:">response-header,
			response-body, response-trailer</t>

		</list></t>

	</list></t>
	
	<t>The request profile contains two variants of adapted part lists: HTTP
	request parts and HTTP response parts. Parts marked with an "(aux)" suffix
	are auxiliary parts that can only be used if explicitly negotiated for a
	profile. See <xref target="section_ocp-app-profile_parts" /> for specific
	rules governing negotiation and use of am-parts.</t>

	<t>The scope of a negotiated profile is the OCP connection (default)
	or the service group specified via the SG parameter.</t>
	
	<section anchor="section_ocp-app-profile_parts" title="Profile Parts">

		<t>An OCP agent MUST send application message parts in the order
		implied by the profile parts lists above. An OCP agent receiving an
		out-of-order part MAY terminate the transaction with an error.</t>
	
		<t>An OPES processor MUST NOT send parts that are not listed as
		"original" in the negotiated profile. An callout server MUST NOT send
		parts that are not listed as "adapted" in the negotiated profile.  An
		OCP agent receiving an not-listed part MUST terminate the transaction
		with an error. The informal rationale for the last requirement is to
		reduce the number of subtle interoperability problems where an agent
		thinks that the parts it is sending are understood/used by the other
		agent when, in fact, they are being ignored or skipped because they
		are not expected.</t>
		
		<t>Some HTTP messages lack certain parts. For example, many HTTP
		requests do not have bodies, and most HTTP messages do not have
		trailers. An OCP agent MUST NOT send (i.e., must skip) absent
		application message parts.</t>
		
		<t>An OCP agent MUST send present non-auxiliary parts and it MUST send
		those present auxiliary parts that were negotiated via the <xref
		target="section_aux-parts">Aux-Parts</xref> parameter. OCP agents MUST
		NOT send auxiliary parts that were not negotiated via the <xref
		target="section_aux-parts">Aux-Parts</xref> parameter.</t>

		<t>An OCP agent receiving a message part in violation of the above
		requirements MAY terminate the corresponding transaction with an
		error.</t>

		<t>By design, original parts not included in the adapted parts list
		cannot be adapted. In other words, a callout service can only adapt
		parts in the adapted parts list even though it may have access to
		other parts.</t>

		<t>In the request profile, the callout server MUST send either adapted
		request parts or adapted response parts.  An OPES processor receiving
		adapted flow with application message parts from both lists (in
		violation of the previous rule) MUST terminate the OCP transaction
		with an error.  Informally, the callout server sends adapted response
		parts to "short-circuit" the HTTP transaction, forcing the OPES
		processor to return an HTTP response without forwarding an adapted
		HTTP request.  This short-circuiting is useful for responding, for
		example, to an HTTP request that the callout service defines as
		forbidden.</t>
		
		<t>Unless explicitly configured to do otherwise, an OPES processor
		MUST offer all non-auxiliary original parts in &NO_t; messages.  See
		<xref target="section_ocp-100C" /> for this rule rationale and
		examples of harmful side-effects from selective adaptation.</t>
		
	</section>

	<section anchor="section_ocp-app-profile_neg" title="Profile Structure">

		<t>An HTTP application profile feature extends semantics of the
		feature type of OCP Core while adding the following named parameters
		to that type:</t>
		
		<t hangText="This document defines these named parameters:"><list style="symbols">
			<t><xref target="section_aux-parts">Aux-Parts</xref></t>
			<t><xref target="section_pause-at-body">Pause-At-Body</xref></t>
			<t><xref target="section_stop-receiving-body">Stop-Receiving-Body</xref></t>
			<t><xref target="section_preservation-interest-body">Preservation-Interest-Body</xref></t>
			<t><xref target="section_content-encodings">Content-Encodings</xref></t>
		</list></t>

		<t>The definition of the HTTP profile feature structure
		using PETDM follows:</t>

		<t><figure anchor="figure_ocp-app-profile">
		<artwork trimspace="yes">
		HTTP-Profile: extends Feature with {
			[Aux-Parts: am-parts];
			[Pause-At-Body: size];
			[Stop-Receiving-Body: size];
			[Preservation-Interest-Body: size];
			[Content-Encodings: codings];
		};</artwork>
		</figure></t>

		<t>An HTTP profile structure can be used in feature lists of &NO_t;
		messages and as anonymous parameter of an &NR_t; message. All profile
		parameters apply to any OCP transaction within profile scope.</t>

	</section>
	
	<section anchor="section_aux-parts" title="Aux-Parts">
		
		<t>The Aux-Parts parameter of an HTTP response profile can be
		used to negotiate the inclusion of auxiliary application message parts
		into the original data flow. The parameter is a possibly empty list of
		am-part tokens. An OPES processor MAY send an Aux-Parts parameter
		to advertise availability of auxiliary application message parts. A
		callout server MAY respond with a possibly empty subset of the parts
		it needs. The callout server response defines the subset of
		successfully negotiated auxiliary message parts.</t>

		<t>When receiving a &NO_t; message, the callout server MUST ignore any
		non-auxiliary part listed in the Aux-Parts parameter. When sending a
		&NR_t; message, the callout server MUST NOT select any application
		message part that was not explicitly listed in the negotiation offer.
		In case of a violation of the last rule, the OPES processor MUST
		terminate the transaction.</t>

		<t>An OPES processor MUST send each negotiated auxiliary part to the
		callout server, unless the part is absent.</t>

		<t><figure anchor="figure_aux-parts_example">
		<artwork trimspace="yes">
		Example:
		     Aux-Parts: (request-header,request-body)
		</artwork>
		</figure></t>

	</section>

	<section anchor="section_pause-at-body" title="Pause-At-Body">
	
		<t>A callout server MAY use the Pause-At-Body parameter to request a
		pause in original application message body transmission before
		original dataflow starts.  The parameter's value is of type "offset".
		The parameter specifies the start of the non-auxiliary application
		message body suffix that the sender is temporary not interested in
		seeing.</t>
		
		<t><figure anchor="figure_pause-at-body">
		<artwork trimspace="yes">
			[headers][ body prefix | body suffix ][trailer]
			<![CDATA[<-- ? --><-- offset  --><-- ? ---------------->]]>
			<![CDATA[<-- equiv. DWP offset ->]]>
		</artwork>
		</figure></t>

		<t>When an OPES processor receives a Pause-At-Body parameter, it MUST
		behave as if it has received a Want Data Paused (DWP) message with the
		corresponding org-offset. Note that the latter offset is different
		from the Pause-At-Body offset and is unknown until the size of the
		HTTP message headers is known.</t>
		
		<t>For example, if the Pause-At-Body value is zero, the OPES processor
		should send a &DPM_t; message just before it sends the first &DUM_t;
		message with the response-body part in the HTTP response profile.  If
		the Pause-At-Body value is 300, the OPES processor should send a &DPM;
		message after transmitting 300 OCTETs for that application message
		part.</t>
		
		<t><figure anchor="figure_pause-at-body-example">
		<artwork trimspace="yes">
		Example:
		     Pause-At-Body: 0
		</artwork>
		</figure></t>

	</section>

	<section anchor="section_stop-receiving-body" title="Stop-Receiving-Body">
	
		<t>A callout server MAY use the Stop-Receiving-Body parameter to imply
		a &DWSR; message behavior before the original dataflow starts.  The
		parameter's value is of type "offset". The parameter specifies an
		offset into the original, non-auxiliary message body part
		(request-body in request profile and response-body in response
		profile).</t>
		
		<t>A callout service MAY send a Stop-Receiving-Body parameter with its
		negotiation response if there is a fixed offset into the message body
		for all transactions of a profile for which a &DWSR_t; message would
		be sent. An OPES processor MUST behave as if it has received a DWSR
		message with the corresponding offset. Note that the latter offset is
		different from the Stop-Receiving-Body offset and is unknown until the
		size of the HTTP message headers is known.</t>
		
		<t>For example, if the Stop-Receiving-Body value is zero in an HTTP
		response profile, the OPES processor should send an AME message with
		result code 206 immediately after sending the response-header message
		part and before starting with the response-body message part.</t>
		
		<t><figure anchor="figure_stop-receiving-body_example">
		<artwork trimspace="yes">
		Example:
			Stop-Receiving-Body: 0
		</artwork>
		</figure></t>

	</section>

	<section anchor="section_preservation-interest-body" title="Preservation-Interest-Body">
	
		<t>The Preservation-Interest-Body parameter can be used to optimize
		data preservation at the OPES processor. The parameter's value is of
		type "size" and denominates a prefix size of the original,
		non-auxiliary message body part (request-body in HTTP request profile
		and response-body in response profile).</t>
		
		<t>A callout service MAY send a Preservation-Interest-Body parameter
		with its negotiation response if there is a fixed-size prefix of the
		application message body for which a &DPI_t; message would be sent. An
		OPES processor MUST behave as if it receives a &DPI; message with
		org-offset zero and org-size equal to the value of the
		Preservation-Interest-Body parameter.</t>
		
		<t>For example, if the Preservation-Interest-Body value is zero in an
		HTTP response profile, the callout server must not send any &DUY;
		message for the response-body part; the OPES processor may use this
		information to optimize its data preservation behavior even before it
		makes the decision to preserve data.</t>

		<t><figure anchor="figure_preservation-interest-body_example">
		<artwork trimspace="yes">
		Example:
		     Preservation-Interest-Body: 0
		</artwork>
		</figure></t>

	</section>

	<section anchor="section_content-encodings" title="Content-Encodings">

		<t>A callout server MAY send a Content-Encodings list to
		indicate its preferences in content encodings. Encodings
		listed first are preferred to other encodings. An OPES
		processor MAY use any content encoding when sending
		application messages to a callout server.</t>
	
		<t>The list of preferred content encodings does not
		imply lack of support for other encodings. The OPES
		processor MUST NOT bypass a service just because
		the actual content encoding does not match the service's
		preferences.</t>
	
		<t>If an OCP agent receives an application message that it
		cannot handle due to specific content encoding, the usual
		transaction termination rules apply.</t>

		<t><figure anchor="figure_content-encodings">
		<artwork trimspace="yes">
		content-coding: extends atom;
		content-codings: extends list of content-coding;

		Example:
			Content-Encodings: (gzip)
		</artwork>
		</figure></t>

		<t>The semantics of content-coding is defined in section 3.5 of <xref
		target="RFC2616" />.</t>

	</section>

	<section anchor="section_prof-nego-sample" title="Profile Negotiation Example">
	
		<t><figure anchor="figure_ocp-app-profile-sample">
		<artwork trimspace="yes">
		Example:
			P: NO ({"38:http://iana.org/opes/ocp/HTTP/response"
			   Aux-Parts: (request-header,request-body)
			   })
			   SG: 5
			   ;
			S: NR {"38:http://iana.org/opes/ocp/HTTP/response"
			   Aux-Parts: (request-header)
			   Pause-At-Body: 30
			   Preservation-Interest-Body: 0
			   Content-Encodings: (gzip)
			   }
			   SG: 5
			   ;
		</artwork>
		</figure></t>
				
		<t>This example shows a negotiation offer made by an OPES processor
		for a service group (id 5) that has already been created; the callout
		server sends an adequate negotiation response.</t>

		<t>The OPES processor offers one profile feature for HTTP response
		messages.  Besides the standard message parts, the OPES processor is
		able to add the header and body of the original HTTP request as
		auxiliary message parts.</t>

		<t>The callout server requests the auxiliary request-header part, but
		is not interested in receiving the request-body part.</t>

		<t>The OPES processor sends at most the following message parts, in
		the specified order, for all transactions in service group 5:
		request-header, response-header, response-body, response-trailer. Note
		that the request-body part is not included (because it is an auxiliary
		part that was not explicitly requested). Some of the response parts
		may not be sent if the original message lacks them.</t>
		
		<t>The callout server indicates through the Preservation-Interest-Body
		parameter with size zero that it will not send any DUY messages. The
		OPES processor may therefore preserve no preservation for any
		transaction of this profile.</t>
		
		<t>By sending a Pause-At-Body value of 30, the callout server requests
		a data pause. The OPES processor sends a &DPM_t; message immediately
		after sending at least 30 OCTETs of the response-body part.
		Thereafter, the OPES processor waits for a &DWM_t; message from the
		callout service.</t>

	</section>

</section>

<section anchor="section_ams-messages" title="Application Message Start Message">

	<t>A new named parameter for Application Message Start (AMS) messages is
	introduced.</t>

	<t><figure anchor="figure_am-el_header">
	<artwork trimspace="yes">
		AM-EL: size
	</artwork>
	</figure></t>
	
	<t>AM-EL value is the size of the request-body part in the HTTP request
	profile, and is the size of the response-body part in the HTTP response
	profile, before any transfer codings have been applied (or after all
	transfer codings have been removed). This definition is consistent with
	the HTTP entity length definition.</t>

	<t>An OCP agent that knows the exact length of the HTTP message entity
	(see Section 7.2.2 "Entity Length" in <xref target="RFC2616" />) at the
	time it sends the AMS message, SHOULD announce this length using the AM-EL
	named parameter of an AMS message. If the exact entity length is not
	known, an OCP agent MUST NOT send an AM-EL parameter. Relaying correct
	entity length can have significant performance advantages for the
	recipient, and implementations are strongly encouraged to relay known
	entity lengths. Similarly, relaying incorrect entity length can have
	drastic correctness consequences for the recipient, and implementations
	are urged to exercise great care when relaying entity length.</t>
	
	<t>An OPES processor receiving an AM-EL parameter SHOULD use the
	parameter's value in a Content-Length HTTP entity header when constructing
	an HTTP message, provided a Content-Length HTTP entity header is allowed
	for the given application message by HTTP (see <xref
	target="section_message-size-recalc" />).</t>
	
</section>

<section anchor="section_dum-messages" title="&DUM; Message">

	<t>A new named parameter for &DUM_t; messages is introduced.</t>

	<t><figure anchor="figure_am-part_header">
	<artwork trimspace="yes">
		AM-Part: am-part
	</artwork>
	</figure></t>

	<t>An OCP agent MUST send an AM-Part parameter with every DUM message that
	is a part of an OCP transaction with an HTTP profile. The AM-Part
	parameter value is a single am-part token. As implied by the syntax, a DUM
	message can only contain data of a single application message part. One
	message part can be fragmented into any number of DUM messages with the
	same AM-Part parameter.</t>

	<t>The following example shows three DUM messages containing an abridged
	HTTP response message. The response-body part is fragmented and sent
	within two DUM messages.</t>

	<t><figure anchor="figure_dum_example">
	<artwork trimspace="yes">
	Example:
		P: DUM 88 1 0
		   Kept: 0
		   AM-Part: response-header
		
		   64:HTTP/1.1 200 OK
		   Content-Type: text/html
		   Content-Length: 51
		
		   ;
		P: DUM 88 1 64
		   Kept: 64
		   AM-Part: response-body
		
		   19:&lt;html&gt;&lt;body&gt;This is
		   ;
		P: DUM 88 1 83
		   Kept: 83
		   AM-Part: response-body
		
		   32: a simple message.&lt;/body&gt;&lt;/html&gt;
		   ;
	</artwork>
	</figure></t>
		
</section>

<section anchor="section_ocp-100C" title="Selective Adaptation">

	<t>The HTTP profile for OCP applies to all HTTP messages.  That scope
	includes HTTP messages such as 1xx (Informational) responses, POST,
	CONNECT, and OPTIONS requests as well as responses with extension status
	codes and requests with extension methods. Unless specifically configured
	to do otherwise, an OPES processor MUST forward all HTTP messages for
	adaptation at callout servers. OPES bypass instructions, configured HTTP
	message handling rules, and OCP-negotiation with a callout server are all
	examples of an acceptable "specific configuration" that provides an
	exception to this rule.</t>

	<t>While it may seem useless to attempt to adapt "control" messages such
	as a 100 (Continue) response, skipping such messages by default may lead
	to serious security flaws and interoperability problems. For example,
	sensitive company information might be relayed via a carefully crafted 100
	Continue response or a malicious CONNECT request may not get logged if
	OPES processor does not forward these messages to a callout service that
	is supposed to handle them.</t>

	<t>By design, OPES processor implementation cannot unilaterally decide
	that an HTTP message is not worth adapting. It needs a callout server
	opinion, a configuration setting, or another external information
	to make the decision.</t>

</section>

<section anchor="section_ocp-hop-headers" title="Hop-by-hop Headers">

	<t>HTTP defines several ho-by-hop headers (e.g., Connection) and allows
	for extension headers to be specified as hop-by-hop ones (via the
	Connection header mechanism). Depending on the environment and
	configuration, an OPES processor MAY forward hop-by-hop headers to callout
	servers and MAY use hop-by-hop headers returned by callout servers to
	build an HTTP message for the next application hop. However, see <xref
	target="section_transfer-encodings" /> for requirements specific to the
	Transfer-Encoding header.</t>

	<t>For example, a logging or statistics collection service may want to see
	hop-by-hop headers sent by the previous application hop to the OPES
	processor and/or hop-by-hop headers sent by the OPES processor to the next
	application hop.  Another service may actually handle HTTP logic of
	removing and adding hop-by-hop headers. Many services will ignore
	hop-by-hop headers. This specification does not define a mechanism for
	distinguishing these use cases.</t>

</section>

<section anchor="section_transfer-encodings" title="Transfer Encodings">

	<t>HTTP messages may use transfer encodings, a hop-by-hop encoding feature
	of HTTP. Adaptations that use HTTP transfer encodings have to be
	explicitly negotiated. This specification does not document such
	negotiations. In the absence of explicit transfer-encoding negotiations,
	an OCP agent MUST NOT send transfer-encoded application message
	bodies.</t>

	<t>Informally, the above rule means that the agent or its environment have
	to make sure that all transfer encodings are stripped from an HTTP message
	body before it enters OCP scope. An agent MUST terminate the OCP
	transaction if it has to send an application message body but cannot
	remove all transfer encodings.  Violations of these rules lead to
	interoperability problems.</t>

	<t>If an OCP agent receives transfer-encoded application data
	in violation of the above requirement, the agent MAY terminate
	the corresponding OCP transaction.</t>
	
	<t>An OPES processor removing transfer encodings MUST remove the
	Transfer-Encoding header before sending the header part to the callout
	service. A callout server receiving a Transfer-Encoding header MAY assume
	that original application data is still transfer-encoded (and terminate
	the transaction). The OPES processor MUST send a correct Transfer-Encoding
	header to the next HTTP recipient independent of what header (if any) the
	callout server returned.</t>

	<t>Logging and wiretapping are the examples where negotiating acceptable
	transfer encodings may be worthwhile. While a callout server may not be
	able to strip an encoding, it may still want to log the entire message "as
	is". In most cases, however, the callout server would not be able to
	meaningfully handle unknown transfer encodings.</t>

</section>

<section anchor="section_header-correctness" title="HTTP Header Correctness">

	<t>When communicating with HTTP applications, OPES processors MUST ensure
	correctness of all computable HTTP headers documented in specifications
	that the processors intend to be compliant with.
	A computable header is defined as a header which value can
	be computed based on the message body alone. For example, the correctness of
	Content-Length and Content-MD5 headers has to be ensured by processors
	claiming compliance with HTTP/1.1 (<xref target="RFC2616" />).</t>
	
	<t>Informally and by default, the OPES processor has to validate and
	eventually recalculate, add, or remove computable HTTP headers in order to
	build a compliant HTTP message from an adapted application message
	returned by the callout server. If a particular OPES processor trusts
	certain HTTP headers that a callout service sends, it can use those
	headers "as is".</t>
	
	<t>An OPES processor MAY forward a partially adapted HTTP message from a
	callout server to the next callout server, without verifying HTTP header
	correctness.  Consequently, a callout service cannot assume that the HTTP
	headers it receives are correct or final from an HTTP point of view.</t>
	
	<t>The following subsections present guidelines for the recalculation of
	some HTTP headers.</t>

	<section anchor="section_message-size-recalc" title="Message Size Recalculation">

		<t>By default, an OCP agent MUST NOT trust the Content-Length header
		that is sent within an HTTP header message part. The message length
		could be modified by a callout service without adaptation of the HTTP
		message headers.</t>
		
		<t>Before sending the HTTP message to the HTTP peer, the OPES
		processor has to ensure correctness of the message length indication
		according to section 4.4 of <xref target="RFC2616" />.</t>
		
		<t>Besides ensuring HTTP message correctness, good OPES processors set
		up the message to optimize performance, including minimizing delivery
		latency.  Specifically, indicating the end of a message by closing
		the HTTP connection ought to be the last resort:</t>

		<t hangText="These are recommended actions:"><list style="symbols">

			<t>If the callout server sends an AM-EL parameter with its AMS
			message, the OPES processor SHOULD use this value to create a
			Content-Length header to be able to keep a persistent HTTP
			connection. Note that HTTP rules prohibit a Content-Length header
			to be used in transfer encoded messages.</t>

			<t>If AM-EL parameter or equivalent entity length information is
			not available, and HTTP rules allow for chunked transfer encoding,
			the OPES processor SHOULD use chunked transfer encoding.  Note
			that any Content-Length header has to be removed in this case.</t>
			
			<t>If the message size is not known a priori and chunked transfer
			coding cannot be used, but the OPES processor can wait for the OCP
			transaction to finish before forwarding the adapted HTTP message
			on a persistent HTTP connection, then the processor SHOULD compute
			and add a Content-Length header.</t>

			<t>Finally, if all optimizations are not applicable, the OPES
			processor SHOULD delete any Content-Length header and forward
			adapted data immediately, while indicating the message end by
			closing the HTTP connection.</t>

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

	<section anchor="section_content-md5-header" title="Content-MD5 Header">
	
		<t>By default, the OPES processor MUST assume that the callout service
		modifies the content in a way that the MD5 checksum of the message
		body becomes invalid.</t>
		
		<t>According to section 14.15 of <xref target="RFC2616" />, HTTP
		intermediaries must not generate Content-MD5 headers. A recalculation
		is therefore possible only if the OPES processor is considered
		authoritative for the entity being adapted. An un-authoritative OPES
		processor MUST remove the Content-MD5 header unless it detects that
		the HTTP message was not modified; in this case it MAY leave the
		Content-MD5 header in the message.  When such detection significantly
		increases message latency, deleting the Content-MD5 header may be a
		better option.</t>
	
	</section>

</section> <!--section_header-correctness -->

<section anchor="section_ocp_examples" title="Examples">
	
	<t>This is a possible OCP message flow using an HTTP request profile.  An
	end-user wants to access the home page of www.restricted-content.org,
	through the proxy, but access is denied by a URL blocking service running
	on the callout server used by the proxy.</t>
    
    <t>OCP messages from the OPES processor are marked with "P:" and OCP
	messages from the callout server are marked with "S:". The OCP connection
	is not closed at the end but kept open for the next OCP transaction.</t>

	<t><figure anchor="figure_ocp_example_1">
	<artwork trimspace="yes">
	Example:
		P: CS;
		S: CS;
		P: SGC 11 ({"23:ocp-test.com/url-filter"});
		P: NO ({"37:http://iana.org/opes/ocp/HTTP/request"})
		   SG: 11
		   ;
		S: NR {"37:http://iana.org/opes/ocp/HTTP/request"}
		   SG: 11
		   ;
		P: TS 55 11;
		P: AMS 55
		   AM-EL: 0
		   ;
		P: DUM 55 0
		   Kept: 0
		   AM-Part: request-header
		   235:GET http://www.restricted-content.org/ HTTP/1.1
		   Accept: */*
		   Accept-Language: de
		   Accept-Encoding: gzip, deflate
		   User-Agent: Mozilla/4.0 (compatible; Windows NT 5.0)
		   Host: www.restricted-content.org
		   Proxy-Connection: Keep-Alive
		
		
		   ;
		P: AME 55;
		S: AMS 55;
		S: DUM 55 0
		   AM-Part: response-header
		
		   76:HTTP/1.1 403 Forbidden
		   Content-Type: text/html
		   Proxy-Connection: close
		
		
		   ;
		S: DUM 55 0
		   AM-Part: response-body
		
		   67:&lt;html&gt;&lt;body&gt;You are not allowed to
		   access this page.&lt;/body&gt;&lt;/html&gt;
		   ;
		S: AME 55;
		P: TE 55;
		S: TE 55;
	</artwork>
	</figure></t>
	
	<t>The next example is a language translation of a small plain text file
	that gets transferred in an HTTP response. In this example, OCP agents
	negotiate a profile for the whole OCP connection. The OCP connection
	remains open in the end of the OCP transaction.</t>
	
	<t><figure anchor="figure_ocp_example_2">
		<artwork trimspace="yes">
	Example:
		P: CS;
		S: CS;
		P: NO ({"38:http://iana.org/opes/ocp/HTTP/response"});
		S: NR {"38:http://iana.org/opes/ocp/HTTP/response"};
		P: SGC 12 ({"45:ocp-test.com/translate?from=EN&amp;to=DE"});
		P: TS 89 12;
		P: AMS 89
		   AM-EL: 86
		   ;
		P: DUM 89 0
		   AM-Part: response-header

		   65:HTTP/1.1 200 OK
		   Content-Type: text/plain
		   Content-Length: 86


		   ;
		P: DUM 89 65
		   AM-Part: response-body

		   86:Whether 'tis nobler in the mind to suffer
		   The slings and arrows of outrageous fortune
		   ;
		P: AME 89;
		S: AMS 89
		   AM-EL: 78
		   ;
		P: TE 89;
		S: DUM 89 0
		   AM-Part: response-header

		   65:HTTP/1.1 200 OK
		   Content-Type: text/plain
		   Content-Length: 78
		   
		   
		   ;
		S: DUM 89 63
		   AM-Part: response-body

		   80:Obīs edler im Gemuet, die Pfeil und Schleudern
		   des wuetenden Geschicks erdulden
		   ;
		S: AME 89;
		S: TE 89;
		</artwork>
	</figure></t>
	
	<t>The following example shows modification of an HTML resource and
	demonstrates data preservation optimization. The callout server uses a DUY
	message to send back an unchanged response header part but because it does
	not know the size of the altered HTML resource at the time it sends the AMS
	message, the callout server omits the AM-EL parameter; the OPES processor
	is responsible for adjusting the Content-Length header.</t>

	<t><figure anchor="figure_ocp_example_3">
	<artwork trimspace="yes">
	Example:
		P: CS;
		S: CS;
		P: SGC 10 ({"22:ocp-test.com/ad-filter"});
		P: NO ({"38:http://iana.org/opes/ocp/HTTP/response"
		   Aux-Parts: (request-header,request-body)
		   },{"29:http://iana.org/opes/ocp/MIME"})
		   SG: 10
		   ;
		S: NR {"38:http://iana.org/opes/ocp/HTTP/response"
		   Aux-Parts: (request-header)
		   Content-Encodings: (gzip)
		   }
		   SG: 10
		   ;
		P: TS 88 10;
		P: AMS 88
		   AM-EL: 95
		   ;
		P: DUM 88 0
		   AM-Part: request-header
		
		   65:GET /opes/adsample.html HTTP/1.1
		   Host: www.martin-stecher.de


		   ;
		P: DUM 88 65
		   Kept: 65 64
		   AM-Part: response-header

		   64:HTTP/1.1 200 OK
		   Content-Type: text/html
		   Content-Length: 95
   
   
		   ;
		P: DUM 88 129
		   Kept: 65 90
		   AM-Part: response-body

		   26:&lt;html&gt;
		   &lt;body&gt;
		   This is my
		   ;
		S: AMS 88;
		P: DUM 88 155
		   Kept: 65 158
		   AM-Part: response-body

		   68: new ad: &lt;img src=&quot;my_ad.gif&quot;
		   width=88 height=31&gt;
		   &lt;/body&gt;
		   &lt;/html&gt;
		   ;
		S: DUY 88 65 64
		S: DPI 88 129 2147483647;
		P: AME 88;
		S: DUM 88 0
		   AM-Part: response-body

		   52:&lt;html&gt;
		   &lt;body&gt;
		   This is my new ad: 
		   &lt;/body&gt;
		   &lt;/html&gt;
		   ;
		S: DPI 88 129 0;
		P: TE 88;
		S: AME 88;
		S: TE 88;
	</artwork>
	</figure></t>

</section>

</section> <!-- section_ocp -->

<section anchor="section_trace" title="Tracing">

	<t><xref target="I-D.ietf-opes-end-comm" /> defines application-agnostic
	tracing facilities in OPES. Compliance with this specification requires
	compliance with <xref target="I-D.ietf-opes-end-comm" />.  When adapting
	HTTP, trace entries are supplied using HTTP message headers. The following
	HTTP extension headers are defined to carry trace entries. Their
	definitions are given using BNF notation and elements defined in <xref
	target="RFC2616" />.</t>

	<t><figure anchor="figure_trace-headers">
		<artwork trimspace="yes">
			OPES-System = "OPES-System" ":" #trace-entry
			OPES-Via    = "OPES-Via" ":" #trace-entry

			trace-entry = opes-agent-id *( ";" parameter )
			opes-agent-id = absoluteURI
		</artwork>
	</figure></t>

	<t>An OPES System MUST add its trace entry to the OPES-System header.
	Other OPES agents MUST use the OPES-Via header if they add their tracing
	entries. All OPES agents MUST append their entries. Informally,
	OPES-System is the only required OPES tracing header while OPES-Via
	provides optional tracing details; both headers reflect the order of trace
	entry additions.</t>
	
	<t>If an OPES-Via header is used in the original application message, an
	OPES System MUST append its entry to the OPES-Via header. Otherwise, an
	OPES System MAY append its entry to the OPES-Via header. If an OPES System
	is using both headers, it MUST add identical trace entries except it MAY
	omit some or all trace-entry parameters from the the OPES-Via header.
	Informally, the OPES System entries in the OPES-Via header are used to
	delimit and group OPES-Via entries from different OPES Systems without
	having a priory knowledge about OPES System identifiers.</t>

	<t>Note that all of these headers are defined using #list constructs and,
	hence, a valid HTTP message may contain multiple trace entries per header.
	OPES agents SHOULD use a single header-field rather than using multiple
	equally-named fields to record a long trace. Using multiple equally-named
	extension header-fields is illegal from HTTP point of view and may not
	work with some of the OPES-unaware HTTP proxies.</t>

	<t>For example, here is an HTTP response message header after
	OPES adaptations have been applied by a single OPES processor
	executing 10 OPES services:</t>

	<t><figure anchor="figure_trace-1p10s">
		<artwork trimspace="yes">
	Example:
		HTTP/1.1 200 OK
		Date: Thu, 18 Sep 2003 06:25:24 GMT
		Last-Modified: Wed, 17 Sep 2003 18:24:25 GMT
		Content-type: application/octet-stream
		OPES-System: http://www.example-cdn.com/opes?session=ac79a749f56
		OPES-Via: http://www.example-cdn.com/opes?session=ac79a749f56,
			http://www.opes-services-4u.com/cat/?sid=123,
			http://www.opes-services-4u.com/cat/?sid=124,
			http://www.opes-services-4u.com/cat/?sid=125 ; mode=A
	</artwork>
	</figure></t>

	<t>In the above example, the OPES processor has not included its trace
	entry or its trace entry was replaced by an OPES system trace entry.
	Only 3 out of 10 services are traced. The remaining services did not
	include their entries or their entries were removed by OPES system or
	processor. The last traced service included a "mode" parameter.
	Various identifiers in trace entries will probably have no meaning to
	the recipient of the message, but may be decoded by OPES System
	software.</t>

	<t>OPES entities MAY place optional tracing entries in a message trailer
	(i.e., entity-headers at the end of a Chunked-Body of a chunked-encoded
	message), provided trailer presence does not violate HTTP protocol. See
	<xref target="I-D.ietf-opes-end-comm" /> for a definition of what tracing
	entries are optional. OPES entities MUST NOT place required tracing
	entries in a message trailer.</t>
	

</section> <!-- section_trace -->


<section anchor="section_bypass" title="Bypass">

	<t>An HTTP extension header is introduced to allow for OPES system
	bypass as defined in <xref target="I-D.ietf-opes-end-comm" />.</t>

	<t><figure anchor="figure_bypass-header">
	<artwork trimspace="yes">
		OPES-Bypass  = "OPES-Bypass" ":" ( "*" | 1#bypass-entry )
		bypass-entry = opes-agent-id
	</artwork>
	</figure></t>
	
	<t>This header can be added to HTTP requests to request OPES system bypass
	for the listed OPES agents. The asterisk "*" character is used to
	represent all possible OPES agents.</t>
	
	<t>See <xref target="I-D.ietf-opes-end-comm" /> for what can be bypassed
	and for bypass requirements.</t>

</section> <!-- section_trace -->


<section anchor="section_iab" title="IAB Considerations">

	<t>OPES treatment of IETF Internet Architecture Board (IAB) <xref
	target="RFC3238">considerations</xref> are documented in 
	<xref target="I-D.ietf-opes-iab">
	"OPES Treatment of IAB Considerations"</xref>.</t>

</section>

<section anchor="section_security" title="Security Considerations">

	<t>Application-independent security considerations are documented
	in application-agnostic OPES specifications. HTTP profiles do
	not introduce any HTTP-specific security considerations.</t>

</section>

<section anchor="section_compliance" title="Compliance">

	<t>Compliance with OPES mechanisms is defined in corresponding
	application-agnostic specifications.  HTTP profiles for these
	mechanisms use corresponding compliance definitions from these
	specifications, as if each profile was incorporated into the
	application-agnostic specification it profiles.</t>

</section>

<appendix anchor="section_acks" title="Acknowledgments">

	<t>The authors gratefully acknowledge the contributions of Robert Collins
	(Syncretize) and Larry Masinter (Adobe). Larry Masinter provided
	an early review of this document.</t>

</appendix>

<appendix anchor="section_change_log" title="Change Log">

	<t>Internal WG revision control ID: $Id: http.xml,v 1.76 2004/01/14 17:01:10 rousskov Exp $</t>

	<t><list style="hanging">
	
	<t hangText="2004/01/14"><list style="symbols">

		<t>Polished examples rendering consistency. Use P: and S: prefixes for
		all OCP messages. Do not separate messages by empty lines.  Use
		"Example" caption for all examples.</t>

		<t>Replaced German umlauts in example.</t>
		
	</list></t>

	<t hangText="2004/01/13"><list style="symbols">
	
		<t>Changed Transfer-Encoding header handling rule: OPES processor MUST
		delete it when it strips transfer encodings.  This seems like a much
		more consistent/clean approach than the old SHOULD rule of leaving the
		header in. If a logging or similar service needs virgin headers, that
		service would either log headers only (and then stripping transfer
		encoding is not necessary) or it will not use HTTP profiles defined
		here so that it can log original transfer encodings as well.</t>

		<t>Removed ToDo section.</t>

		<t>Editorial changes.</t>

	</list></t>

	<t hangText="2004/01/07"><list style="symbols">
	
		<t>Added second and third example.</t>

		<t>Changed example syntax using now P: and S: prefixes.</t>

		<t>OCP example section with first example</t>

	</list></t>

	<t hangText="2003/12/19"><list style="symbols">

		<t>Let Pause-At-Body parameter refer to new Paused My Data (DPM)
	    OCP core message.</t>
	    
	    <t>Renamed Wont-Look-Body to Stop-Receiving-Body and changed
	    reference to Want Stop Receiving Data (DWSR) OCP core message.</t>
	    
	    <t>Renamed Wont-Send-Body to Preservation-Interest-Body, reverted
	    logic of size parameter and changed reference to Data Preservation
	    Interest (DPI) OCP core message.</t>

	</list></t>
	
	<t hangText="2003/12/14"><list style="symbols">

		<t>Added a Selective Adaptation section to cover adaptation of 100
		Continue, CONNECT, and other "unusual" HTTP messages.</t>

		<t>Added new requirement: an OPES processor MUST offer all
		non-auxiliary original parts in NO messages. Without this requirement,
		the "Selective Adaptation" section would make little sense since vital
		HTTP message parts could be selectively skipped by the processor.</t>

		<t>Added an introduction to the OCP section.</t>

		<t>Added an OPES Document Map boilerplate.</t>
		
	</list></t>

	<t hangText="2003/12/14"><list style="symbols">

		<t>Explicitly require OCP Core familiarity for OCP HTTP
		Profile understanding.</t>

		<t>Added Robert Collins and Larry Masinter to the
		Acknowledgments section.</t>

		<t>Renamed "binding" to "profile" as suggested by external
		reviews.</t>
		
	</list></t>

	<t hangText="2003/11/21"><list style="symbols">

		<t>Moved profile part notes completely to the "Profile Parts" section
		and changed labels of original and adapted part lists.</t>
		
	</list></t>

	<t hangText="2003/11/18"><list style="symbols">

		<t>Re-documented OPES tracing headers. Use OPES System entries in
		OPES-Via to indicate system boundaries. Note that using multiple
		OPES- headers may be illegal from HTTP point of view, but
		header-values may be repeated.</t>
		
	</list></t>

	<t hangText="2003/10/27"><list style="symbols">

		<t>Proof reading.</t>
		
		<t>Renamed document to draft-ietf-opes-http-01.</t>
			
		<t>Wont-Send-Body parameter refers to DWSY message and
		Wont-Look-Body parameter refers to DWLY messages of OCP core.</t>
		
	</list></t>

	<t hangText="2003/10/26"><list style="symbols">
	
		<t>Deleted resolved XXXes.</t>

		<t>Section "Profile Parts": Cleaned-up and removed ambiguities.</t>
	
		<t>Renamed Wont-Use-Body to Wont-Send-Body and added Wont-Look-Body</t>

		<t>Documented OCP parameters in TDM as required by OCP core.</t>

		<t>Adjusted the Profile Negotiation example</t>
		
		<t> Remove Skip-Parts and added Wont-Use-Body and Pause-At-Body. We agreed
		that these parameters solve the what-parts-to-send-or-skip problem that
		Skip-Parts introduced.</t>
		
	</list></t>

	<t hangText="2003/10/24"><list style="symbols">
	
		<t>Changed beginning of section HTTP Header Correctness to
		"When communicating with HTTP applications, OPES processors MUST..."</t>
		
		<t>Added second variant of adapted parts for request profile and so introduced
		short-circuit possibility for callout services.</t>
		
		<t>Removed the comment about Transfer-Encoding problems; there is no problem if
		we have a MUST that precludes any encodings and a MUST that terminates the transaction
		if not all encodings can be removed. Added 2nd MUST and an informal sentence that warns
		for interoperability problems if these rules are violated.</t>

		<t>Renamed optional parts to auxiliary parts; Optional-Parts parameter
		becomes Aux-Parts</t>
		
	</list></t>

	<t hangText="2003/10/22"><list style="symbols">

		<t>Fixed the after-negotiation part of the profile negotiation
		example.</t>

		<t>An OPES processor has to use the adapted version of the skipped part
		if it is available or processor's own (original) version of the part
		if the callout server did not send an adapted version.</t>

		<t>AM-Parts not listed in the corresponding section
		of a negotiated profile MUST NOT be sent.</t>

		<t>Deleted resolved XXXes.</t>

		<t>Resurrected and polished a note that original parts not included in
		the adapted parts list cannot be adapted.</t>

		<t>Skipped parts MAY be sent by processor because a MUST NOT send
		requirement would essentially require buffering a potentially large
		part at the processor. The MAY requirement moves the burden to the
		service, which is likely to be in a better position than processor to
		optimize.</t>

		<t>Do not support extension am-parts explicitly;
		extension/new profiles can defined them explicitly as needed
		and a different profile would most certainly be required to
		add a meaningful new part anyway.</t>

		<t>Proof reading</t>

	</list></t>

	<t hangText="2003/10/21"><list style="symbols">
		<t>Added few more XXXs and commented others. All new comments are marked with (MS).</t>
		<t>Replaced "am-part string" with "am-part tokens"</t>
	</list></t>
	
	<t hangText="2003/10/20"><list style="symbols">
		<t>Made sure that most RFC2119 requirements have a subject.</t>
		<t>Added XXXs to identify places that need more work.</t>
		<t>Added section Application Message Start introducing AM-EL named parameter</t>
		<t>Removed sizep parameter reference</t>
		<t>Updated Message Size Recalculation section</t>
		<t>Added references to other documents</t>
		<t>Filled bypass section</t>
		<t>Little first proofreading</t>
	</list></t>

	<t hangText="2003/10/17"><list style="symbols">
		<t>Completed section HTTP Header Correctness</t>
		<t>Note about header correctness in Transfer-Encodings section</t>
	</list></t>

	<t hangText="2003/10/16"><list style="symbols">
		<t>Removed Transfer-Encodings as a named parameter of profile feature</t>
		<t>Moved Transfer-Encodings section</t>
		<t>Added section HTTP Header Correctness</t>
	</list></t>

	<t hangText="2003/10/13"><list style="symbols">
		<t>Filled transfer- and content-encodings paragraphs</t>
		<t>Fixed negotiation example</t>
	</list></t>

	<t hangText="2003/10/10"><list style="symbols">

		<t>Filled application message part section.</t>
		<t>Added Data Use Mine Message section.</t>
		<t>Restructured, changed and enhanced Callout Protocol section and subsections.</t>

	</list></t>

	<t hangText="2003/09/24"><list style="symbols">

		<t>Removed duplicate and empty Tracing section.</t>

		<t>Moved the Bypass section behind the Tracing section.</t>

	</list></t>

	<t hangText="head-sid13"><list style="symbols">

		<t>Removed HTTP-transaction profile, added
		optional parts as feature parameters, added example.</t>

	</list></t>

	<t hangText="head-sid12"><list style="symbols">

		<t>Initial revision.</t>

	</list></t>

	</list></t>

</appendix>

</middle>

<back>

<references title='Normative References'>

<?rfc include='reference.RFC.2616.xml' ?>
<?rfc include='reference.I-D.ietf-opes-end-comm.xml' ?>
<?rfc include='reference.I-D.ietf-opes-ocp-core.xml' ?>

</references>

<references title='Informative References'>

<?rfc include='reference.I-D.ietf-opes-architecture.xml' ?>
<?rfc include='reference.I-D.ietf-opes-protocol-reqs.xml' ?>
<?rfc include='reference.I-D.ietf-opes-threats.xml' ?>
<?rfc include='reference.I-D.ietf-opes-scenarios.xml' ?>
<?rfc include='reference.I-D.ietf-opes-authorization.xml' ?>
<?rfc include='reference.I-D.ietf-opes-rules-p.xml' ?>
<?rfc include='reference.I-D.ietf-opes-iab.xml' ?>
<?rfc include='reference.RFC.3238.xml' ?>

</references>

</back>

</rfc>

