mirror of
https://gitee.com/acl-dev/acl.git
synced 2024-12-16 01:40:52 +08:00
9697f95b8f
This reverts commit 15d999759e
.
115 lines
2.9 KiB
C++
115 lines
2.9 KiB
C++
#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("<root error='some error happened!' />\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("<root error='unkown request method %s' />\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 请打开下面注释
|
|
/*
|
|
$<GET_COOKIES>
|
|
*/
|
|
|
|
const char* ptr = req.getPathInfo();
|
|
if (ptr == NULL || *ptr == 0) {
|
|
logger_error("path null");
|
|
return doError(req, res);
|
|
}
|
|
|
|
acl::string path(ptr);
|
|
path.lower();
|
|
|
|
// 根据 uri path 查找对应的处理句柄,从而实现 HTTP 路由功能
|
|
|
|
std::map<std::string, handler_t>::iterator it =
|
|
handlers_.find(path.c_str());
|
|
|
|
if (it == handlers_.end()) {
|
|
logger_warn("not support, path=%s", path.c_str());
|
|
return doError(req, res);
|
|
}
|
|
|
|
return (this->*it->second)(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);
|
|
}
|