ultimatepp/bazaar/Scgi/Scgi.cpp
micio 968b21ac00 Bazaar/Scgi : fix for C++11 changes
git-svn-id: svn://ultimatepp.org/upp/trunk@10954 f0d560ea-af0d-0410-9eb7-867de7ffcac7
2017-03-19 08:55:43 +00:00

97 lines
1.7 KiB
C++

#include <signal.h>
//#include "Web.h"
#include "Scgi.h"
NAMESPACE_UPP
bool run = true;
void sighandler(int sig)
{
run = false;
}
Scgi::Scgi(int port)
{
this->port = port;
signal(SIGABRT, sighandler);
signal(SIGINT, sighandler);
signal(SIGTERM, sighandler);
/*
query.CaseSensitive();
post.CaseSensitive();
*/
}
VectorMap<String, String> Scgi::ParseUri(String const &uri) const
{
VectorMap<String, String> res;
const char *p = ~uri;
while(*p)
{
const char *last = p;
while(*p && *p != '=' && *p != '&')
p++;
// String key = case_sensitive ? UrlDecode(last, p) : ToUpper(UrlDecode(last, p));
String key = ToUpper(UrlDecode(last, p));
if(*p == '=')
p++;
last = p;
while(*p && *p != '&')
p++;
res.Add(key, UrlDecode(last, p));
if(*p)
p++;
}
return res;
}
void Scgi::Process()
{
clientIP = clientSock.GetPeerAddr();
OnAccepted();
HttpHeader header;
header.Read(clientSock);
String method = header.GetMethod();
int64 contentLen = header.GetContentLength();
serverVars = pick(header.fields);
header.Clear();
query.Clear();
if(serverVars.Find("QUERY_STRING") >= 0)
query = ParseUri(serverVars.Get("QUERY_STRING"));
post.Clear();
if(method == "POST")
{
if (contentLen > 0 && clientSock.IsOpen() && !clientSock.IsEof() && !clientSock.IsError())
{
String data = clientSock.Get(contentLen);
post = ParseUri(data);
}
}
OnRequest();
clientSock.Close();
OnClosed();
}
bool Scgi::Accept()
{
return clientSock.Accept(serverSock);
}
void Scgi::Run(int listenCount)
{
serverSock.Listen(port, listenCount);
while(run)
if(Accept())
Process();
}
END_UPP_NAMESPACE