bool http_servlet::doPost(acl::HttpServletRequest& req, acl::HttpServletResponse& 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* mycookie = req.getCookieValue("mycookie"); if (mycookie == NULL) res.addCookie("mycookie", "{xxx}"); */ bool keep_alive = req.isKeepAlive(); res.setContentType("text/xml; charset=utf-8") // 设置响应字符集 .setKeepAlive(keep_alive) // 设置是否保持长连接 .setChunkedTransferEncoding(true); // 采用 chunk 传输方式 const char* param1 = req.getParameter("name1"); const char* param2 = req.getParameter("name2"); // 创建 xml 格式的数据体 acl::xml 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) && keep_alive; }
bool http_servlet::doPost(acl::HttpServletRequest& req, acl::HttpServletResponse& 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 请打开下面注释 /* */ res.setContentType("text/xml; charset=utf-8") // 设置响应字符集 .setKeepAlive(req.isKeepAlive()) // 设置是否保持长连接 .setContentEncoding(true) // 自动支持压缩传输 .setChunkedTransferEncoding(false); // chunk 传输方式 const char* cmd = req.getParameter("cmd"); if (cmd == NULL || *cmd == 0) { logger_error("cmd not found"); return replyf(req, res, 400, "%s", "no cmd"); } #define EQ !strcasecmp acl::string buf; commands_action action(addr_, req, res, cmd); action.set_conf(conf_); int status = action.run(buf); return reply_json(req, res, status, buf); }
bool http_servlet::doPost(acl::HttpServletRequest& req, acl::HttpServletResponse& res) { #if 0 const char* session_name = req.getSession().getAttribute("session_name"); if (*session_name == 0) { req.getSession().setAttribute("session_name", "name"); req.getSession().setMaxAge(100); } session_name = req.getSession().getAttribute("session_name"); const char* session_user = req.getSession().getAttribute("session_user"); if (*session_user == 0) req.getSession().setAttribute("session_user", "user"); session_user = req.getSession().getAttribute("session_user"); #else const char* session_name = "name", *session_user = "******"; #endif // 取得浏览器 cookie const char* cookie_name = req.getCookieValue("cookie_name"); bool keep_alive = req.isKeepAlive(); const char* param1 = req.getParameter("name1"); const char* param2 = req.getParameter("name2"); // 创建 xml 格式的数据体 acl::xml body; body.get_root() .add_child("root", true) .add_child("session", true) .add_child("session_name", true) .set_text(session_name) .get_parent() .add_child("session_user", true) .set_text(session_user) .get_parent() .get_parent() .add_child("cookie", true) .add_child("cookie_name", true) .set_text(cookie_name ? cookie_name : "") .get_parent() .get_parent() .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); #if 0 res.setContentType("text/xml; charset=utf-8") // 设置响应字符集 .setKeepAlive(keep_alive) // 设置是否保持长连接 //.setContentLength(buf.length()); #else res.setContentType("text/xml; charset=utf-8") // 设置响应字符集 .setKeepAlive(keep_alive) // 设置是否保持长连接 .setContentEncoding(true) // 设置是否压缩数据 .setChunkedTransferEncoding(true); // 采用 chunk 传输方式 #endif //logger("access http://%s%s", req.getRemoteAddr(), req.getRequestUri()); // 发送 http 响应体,因为设置了 chunk 传输模式,所以需要多调用一次 // res.write 且两个参数均为 0 以表示 chunk 传输数据结束 return res.write(buf) && res.write(NULL, 0); }
bool http_servlet::doParse(acl::HttpServletRequest& req, acl::HttpServletResponse& res) { const char* ptr = req.getParameter("name1"); if (ptr) param1_ = ptr; ptr = req.getParameter("name2"); if (ptr) param2_ = ptr; ptr = req.getParameter("name3"); if (ptr) param3_ = ptr; acl::string path; // 遍历所有的 MIME 结点,找出其中为文件结点的部分进行转储 const std::list<acl::http_mime_node*>& nodes = mime_->get_nodes(); std::list<acl::http_mime_node*>::const_iterator cit = nodes.begin(); for (; cit != nodes.end(); ++cit) { const char* name = (*cit)->get_name(); if (name == NULL) continue; acl::http_mime_t mime_type = (*cit)->get_mime_type(); if (mime_type == acl::HTTP_MIME_FILE) { const char* filename = (*cit)->get_filename(); if (filename == NULL) { logger("filename null"); continue; } // 有的浏览器(如IE)上传文件时会带着文件路径,所以 // 需要先将路径去掉 filename = acl_safe_basename(filename); #if defined(_WIN32) || defined(_WIN64) path.format("%s\\%s", var_cfg_var_path, filename); #else path.format("%s/%s", var_cfg_var_path, filename); #endif (void) (*cit)->save(path.c_str()); if (strcmp(name, "file1") == 0) { file1_ = filename; fsize1_ = get_fsize(var_cfg_var_path, filename); } else if (strcmp(name, "file2") == 0) { file2_ = filename; fsize2_ = get_fsize(var_cfg_var_path, filename); } else if (strcmp(name, "file3") == 0) { file3_ = filename; fsize3_ = get_fsize(var_cfg_var_path, filename); } } } // 查找上载的某个文件并转储 const acl::http_mime_node* node = mime_->get_node("file1"); if (node && node->get_mime_type() == acl::HTTP_MIME_FILE) { ptr = node->get_filename(); if (ptr) { // 有的浏览器(如IE)上传文件时会带着文件路径,所以 // 需要先将路径去掉 ptr = acl_safe_basename(ptr); #if defined(_WIN32) || defined(_WIN64) path.format("%s\\1_%s", var_cfg_var_path, ptr); #else path.format("%s/1_%s", var_cfg_var_path, ptr); #endif (void) node->save(path.c_str()); } } return doReply(req, res, "OK"); }