Chinaunix首页 | 论坛 | 博客
  • 博客访问: 95153
  • 博文数量: 11
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 191
  • 用 户 组: 普通用户
  • 注册时间: 2013-10-18 16:33
个人简介

有二事焉,恒然于心,敬之畏之,日省日甚!外乎者如璀璨星穹,内在者犹道德律令。

文章分类

全部博文(11)

文章存档

2017年(7)

2014年(2)

2013年(2)

我的朋友

分类: Java

2017-04-24 11:24:51

HttpCore 手册

Oleg Kalnichevski

前言
1. HttpCore范围
2. HttpCore目标
3. HttpCore不能做什么
1. 基础概念
1.1. HTTP消息
1.1.1. 结构
1.1.2. 基本操作
1.1.3. HTTP实体
1.1.4. 创建实体
1.2. HTTP协议处理器
1.2.1. 标准协议拦截器
1.2.2. 与协议处理器一起工作
1.3. HTTP执行上下文
1.3.1. 上下文共享
2. 阻塞I/O模型
2.1. 阻塞HTTP连接
2.1.1. 与阻塞HTTP连接一起工作
2.1.2. 用阻塞I/O传输内容
2.1.3. 支持内容传输机制
2.1.4. 终止HTTP连接
2.2. 异常处理
2.2.1. 协议异常
2.3. 阻塞HTTP协议处理者
2.3.1. HTTP服务
2.3.2. HTTP请求执行器
2.3.3. 连接持久化/重用
2.4. 连接池
2.5. TLS/SSL支持
2.6. 嵌入式HTTP服务器
3. 基于NIO的异步I/O
3.1. 与其它I/O框架的差异
3.2. I/O反应堆
3.2.1. I/O分配器
3.2.2. I/O反应堆的关闭
3.2.3. I/O会话
3.2.4. I/O会话状态管理
3.2.5. I/O会话事件遮罩
3.2.6. I/O会话缓冲
3.2.7. I/O会话关闭
3.2.8. 监听I/O反应堆
3.2.9. 连接到I/O反应堆
3.3. I/O反应堆的配置
3.3.1. I/O兴趣集操作队列
3.4. I/O反应堆配置
3.4.1. I/O反应堆审计日志
3.5. 非阻塞HTTP连接
3.5.1. 非阻塞HTTP连接执行上下文
3.5.2. 与非阻塞HTTP连接一起工作
3.5.3. HTTP I/O控制
3.5.4. 非阻塞内容传输
3.5.5. 非阻塞内容传输机制支持
3.5.6. 直接隧道I/O
3.6. HTTP I/O事件分派
3.7. 非阻塞HTTP内容生产者
3.7.1. 创建非阻塞实体
3.8. 非阻塞HTTP协议处理者
3.8.1. 异步HTTP服务
3.8.2. 异步HTTP请求执行器
3.9. 非阻塞连接池
3.10. 流水线请求执行
3.11. 非阻塞TLS/SSL
3.11.1. SSL I/O会话
3.11.2. TSL/SSL感知I/O事件分派
3.12. 嵌入式非阻塞HTTP服务器
4. 高级主题
4.1. HTTP消息解析和格式化框架
4.1.1. HTTP行解析和格式化
4.1.2. HTTP消息流和会话I/O缓冲
4.1.3. HTTP消息解析器和格式器
4.1.4. 在必要时解析HTTP头

前言
HttpCore是实现了HTTP协议最基本方面的组件集合,尽管如此也足以开以最小占用开发出全性能的客户端和服务端HTTP服务。

HttpCore有如下的范围和目标:
1. HttpCore的范围
* 一套创建客户端/代理/服务端HTTP服务的一致性API
* 一套创建同步和异步HTTP服务的一致性API
* 一组基于阻塞(经典)和非阻塞(NIO)I/O模型的低级别组件集

2. HttpCore的目标
* HTTP传输方面最基本的实现
* 在好的性能和API透明性&表现型之间折中
* 小(可预见的)内存占用
* 自包含函数库(没有超出JRE之外的依赖)
3. HttpCore不能做什么
* HttpClient的一个替代
* Servlet APIs的一个替代

第一章. 基本原理
1.1. HTTP消息
1.1.1. 结构
一个HTTP消息由一个头和一个可选的体组成。一个HTTP请求的消息头由一个请求行和一个头字段集合组成。一个HTTP响应的消息头由一个状态行和一个头字段集合组成。所有的HTTP消息必须包含协议版本。一些HTTP消息可以可选地封入一个内容体。
HttpCore规定HTTP消息对象模型尽量的遵循这个定义,并且对HTTP消息元素的序列化(格式化)和反序列化(解析)提供大量的支持。

1.1.2. 基本操作
1.1.2.1. HTTP请求消息
HTTP请求是从客户端发送到服务器端的一个消息。那个消息的第一行包含了适用于资源的方法、资源的标识符和在使用中的协议版本。

*************************************************************
*                                                           *
* HttpRequest request = new BasicHttpRequest("GET", "/",    *
* HttpVersion.HTTP_1_1);                                    *
* System.out.println(request.getRequestLine().getMethod()); *
* System.out.println(request.getRequestLine().getUri());    *
* System.out.println(request.getProtocolVersion());         *
* System.out.println(request.getRequestLine().toString());  *
*                                                           *
*************************************************************
stdout>

******************
*                *
* GET            *
* /              *
* HTTP/1.1       *
* GET / HTTP/1.1 *
*                *
******************

1.1.2.2. HTTP响应消息
HTTP响应是在已经接收并且解释了一个请求消息之后由服务器端发回到客户端的一个消息。消息的第一行由协议版本紧跟一个数字状态码和它的相关的文本短语。

***********************************************************************
*                                                                     *
* HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, *
* HttpStatus.SC_OK, "OK");                                            *
* System.out.println(response.getProtocolVersion());                  *
* System.out.println(response.getStatusLine().getStatusCode());       *
* System.out.println(response.getStatusLine().getReasonPhrase());     *
* System.out.println(response.getStatusLine().toString());            *
*                                                                     *
***********************************************************************

stdout>

*******************
*                 *
* HTTP/1.1        *
* 200             *
* OK              *
* HTTP/1.1 200 OK *
*                 *
*******************

1.1.2.3. HTTP消息公共属性和方法
一个HTTP消息能包含用以描述消息属性的一些例如内容长度、内容类型和其它的头。HttpCore提供了获取、添加、移除和枚举这些头的方法。

***********************************************************************
*                                                                     *
* HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, *
*       HttpStatus.SC_OK, "OK");                                      *
* response.addHeader("Set-Cookie",                                    *
*       "c1=a; path=/; domain=localhost");                            *
* response.addHeader("Set-Cookie",                                    *
*       "c2=b; path=\"/\", c3=c; domain=\"localhost\"");              *
* Header h1 = response.getFirstHeader("Set-Cookie");                  *
* System.out.println(h1);                                             *
* Header h2 = response.getLastHeader("Set-Cookie");                   *
* System.out.println(h2);                                             *
***********************************************************************

stdout>

********************************************************
*                                                      *
* Set-Cookie: c1=a; path=/; domain=localhost           *
* Set-Cookie: c2=b; path="/", c3=c; domain="localhost" *
* 2                                                    *
*                                                      *
********************************************************

这里有一个有效的方法可以用HeaderIterator接口获取给定类型的所有头。

***********************************************************************
*                                                                     *
* HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, *
*       HttpStatus.SC_OK, "OK");                                      *
* response.addHeader("Set-Cookie",                                    *
*       "c1=a; path=/; domain=localhost");                            *
* response.addHeader("Set-Cookie",                                    *
*       "c2=b; path=\"/\", c3=c; domain=\"localhost\"");              *
* HeaderIterator it = response.headerIterator("Set-Cookie");          *
* while (it.hasNext()) {                                              *
*       System.out.println(it.next());                                *
* }                                                                   *
*                                                                     *
***********************************************************************

stdout>

********************************************************
*                                                      *
* Set-Cookie: c1=a; path=/; domain=localhost           *
* Set-Cookie: c2=b; path="/", c3=c; domain="localhost" *
*                                                      *
********************************************************

另外也提供便利的方法用以去解析HTTP消息到单个的头元素中。

***********************************************************************
*                                                                     *
* HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, *
*       HttpStatus.SC_OK, "OK");                                      *
* response.addHeader("Set-Cookie",                                    *
*       "c1=a; path=/; domain=localhost");                            *
* response.addHeader("Set-Cookie",                                    *
*       "c2=b; path=\"/\", c3=c; domain=\"localhost\"");              *
* HeaderElementIterator it = new BasicHeaderElementIterator(          *
*       response.headerIterator("Set-Cookie"));                       *
* while (it.hasNext()) {                                              *
*       HeaderElement elem = it.nextElement();                        *
*       System.out.println(elem.getName() + " = " + elem.getValue()); *
*       NameValuePair[] params = elem.getParameters();                *
*       for (int i = 0; i < params.length; i++) {                     *
*               System.out.println(" " + params[i]);                  *
*       }                                                             *
* }                                                                   *
*                                                                     *
***********************************************************************

stdout>

*********************
*                   *
* c1 = a            *
*  path=/           *
*  domain=localhost *
* c2 = b            *
*  path=/           *
* c3 = c            *
*  domain=localhost *
*                   *
*********************

HTTP头仅在需要时被分离到单独的头元素中。在一个HTTP连接上接收的头在内部被存储为一个字符数组并且在当你访问他们的属性时被延迟解析。



未完待续......


阅读(1819) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~