rfc3507.txt   rfc3507-fixed.txt 
skipping to change at page 11, line 28 skipping to change at page 11, line 28
ICAP uses TCP/IP as a transport protocol. The default port is 1344, ICAP uses TCP/IP as a transport protocol. The default port is 1344,
but other ports may be used. The TCP flow is initiated by the ICAP but other ports may be used. The TCP flow is initiated by the ICAP
client to a passively listening ICAP server. client to a passively listening ICAP server.
ICAP messages consist of requests from client to server and responses ICAP messages consist of requests from client to server and responses
from server to client. Requests and responses use the generic from server to client. Requests and responses use the generic
message format of RFC 2822 [3] -- that is, a start-line (either a message format of RFC 2822 [3] -- that is, a start-line (either a
request line or a status line), a number of header fields (also known request line or a status line), a number of header fields (also known
as "headers"), an empty line (i.e., a line with nothing preceding the as "headers"), an empty line (i.e., a line with nothing preceding the
CRLF) indicating the end of the header fields, and a message-body. CRLF) indicating the end of the header fields, and possibly a
message-body.
The presence of a message-body is determined exclusively by the
presence and value of the Encapsulated header documented in Section
4.4. Thus, the sender MUST include the Encapsulated header in every
ICAP message with message-body. The message-body syntax and semantics
are determined by the value of the Encapsulated header.
The header lines of an ICAP message specify the ICAP resource being The header lines of an ICAP message specify the ICAP resource being
requested as well as other meta-data such as cache control requested as well as other meta-data such as cache control
information. The message body of an ICAP request contains the information. The message body of an ICAP request contains the
(encapsulated) HTTP messages that are being modified. (encapsulated) HTTP messages that are being modified.
As in HTTP/1.1, a single transport connection MAY (perhaps even As in HTTP/1.1, a single transport connection MAY (perhaps even
SHOULD) be re-used for multiple request/response pairs. The rules SHOULD) be re-used for multiple request/response pairs. The rules
for doing so in ICAP are the same as described in Section 8.1.2.2 of for doing so in ICAP are the same as described in Section 8.1.2.2 of
[4]. Specifically, requests are matched up with responses by [4]. Specifically, requests are matched up with responses by
allowing only one outstanding request on a transport connection at a allowing only one outstanding request on a transport connection at a
time. Multiple parallel connections MAY be used as in HTTP. time. Multiple parallel connections MAY be used as in HTTP.
An ICAP client sending a message-body MUST monitor the transport
connection for an early ICAP response (i.e., the response that comes
while the client is still transmitting the request). Such a response
may be a successful (e.g., 200 "OK") response or not (e.g., 400 "Bad
Request"). Just like HTTP rules in Section 8.2.2 of [4], this
requirement eliminates a deadlock when neither client nor server can
send more data. However, correct early response handling is more
important (and not limited to errors) for ICAP because ICAP servers
often have to respond early to avoid buffering the entire
encapsulated message. Early responses may also decrease end-user
perceived latency if the client pipelines received content to the
end-user.
Regardless of the early response meaning and timing, the ICAP client
SHOULD finish sending the request. If the client chooses not to
finish the request, it MUST terminate the transport connection after
receiving the early response because the ICAP server would not be
able to detect the end of the ICAP request otherwise. ICAP
extensions (not defined in this document) MAY supersede these
requirements by documenting ways to abort the request without
terminating the transport connection abnormally.
4.2 ICAP URIs 4.2 ICAP URIs
All ICAP requests specify the ICAP resource being requested from the All ICAP requests specify the ICAP resource being requested from the
server using an ICAP URI. This MUST be an absolute URI that server using an ICAP URI. This MUST be an absolute URI that
specifies both the complete hostname and the path of the resource specifies both the complete hostname and the path of the resource
being requested. For definitive information on URL syntax and being requested. For definitive information on URL syntax and
semantics, see "Uniform Resource Identifiers (URI): Generic Syntax semantics, see "Uniform Resource Identifiers (URI): Generic Syntax
and Semantics," RFC 2396 [1], Section 3. The URI structure defined and Semantics," RFC 2396 [1], Section 3. The URI structure defined
by ICAP is roughly: by ICAP is roughly:
skipping to change at page 14, line 50 skipping to change at page 14, line 50
400 - Bad request. 400 - Bad request.
404 - ICAP Service not found. 404 - ICAP Service not found.
405 - Method not allowed for service (e.g., RESPMOD requested for 405 - Method not allowed for service (e.g., RESPMOD requested for
service that supports only REQMOD). service that supports only REQMOD).
408 - Request timeout. ICAP server gave up waiting for a request 408 - Request timeout. ICAP server gave up waiting for a request
from an ICAP client. from an ICAP client.
418 - Bad composition. ICAP server needs encapsulated sections
different from those in the request.
500 - Server error. Error on the ICAP server, such as "out of disk 500 - Server error. Error on the ICAP server, such as "out of disk
space". space".
501 - Method not implemented. This response is illegal for an 501 - Method not implemented. This response is illegal for an
OPTIONS request since implementation of OPTIONS is mandatory. OPTIONS request since implementation of OPTIONS is mandatory.
502 - Bad Gateway. This is an ICAP proxy and proxying produced an 502 - Bad Gateway. This is an ICAP proxy and proxying produced an
error. error.
503 - Service overloaded. The ICAP server has exceeded a maximum 503 - Service overloaded. The ICAP server has exceeded a maximum
skipping to change at page 16, line 25 skipping to change at page 16, line 25
or bodies of HTTP messages. or bodies of HTTP messages.
Encapsulated bodies MUST be transferred using the "chunked" Encapsulated bodies MUST be transferred using the "chunked"
transfer-coding described in Section 3.6.1 of [4]. However, transfer-coding described in Section 3.6.1 of [4]. However,
encapsulated headers MUST NOT be chunked. In other words, an ICAP encapsulated headers MUST NOT be chunked. In other words, an ICAP
message-body switches from being non-chunked to chunked as the body message-body switches from being non-chunked to chunked as the body
passes from the encapsulated header to encapsulated body section. passes from the encapsulated header to encapsulated body section.
(See Examples in Sections 4.8.3 and 4.9.3.). The motivation behind (See Examples in Sections 4.8.3 and 4.9.3.). The motivation behind
this decision is described in Section 8.2. this decision is described in Section 8.2.
HTTP chunked transfer-coding may include a trailer area containing
HTTP entity-header fields. Since ICAP requires support for chunked
transfer-coding, an ICAP agent MUST accept an encapsulated trailer,
if any (i.e., the presence of a trailer must not prevent ICAP
recipient from correctly parsing and handling an ICAP message).
Similar to other HTTP message parts, an ICAP server MUST send the
received trailer back to the ICAP client unless the ICAP server
modifies or strips trailers as a part of server content adaptation
actions.
An ICAP agent MUST NOT send an ICAP header in a trailer area of the
ICAP message-body encoding unless it knows the recipient expects such
a header. This document does not define how such an expectation is
negotiated. In general, sending ICAP headers in the trailer makes it
impossible for the trailer recipient to distinguish HTTP headers from
ICAP headers.
4.4.1 The "Encapsulated" Header 4.4.1 The "Encapsulated" Header
The offset of each encapsulated section's start relative to the start The offset of each encapsulated section's start relative to the start
of the encapsulating message's body is noted using the "Encapsulated" of the encapsulating message's body is noted using the "Encapsulated"
header. This header MUST be included in every ICAP message. For header. For example, the header
example, the header
Encapsulated: req-hdr=0, res-hdr=45, res-body=100 Encapsulated: req-hdr=0, res-hdr=45, res-body=100
indicates a message that encapsulates a group of request headers, a indicates a message that encapsulates a group of request headers, a
group of response headers, and then a response body. Each of these group of response headers, and then a response body. Each of these
is included at the byte-offsets listed. The byte-offsets are in is included at the byte-offsets listed. The byte-offsets are in
decimal notation for consistency with HTTP's Content-Length header. decimal notation for consistency with HTTP's Content-Length header.
The special entity "null-body" indicates there is no encapsulated The special entity "null-body" indicates there is no encapsulated
body in the ICAP message. HTTP body in the ICAP message. An Encapsulated header value of
"null-body=0" describes a message-body of zero length, which is
syntactically equivalent to having no message-body. A value of
"null-body=0" is common for OPTIONS responses, for example.
The syntax of an Encapsulated header is: The syntax of an Encapsulated header is:
encapsulated_header: "Encapsulated: " encapsulated_list encapsulated_header: "Encapsulated: " encapsulated_list
encapsulated_list: encapsulated_entity | encapsulated_list: encapsulated_entity |
encapsulated_entity ", " encapsulated_list encapsulated_entity ", " encapsulated_list
encapsulated_entity: reqhdr | reshdr | reqbody | resbody | optbody encapsulated_entity: reqhdr | reshdr | reqbody | resbody | optbody
reqhdr = "req-hdr" "=" (decimal integer) reqhdr = "req-hdr" "=" (decimal integer)
reshdr = "res-hdr" "=" (decimal integer) reshdr = "res-hdr" "=" (decimal integer)
reqbody = { "req-body" | "null-body" } "=" (decimal integer) reqbody = { "req-body" | "null-body" } "=" (decimal integer)
resbody = { "res-body" | "null-body" } "=" (decimal integer) resbody = { "res-body" | "null-body" } "=" (decimal integer)
optbody = { "opt-body" | "null-body" } "=" (decimal integer) optbody = { "opt-body" | "null-body" } "=" (decimal integer)
There are semantic restrictions on Encapsulated headers beyond the There are semantic restrictions on Encapsulated headers beyond the
syntactic restrictions. The order in which the encapsulated parts syntactic restrictions. The order in which the encapsulated parts
appear in the encapsulating message-body MUST be the same as the appear in the encapsulating message-body MUST be the same as the
order in which the parts are named in the Encapsulated header. In order in which the parts are named in the Encapsulated header. In
other words, the offsets listed in the Encapsulated line MUST be other words, the offsets listed in the Encapsulated line MUST be
monotonically increasing. In addition, the legal forms of the monotonically increasing.
Encapsulated header depend on the method being used (REQMOD, RESPMOD,
or OPTIONS). Specifically: In addition, the legal forms of the Encapsulated header value depend
on the request method. The value MUST use the following grammar for
matching requests and 200 "OK" responses to those requests.
REQMOD request encapsulated_list: [reqhdr] reqbody REQMOD request encapsulated_list: [reqhdr] reqbody
REQMOD response encapsulated_list: {[reqhdr] reqbody} | REQMOD response encapsulated_list: {[reqhdr] reqbody} |
{[reshdr] resbody} {[reshdr] resbody}
RESPMOD request encapsulated_list: [reqhdr] [reshdr] resbody RESPMOD request encapsulated_list: [reqhdr] [reshdr] resbody
RESPMOD response encapsulated_list: [reshdr] resbody RESPMOD response encapsulated_list: [reshdr] resbody
OPTIONS request encapsulated_list: [optbody]
OPTIONS response encapsulated_list: optbody OPTIONS response encapsulated_list: optbody
In the above grammar, note that encapsulated headers are always In the above grammar, note that encapsulated headers are always
optional. At most one body per encapsulated message is allowed. If OPTIONAL. At most one encapsulated body per ICAP message is allowed.
no encapsulated body is presented, the "null-body" header is used If no encapsulated body is presented, the "null-body" header is used
instead; this is useful because it indicates the length of the header instead; this is useful because it indicates the length of the header
section. section.
Interpretation of a message-body depends on the Encapsulated header
value. This specification defines Encapsulated value semantics for
three request methods and 200 "OK" responses to those requests. The
sender MUST NOT include a message-body in any other message unless it
knows the recipient can handle it; the mechanism to obtain such
knowledge is beyond the scope of this document. For example, requests
using extension methods and responses other than 200 "OK" must not
include a message-body unless the recipient knows how to interpret
it.
An ICAP server receiving encapsulated_list that does not match server
needs MAY respond with a 418 "Bad Composition" error. This situation
may happen, for example, when the server does not receive
encapsulated HTTP requests headers in a RESPMOD request but needs
them to process the encapsulated HTTP response.
Examples of legal Encapsulated headers: Examples of legal Encapsulated headers:
/* REQMOD request: This encapsulated HTTP request's headers start /* REQMOD request: This encapsulated HTTP request's headers start
* at offset 0; the HTTP request body (e.g., in a POST) starts * at offset 0; the HTTP request body (e.g., in a POST) starts
* at 412. */ * at 412. */
Encapsulated: req-hdr=0, req-body=412 Encapsulated: req-hdr=0, req-body=412
/* REQMOD request: Similar to the above, but no request body is /* REQMOD request: Similar to the above, but no request body is
* present (e.g., a GET). We use the null-body directive instead. * present (e.g., a GET). We use the null-body directive instead.
* In both this case and the previous one, we can tell from the * In both this case and the previous one, we can tell from the
skipping to change at page 20, line 49 skipping to change at page 20, line 49
original request. See Section 4.8.2 and 4.9.2 for the format of original request. See Section 4.8.2 and 4.9.2 for the format of
reqmod and respmod responses. reqmod and respmod responses.
- 100 Continue. If the entire encapsulated HTTP body did not fit - 100 Continue. If the entire encapsulated HTTP body did not fit
in the preview, the ICAP client MUST send the remainder of its in the preview, the ICAP client MUST send the remainder of its
ICAP message, starting from the first chunk after the preview. If ICAP message, starting from the first chunk after the preview. If
the entire message fit in the preview (detected by the "EOF" the entire message fit in the preview (detected by the "EOF"
symbol explained below), then the ICAP server MUST NOT respond symbol explained below), then the ICAP server MUST NOT respond
with 100 Continue. with 100 Continue.
As prescribed in Section 4.1.1, 100 "Continue" and 204 "No Content"
responses must not have message-bodies by default.
When an ICAP client is performing a preview, it may not yet know how When an ICAP client is performing a preview, it may not yet know how
many bytes will ultimately be available in the arriving HTTP message many bytes will ultimately be available in the arriving HTTP message
that it is relaying to the HTTP server. Therefore, ICAP defines a that it is relaying to the HTTP server. Therefore, ICAP defines a
way for ICAP clients to indicate "EOF" to ICAP servers if one way for ICAP clients to indicate "EOF" to ICAP servers if one
unexpectedly arrives during the preview process. This is a unexpectedly arrives during the preview process. This is a
particularly useful optimization if a header-only HTTP response particularly useful optimization if a header-only HTTP response
arrives at the ICAP client (i.e., zero bytes of body); only a single arrives at the ICAP client (i.e., zero bytes of body); only a single
round trip will be needed for the complete ICAP server response. round trip will be needed for the complete ICAP server response.
We define an HTTP chunk-extension of "ieof" to indicate that an ICAP We define an HTTP chunk-extension of "ieof" to indicate that an ICAP
skipping to change at page 22, line 9 skipping to change at page 22, line 9
<204 or modified response> (100 Continue disallowed due to ieof) <204 or modified response> (100 Continue disallowed due to ieof)
If the preview is 1024 bytes and the origin response is 1025 bytes If the preview is 1024 bytes and the origin response is 1025 bytes
(and the ICAP server responds with 100-continue), then these chunks (and the ICAP server responds with 100-continue), then these chunks
would appear on the wire: would appear on the wire:
200\r\n 200\r\n
<512 bytes of data>\r\n <512 bytes of data>\r\n
200\r\n 200\r\n
<512 bytes of data>\r\n <512 bytes of data>\r\n
0\r\n 0\r\n\r\n
<100 Continue Message> <100 Continue Message>
1\r\n 1\r\n
<1 byte of data>\r\n <1 byte of data>\r\n
0\r\n\r\n <no ieof because we are no longer in preview mode> 0\r\n\r\n <no ieof because we are no longer in preview mode>
Once the ICAP server receives the eof indicator, it finishes reading Once the ICAP server receives the eof indicator, it finishes reading
the current chunk stream. the current chunk stream.
skipping to change at page 23, line 45 skipping to change at page 23, line 45
4.8 Request Modification Mode 4.8 Request Modification Mode
In this method, described in Section 3.1, an ICAP client sends an In this method, described in Section 3.1, an ICAP client sends an
HTTP request to an ICAP server. The ICAP server returns a modified HTTP request to an ICAP server. The ICAP server returns a modified
version of the request, an HTTP response, or (if the client indicates version of the request, an HTTP response, or (if the client indicates
it supports 204 responses) an indication that no modification is it supports 204 responses) an indication that no modification is
required. required.
4.8.1 Request 4.8.1 Request
In REQMOD mode, the ICAP request MUST contain an encapsulated HTTP In REQMOD mode, the ICAP request contains an encapsulated HTTP
request. The headers and body (if any) MUST both be encapsulated, request. An HTTP request has at most two parts: HTTP request headers
except that hop-by-hop headers are not encapsulated. (including HTTP Request-Line) and possibly an HTTP request body. An
ICAP client MUST encapsulate at least one part. If the request body
is not encapsulated, the client MUST use the "null-body" entity.
To improve interoperability, an ICAP client SHOULD encapsulate all
available HTTP request parts unless it knows the ICAP server expects
just one part. Note that an HTTP trailer, if any, is a part of the
chunked HTTP request body and, hence, may be present in an ICAP
REQMOD request even if HTTP request headers are not encapsulated.
An ICAP client MUST NOT encapsulate HTTP hop-by-hop request headers.
4.8.2 Response 4.8.2 Response
The response from the ICAP server back to the ICAP client may take The response from the ICAP server back to the ICAP client may take
one of four forms: one of four forms:
- An error indication, - An error indication,
- A 204 indicating that the ICAP client's request requires no - A 204 indicating that the ICAP client's request requires no
adaptation (see Section 4.6 for limitations of this response), adaptation (see Section 4.6 for limitations of this response),
skipping to change at page 27, line 38 skipping to change at page 27, line 38
In this method, described in Section 3.2, an ICAP client sends an In this method, described in Section 3.2, an ICAP client sends an
origin server's HTTP response to an ICAP server, and (if available) origin server's HTTP response to an ICAP server, and (if available)
the original client request that caused that response. Similar to the original client request that caused that response. Similar to
Request Modification method, the response from the ICAP server can be Request Modification method, the response from the ICAP server can be
an adapted HTTP response, an error, or a 204 response code indicating an adapted HTTP response, an error, or a 204 response code indicating
that no adaptation is required. that no adaptation is required.
4.9.1 Request 4.9.1 Request
Using encapsulation described in Section 4.4, the header and body of In RESPMOD mode, the ICAP request contains optional encapsulated HTTP
the HTTP response to be modified MUST be included in the ICAP body. request headers and an encapsulated HTTP response. An HTTP response
If available, the header of the original client request SHOULD also has at most two parts: HTTP response headers (including HTTP
be included. As with the other method, the hop-by-hop headers of the Status-Line) and possibly an HTTP response body. An ICAP client MUST
encapsulated messages MUST NOT be forwarded. The Encapsulated header encapsulate at least one of those two parts. If the HTTP response
MUST indicate the byte-offsets of the beginning of each of these four body is not encapsulated, the client MUST use the "null-body" entity.
parts.
To improve interoperability, an ICAP client SHOULD encapsulate HTTP
request headers and all available HTTP response parts unless it knows
the ICAP server expects something else. Note that an HTTP trailer,
if any, is a part of the chunked HTTP response body and, hence, may
be present in an ICAP RESPMOD request even if HTTP response headers
are not encapsulated.
An ICAP client MUST NOT encapsulate HTTP hop-by-hop response headers.
4.9.2 Response 4.9.2 Response
The response from the ICAP server looks just like a reply in the The response from the ICAP server looks just like a reply in the
Request Modification method (Section 4.8); that is, Request Modification method (Section 4.8); that is,
- An error indication, - An error indication,
- An encapsulated and potentially modified HTTP response header and - An encapsulated and potentially modified HTTP response header and
response body, or response body, or
skipping to change at page 29, line 49 skipping to change at page 29, line 49
ICAP client sends a request addressed to a specific ICAP resource and ICAP client sends a request addressed to a specific ICAP resource and
receives back a response with options that are specific to the receives back a response with options that are specific to the
service named by the URI. All OPTIONS requests MAY also return service named by the URI. All OPTIONS requests MAY also return
options that are global to the server (i.e., apply to all services). options that are global to the server (i.e., apply to all services).
4.10.1 OPTIONS Request 4.10.1 OPTIONS Request
The OPTIONS method consists of a request-line, as described in The OPTIONS method consists of a request-line, as described in
Section 4.3.2, such as the following example: Section 4.3.2, such as the following example:
OPTIONS icap://icap.server.net/sample-service ICAP/1.0 User-Agent: OPTIONS icap://icap.server.net/sample-service ICAP/1.0
ICAP-client-XYZ/1.001 User-Agent: ICAP-client-XYZ/1.001
Other headers are also allowed as described in Section 4.3.1 and Other headers are also allowed as described in Section 4.3.1 and
Section 4.3.2 (for example, Host). Section 4.3.2 (for example, Host).
Some ICAP servers may not be able to handle OPTIONS requests with
message-body because earlier protocol specifications did not
explicitly allow or prohibit such requests. An ICAP client MUST NOT
send an OPTIONS request with a message-body, unless the client knows
that the server can handle such a request.
4.10.2 OPTIONS Response 4.10.2 OPTIONS Response
The OPTIONS response consists of a status line as described in The OPTIONS response consists of a status line as described in
section 4.3.3 followed by a series of header field names-value pairs section 4.3.3 followed by a series of header field names-value pairs
optionally followed by an opt-body. Multiple values in the value optionally followed by an opt-body. Multiple values in the value
field MUST be separated by commas. If an opt-body is present in the field MUST be separated by commas. If an opt-body is present in the
OPTIONS response, the Opt-body-type header describes the format of OPTIONS response, the Opt-body-type header describes the format of
the opt-body. the opt-body.
The OPTIONS headers supported in this version of the protocol are: The OPTIONS headers supported in this version of the protocol are:
skipping to change at page 37, line 11 skipping to change at page 37, line 11
1005 ICAP_SERVER_UNEXPECTED_CLOSE: 1005 ICAP_SERVER_UNEXPECTED_CLOSE:
"ICAP Server closed connection as ICAP client wrote body "ICAP Server closed connection as ICAP client wrote body
preview". preview".
6.3 Use of Chunked Transfer-Encoding 6.3 Use of Chunked Transfer-Encoding
For simplicity, ICAP messages MUST use the "chunked" transfer- For simplicity, ICAP messages MUST use the "chunked" transfer-
encoding within the encapsulated body section as defined in HTTP/1.1 encoding within the encapsulated body section as defined in HTTP/1.1
[4]. This requires that ICAP client implementations convert incoming [4]. This requires that ICAP client implementations convert incoming
objects "on the fly" to chunked from whatever transfer-encoding on objects "on the fly" to chunked from whatever transfer-encoding on
which they arrive. However, the transformation is simple: which they arrive. A straightforward conversion approach is
highlighted below.
- For objects arriving using "Content-Length" headers, one big chunk As object content comes in, the ICAP client converts all available
can be created of the same size as indicated in the Content-Length content bytes into a single chunk to be sent to the ICAP server. If
header. incoming content is chunked-encoded, the client decodes the encoding
first, to get access to object content. The client follows HTTP rules
to detect the end of the incoming HTTP message. For example, if the
client gets an HTTP message with Content-Length of 100KB and gets the
first 100 bytes of that message content, the client can send the
first 100 bytes as a single complete chunk. The client should neither
(a) wait a long time for all 100KB to arrive or (b) announce a 100KB
chunk but send the first 100 bytes only.
- For objects arriving using a TCP close to signal the end of the The above straightforward process can be optimized to minimize
object, each incoming group of bytes read from the OS can be copying of content bytes, even if the incoming content is chunked.
converted into a chunk (by writing the length of the bytes read, For example, an implementation can wait a little for more HTTP
followed by the bytes themselves) content (or the entire HTTP chunk) to become available before forming
and sending a chunk to the ICAP server.
- For objects arriving using chunked encoding, they can be When object content length is known a priori, it is tempting to
retransmitted as is (without re-chunking). declare a single chunk of matching size and then forward incoming
object data as it comes in, without any additional encoding efforts.
Similarly, it is tempting to forward already chunked content "as is",
without re-chunking it first.
However, unrecoverable errors may occur when an ICAP client promises
to send chunk content that it does not yet have because the promised
data may never arrive due to origin server or network errors.
Chunked coding does not have a mechanism to terminate a chunk
prematurely; the ICAP server would expect all promised bytes. Thus,
if ICAP client receives fewer than expected HTTP bytes, it has no
other choice but to close the ICAP connection. A straightforward
approach described above does not make false promises and avoids the
problem.
6.4 Distinct URIs for Distinct Services 6.4 Distinct URIs for Distinct Services
ICAP servers SHOULD assign unique URIs to each service they provide, ICAP servers SHOULD assign unique URIs to each service they provide,
even if such services might theoretically be differentiated based on even if such services might theoretically be differentiated based on
their method. In other words, a REQMOD and RESPMOD service should their method. In other words, a REQMOD and RESPMOD service should
never have the same URI, even if they do something that is never have the same URI, even if they do something that is
conceptually the same. conceptually the same.
This situation in ICAP is similar to that found in HTTP where it This situation in ICAP is similar to that found in HTTP where it
 End of changes. 

This html diff was produced by rfcdiff 1.15e, available from http://www.levkowetz.com/ietf/tools/rfcdiff/