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); }
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("<root error='unkown request method %s' />\r\n", method); res.write(buf); res.write(NULL, 0); return false; }
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("<root error='some error happened!' />\r\n"); res.write(buf); res.write(NULL, 0); return false; }
///---------------------------------------------------------------------------- aid_t coroutine_stackful_actor::recv(response_t res, message& msg, duration_t tmo) { aid_t sender; recving_res_ = res; if (!mb_.pop(res, msg)) { if (tmo > zero) { detail::scoped_bool<bool> scp(responsing_); if (tmo < infin) { start_recv_timer(tmo); } actor_code ac = yield(); if (ac == actor_timeout) { return sender; } res = recving_res_; msg = recving_msg_; recving_res_ = response_t(); recving_msg_ = message(); } else { return sender; } } sender = res.get_aid(); return sender; }
///---------------------------------------------------------------------------- aid_t slice::recv(response_t res, message& msg) { aid_t sender; mixin::move_pack(this, mb_, pack_que_, user_, sire_); if (!mb_.pop(res, msg)) { return sender; } sender = res.get_aid(); return sender; }
///------------------------------------------------------------------------------ bool mailbox::push(response_t res, message const& msg) { res_msg_list_.insert(std::make_pair(res.get_id(), std::make_pair(res, msg))); return false; }