mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-05-16 06:05:58 -06:00
82 lines
1.6 KiB
C++
82 lines
1.6 KiB
C++
#include <signal.h>
|
|
|
|
#include "Web.h"
|
|
|
|
NAMESPACE_UPP
|
|
|
|
bool run = true;
|
|
|
|
void sighandler(int sig)
|
|
{
|
|
run = false;
|
|
}
|
|
|
|
ScgiServer::ScgiServer(int port)
|
|
{
|
|
this->port = port;
|
|
|
|
signal(SIGABRT, sighandler);
|
|
signal(SIGINT, sighandler);
|
|
signal(SIGTERM, sighandler);
|
|
}
|
|
|
|
void ScgiServer::Run(int listenCount)
|
|
{
|
|
ServerSocket(serverSock, port, false, listenCount);
|
|
while (run) {
|
|
if (serverSock.Accept(clientSock, &clientIP)) {
|
|
OnAccepted();
|
|
|
|
String sLen = clientSock.ReadUntil(':');
|
|
int len = atoi(sLen);
|
|
String data;
|
|
|
|
if (clientSock.IsOpen() && !clientSock.IsEof() && !clientSock.IsError()) {
|
|
// len + 1 = data plus the trailing , as in SCGI spec
|
|
data = clientSock.ReadCount(len+1, 3000);
|
|
}
|
|
|
|
String key;
|
|
int spos = 0;
|
|
for (int i=0; i < data.GetCount(); i++) {
|
|
if (data[i] == 0) {
|
|
if (key.IsEmpty())
|
|
key = data.Mid(spos, i-spos);
|
|
else {
|
|
String value = data.Mid(spos, i-spos);
|
|
|
|
serverVars.Add(key, value);
|
|
key.Clear();
|
|
}
|
|
|
|
spos = i + 1;
|
|
}
|
|
}
|
|
|
|
query.SetURL("?" + serverVars.Get("QUERY_STRING"));
|
|
|
|
hasPostData = false;
|
|
if (serverVars.Get("REQUEST_METHOD") == "POST") {
|
|
len = atoi(serverVars.Get("CONTENT_LENGTH"));
|
|
if (len > 0 && clientSock.IsOpen() && !clientSock.IsEof() &&
|
|
!clientSock.IsError())
|
|
{
|
|
data = clientSock.ReadCount(len, 3000);
|
|
post.SetURL("?" + data);
|
|
hasPostData = true;
|
|
}
|
|
}
|
|
|
|
OnRequest();
|
|
|
|
clientSock.Close();
|
|
serverVars.Clear();
|
|
query.Clear();
|
|
post.Clear();
|
|
|
|
OnClosed();
|
|
}
|
|
}
|
|
}
|
|
|
|
END_UPP_NAMESPACE
|