修改历史列表：

266) 2019.8.7
266.1) bugfix: http_chat_async.c 中在 hdr_can_read() 回调用户注册的函数时，如果
回调函数返回-1则应该关闭连接

265) 2019.7.4
265.1) optimize: http_hdr.c 中，keep_alive 字段分三种情况：没有设置，保持长连接，
以及不保持长连接

264) 2019.6.5
264.1) bugfix: http_chat_async.c 在读取数据体时有问题

------------------------------------------------------------------------
263) 2018.4.27
263.1) feature: 针对 HTTP 请求 uri 中的 "?" 问号被转义成 "%3F" 的情况，可以做兼容性处理

262) 2017.8.16
262.1) bugfix: icmp 模块存在严重 BUG，当超时的响应包再次到达时会影响结果显示，
应该严格检验响应包与发送包的序列号是否相等

261) 2017.8.15
261.1) bugfix: icmp_stream.c 中函数 icmp_read 应该设置 read_ready = 0，以清除
在异步 IO 模式与 event 事件引擎设置的该标志位，否则会造成 IO 死循环
261.2) feature: icmp_chat.c 中将 ICMP_CHAT::tid 由原来的线程 ID 改为原子加值，
以支持协程模式下使用
261.3) feature: 将 ICMP_HOST::delay 的单位由秒调整为毫秒
261.4) compatibility: icmp_pkt.c 中在创建 ping 数据包时，数据载荷最好置为0，
否则有些移动的路由器会阻挡

260) 2016.5.10
260.1) feature: http_hdr_res.c 中的函数 http_hdr_res_parse 取消了对 http_status
的检查，以便于应用使用自定义状态码

------------------------------------------------------------------------
259) 2016.2.28
259.1) bugfix: http_hdr_req.c 中分析 url_part 有误
258) 2016.2.15
258.1) bugfix: http_hdr_req.c 中分析 url_part 有误

257) 2015.11.6
257.1) bugfix: http_hdr_res.c/http_hdr_req.c 中有可能会因为 main_cache_free
的调用在 http_hdr_res_free/http_hdr_req_free 之前调用而造成内存冲突

------------------------------------------------------------------------
256) 2015.7.23
256.1) compile: 去掉了 -pedantic 编译选项，因为其与 __FUNCTION__ 冲突

255) 2015.7.2
255.1) bugfix: http_hdr.c 中的函数 http_hdr_print/http_hdr_fprint/http_hdr_sprint
应过滤掉被禁掉的 HTTP 部字段

254) 2015.6.28
254.1) compile: 支持在 VC x64 环境下编译使用

253) 2015.1.30
253.1) feature: 在解析 HTTP 请求头的函数 http_hdr_req_line_parse 中，取消了
HTTP 请求方法的限制，从而允许应用可以扩展自己的 HTTP 请求方法

252) 2015.1.1
252.1) compile: 整个工程可以使用 clang/clang++ 编译通过
------------------------------------------------------------------------
251) 2014.11.27
251.1) bugfix: 239.1) 修改 http_hdr_req.c 中的函数  __strip_url_path 仍然存在 
问题，因为输入的两个参数有可能指向相同的内存地址，从而导致第二个参数被赋 '\0'，
所以应该把 ACL_VSTRING_RESET/ACL_VSTRING_TERMINATE 放在 acl_argv_split 之后。

250) 2014.11.18
250.1) bugfix: proto_snprintf.c 中函数 proto_secure_snprintf/proto_securevsnprintf
在调用 _vsnprintf_s 时第三个参数应该为 _TRUNCATE，否则当缓冲区给的比较小时VC提供的
API 内部会产生断言

249) 2014.8.8
249.1) bugfix: http_hdr_req.c 中当重复使用线程局部变量时调用 __hdr_reset
来重置其中的一些参数，虽然调用了 ACL_VSTRING_RESET，但该宏并不会将缓冲数据
尾部置 0，导致旧的数据会被重复使用

------------------------------------------------------------------------
248) 2014.5.13
248.1) bugfix: http_hdr_req.c 中 http_hdr_req_cookies_parse 在创建 cookies_table
哈希表时指定了 ACL_HTABLE_FLAG_KEY_REUSE，但在 __add_cookie_item 中却将 KEY 所
属的内存空间给提前释放了，从而引起了内存非法访问

247) 2014.1.11
247.1) compile: 在高版本VC（>VC2008) 环境下，使用更为安全的函数

246) 2013.12.5
246.1) feature: Makefile 支持 solaris 编译

245) 2013.11.22
245.1) bugfix: http_chat_sync.c，在函数 http_res_body_get_sync 中，当为
chunked 传输方式时，需要设置 ctx->chunk.chunk_oper = CHUNK_OPER_HEAD

244) 2013.11.6
244.1) compile: http_hdr_res.c/http_hdr_req.c，内部的线程局部变量无法在
主线程中释放，会导致 valgrind 报警告

------------------------------------------------------------------------

243) 2013.10.3
243.1) bugfix: http_chat_async.c 中 http_res_body_get_async/http_req_body_get_async
两个函数没有对 ctx->read_cnt 置 0

242) 2013.9.27
242.1) lib_acl 库中 ACL_EVENT_NOTIFY_RDWR/ACL_EVENT_NOTIFY_TIME 函数接口定义 
的修改，与之相关的模块(icmp)进行了修改

241) 2013.9.22
241.1) 因为 lib_acl 基础库中的 ACL_VSTREAM 读写回调函数接口变更，调整了与之相关的
部分内部接口，主要影响到了 icmp 模块中 icmp_stream.c 中的内部接口

240) 2013.7.30
240.1) warning: http_hdr_req.c::http_hdr_req_new() 内部使用了线程局部变量，
当用 valgrind 检查时会报内存泄露警告，通过在主线程中将其释放去掉了此警告

239) 2013.7.23
239.1) bugfix: http_hdr_req.c->http_hdr_req_create() 分离 URL 时有误

238) 2013.5.22
238.1) performance: http 协议库提高了 HTTP 头的解析速度，由原来的每秒 5 万
多次提升至每秒 17 万多次
238.2) bugfix: http 协议库中 http_hdr_reset 函数判断 hh 参数是否合法时有误

237) 2013.3.24
237.1) bugfix: http_hdr_req.c->__strip_url_path 解析有误导致第一个 / 丢失

236) 2012.12.30
236.1) feature: smtp_client 模块中添加了 smtp_printf 函数，更方便发送数据

235) 2012.12.17
235.1) feature:  smtp 协议模块增加了 smtp_greet 函数，通过它可以直接调用
smtp_helo/smtp_ehlo

234) 2012.11.7
334.1) feature: 增加了 smtp 协议的支持

233) 2012.7.10
233.1) compile: 支持 VC2003 的预编译功能，从而使编译速度更快

233) 2012.4.29
233.1) bugfix: 因为 acl_aio_request_timer 的时间单位由原来的秒改为微秒，
所以需要修改 icmp_chat_aio.c 中的时间单位

232) 2012.4.9
232.1) 通过添加函数声明前缀：__attribute__((format(printf,3,4))) 来帮助
编译器识别变参参数

231) 2011.6.21
231.1) bugfix: http_util.c, 当 http_util_req_new 中的 http_hdr_req_host
返回 NULL 会导致 http_util_req_new 产生 core
231.2) http_hdr_req.c: http_hdr_req_create 改变了提取 Host 字段的方式

230) 2011.6.15
230.1) http_hdr_req.c: http_hdr_req_create() 形成的 HTTP 请求格式为：
{METHOD} http://xxx.xxx.xxx/xxx?xxx HTTP/1.x
但该格式 tomcat 不能识别，所以现在改为:
{METHOD} /xxx?xxx HTTP/1.x

229) 2011.4.18
229.1) performance: http_hdr_req.c, http_hdr_res.c 增加线程局部内存池的缓存
功能，可以重复使用 HTTP 头对象，只要在程序开始时调用一次 http_hdr_cache 即可

228) 2011.4.11
228.1) performance: http_req_body_get_sync(), http_res_body_get_sync() 内部
的 ctx 临时变量的生存周期原来是以流的生命周期为准，因为一个流的生命周期内会
有多产请求或响应，所以会导致在 HTTP 长连接情况下，性能随着请求或响应次数的
增加而下降，现在将 ctx 的生命周期改为以每一次请求或响应的会话的生命周期为准

227) 2010.11.23
227.1) 修改了一些容易引起误解的函数返回值
227.2) bugfix: http_hdr.c, http_hdr_entry_value 内部对于设置了 off 标志位的
项应视为无效项

226) 2010.11.22
226.1) bugfix: http_hdr_req.c
http_hdr_req_cookies_parse() 中的 cookies_table 判断方式错误

225) 2010.2.2
225.1) http_chat_asyn.c: body_can_read() 中当回调返回 -1 时则也直接返回 -1

224) 2010.1.22
224.1) performance: http_chat_async.c, 重新设计了异步读数据体的过程，大大提高
了效率

223) 2010.1.11
223.1) feature: 增加了 http_util.c, 可以非常方便地使用 http 协议库里的函数
223.2) samples: 增加了 http/ 目录下的三个例子

222) 2010.1.8
222.1) http_chat_async.c: 去掉了无用的回调函数

221) 2010.1.1
221.1) 完善了HTTP协议异步读的接口，目前可以提供两种读HTTP头的方式, 将来可以
对外提供控制接口以允许用户自行设置读HTTP头的方式

220) 2009.12.30 - 12.31
220.1) http_chat_async.c: 重新设计了异步读数据体的框架, 使代码更加清晰明了，
同时更加灵活(采用注册勾子方式添加读的回调函数，原来只能注册一个读回调，现在
采用最新的 acl_aio 的可以注册多个回调的方式，这样其它程序也可以注册自己的
回调处理过程)
220.2) http_chat_async.c: 提供另一种异步读的模式

219) 2009.12.16
219.1) lib_http_struct.h: 去掉了 HTTP_HDR_RES 中无用的成员字段

218) 2009.12.14
218.1) http_hdr_req.c: 将 http_hdr_req_redirect 改名为 http_hdr_req_rewrite,
将 http_hdr_req_redirect2 改名为 http_hdr_req_rewrite2
218.2) http_hdr_req.c: http_hdr_req_url() 中去掉了以 __thread 方式使用线程
局部变量的方式，改为 acl_pthread_tls_get() 方式，这样当 lib_protocol 库被
调用者动态加载时可以避免动态库加载时线程局部变量引用的问题

217) 2009.12.4
217.1) feature: http_hdr.c 增加了 http_hdr_entry_replace2()/5 支持 HTTP 头里
部分字符串的多次匹配替换操作

216) 2009.12.3
216.1) http_hdr.c: 在分析 keep-alive 功能时增加了针对 chunked 传输的判断条件,
因为 HTTP1.1 在 chunked 传输模式下, 可以不必有 Connection: keep-alive 内容即
可保持长连接, 所以如果没有 Connection: keep-alive 但属于 chunked 传输则允许
保持长连接.

215) 2009.11.26
215.1) http: 整理了头文件, 从而便于使用
215.2) http_hdr_req.c: 添加了函数 http_hdr_req_url()/1 用来取得完整的请求URL

214) 2009.11.11
214.1) bugfix: http_hdr_req.c: __add_request_item() 当出现重复键时会有内存泄露问题

213) 2009.11.10
213.1) http_hdr_entry_value, http_hdr_entry 返回值去掉了 const 限制

212) 2009.6.22
212.1) Makefile: 可以通过 make all_lib 合并 lib_acl.a 至 lib_protocol.a,
这样用户再使用 lib_protocol.a 时就不必再包含 lib_acl.a 了

211) 2009.4.9
211.1) http 协议库中的通信部分进行了适合调整，使同步通信库与异步通信库中
的有些变量定义的含义更加一致
211.2) imcp 协议库中的 icmp_stat_host()/2 函数及结构 ICMP_HOST 由内部变
为外部直接可用，从而方便应用的使用
211.3) imcp 中的 ping 功能在时间精度上更细，原因是ACL库中win32平台下的
gettimeofday()/2 的精度更细

210) 2009.4.8
210.1)  使HTTP异步通信库更加易用；同时去掉了HTTP同步通信库中旧的通信模式

209) 2009.4.3
209.1) 因为 aio 库的修改，所以对HTTP异步通信部分进行了修改

208) 2009.3.6
208.1) feature: http_tmpl.c, 增加了 1xx, 2xx, 3xx 的信息提示功能

207) 2009.2.26
207.1) 因为 lib_acl 中的 aio 模块增加了一些新的功能特性，故修改了 
http_chat_async.c 模块，使之处理异步IO问题更加灵活，而不干扰之前的IO设置

206) 2009.2.17
206.1) feature: http/http_tmpl.c 增加了 http_tmpl_title()/1 函数便于根据
HTTP响应码查找提示标题信息

205) 2009.1.5
205.1) comment: icmp/ 的头文件中增加了 JavaDoc 方式的注释
205.2) icmp: 修改个别接口的定义方式

19) 2009.1.1-2009.1.3
19.1) 整理了工程目录(vc6, vc2003, vc2008)：增加了目录 src/http, src/icmp,
include/http, include/icmp, 并增加了统一的协议支持头文件 lib_protocol.h
19.2) 添加了 ICMP 协议的实现，目前仅支持 ping 操作

18) 2008.12.4
18.1) feature: http_chat_sync.c, 增加了读操作时的预缓冲功能，可以提高读的效率，
同时提供了控制接口，可以设置读时是否要采用预缓冲策略

17) 2008.11.21
17.1) feature: http_hdr_req.c 增加了 http_hdr_req_redirect2() 接口，可以在
原有的请求头进行重定向重写请求头

16) 2008.10.23
16.1) feature: 添加了 http_hdr_req_range 及 http_hdr_res_range 两个分析偏移
传输的函数分析

15) 2008.10.11
15.1) 重新将HTTP协议的头文件的注释整理了一遍

14) 2008.10.10
14.1) bugfix: 修复了有关sscanf 针对64位整数操作时的BUG，受影响的函数有
http_chat_sync.c: chunked_hdr_get2(), http_chat_async: chunked_hdr_get_ready()

13) 2008.10.9
13.1) workaround: 重新整理了VC6、VC2003编译环境下的工程组织，将动态库以
lib_http.dll, lib_http.lib, lib_http_d.dll, lib_http_d.lib 命名，将静态库以
lib_http_vc6.lib, lib_http_vc6d.lib, lib_http_vc2003.lib, lib_http_vc2003d.lib
命名，其中动态库是用VC2003编译的，可以在VC6下使用

12) 2008.10.7
12.1) bugfix: HTTP_HDR 结构中引入的两个成员（chat_ctx，chat_free_ctx_fn），当调用
http_hdr_clone() 时，应该将这两个值赋空，否则会引起二次释放同一内存对象，造成存非
法访问，当初之所以引入这两个成员变量，是为了避免在HTTP异步通信时通过ACL_VSTREAM 的
acl_vstream_add_close_handle() 来回调释放函数；另外，现在HTTP同步通信中依然采用
acl_vstream_add_close_handle() 模式来回调释放函数，将来需要改成与异步通信的释放模式

11) 2008.10.6
11.1) compile bugfix: 在编译动态库时没有将http_hdr_res_get_sync引出

10) 2008.9.29
10.1) feature: 修改了所有头文件的函数定义，添加了 HTTP_API 定义，允许
以DLL方式引出, 可以方便其它编程语言使用 HTTP 库，当其它应用以DLL方式使用
HTTP 库时，需要增加一个预定义宏：HTTP_DLL

9) 2008.9
9.1) 调整了 http_chat_async.c 中的部分接口

8) 2008.7.23
8.1) 兼容性: 腾讯修改的APACHE存在问题，对于自己不认识的HTTP请求头字段采取超时关闭
的方式，以前在关闭某一HTTP请求项时通常采用将第一个字母替换为 "_" 的方式(cresondo
的做法)，看来这种方法对于QQ的服务器存在问题，所以现在采用另外的方法来禁掉某一请求项

7) 2008.7.17
7.1) safety: http_chat_async.c 中增加了 ctx_nested_check() 函数，以避免关闭或超时
回调函数被嵌套调用

6) 2008.3.19
6.1) feature: 支持 content-length 大于 unsigned int 最大值的情况

5) 2008.3.10
5.1) feature: http_hdr_req.c, 增加了http_hdr_req_redirect，以便应用进行重定向操作

4) 2008.3.6
4.1) bugfix: http_hdr_req.c, 在由客户端的请求头中获取 Host 字段时，在请求方法为
CONNECT方法时，如果没有HOST字段，则取不到HOST信息，增加一条功能：此时可以尝试
在 CONNECT ip[domain]:port HTTP/1.1 中由 ip[domain] 来填充HOST信息

url行且
3) 2008.3.2
3.1) features: http_chat_sync.c, 增加了一组同步获取服务器返回数据的函数接口

2) 2008.2.13
2.1) features: add http_hdr_clone() in http_hdr.c, add http_hdr_res_clone()
in http_hdr_res.c, add http_hdr_req_clone() in http_hdr_req.c

1) 2008.1.8
1.1) bugfix: http_hdr_req.c->__add_request_item，__add_cookie_item，中对变量对
的存储原来未处理重复变量名的情况，会导致内存泄漏。
