续(二)
1.2. HTTP协议处理器
HTTP协议拦截器是一个实现了HTTP协议特定方面的程序。通常协议拦截器被希望对入埠消息的一个特定头或一组相关头起作用又或者用一个特定头或一组相关头填充离埠消息。协议拦截器也能够操纵消息附加内容实体;明显地,内容压缩/解压将是一个好实例。一个包装实体类被用于修饰原始实体的那些地方通常由「装饰器」模式来完成。若干协议拦截器能够结合在一个逻辑单元中。
HTTP协议处理器是一个实现了「责任链」模式的多个协议拦截器组成的集合,每个单独的协议拦截器被期望工作HTTP协议中它力所能及的那些特定方面。
通常拦截器被执行的顺序应当不相关,只要它们不依赖执行上下文的一个特定的状态。如果多个协议拦截器之间有内部关联并因之当按特定顺序被执行,那么它们应该按照它们被期望的执行顺序而添加到协议处理器中。
协议拦截器应当实现线程安全。类似servlet,协议拦截器不应当使用实例变量除非这些变量被同步访问。
1.2.1. 标准协议拦截器
HttpCore由一些用于客户端或服务端HTTP处理的最基本的协议拦截器组成。
1.2.1.1. RequestContent
RequestContent是最重要的离埠请求拦截器。通过基于被附加实体的属性和协议的版本来添加Content-Length或Transfer-Content头以负责限定内容长度。这个拦截器是客户端协议处理器所必须的校正函数。
1.2.1.2. ResponseContent
ResponseContent是最重要的离埠响应拦截器。通过基于被附加实体的属性和协议的版本来添加Content-Length或Transfer-Content头以负责限定内容长度。这个拦截器是服务端协议处理器所必须的校正函数。
1.2.1.3. RequestConnControl
RequestConnControl负责给离埠请求添加Connection头,这是HTTP/1.0连接持久化的基础。这个拦截器被推荐给客户端用于协议处理。
1.2.1.4. ResponseConnControl
ResponseConnControl负责给离埠响应添加Connection头,这是HTTP/1.0连接持久化的基础。这个拦截器被推荐给客户端用于协议处理。
1.2.1.5. RequestDate
RequestDate负责给离埠请求添加Date头。这个拦截器对于客户端协议处理器来说是可选地。
1.2.1.6. ResponseDate
ResponseDate负责给离埠响应添加Date头,这个拦截器被推荐给服务端协议处理器。
1.2.1.7. RequestExpectContinue
RequestExpectContinue负责添加Expect头使得「expect-continue」握手成为可能。这个拦截器被推荐给客户端协议处理器。
1.2.1.8. RequestTargetHost
RequestTargetHost负责添加Host头。这个拦截器对于客户端协议处理器来说是必须的。
1.2.1.9. RequestUserAgent
RequestUserAgent负责添加User-Agent头。这个拦截器被推荐给客户端协议处理器。
1.2.1.10. ResponseServer
ResponseServer负责添加Server头。这个拦截器被推荐给服务端协议处理器。
1.2.2. 与协议处理器一起工作
通常HTTP协议处理器被用于在执行应用程序特定逻辑之前的到埠消息预处理和离埠消息后处理。
***********************************************************
* *
* HttpProcessor httpproc = HttpProcessorBuilder.create() *
* // Required protocol interceptors *
* .add(new RequestContent()) *
* .add(new RequestTargetHost()) *
* // Recommended protocol interceptors *
* .add(new RequestConnControl()) *
* .add(new RequestUserAgent("MyAgent-HTTP/1.1")) *
* // Optional protocol interceptors *
* .add(new RequestExpectContinue(true)) *
* .build(); *
* HttpCoreContext context = HttpCoreContext.create(); *
* HttpRequest request = new BasicHttpRequest("GET", "/"); *
* httpproc.process(request, context); *
* *
***********************************************************
发送请求到目标主机并获取一个响应。
****************************************
* *
* HttpResponse = <...> *
* httpproc.process(response, context); *
* *
****************************************
请注意BasicHttpProcessor类不会同步访问其内部结构,因此可能不是线程安全的。
1.3. HTTP执行上下文
原始的HTTP被设计成为一个无状态的,面向响应-请求的协议。然而,现实世界中的应用程序常常要能通过若干逻辑相关的请求-响应交换来保持状态信息。为了使应用程序能够维护一个处理状态,HttpCore允许HTTP消息在一个特定的执行上下文中被执行。其被称作HTTP上下文。多个逻辑相关的消息能参与到一个逻辑会话中如果同一个上下文在连续的请求之间被复用的话。HTTP上下文功能上类似java.util.Map。它是一个简单的逻辑相关的键值集合。
请注意HttpContext能够包含任意的对象并因此可能造成在多个线程间共享时不安全。必须注意确保HttpContext实例在同一时刻只能被一个线程访问。
1.3.1. 上下文共享
协议拦截器能够通过共享信息的方式进行协作——必须处理状态——通过HTTP执行上下文。HTTP上下文是一个能够用于讲一个属性名字映射到一个属性值的结构。HTTP上下文内部的实现依赖于一个HashMap。HTTP上下文主要的目的是促进各种逻辑相关的组件之间的信息共享。HTTP上下文能够被用于为一个消息或若干个连续消息存储一个处理状态。如果同一个上下文在连续的多个消息之间被重用的话,那么多个逻辑相关的消息就能参与到一个逻辑会话中来。
************************************************************************************
* *
* HttpProcessor httpproc = HttpProcessorBuilder.create() *
* .add(new HttpRequestInterceptor() { *
* public void process( *
* HttpRequest request, *
* HttpContext context) throws HttpException, IOException { *
* String id = (String) context.getAttribute("session-id"); *
* if (id != null) { *
* request.addHeader("Session-ID", id); *
* } *
* } *
* }) *
* .build(); *
* HttpCoreContext context = HttpCoreContext.create(); *
* HttpRequest request = new BasicHttpRequest("GET", "/"); *
* httpproc.process(request, context); *
* *
************************************************************************************
未完待续。。。
阅读(2136) | 评论(0) | 转发(0) |