MyHttpd Code
Brought to you by:
sunkwei
File | Date | Author | Commit |
---|---|---|---|
src | 2011-01-12 | sunkwei | [r7] admin: status: 增加显示工作线程数目 |
ChangeLog | 2011-01-12 | sunkwei | [r7] admin: status: 增加显示工作线程数目 |
README | 2011-01-07 | sunkwei | [r3] 新增内置模块 log |
不管网络应用还是本地应用,都可以从逻辑上分成‘服务’和‘展示’两部分,服务部分通过一定的手段(协议)与展示部分交互,其中展示部分可以使用各种gui库,或者命令行实现。更一般的,服务的接口如果采用http方式提供(有的服务可能不适合),则展示部分完全可以使用标准的浏览器来访问定制的网页形式呈现了。这样做的好处至少包括: 1. 统一的服务接口:使用http,意味着天然可以利用http的属性,如http authentication,文本化接口(便与调试),大量现成的client(浏览器,curl, wget...); 2. 更灵活的用户界面:用户界面可以就是html页面了; 3. 服务的部署:所有的服务使用uri标记,取消部署的限制...... 4. http在网络防火墙中的优势:... myhttpd 从来没有希望成为一个通用httpd的野心,所以myhttpd也不会下大精力优化性能,其实优化性能更有效的手段是改进‘服务’的实现,myhttpd仅仅起了一个中转的作用。 myhttpd 包含以下特性: 1. 多线程:每个tcp连接一个工作线程。这样做的目的是减少服务编写时的'协作'考虑,服务完全可以阻塞当前线程; 2. plugin模式:每个服务都将作为一个myhttpd的plugin,myhttpd处理底层的协议解析,并且把http request转发到匹配的plugin(服务)中; myhttpd 基本结构: 1. http message解析器:在 EHttpMsgParser.java 中实现; 2. 多线程tcp server:在 HttpSockSrv.java 中实现; 3. 插件管理:在 EPluginMgrt.java 中实现; 4. url解析:在 EUrl.java 中实现; 5. plugin编写规范(接口):在 IMyHttpPlugin.java 中声明; myhttpd 基本流程: 1. 初始化:根据 plugins.conf 描述,加载指定的 class(plugin); 2. 使用 11559 tcp port 启动 HttpSockSrv,等待连接; 2.1 自从内置了 authen 模块后,添加了这一步:当收到 request 后,检查 protected.conf 中url是否收到保护,如果收到保护,则返回401,并要求 digest authentication,只有通过了,才进行 3; 3. 收到连接后,解析 tcp stream,得到完整 IHttpMsg 后,依次查询所有plugins,当 url_match()时,执行改plugin的 onRequest(); 4. 如果没有匹配的 plugin,执行缺省的 http server 行为; myhttpd 源自作者工作中的一个项目,不过原始项目是 c/c++ 的,这里使用 java 完全重新实现一个,不会有任何授权问题。当myhttpd开发差不多后,将考虑使用 BSD 协议分发。 运行myhttpd: cd bin/ ./run.sh 如果顺利,此时myhttpd启动了,并且绑定监听端口 11559,可以使用浏览器输入 http://localhost:11559/admin/help 了,help 是一个非常简单的 plugin,自己看代码就行了。 使用 http authentication 保护指定的 url: 编辑 bin/protected.conf,将需要保护的url的前缀部分与希望使用的口令文件名字绑定,如 /admin:password 的意思是:当需要访问 /admin 开始的 url 时,必须通过 password 中的用户认证; 使用 java myhttpd.utils.Passwd <passwd filename> 来生成,更新,添加口令文件,如希望生成 password 文件,则 java myhttpd.utils.Passwd password 将提示输入用户名,口令,完成后,新的用户信息已经保存到 password 文件中了,删除用户,直接使用文本编辑器删除用户对应的那一行即可。 内置模块: 1. admin: 代码在 src/myhttpd/plugins/PAdmin.java 中:用于实现一些认为是admin的工作 :),如列出已经加载的 plugins; 2. authen: 代码在 src/myhttpd/plugins/PAuthen.java 中:实现了 rfc2617中 digest authentication。 3. log: 代码在 src/myhttpd/plugins/PLog.java 中:希望实现简单的日志功能。 编写 plugin: 1. 继承 myhttpd.plugins.PBase,至少实现 onRequest() 和 url_matched(); 2. 如果需要支持重新获取配置,可以继承 reset(),当执行 /admin/reset 时,将会调用该方法; 3. 通过成员变量 m_server_func 使用 server 端提供的功能; 4. 修改 plugins.conf 文件,当启动 myhttpd 时加载;