修改历史列表: ------------------------------------------------------------------------ 216) 2014.1.11 216.1) compile: 支持 vc2008 编译器 216.2) feature: 在使用高版本 vc(_MSC_VER >= 1500,即 VC9 以上版本) 编译器时, 不再使用 _CRT_SECURE_NO_WARNINGS 宏来避免编译器警告,而是使用 VC 建议的安全函数 215) 2014.1.8 215.1) feature: http_request 类添加了方法 set_timeout 可以设置网络超时及读写超时 214) 2014.1.6 214.1) bugfix: 新线程池服务器模板 master_threads2 类在调用 service_pre_jail 时应该通过 acl_threads_server_event 获得事件引擎 (原来写的是 acl_ioctl_server_event, 这个是旧的服务器模板获取事件引擎的方法) 213) 2014.1.5 213) security: ipc 通信机制中增加了随机数安全验证功能,以防止外来干扰 212) 2014.1.4 212.1) bugfix: queue_file.cpp,queue_file::create 函数内在尝试创建文件时 可能会因为文件系统出问题而进入循环过程,通过增加标志位避免该问题 211) 2013.12.29 211.1) feature: json 类支持将字符串对象添加至数组对象中 211.2) samples: json 下的测试用例继续完善 210) 2013.12.28 210.1) samples: 将所有的 json 测试用例移至 samples/json 目录下 209) 2013.12.25 209.1) bugfix: json.cpp 中 json_node::set_text 误把文本值赋予标签变量 208) 2013.12.22 208.1) feature: socket_stream 类支持 ssl 传输(与 polarssl 结合); 去掉了 ssl_stream 类 207) 2013.12.13 207.1) feature: master_threads2,新增加了服务器线程池模板 ------------------------------------------------------------------------ 206) 2013.12.7 206.1) samples/master_udp_threads: 该例子中的线程局部变量的静态用法 __thread 无法支持 solaris,改为动态方式使用线程局部变量方式 205) 2013.12.6 205.1) comment: 修正 connect_manager::init 原来错误的参数格式描述 205.2) bugfix: connect_pool::put 在归还连接给连接池时,为了让过期连接尽快回收, 需要调用 push_front,原来调用了 push_back 204) 2013.12.5 204.1) feature: Makefile 支持 solaris(x86) 编译 203) 2013.12.2 203.1) document: 消除了几个头文件中由 doxygen 检测出的错误注释 202) 2013.12.1 202.1) feature: 新增加 event 模块,将 master_timer 定时器类改名为 event_timer 类放于 event 模块中 202.2) feature: 在基类 master_base 中添加了方法 proc_set_timer 用于添加进程 级别的定时器,(同时移除了 master_threads 子类中的 proc_set_timer 方法),这样 master_base 的所有子类 (master_threads, master_aio, master_proc, master_udp, master_trigger) 都可以添加进程级别的定时器 201) 2013.11.29 201.1) feature: master 模块增加了定时器类 master_timer 201.2) feature: master_threads 模板支持新的定时器 201.3) workaround: stream 模块的异步流部分,将 aio_timer_callback 等类声明从 aio_handle 类中移除成为独立的类 200) 2013.11.26 200.1) feature: json.cpp, 200.1.1) json 类增加了以下功能函数: a) 构造函数 json(const json_node&),可以根据一个 json 对象的某一个 json 结点创建一个新的 json 对象 b) duplicate_node 根据一个 json 对象的某个 json 结点复制一个新的 json 结点 c) to_string 新的将 json 对象转换为字符串的函数 200.1.2) json_node 类增加了以下功能函数: a) to_string 根据 json 结点生成 json 字符串的函数 b) set_tag 用来替换标签名 c) set_text 当 json 结点为叶结点时用来替换标签值 200.2) samples: 新增加了 json 测试用例 json3/json4 199) 2013.11.23 199.1) feature: http_header 类丰富了 set_url 及请求构造函数的参数类型, 允许 URL 参数中含有请求参数,且内部会自动解析 url 中的主机名及参数 199.2) feature: http_header 类添加了请求参数添加方法:add_int 及 add_format 199.3) feature: http_header add_param 允许参数值为空指针或空串 199.3) feature: http_header::set_host 仅是将主机字符串添加至成员变量 host_ 中 199.4) feature: http_header::set_url 中允许添加类似于 http://www.test.com 的 url(即末尾可以没有 '/') 198) 2013.11.21 198.1) feature: http_client 类增加了 chunked 传输方式; 198.2) feature: http_request 类增加流式写函数:write_head/write_body; 198.3) feature: http_response 类增加了流式写数据方式 197) 2013.11.19 197.1) workaround: 调整类 http_client 中的两个函数 get_respond_head 和 get_request_head 的返回值限制,去掉 const 限定词 197.2) bugfix: http_header.cpp,http_header::date_format 在 WIN32 编译出错 196) 2013.11.17 196.1) bugfix: json.cpp, json::getElementsByTags() 内部未对空指针做判断 196.2) samples: samples/json2, 用于测试级联提取数据的例子 195) 2013.11.13 195.1) bugfix: http_header.cpp, http_header::date_format 在 UNIX 平台下 gmtime 是线程不安全的,所以需要使用 gmtime_r 194) 2013.11.9 194.1) feature: HttpServletRequest 类增加了几个获取 HTTP 请求头参数的方法 193) 2013.11.8 193.1) feature: http_utils::get_addr 的 url 参数既可以是 HTTP 也可以是 HTTPS 192) 2013.11.7 192.1) bugfix: http_download.cpp 的构造函数中调用 ACL_SAFE_STRNCPY 时第三个 参数给出错误的尺寸大小(此 bug 由高版本的 gcc4.8.2 检测出) ------------------------------------------------------------------------ 191) 2013.11.5 191.1) bugfix: http_header.cpp, http_header::build_common 添加 Content-Length HTTP 头部字段时没有添加分隔符 ": " 190) 2013.11.1 190.1) feature: 当使用 GCC 进行编译时,针对所有具有变参的函数接口定义添加了 属性限定---__attribute__((format(printf, n, m))),这样便于在编译期就能发现 因参数使用不当而导致的错误 190.2) bugfix: master_udp.cpp,当以 alone 方式运行时,没有将 socket_stream 赋给 ACL_VSTREAM::context,导致在 service_main 时又重新打开一次 189) 2013.10.31 189.1) bugfix: thread.cpp,当线程为分离方式创建时 thread::thread_run 在调用完 虚函数 run 后不得再引用线程对象的 return_arg_,否则会造成内存非法访问 188) 2013.10.20 188.1) feature: HttpServletResponse 类支持 Transfer-Encoding: chunked 传输方式 187) 2013.10.19 187.1) samples: 增加了测试用例 thread_client,一个多线程网络客户端程序 186) 2013.10.18 186.1) bugfix: db/db_mysql.cpp, 在打开 mysql 连接时设置字符集,判断是否设置 成功的方法有误 185) 2013.10.15 185.1) thread 类分离出一个基类: thread_job,从而使逻辑更为清晰 184) 2013.10.13 184.1) bugfix: master_udp.cpp, master_udp::service_main() 中的 socket_stream 是临时堆栈变量,如果被用户外部引用则可能造成内存非法访问 183) 2013.10.12 183.1) samples: 增加了 master_udp_threads,该例子将线程池与 master_udp 模板结合 182) 2013.10.11 182.1) feature: connect_manager/connect_pool 允许动态添加、删除连接池对象 182.2) feature: 增加了线程类(stdlib/thread)及线程池类(stdlib/thread_pool) 182.3) samples: 增加了测试用例 thread 用以测试线程类 182.4) samples: 增加了测试用例 thread_pool 用以测试线程池类 181) 2013.10.10 181.1) samples: 添加了 master_aio_proxy 用作纯 TCP 非阻塞代理 ------------------------------------------------------------------------ 180) 2013.10.3 180.1) feature: aio_stream 增加了 get_peer/get_local 用来获得网络连接流的本地 及远程地址 179) 2013.9.30 179.1) feature: master_udp 服务器模板增加了可在 proc_on_init() 虚函数中获得 本地绑定套接字流对象集合的函数功能: get_sstreams() 179.2) bugfix: memcache.cpp 当调用 open 函数连接 memcached 服务器失败时,用 valgrind 检查出记录错误日志时引用了一个未经初始化的变量 178) 2013.9.27 178.1) lib_acl 库中 ACL_EVENT_NOTIFY_RDWR/ACL_EVENT_NOTIFY_TIME 函数接口定义 的修改,与之相关的模块进行了修改 178.2) feature: master 服务器框架增加了 master_udp 服务模板类 178.3) samples: 增加了针对 UDP 的测试用例 udp_client 177) 2013.9.22 177.1) 因为 lib_acl 基础库中的 ACL_VSTREAM 读写回调函数接口变更,调整了与之相关的 部分内部接口,主要影响到了 ssl_stream/ssl_aio_stream 176) 2013.9.13 176.1) compile: 增加了 Makefile.db 工程文件,使用该文件编译则需要 mysql/sqlite 库; 如果不需要数据库相关的功能,则使用 Makefile 工程文件进行编译 175) 2013.9.12 175.1) feature: connect_manager 类增加了根据键值字符串的哈希值获取连接池对象的 虚函数,从而有利于在分布式环境里使用连接池 175.2) feature: connect_manager/connect_pool 类增加了针对每个连接池有一个其 位于连接池集合中的下标索引 174) 2013.9.10 174.1) feature: http_request::request 中原来只能指定 GET/POST 两种请求方法,现在 可以指定多种请求方法 174.2) feature: http_header 允许设置自定义(即除 GET/POST/PUT/CONNECT/PURGE之个) 的请求头命令字 173) 2013.9.9 173.1) feature: memcache 类支持流式读写数据,从而可以支持大 value 的存取方式 172) 2013.9.7 172.1) master_threads 类在单独运行方式的使用场景接近于在 acl_master 框架下的运行场景 171) 2013.9.5 171.1) feature: master_threads/master_aio/master_proc 类支持在单独运行模式下监听多个地址 171.2) feature: acl_cpp_init.cpp 中添加了 WIN32 下关闭 DOS 窗口的函数 171.3) compile: acl_cpp_init.cpp 中 freopen 返回的文件句柄因为未被使用而使编译器报警 170) 2013.8.30 170.1) feature: http/memcache 模块增加了连接池管理类 170.2) connpool/http_request_pool/memcache_pool: 调整了构造函数,去掉了最后一个参数 169) 2013.8.22 169.1) bugfix: memcache 类中当连接异常中断重试时会因请求数据被清掉而出错,原因 是请求与响应共用同一个缓冲区所致,现将请求缓冲区与响应缓冲区分开 168) 2013.8.18 168.1) samples: 增加了测试 http_request_pool 的例子 samples/http_request_pool 168.2) samples: 增加了测试 memcache_pool 的例子 samples/memcache_pool 167) 2013.8.17 167.1) feature: 增加了 HTTP 客户端连接池类 http_request_pool;同时将 http_request 类变为 connect_client 的子类 167.2) feature: memcache 增加了连接池类 memcache_pool;同时将类 mem_cache 改为 memcache 166) 2013.8.13 166.1) mem_cache: 调整了构造函数接口,使之更容易使用 166.2) feature: 添加了通用的客户端连接池管理对象:connect_client, connect_pool, connect_manager,这些类均为纯虚类,但子类只需要实现很少的几个虚函数便可获得功能丰富的 连接池管理功能 165) 2013.8.11 165.1) feature: db_pool 支持动态将空闲时间过期的数据库连接释放掉,从而减少 对后端数据库的压力 164) 2013.8.9 164.1) bugfix: db/db_mysql.c 在打开 mysql 时原来的实现中,如果需要设置字符集, 则会导致崩溃,原因是设置字符集必须是在连接打开之后设置,原来的做法是在连接打开 前设置的 163) 2013.7.29 163.1) bugfix: string::split/split2 内部在调用 acl_argv_split 后没有调用 acl_argv_free 释放动态分配的内存 162) 2013.7.1 162.1) 规整了所有的源文件 161) 2013.6.25 161.1) compile: 消除了在 gcc-4.6.3 下的一些编译警告 160) 2013.6.13 160.1) feature: 添加了 server_socket 类 160.2) socket_stream: 对 get_ip 类的函数做了一定调整 160.3) samples/benchmark: 增加了 client/server 两个用于测试 IO 压力的程序 159) 2013.6.6 159.1) feature: HttpServletRequest/http_client 添加调试输出 HTTP 请求头的函数 158) 2013.5.13 158.1) feature: master_thread 类增加了静态添加定时器功能 157) 2013.5.2 157.1) feature: 增加了针对文件进行异步 IO 操作的类:aio_fstream 157.2) samples: 增加了针对新增类 aio_fstream 的测试例子: fs_benchmark 156) 2013.4.17 156.1) bugfix: master_thread.cpp 在测试环境下运行时,master_threads::thread_run 函数增加了缓冲区是否有可读数据的判断 155) 2013.4.5 155.1) bugfix: ipc_service.cpp 中 thread_pool_main 函数应该调用 last_serror 而不应该调用 last_error 155.2) bugfix: 在 rpc_request::run 函数中发送了一个局部栈变量,而当主线程中 的 rpc_client::on_message 通过 IO 收到此变量时可能它已经在子线程中销毁了, 可能造成内存非法访问问题,所以现在把此变量的生命周期改成与 rpc_request 相同 从而防止 rpc_client::on_message 中引用了一个提前释放的变量 154) 2013.4.1 154.1) HttpServletRequest.cpp: HttpServletRequest::getSession中生成 COOKIE 及 SESSION 的优先级做了调整 153) 2013.3.28 153.1) feature: beanstalk 客户端连接增加了连接池类 beanstalk_pool 152) 2013.3.23 152.1) bugfix: HttpServletRequest::getPathInfo 方法中,在 CGI 模式下应该 先根据 SCRIPT_NAME 环境变量取得,如果取不到再根据 PATH_INFO 环境变量获取 151) 2013.3.14 151.1) feature: HttpServletRequest::getSession 增加了参数 sid 151.2) feature: memcache_session 类增加了一个构造函数 150) 2013.3.11 150.1) bugfix: rpc.cpp, rpc_request::cond_wait 调用过程中,如果函数 acl_pthread_cond_wait 或 acl_pthread_cond_timedwait 返回非 0 值,则应该 解锁,否则会造成 rpc_request::cond_signal 因为无法获得锁而阻塞 149) 2013.2.25 149.1) bugfix: ipc 模块,当 aio_handle 为 WIN32 窗口消息事件引擎时,不应 调用套接口的监听过程 149.2) feature: ipc 模块简化了接口 149.3) samples/gui_rpc: 更新了部分代码 148) 2013.2.24 148.1) 将 db_pool 类变成基类,增加了 mysql_pool 和 sqlite_pool 两个子类 147) 2013.2.8 147.1) feature: 添加了 url_coder 类,用于 url 的编码与解码 147.2) http/: 将 HttpCookie 类从 http_header 类的头文件中剥离形成单独的类 146) 2013.2.5 146.1) feature: beanstalk.cpp,当网络重连时,watch 及 use 命令会被自动调用 145) 2013.1.31 145.1) feature: beanstalk 类增加了几个方法 145.2) wizard: 模板生成中的模板增加了几个方法 145) 2013.1.27 145.1) feature: 增加了文件队列的操作库 queue/ 144) 2013.1.26 144.1) beanstalk: 优化了接口实现方案 143) 2013.1.25 143.1) feature: 添加了针对 beanstalkd 客户端通讯协议的支持 143.2) samples: 添加了测试 beanstalk 客户端通讯库的例子 142) 2013.1.13 142.1) lib_acl_cpp: 将头文件进行了分类,使之更加模块化,也便于将头文件放在系统目录下 141) 2012.12.31 141.1) feature: master_threads.hpp 增加了 thread_on_timeout() 虚函数 140) 2012.12.28 140.1) bugfix: string.cpp 类中的 left()/right() 有误 139) 2012.12.17 139.1) bugfix: session.cpp, vbuf_new() 中的去掉了 assert() 语句 138) 2012.12.14 138.1) feature: socket_stream.cpp: get_peer()/get_local() 增加了一个控制参数, 允许用户获得 IP:PORT 或 IP 格式的地址 138.2) feature: socket_stream.cpp, 增加了两个函数 get_peer_ip/get_local_ip 137) 2012.12.10 137.1) performance: session 类增加了本地对象的缓存机制,提高了查询/添加/删除 的性能 136) 2012.12.7 136.1) feature: session 类增加了延迟方式修改数据,这样当针对某一 SID 号 做多次修改、添加操作时,只当最后 flush 后才真正连接后端的 cache 服务器, 从而大大提高了整体性能 136.2) string: 完善了一下构造函数 136.3) samples: samples/session 增加了对延迟修改 session 的测试示例 135) 2012.12.6 135.1) bugfix: db/db_mysql.cpp, 连接 mysql 时的地址有错 134) 2012.11.27 134.1) feature: 增加了单体模板类 singleton.hpp 134.2) samples: 增加了单例的测试示例 samples/singleton 133) 2012.11.8 133.1) class istream: 修改了 gets_peek/read_peek 的参数接口;增加了 readn_peek 函数 132) 2012.9.7 132.1) 为了避免一些不兼容性及编译问题,去掉了大部分类中的 noncopyable 继承关系 131) 2012.9.6 131.1) feature: 添加了 noncopyable 类,子类只需继承该类便可阻止类对象赋值 131.2) 大部分类均继承了 noncopyable 类,可以在编译期有效地阻止类对象直接赋值 130) 2012.8.21 130.1) feature: stream 类中添加了 set_rw_timeout/get_rw_timeout 130.2) socket_stream: 去掉了 unbind_vstream,因为基类 stream 有类似函数 129) 2012.8.18 129.1) samples/http_client: VC 工程文件中动态连接方式的连接库有误 *128*) 2012.8.17 1.1.1.2 release 版本正式发布!~ 127) 2012.8.16 127.1) performance: rpc, ipc_service 内部的 ipc 消息连接流允许采用长连接方式, 从而提高了消息传递的效率 126) 2012.8.15 126.1) http_response.cpp: get_body() 当长度 < 0 且 HTTP 请求方法为 GET/CONNECT 时,则也应返回 true 126.2) samples: http_server 用来测试 rpc 通讯模式下半非阻塞方式的功能 125) 2012.8.14 125.1) doxygen 检查出一些头文件中注释不准确的地方 125.2) 准备发布正式版本了:) 124) 2012.8.13 124.1) feature: 因为 md5 算法经常会被使用,所以封装了一个 md5 算法类,见 md5.cpp 124.2) samples: md5 示例测试新增的 md5 功能类 123) 2012.8.2 123.1) aio_handle: 将定时器的接口进行了相应调整,使之更加明晰 122) 2012.7.30 122.1) feature: socket_stream 类增加了 unbind_stream 方法 121) 2012.7.26 121.1) bugfix: xml.cpp 的 xml 类中,多处存在内存泄露及内存非法释放的问题, 这些问题均由 valgrind 查出 120) 2012.7.25 120.1) bugfix: rpc.cpp 中如果 cond_signal 调用时间早于 cond_wait 时,则会 因为线程锁及线程条件变量未被初始化而出错,所以这两个变量应该在构造函数内 进行初始化;同时还增加了 cond_count_ 作为 cond_wait 是否应该等待的条件 119) 2012.7.20 119.1) feature: 增加了 http_utils,专门用于一些常用的工具类功能 119.2) feature: 增加了 http_download,专门用于支持断点续传方式的文件下载 118) 2012.7.19 118.1) feature: http_request/http_header 增加了对 Range 的支持 117) 2012.7.16 117.1) feature: http_request, 增加了方法:set_charset/read_body,从而可以 循环读取服务器返回的压缩数据,并进行解压,同时可以转换为本地字符集 117.2) bugfix: http_client, read_response_body(char* buf, size_t size) 中, 当在读响应头且自动启动了解压模块时,而该函数却不能进行解压处理(也不会调用 zlib_stream::unzip_finish 过程),这会造成 zlib 库的内存泄露 117.3) bugfix: rpc.cpp, rpc_request::cond_wait 加锁/解锁顺序不对 117.4) feature: string.cpp, 增加了 split2 函数,用于返回 vector 格式数据 116.1) 2012.7.12 116.1) string 类中的 split 函数的返回值由原来的 std::list 改为 std::vector, 这样更便于用户使用 115) 2012.7.10 115.1) compile: 消除了例子中的几个编译问题 114) 2012.7.5 114.1) feature: rcp.hpp 增加了 cond_wait/cond_signal 方法,便于主线程向处于等待 状态的子线程发送消息 113) 2012.7.4 113.1) feature: socket_stream.h 增加了 ACL_SOCKET unbind_sock() 方法,将套接字 与流对象解绑,从而将流对象的释放与套接字的关闭分开 112) 2012.7.2 112.1) bugfix: aio_istream.cpp 中,函数 aio_istream::gets 和 aio_istream::read 当输入的超时时间为 timeout 为 0 时,则会延用之前设置的超时时间,应该是把超时时间 设置为 0 112.2) samples/rpc_download: 进一步优化,同时使用 valgrind 检查出库本身一些问题 112.3) samples/gui_rpc: 该例子采用基于 WIN32 窗口消息方式,实现阻塞式下载过程与 窗口消息结合的功能 111) 2012.7.1 111.1) bugfix: http_request.cpp/http_response.cpp 中的 get_body(char*, size_t) 有一处手误,返回值给的不对 111.2) samples: rpc_download 该例子以一个完整的 HTTP 下载为例,测试了 rpc 功能 模块的可用性 110) 2012.6.30 110.1) feature: rpc_request 类增加了两个有用的方法: rpc_signal/rpc_wakeup, 从而可以在调用子类的 rpc_run 方法时,允许子类在子线程中边处理边向主线程发 消息,主线程收到消息后启用 rpc_request::rpc_wakeup 处理中间结果 110.2) rpc_request 的方法 rpc_callback 改为 rpc_onover,同时 rpc_onover 的 权限范围被限定为 protected,为了保证在 rpc_service 中可以访问,将 rpc_service 和 rpc_client 加为 rpc_request 的友元类 109) 2012.6.28 109.1) feature: 增加了 ipc/rpc.cpp,从而进一步扩展了 IPC 类,使非阻塞线程 与阻塞线程之间的通信更为方便 108) 2012.6.26 108.1) feature: http_header/HttpCookie 两个类中,在关设置的方法增加了本 对象的引用,以便于用户可以连续对该对象的设置操作 108.2) bugfix: HttpServletRequest::readHeader,有一处没有判断指针为 NULL 的问题 107) 2012.6.21 107.1) bugfix: samples/cgi_upload 在循环读数据时有内存越界问题 107.2) feature: src/http/http_header 增加了 set_request_mode 方法用于手工 设置是请求头还是响应头 107.3) HttpServletResponse: 在创建 http_header 时调用 set_request_mode 指定了响应头方式 107.4) samples/: cgi, cgi_upload 添加了单独服务运行方式,以方便进行调试 107.5) feature: HttpServletResponse 类增加了方法 setKeepAlive 以及 getHttpHeader() 106) 2012.6.20 106.1) http 模块中的一些接口重新优化了一下,涉及的文件有:HttpServlet, HttpServletRequest, HttpServleResponse, HttpSession 106.2) session 类重新设计了一下,该类成为纯虚类,增加了 memcache_session 类,用来实现当缓存为 memcached 时的 session 功能,将来还可以再增加对redis 的支持 106.3) samples: cgi/cgi_upload/http_servlet/session 稍微修改一下,以适应上面的修改 105) 2012.6.19 105.1) bugfix: master_conf.c 中在 reset 函数中,在释放字符串类型的变量时, 如果该变量未被赋值,则不应释放 105.2) feature: master_base 增加了接口 daemon_mode 用来判断是否是由 acl_master 控制的后台服务器模式 105.3) bugfix: http_header::build_request 方法内部对 URL 编码方式有误, 不应对整个 URL 参数进行 URL 编码,而应该针对每一个参数分别进行 URL 编码 105.4) bugfix: http_request::get_cookie 第一次被调用时应该先调用一下 http_request::create_cookies 104) 2012.6.15 104.1) samples: 增加了 samples/http_request 测试用例 103) 2012.6.13 103.1) feature: 增加了 http_pipe 类,用于以管道流方式处理 HTTP 协议数据 103.2) feature: http_request/http_response 增加了一些功能函数 103.3) samples: 增加了 samples/http_response 测试用例 102) 2012.6.12 102.1) feature: session/HttpSession 增加了设置 session 过期的方法 102.2) 去掉了有些源程序中在 WIN32 平台下对 snprintf 的定义,因为其包含的 头文件 lib_acl.h 中已经定义过了 101) 2012.6.11 101.1) feature: session/HttpSession 增加了允许存取二进制属性对象的接口 100) 2012.6.8 100.1) feature: session 添加了 del 接口 100.2) feature: HttpServletRequest 类添加了 setCookie 函数 100.2) bugfix: HttpSession 在第一次添加 session 时如果浏览器没有 session 标识,则设置了 session 后立即取该值会因为没有那个 session cookie 而取不到 100.2) samples: 添加了 http_test, session 两个例子 99) 2012.6.7 99.1) feature: 将 session 单独形成一个类,使 HttpSession 继承 session 类 99.2) locker: 修改了相关的接口,使之更合理 99.3) HttpServlet: 增加了当未知请求方法时的处理虚函数 doUnkown 98) 2012.6.5 98.1) feature: http_request/http_response 两个类的功能进一步得到完善 98.2) http_header: 添加了 reset 方法,可以重置内部状态 98.3) featur: http_header->HttpCookie 添加了 setCookie 函数用来分析来自 于服务器响应的 Set-Cookie 中内容 97) 2012.6.3 97.1) feature: 增加了 master_conf 类用于读取配置文件,同时将 master_base 类中 有关配置的部分放置在 master_conf 中处理 97.2) compile: 在 AS6/CS6 上编译通过 96) 2012.6.1 96.1) feature: db_handle 增加了 escape_string 用于将数据库的字段中的特殊字符 进行转义以防止 SQL 注入攻击 96.2) feature: db_handle/db_pool 重新建立了二者实例对象之间的关联关系 95) 2012.5.31 95.1) feature: xml, 增加了 getFirstElementByTag/getFirstElementByTags,从而更 方便用户操作 xml 对象 94) 2012.5.28 94.1) bugfix: mime/internal/mime_state_parse.cpp: 因为之前增加了 body_data_end 做为某个 MIME 结点数据体的结尾,当邮件体不是 MULTIPART 格式时,body_data_end 也 应该赋值才对。 93) 2012.5.26 93.1) linux 平台下默认将对 polarssl 库的依赖去掉了 92) 2012.5.18: 1.1.1.0 BETA 版本发布 92.1) http 模块功能已经比较丰富了,基本可以替代传统的 CGI 方式,用户在使用 时可以象使用 java servlet 一样方便了,GOOD WORK! 91) 2012.5.17 91.1) 修改了 mime/ 相关模块,从而可以使 http_mime 类支持文件上传了 90) 2012.5.16 90.1) http/: 增加了 http_mime 类,支持文件上传功能 89) 2012.5.15 89.1) http/: HttpServlet 类增加了对参数等的支持 89.2) http_client: 在调用第二个构建函数时,rw_timeout_ 没有赋初始值(valgrind 检查出该错误) 88) 2012.5.13 88.1) http/: 增加了针对 CGI 的部分支持 88) 2012.5.10 88.1) feature: 增加了 HttpServlet, HttpServletRequest, HttpServletResponse, HttpSession 等类,可以用作 CGI 开发 88.2) 去掉了 HTTP_COOKIE 结构, 增加了 HttpCookie 类 88.3) 增加了 samples/http_servlet 例子 87) 2012.5.2 87.1) http_client: 增加了 get_ostream/get_istream 接口,去掉了冗余的 write 接口,用户可以直接调用 http_client::get_ostream().write 来达到写的目的 86) 2012.4.26 86.1) feature: xml.hpp 中增加了 xml_attr 类,同时给 xml_node 类增加了用 来遍历结点所有属性的功能 85) 2012.4.24 85.1) feature: json 增加了 get_json() 函数,xml 增加了 get_xml 函数 85.2) feature: json/xml 都增加了 first_child/next_child 用于某个结点遍历 子结点的函数,同时增加了 get_parent() 函数 84) 2012.4.22 84.1) feature: json/xml 均增加了一些非常有用的接口函数,从而更容易地创建 json/xml 对象,可以参考相关的例子 83) 2012.4.21 83.1) feature: json/xml 都增加了用于结点遍历的 first_node/next_node 接口 83.2) feature: master/ 框架,在 acl_cpp 库使用 acl 库中的 master 框架时, 用户的程序中不再需要包含 lib_acl.h 头文件,只需要包含 lib_acl.hpp 头文件 即可,这样使用户在使用 acl_cpp 库时可以不用再了解 acl 库的知识,同时在编译 时更为方便(只需要链接 lib_acl.a 库即可) 82) 2012.4.20 82.1) feature: 添加 json 库的封装及相关功能 82.2) samples: samples/json 81) 2012.4.17 81.1) feature: xml 库添加了创建 xml 对象序列号的功能 80) 2012.4.12 80.1) bugfix: master 框架下 master_proc, master_trigger 服务器模板需要 添加 acl_watchdog_pat() 过程通知 acl_master 进程子进程还正常; 在 master_base.hpp 中添加了一个新的成员变量:daemon_mode_ 来表明是单独运行 模式还是后台进程模式 79) 2012.4.11 79.1) compile: 调整了在 WIN32 下 VC2010 编译工程 78) 2012.4.3 78.1) feature: http_header 即可以作为 HTTP 请求头,又可作为 HTTP 响应头 77) 2012.4.2 77.1) feature: http_client 丰富了一些函数接口,使该类即可以用作请求端的 HTTP 客户端流,又可以用作响应端的 HTTP 客户端流 76) 2012.4.1 76.1) bugfix: string.cpp, 在CS4/AS4 上的 g++ 无法区分变参类型的接口,如 format(const char* fmt, ...); format(const char* fmt, va_list ap), 所以导致了 string.cpp 的 format, format_append 的错误匹配,所以增加了 vformat(const char* fmt, va_list ap) 75) 2012.3.18 75.1) Makefile: 在 samples/ 下增加了一个统一的 Makefile.in, 所有的示例的 Makefile 文件都大大简化 75.2) bugfix: string.cpp 类中的 parse_xxx() 使用了临时的栈变量,现在统一 改成了线程局部存储变量 75.3) feature: 增加了 db_service_mysql 类,从而增加了对 mysql 数据库服务 的支持 75.4) db_service: 将 db_service 定义为基类,增加了 db_service_sqlite 用于 支持 sqlite 数据库 74) 2012.3.16 74.1) bugfix: mem_cache.cpp 在 set 命令时有个BUG,已修复 73) 2012.3.13 73.1) Makefile: 指定了 mysql 头文件的路径为: include/mysql 73.2) feature: db_mysql.cpp 支持本地字符集 72) 2012.3.7 72.1) compile: 在编译动态库时可以指定链接路径,用法如下: make shared rpath=xxx; 仅编译动态库 或 make rpath=xxx; 同时编译动态库及静态库存 71) 2012.2.18 71.1) 将根目录下的 mime 目录移到 src/mime/internal/ 目录下 70) 2012.2.15 70.1) src/stdlib/mem_cache.cpp: 实现了部分常用的 memcached 协议 69) 2012.2.14 69.1) src/ 目录重新规划了目录结构,从而显得更为清晰 68) 2012.1.19 68.1) feature: http_client/http_header, 允许接收来自于服务器的压缩数据并进行解压 68.2) samples: http_client2, 该例子用来测试 http_client 类 67) 2012.1.18 67.1) feature: log.hpp: 增加了接口 stdout_open 当未打开日志流时,通过此 函数用来将日志信息输出至标准输出 67.2) log.hpp: 将 open 函数的参数设置了缺省的值 67.3) feature: zlib_stream 增加了针对 HTTP 传输过程中解压 gzip 数据的支持 66) 2012.1.10 : 1.1.0.0 版本发布了!!!!!!! 66.1) feature: master_aio.cpp, 该库封装了 acl_master 服务器框架中的 单线程非阻塞模板 66.2) feature: master_proc.cpp, 该库封装了 acl_master 服务器框架中的 进程池模板 66.3) feature: master_trigger.cpp, 该库封装了 acl_master 服务器框架中的 触发器模板 66.3) samples: samples/master_aio, samples/master_proc, samples/master_trigger 65) 2012.1.8 65.1) feature: master_threads 类完善了一些接口调用 64) 2012.1.6 64.1) feature: master_threads.cpp, 该库封装了 acl_master 服务器框架中的多 线程处理模板 64.2) samples: samples/master_threads,测试用例 63) 2011.12.21 63.1) feature: db_handle.cpp,其中的 db_handle 类增加了三个函数,方便用户在 数据库查询后直接获得结果集:get_first_row()/0, get_rows()/2, get_rows()/0 62) 2011.12.7 62.1) feature: 增加了 db_mysql.cpp,该类从 db_handle 继续,从而使 db_handle 可以支持 mysql 了,但该类在 WIN32 使用时会有点问题,因为目前还没有找到合适的 libmysql.lib/libmysql.dll,所以在 WIN32 使用该类时,建议使用 acl_cpp 的静态库 62.2) feature: 增加了 db_pool.cpp,该类实现了数据库连接池的功能 62.3) samples: samples/mysql,用来测试新加的 db_mysql 类 61) 2011.10.5 61.1) feature: 从 glib 中摘取了一段代码 win_iconv.cpp 用于支持 win32 环境下 的字符集转换功能,这样在 win32 下 acl_cpp 库既可以使用 iconv.dll 进行字符集 的转换,同时也可以通过在 acl_cpp 的编译开关定义 USE_WIN_ICONV 使用 win32 原 生的字符集转换功能。感谢 glib 中 win_iconv.cpp 的作者使用 win32 的原生 API 模拟了 iconv 库的功能。 60) 2011.10.3 60.1) mime.cpp: save_mail, get_image, get_images 三个函数增加了几个默认参数 59) 2011.9.15 59.1) malloc.cpp, malloc.hpp:将针对 new, delete 的重载去掉,而作为条件编译保留 58) 2011.9.12 58.1) feature: 重载了 new, delete,这样便于调用 acl 库的内存池切片库 57) 2011.9.5 57.1) string: 将 push_back 调用做为二进制字符添加,这样象 mime_code 等类 中调用 push_back 时就不会出错了 56) 2011.9.4 56.1) 重新设计了 pipe_stream 基础类,将原来的 push 和 pop 合为一个函数 push_pop,其它相应的子类做相应修改 56.2) bugfix: 因为 string 类对二进制及纯字符做了存储区分,所以导致了 调用 push_back 等函数的调用会出错,其中 mime_code 类就因此而出错 55) 2011.9.3 55.1) feature: zlib_stream,支持 pipe_stream 方式 55.2) samples: samples/zlib 增加了支持 pipe_stream 的测试 55.3) bugfix: charset_conv 当源字符集为 utf-8 时,针对 utf-8 的前缀判断有 问题 54) 2011.9.2 54.1) feature: zlib,增加了对 zlib 库的封装,既支持流式压缩与解压缩,同时 又支持一次性压缩与解压缩,并且在 WIN32 平台下是动态加载 zlib.dll 的 54.2) samples: samples/zlib 为测试新的 zlib 库的例子 53) 2011.8.26 53.1) feature: mime 解析完毕后,允许从内存中转储邮件数据解析结果,原来在 转储解析结果时只能是从源文件中抽取数据;影响的类有 mime_node, mime_body 53.2) samples: mime 例子增加了针对 53.1) 新特性的测试用例 52) 2011.8.18 52.1) ipc_service 基类支持基于 WIN32 窗口消息方式的 IPC 通信,其它基于此 类的继承类 dns_service, http_service, db_service 均支持了 WIN32 窗口消息 的 IPC 通信方式; 当然,子类可以自行选择 IPC 通信方式是采用 IO 消息方式还 是 WIN32 窗口消息方式 52.2) samples: wn_dbservice 实例,用来检测 db_service 的功能以及 db_service 的 WIN32 消息的 IPC 通信功能 52.3) feature: 对于 iconv.dll, sqlite3.dll 调用的方式改为动态加载模式 51) 2011.8.14 51.1) 增加了 db_handle/db_sqlite 类,从而可以方便数据库的操作过程 51.2) 增加了 db_service 类,从而可以将数据库操作过程在子线程中处理,保证 了主线程仍然为非阻塞过程 50) 2011.7.22 50.1) final_tpl.hpp: 增加了类似于 java 中 final 功能的禁止继承的模板类 49) 2011.7.19 49.1) 修改了 acl::xml 中有关 XML 解析的方法,同时增加了一些注释,方便用户使用 49.2) feature: ssl_aio_stream/ssl_stream 允许来回切换流为 SSL 流或非 SSL 流 48) 2011.7.18 48.1) 增加了 WIN32 平台下的版本号资源 47) 2011.7.16 47.1) 消除了异步IO的回调类中的多重继承问题 46) 2011.7.3-7.6 46.1) feature: 增加了新类对象 ssl_aio_stream,该类支持基于 polarssl 的加密 传输,不过目前该类对象仅支持客户端连接流,该类是支持非阻塞IO的SSL加密流对象 46.2) bugfix: ssl_stream(基于 polarssl 的阻塞流) 类对象修改了几处可能的问题 45) 2011.6.29 45.1) aio_stream/aio_istream/aio_ostream: 在添加回调类对象时,内部会动态 分配内存块用来存储这些对象,这样在类对象的回调中如果用户即调用删除回调类 对象的函数,这些动态分配的内存区并不会被误删除,从而可以保证之后对这些存 储对象的访问不至于出现非法访问的问题 44) 2011.6.28 44.1) feature: aio_stream 类: 增加了 del_close_callback/del_timeout_callback /disable_close_callback/disable_timeout_callback aio_ostream 类: 增加了 del_write_callback/disable_write_callback aio_istream 类: 增加了 del_read_callback/disable_read_callback 43) 2011.6.24 43.1) http_header: 去掉了类构造函数的两个无用的参数(domain 和 port) 43.2) http_request: 在类构造函数中添加了 domain, port 两个参数 42) 2011.6.23 42.1) 将 http_stream.c/http_stream.h 改名为 http_client.c/http_client.h 41) 2011.6.22 41.1) 修改了 Doxygen 报错的一些头文件中的注释 40) 2011.6.21 40.1) 为了与 VC 编辑器兼容,将所有的源文件和头文件都转成 DOS 方式,即回车 换行采用 \r\n,主要是 VIM 比较智能,它能根据文件的换行格式自动选取,而VC 就比较弱,虽然VC识别\n,但添加换行时只会添加\r\n 39) 2011.6.16 39.1) 修改了一下 VC 的工程文件 39.2) http_request, dns_result_callback 两个 类增加了 destroy 虚接口, 以便于在子类中进行销毁类对象 39.3) bugfix: aio_handle.cpp, aio_timer_callback::del_task 不应该在调用 tasks_.erase(it); 之后的循环外再次判断 it == tasks_.end(),因为 iterator 被删除后 it 也就没有任何意义了 38) 2011.6.15 38.1) 为了便于使用 VC 自带的比较弱知的 NEW 宏来检查内存泄漏,不得不把内部 所有的 new 都改成 NEW;在 acl_stafx.hpp 中添加了 WIN23 下的 NEW 宏定义 38.2) feature: 增加了类接口 aio_delay_free,这样子类只要继承该类,就可以 在异步引擎中被延迟释放;同时,将 aio_timer_callback 做为 aio_delay_free 的 子类;将 aio_handle 中的 delay_free_timer 改为 delay_free,从而使该功能成 为一个更为通用的功能 37) 2011.6.13 37.1) HttpClient 创建了 vc2010 下的工程 36) 2011.6.10 36.1) 调整了一下在 VC 开始环境的工程 35) 2011.6.9 35.1) feature: 增加了 http_service 类,可以方便进行HTTP请求处理过程 35.2) ipc_service: 优化了一些处理过程 34) 2011.6.1 34.1) feature: 异步定时器支持子类定时器可以设置多个定时消息事件 33) 2011.5.23 33.1) feature: win32 下支持 iconv 了 32) 2011.5.16 32.1) 将所有与定时器相关的精度由秒级提高到微秒级 31) 2011.5.13 31.1) bugfix: aio_ostream.cpp 中的类 aio_timer_writer::timer_callback() 中使用了一个无效的 iterator 进行判断 31.2) compile: 将 acl_stdafx.hpp 放在 src/ 目录下,以保持私有性 31.3) compile: 将VC链接时的警告去(/EDITANDCONTINUE, /OPT:ICF),只需要 打开增量链接就可以了 30) 2011.5.12 30.1) feature: 增加了类 rfc822,用于解析对符合 rfc822 规范的邮件内容(如 邮件地址, 日期) 进行解析 30.2) samples: 增加了测试程序 samples/rfc822 29) 2011.5.6 29.1) feature: aio_stream 类增加了 get_astream() 接口可以获得 ACL_ASTREAM 对象 28) 2011.5.2 28.1) feature: xml.hpp, 增加了 get_xml_node() 函数 28.2) feature: stream.hpp, 增加了 get_vstream() 函数 28.3) feature: socket_stream.hpp, 增加了 open(ACL_VSTREAM*) 函数 27) 2011.4.21 27.1) mime/header_opts.cpp: 去掉了 header_opts_begin, header_opts_cleanup 两个函数,在内部增加了 acl_pthread_once, atexit 两个系统调用,可以保证内部 的全局静态对象仅被初始化一次,且当程序退出时会自动释放该对象 27.2) mime.cpp: mime::init(), mime::cleanup() 已经没有用处了,将来将会被去掉 26) 2011.4.15 26.1) xml: 增加了几个功能函数,方便取得 XML 对象中的相关属性值 26.2) acl_stdafx.hpp: 去掉了 *.hpp 包含 25) 2011.4.14 25.1) handlersocket: 增加了单独的 hsproto 类,专门用于协议处理 24) 2011.4.9 24.1) handlersocket, hsclient: 增加了因网络IO问题出错的重试功能 24.2) 修复了在高版本 gcc 上的编译错误 23) 2011.4.7-4.8 23.1) handlersocket: 优化了代码,并修复了一些问题,现在 handlersocket 主要由 hspool, hsclient, hstable, hsrow 四个类组成 22) 2011.3.31 22.1) bugfix: log.hpp 中的函数名可能会造成 VC2003 在函数重载解析后出错而导致 在运行时程序出现不可预知问题,所以将 log.hpp 中的函数名区分开,而不采用C++中 函数名的重载方式 21) 2011.3.28 21.1) aio_xxx: 增加了异步流的功能,并修改了延迟读的 BUG 20) 2011.3.25 20.1) aio_handle.cpp: 当异步句柄为 WIN GUI 消息时,允许用户绑定自定义的消息号 19) 2011.3.16-3.20 19.1) feature: 在异步流的基础上增加了 ipc_xxx 等相关功能类,这些类可以保证 在不同线程或不同进程之间进行异步通信 19.2) feature: 在 ipc_xxx 基础上增加了 ipc_manager 类,该类可以保证主线程为 非阻塞过程,而子线程是阻塞过程,子线程通过 ipc 方式与主线程进行通信 19.3) feature: 在 ipc_manager 的基础上增加了 DNS 异步查询的功能类,该类的特 点是主线程是非阻塞的,而查询子线程是阻塞的,查询子线程通过 ipc_xxx 方式将结 果通知主线程 18) 2011.3.14 18.1) feature: aio_ostream/aio_istream 增加了延迟写/读的功能,方便网络限速 17) 2011.3.13 17.1) aio_handle: 增加了针对 WIN32 界面消息的支持 17.2) aio_handle: 增加了定时器功能 16) 2011.3.10 16.1) aio_xxx: 基本上成熟,可以使用了:) 16.2) string.cpp: 增加了二进制流及文件流的区分功能 15) 2011.3.8 15.1) aio: 继续完善 14) 2011.3.1 14.1) 完善了非阻塞IO的函数库 13) 2011.2.26-27 13.1) feature: 添加了异步非阻塞流的支持,增加了如下几个文件: aio_stream.cpp, aio_socket_stream.cpp, aio_ostream.cpp, aio_istream.cpp, aio_listen_stream.cpp 12) 2011.2.25 12.1) 修改了所有头文件,减少了使用 #include 的包含数量 11) 2011.2.23 11.1) feature: rfc2047, 增加了编码函数 11.2) feature: mime_base64, mime_xxcode, mime_uucode, mime_quoted_printable 增加了静态编码及静态解码的函数 11.3) bugfix: mem_cache, 采用 rfc2047 编码来处理协议中键值的特殊字符 10) 2011.2.22 10.1) mem_cache: 对 key 键值进行了简单的编码处理,以免与 memcached 协议的 分隔符有冲突 9) 2011.2.19 9.1) bugfix: header_opts.cpp,内部使了一个线程不安全的静态变量 8) 2011.2.17 8.1) feature: mem_cache, 增加了更新存在键时间截的接口 7) 2011.2.14 7.1) feature: mem_cache 类封装了 libmemcached 的一些函数 7.2) samples: mem_cache/ 6) 2011.2.12 6.1) feature: hsclient 该类增加了一些方便使用的函数接口 5) 2011.2.10 5.1) feature: 增加了对 handlersocket 的协议支持, hsclient.cpp 4) 2011.1.28 4.1) feature: mime_head.cpp, 增加了 header_values()/2, 用于获得对就相同名称 的多个字段的值集合 3) 2011.1.26 3.1) bugfix: mime.cpp, body_node(), 中查找邮件正文时如果不存在HTML格式的 正文时会有问题 2) 2011.1.14 2.1) bugfix: mime_state_parse.cpp, 当邮件为非 multipart 时,结点的 body_end 不对,应该是当前偏移量值 curr_off - 1 而不是 curr_off,因为 curr_off 指的是文件中的下一个要处理的位置。 1) 2011.1.11 1.1) acl_wrap1.0 release