ICAP
ICAP协议介绍一. ICAP协议简介
ICAP 是Internet Content Adaptation Protocol 的缩写.它在本质上是在HTTP message上执行RPC远程过程调用的一种轻量级的协议, 也就是说, 它让ICAP Client可以把HTTP Message传给ICAP Server, 然后ICAP Server可以对其进行某种变换或者其他处理(“匹配”).被变换的message可以是HTTP请求也可以是HTTP应答. ICAP 是和HTTP协议在结构和用法上都相似的请求/应答式的协议.虽然和HTTP协议类似,但它并不是HTTP,也并不是以HTTP协议为底层协议在其上实现的应用层协议, 也就是说, ICAP 的message不能够被HTTP代理所处理和转发. 实际上, 在ICAP协议刚被提出的时候, 出于HTTP协议已被业界广泛采用和利用在HTTP上的已有的大量投资, 是曾经把它设计成HTTP上层的应用层协议的. 但是, 以HTTP为底层而实现的方案后来被证明是不可行的, 因为一些对于ICAP相当重要的特性无法在HTTP上面实现.例如, ICAP C lient可以在传输一个消息体的中间暂停并且等待一个”100 Continue”消息, 而HT TP Client只能在消息头和消息体之间暂停等待, 另外, HTTP代理程序对Http me ssage 的一些变换是合法的和无害的, 而对于ICAP, 由于ICAP 的”消息头中又内嵌有消息头” 的封装机制和其他其他一些特性就将会引起问题. Origin Server 用户所要获得的资源所存储在或者所被生成的Server, 例如xxxmail 的box rver就是一种Origin Server. ICAP资源和HTTP资源相似, 但是其URI指定
的是某个负责执行HTTP message 的变换的ICAP服务. ICAP rver: 和一个HTTP rver类似,但可通过ICAP请求应用程序服务. ICAP client: 建立和ICAP s ervers 的连接并发送请求给它的程序.ICAP client经常是(但不总是)为用户服务的代理程序. ICAP 的两种工作模式: 1) 请求修改模式在”请求修改”(reqmod)模式中, ICAP Client把HTTP request发送给ICAP Server, 然后ICAP SERVER 可以做以下处理之一: a. 送回http request 的一个修改后的版本, 然后ICAP Clie nt把修改后的http request交给一个Origin Server去处理, 或者把修改后的req uest排队送到另一个ICAP Server做进一步的修改; b. 送回一个http respon. 在错误发生需要给用户有用的提示信息的时候. 例如”你请求访问一个你没有权限访问的网页”. c. 返回一个错误. ICAP Client必须能够处理以上所有这3种ICAP SERVER 的respon. 但是ICAP Client 的实现在处理错误的时候仍可具有灵活性, 对于ICAP Server返回的错误, 可以直接把错误返回给用户, 或者再重新尝试匹配变换过程(把http request交给ICAP Server修改的过程). 在请求修改模式下的ICAP 的典型的数据流程如下图所示: origin-rver | /|\ | | 5 | | 4 | | \|/ | 2 ICAP-client --------------%26gt; ICAP-resource (surrogate) ICAP-resource (surrogate)
一. ICAP协议简介
ICAP是Internet Content Adaptation Protocol的缩写.它在本质上是在HTTP message上执
行RPC远程过程调用的一种轻量级的协议, 也就是说, 它让ICAP Client可以把HTTP Message传给ICA
P Server, 然后ICAP Server可以对其进行某种变换或者其他处理(“匹配”).被变换的message可以是HTTP请求也可以是HTTP应答.
ICAP是和HTTP协议在结构和用法上都相似的请求/应答式的协议.虽然和HTTP协议类似,但它并不是HTTP,也并不是以HTTP协议为底层协议在其上实现的应用层协议, 也就是说, ICAP的message不能够被HTTP代理所处理和转发. 实际上, 在ICAP协议刚被提出的时侯, 出于HTTP协议已被业界广泛采用和利用在HTTP上的已有的大量投资, 是曾经把它设计成HTTP上层的应用层协议的. 但是, 以HTTP为底层而实现的方案后来被证明是不可行的, 因为一些对于ICAP相当重要的特性无法在HTTP上面实现.例如, ICAP Client 可以在传输一个消息体的中间暂停并且等待一个”100 Continue”消息, 而HTTP Client 只能在消息头和消息体之间暂停等待, 另外, HTTP代理程序对Http message的一些变换是合法的和无害的, 而对于ICAP, 由于ICAP的”消息头中又内嵌有消息头”的封装机制和其他其他一些特性就将会引起问题.
Origin Server
用户所要获得的资源所存储在或者所被生成的Server, 例如xxxmail的box rver就是一种Origin Server.
ICAP资源
和HTTP资源相似, 但是其URI指定的是某个负责执行HTTP message的变换的ICAP服务.
ICAP rver:
和一个HTTP rver类似,但可通过ICAP请求应用程序服务.
ICAP client:
建立和ICAP rvers的连接并发送请求给它的程序.ICAP client经常是(但不总是)为用户服务的代理程序.
ICAP的两种工作模式:
1) 请求修改模式
在”请求修改”(reqmod) 模式中, ICAP Client把HTTP request发送给ICAP Server, 然后ICAP SERVER可以做以下处理之一:
a. 送回http request的一个修改后的版本, 然后ICAP Client把修改后的http request交给一个Origin Server去处理, 或者把修改后的request排队送到另一个ICAP Server做进一步的修改;
键盘维修b. 送回一个http respon. 在错误发生需要给用户有用的提示信息的时侯. 例如”你请求访问一个你没有权限访问的网页”.
c. 返回一个错误.
ICAP Client必须能够处理以上所有这3种ICAP SERVER的respon. 但是ICAP Client的实现在处理错误的时侯仍可具有灵活性, 对于ICAP Server返回的错误, 可以直接把错误返回给用户, 或者再重新尝试匹配变换过程(把http request交给ICAP Server 修改的过程).
在请求修改模式下的ICAP的典型的数据流程如下图所示:
origin-rver英文写信
| /|\
| |
5 | | 4
| |
\|/ | 2
ICAP-client --------------> ICAP-resource
120急救(surrogate) <-------------- on ICAP-rver
| /|\ 3
| |
6 | | 1
| |
\|/ |
client
1. 用户client向支持ICAP的代理程序(ICAP client)发送请求, 请求获得在一个Origin Server上的一个对象(网页,文件等等).
2. 代理程序向ICAP rver发送请求.
3. ICAP rver在收到的request 上面执行ICAP 资源的服务程序,然后送回很可能修改过的request, 或者是对该request的respon给ICAP client.
如果步骤3 送回了request的话:
4. 代理程序把ICAP Server送回的request(很可能和用户client的原来的request 不同了的)送给Origin Server.
5. Origin Server对request作处理并把应答给代理程序.
6. 代理程序把应答(从ICAP rver回送的或者是Origin Server回送的) 回送给用户client.
2) 应答修改模式
在”应答修改”(respmod)模式中,ICAP client把HTTP respon(Origin Server所生成的)发送给ICAP rver, 然后ICAP rver可以做以下之一:
a. 回送respon的一个修改后的版本.
b. 返回错误
在应答修改模式下的ICAP的典型的数据流程如下图所示:
origin-rver
| /|\
| |
3 | | 2
| |
\|/ | 4
ICAP-client --------------> ICAP-resource
(surrogate) <-------------- on ICAP-rver
| /|\ 5
| |
6 | | 1
| |
\|/ |
client
1. 用户client向支持ICAP的代理程序(ICAP client)发送请求,请求获得一个在Origin Server上的对象.
2. 代理程序把request送给Origin Server.
3. Origin Server对request作出应答.
4. 支持ICAP的代理程序把Origin Server的应答发送ICAP rver.
5. ICAP rver在Origin Server的应答的上面执行ICAP资源的服务程序,然后把很可能修改过的应答送回给ICAP client.
6. 代理程序把应答(很可能把Origin Server的应答修改过的)回送给用户client.
ICAP URI:
ICAP Client可以在ICAP URI里面传递参数给ICAP服务程序.ICAP URI的格式例子: icap://ample:2000/rvices/antivirus
icap://icap/rvice?mode=translate&lang=french
二. ICAP的请求/应答的例子
1. 请求修改模式
ICAP Request如下所示:
REQMOD icap://icap-rver/rver?arg=87 ICAP/1.0
SAS接口
Host: icap-rver
Encapsulated: req-hdr=0, null-body=170
GET / HTTP/1.1
Host:
Accept: text/html, text/plain
Accept-Encoding: compress
Cookie: ff39fk3jur@4ii0e02i
If-None-Match: "xyzzy", "r2d2xxxx"
ICAP Respon如下所示:
ICAP/1.0 200 OK
Date: Mon, 10 Jan 2000 09:55:21 GMT
Server: ICAP-Server-Software/1.0
Connection: clo
组装机器人2ISTag: "W3E4R7U9-L2E4-2"
Encapsulated: req-hdr=0, null-body=231
GET /modified-path HTTP/1.1
Host:
Via: 1.0 icap-rver (ICAP Example ReqMod Service 1.1)
Accept: text/html, text/plain, image/gif
Accept-Encoding: gzip, compress
If-None-Match: "xyzzy", "r2d2xxxx"
第2个例子和上面相似, 但request是以”POST”方式提交而不是以”GET”方式提交: ICAP Request:
REQMOD icap://icap-rver/rver?arg=87 ICAP/1.0
Host: icap-rver
Encapsulated: req-hdr=0, req-body=147
POST /origin-resource/form.pl HTTP/1.1
Host:
Accept: text/html, text/plain
Accept-Encoding: compress
Pragma: no-cache
1e
I am posting this information.
ICAP Respon:人名字大全
ICAP/1.0 200 OK
Date: Mon, 10 Jan 2000 09:55:21 GMT
Server: ICAP-Server-Software/1.0
Connection: clo
ISTag: "W3E4R7U9-L2E4-2"
Encapsulated: req-hdr=0, req-body=244
POST /origin-resource/form.pl HTTP/1.1
Host:
Via: 1.0 icap-rver (ICAP Example ReqMod Service 1.1)
有人无人都是你打一字
Accept: text/html, text/plain, image/gif
Accept-Encoding: gzip, compress
Pragma: no-cache
Content-Length: 45
2d
I am posting this information. ICAP powered!
2. 应答修改模式
RESPMOD icap://ample/satisf ICAP/1.0
>简历英文