acl/lib_acl_cpp/samples/http/cgi_env/http_servlet.cpp

115 lines
2.2 KiB
C++
Raw Normal View History

// http_servlet.cpp : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̨Ӧ<CCA8>ó<EFBFBD><C3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ㡣
//
#include "stdafx.h"
using namespace acl;
//////////////////////////////////////////////////////////////////////////
class http_servlet : public HttpServlet
{
public:
http_servlet(void)
{
}
~http_servlet(void)
{
}
virtual bool doUnknown(HttpServletRequest&, HttpServletResponse& res)
{
res.setStatus(400);
res.setContentType("text/xml; charset=gb2312");
// <20><><EFBFBD><EFBFBD> http <20><>Ӧͷ
if (res.sendHeader() == false)
return false;
// <20><><EFBFBD><EFBFBD> http <20><>Ӧ<EFBFBD><D3A6>
string buf("<root error='unkown request method' />\r\n");
(void) res.getOutputStream().write(buf);
return false;
}
virtual bool doGet(HttpServletRequest& req, HttpServletResponse& res)
{
return doPost(req, res);
}
virtual bool doPost(HttpServletRequest& req, HttpServletResponse& res)
{
extern char **environ;
if (environ == NULL)
return doError(req, res);
acl::string buf;
for (size_t i = 0; environ[i] != NULL; i++)
buf << environ[i] << "\r\n";
// <20><><EFBFBD><EFBFBD> HTTP <20><>Ӧͷ
res.setStatus(200);
res.setContentType("text/plain");
res.setCharacterEncoding("gb2312");
res.setContentEncoding(true);
//res.setContentLength(buf.size());
res.setChunkedTransferEncoding(true);
return res.write(buf) && res.write(NULL, 0);
}
};
//////////////////////////////////////////////////////////////////////////
static void do_run(socket_stream* stream)
{
memcache_session session("127.0.0.1:11211");
http_servlet servlet;
servlet.setLocalCharset("gb2312");
servlet.doRun(session, stream);
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>ʱ<EFBFBD>ķ<EFBFBD><C4B7><EFBFBD><EFBFBD><EFBFBD>
class master_service : public master_proc
{
public:
master_service() {}
~master_service() {}
protected:
virtual void on_accept(socket_stream* stream)
{
do_run(stream);
}
};
// WEB <20><><EFBFBD><EFBFBD>ģʽ
static void do_alone(void)
{
master_service service;
printf("listen: 0.0.0.0:8888 ...\r\n");
service.run_alone("0.0.0.0:8888", NULL, 0); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>з<EFBFBD>ʽ
}
// WEB CGI ģʽ
static void do_cgi(void)
{
do_run(NULL);
}
int main(int argc, char* argv[])
{
#ifdef WIN32
acl::acl_cpp_init();
#endif
// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
if (argc >= 2 && strcmp(argv[1], "alone") == 0)
do_alone();
else
do_cgi();
return 0;
}