#include "stdafx.h" #include "http_servlet.h" http_servlet::http_servlet(acl::socket_stream* stream, acl::session* session) : acl::HttpServlet(stream, session) { handlers_["/hello"] = &http_servlet::on_hello; } http_servlet::~http_servlet(void) { } bool http_servlet::doError(request_t&, response_t& res) { res.setStatus(400); res.setContentType("text/xml; charset=utf-8"); // 发送 http 响应体 acl::string buf; buf.format("\r\n"); res.write(buf); res.write(NULL, 0); return false; } bool http_servlet::doOther(request_t&, response_t& res, const char* method) { res.setStatus(400); res.setContentType("text/xml; charset=utf-8"); // 发送 http 响应体 acl::string buf; buf.format("\r\n", method); res.write(buf); res.write(NULL, 0); return false; } bool http_servlet::doGet(request_t& req, response_t& res) { return doPost(req, res); } bool http_servlet::doPost(request_t& req, response_t& res) { // 如果需要 http session 控制,请打开下面注释,且需要保证 // 在 master_service.cpp 的函数 thread_on_read 中设置的 // memcached 服务正常工作 /* const char* sid = req.getSession().getAttribute("sid"); if (*sid == 0) req.getSession().setAttribute("sid", "xxxxxx"); sid = req.getSession().getAttribute("sid"); */ // 如果需要取得浏览器 cookie 请打开下面注释 /* $ */ const char* path = req.getPathInfo(); handler_t handler = path && *path ? handlers_[path] : NULL; return handler ? (this->*handler)(req, res) : on_default(req, res); } bool http_servlet::on_default(request_t& req, response_t& res) { return on_hello(req, res); } bool http_servlet::on_hello(request_t& req, response_t& res) { res.setContentType("text/xml; charset=utf-8") // 设置响应字符集 .setKeepAlive(req.isKeepAlive()) // 设置是否保持长连接 .setContentEncoding(true) // 自动支持压缩传输 .setChunkedTransferEncoding(true); // 采用 chunk 传输方式 const char* param1 = req.getParameter("name1"); const char* param2 = req.getParameter("name2"); // 创建 xml 格式的数据体 acl::xml1 body; body.get_root() .add_child("root", true) .add_child("params", true) .add_child("param", true) .add_attr("name1", param1 ? param1 : "null") .get_parent() .add_child("param", true) .add_attr("name2", param2 ? param2 : "null"); acl::string buf; body.build_xml(buf); // 发送 http 响应体,因为设置了 chunk 传输模式,所以需要多调用一次 // res.write 且两个参数均为 0 以表示 chunk 传输数据结束 return res.write(buf) && res.write(NULL, 0); }