allow a request to be processed in a job
Now we allow a request to be passed into a job queue, and after the job finishes the request is passed into a controller again. In order to achieve this we have a requests queue in System, when we put a request to the job this Request structure is preserved in the queue and for a new request a new Request is added to the queue. while here: - remove App::Lock()/Unlock(), use scoped locking - fix: Plugin now has a Call method which takes ModelConnector and a logger (used in multithreaded environment) - BaseThread has a main_model_connector pointer to the main (from the main thread) model connector - the FastCGI structure fcgi_request moved from App to Request - some methods for handling requests moved from App to Request - small refactoring in main.cpp - add Http class (a http client)
This commit is contained in:
@@ -50,22 +50,21 @@ FunctionParser::FunctionParser()
|
||||
}
|
||||
|
||||
|
||||
bool FunctionParser::Parse(Cur * pcur, Db * pdb, Functions * pfunctions, System * psystem)
|
||||
bool FunctionParser::Parse(Request * request, Dirs * dirs, Functions * functions)
|
||||
{
|
||||
db = pdb;
|
||||
cur = pcur;
|
||||
system = psystem;
|
||||
functions = pfunctions;
|
||||
this->request = request;
|
||||
this->dirs = dirs;
|
||||
this->functions = functions;
|
||||
last_dir = nullptr;
|
||||
path = cur->request->env_request_uri.c_str();
|
||||
path = request->env_request_uri.c_str();
|
||||
status = true;
|
||||
|
||||
// IMPROVEME put WINIX_URL_MAX_SIZE to the config
|
||||
if( cur->request->env_request_uri.size() <= WINIX_URL_MAX_SIZE )
|
||||
if( request->env_request_uri.size() <= WINIX_URL_MAX_SIZE )
|
||||
{
|
||||
if( !cur->request->dir_tab.empty() )
|
||||
if( !request->dir_tab.empty() )
|
||||
{
|
||||
last_dir = cur->request->dir_tab.back();
|
||||
last_dir = request->dir_tab.back();
|
||||
PrintCurrentDirs();
|
||||
|
||||
if( ParseDirsItemFunction() )
|
||||
@@ -77,36 +76,74 @@ bool FunctionParser::Parse(Cur * pcur, Db * pdb, Functions * pfunctions, System
|
||||
else
|
||||
{
|
||||
status = false;
|
||||
cur->request->http_status = Header::status_500_internal_server_error;
|
||||
request->http_status = Header::status_500_internal_server_error;
|
||||
log << log1 << "FP: no root directory provided in the request dir_tab" << logend;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
status = false;
|
||||
cur->request->http_status = Header::status_414_uri_too_long;
|
||||
log << log1 << "FP: the URL is too long: " << cur->request->env_request_uri.size() << logend;
|
||||
request->http_status = Header::status_414_uri_too_long;
|
||||
log << log1 << "FP: the URL is too long: " << request->env_request_uri.size() << logend;
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool FunctionParser::ParseDirs(Request * request, Dirs * dirs)
|
||||
{
|
||||
this->request = request;
|
||||
this->dirs = dirs;
|
||||
this->functions = nullptr;
|
||||
last_dir = nullptr;
|
||||
path = request->env_request_uri.c_str();
|
||||
status = true;
|
||||
|
||||
// IMPROVEME put WINIX_URL_MAX_SIZE to the config
|
||||
if( request->env_request_uri.size() <= WINIX_URL_MAX_SIZE )
|
||||
{
|
||||
if( !request->dir_tab.empty() )
|
||||
{
|
||||
last_dir = request->dir_tab.back();
|
||||
PrintCurrentDirs();
|
||||
ParseDirs();
|
||||
}
|
||||
else
|
||||
{
|
||||
status = false;
|
||||
request->http_status = Header::status_500_internal_server_error;
|
||||
log << log1 << "FP: no root directory provided in the request dir_tab" << logend;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
status = false;
|
||||
request->http_status = Header::status_414_uri_too_long;
|
||||
log << log1 << "FP: the URL is too long: " << request->env_request_uri.size() << logend;
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* there should be at least the root directory
|
||||
*/
|
||||
void FunctionParser::PrintCurrentDirs()
|
||||
{
|
||||
std::vector<Item*>::iterator i = cur->request->dir_tab.begin();
|
||||
std::vector<Item*>::iterator i = request->dir_tab.begin();
|
||||
|
||||
for( ; i != cur->request->dir_tab.end() ; ++i)
|
||||
for( ; i != request->dir_tab.end() ; ++i)
|
||||
{
|
||||
LogDir(*i);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bool FunctionParser::ParseDirsItemFunction()
|
||||
void FunctionParser::ParseDirs()
|
||||
{
|
||||
ReadName();
|
||||
|
||||
@@ -115,6 +152,12 @@ bool FunctionParser::ParseDirsItemFunction()
|
||||
AddDir();
|
||||
ReadName();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bool FunctionParser::ParseDirsItemFunction()
|
||||
{
|
||||
ParseDirs();
|
||||
|
||||
if( name.empty() )
|
||||
{
|
||||
@@ -150,7 +193,7 @@ bool FunctionParser::ParseDirsItemFunction()
|
||||
if( !CheckAddFunction() )
|
||||
{
|
||||
log << log3 << "FP: unknown function: " << name << logend;
|
||||
cur->request->http_status = Header::status_404_not_found;
|
||||
request->http_status = Header::status_404_not_found;
|
||||
status = false;
|
||||
return false;
|
||||
}
|
||||
@@ -167,7 +210,7 @@ bool FunctionParser::IsDir()
|
||||
if( name.empty() || !last_dir )
|
||||
return false;
|
||||
|
||||
last_dir = system->dirs.GetDir(name, last_dir->id);
|
||||
last_dir = dirs->GetDir(name, last_dir->id);
|
||||
|
||||
return last_dir != nullptr;
|
||||
}
|
||||
@@ -175,8 +218,8 @@ bool FunctionParser::IsDir()
|
||||
|
||||
bool FunctionParser::CheckAddItem()
|
||||
{
|
||||
// cur->request->dir_tab has at least one element
|
||||
long parent_id = cur->request->dir_tab.back()->id;
|
||||
// request->dir_tab has at least one element
|
||||
long parent_id = request->dir_tab.back()->id;
|
||||
morm::Finder<Item> finder(model_connector);
|
||||
|
||||
finder.
|
||||
@@ -184,33 +227,36 @@ bool FunctionParser::CheckAddItem()
|
||||
where().
|
||||
eq(L"parent_id", parent_id).
|
||||
eq(L"url", name).
|
||||
get(cur->request->item);
|
||||
get(request->item);
|
||||
|
||||
if( cur->request->item.found() )
|
||||
if( request->item.found() )
|
||||
{
|
||||
log << log3 << "FP: Item: id: " << cur->request->item.id << ", url: " << cur->request->item.url << logend;
|
||||
cur->request->last_item = &cur->request->item;
|
||||
cur->request->is_item = true;
|
||||
log << log3 << "FP: Item: id: " << request->item.id << ", url: " << request->item.url << logend;
|
||||
request->last_item = &request->item;
|
||||
request->is_item = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
log << log3 << "FP: No Item: url: " << name << logend;
|
||||
cur->request->http_status = Header::status_404_not_found;
|
||||
request->http_status = Header::status_404_not_found;
|
||||
status = false;
|
||||
}
|
||||
|
||||
return cur->request->item.found();
|
||||
return request->item.found();
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool FunctionParser::CheckAddFunction()
|
||||
{
|
||||
cur->request->function = functions->Find(name);
|
||||
|
||||
if( cur->request->function )
|
||||
if( functions )
|
||||
{
|
||||
log << log3 << "FP: Function: " << cur->request->function->fun.url << logend;
|
||||
request->function = functions->Find(name);
|
||||
}
|
||||
|
||||
if( request->function )
|
||||
{
|
||||
log << log3 << "FP: Function: " << request->function->fun.url << logend;
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -231,9 +277,9 @@ void FunctionParser::LogDir(Item * dir)
|
||||
|
||||
void FunctionParser::AddDir()
|
||||
{
|
||||
cur->request->dir_tab.push_back(last_dir);
|
||||
request->dir_tab.push_back(last_dir);
|
||||
LogDir(last_dir);
|
||||
cur->request->last_item = cur->request->dir_tab.back();
|
||||
request->last_item = request->dir_tab.back();
|
||||
}
|
||||
|
||||
|
||||
@@ -302,7 +348,7 @@ void FunctionParser::AddParam()
|
||||
{
|
||||
param.name = name;
|
||||
param.value = value;
|
||||
cur->request->param_tab.push_back(param);
|
||||
request->param_tab.push_back(param);
|
||||
|
||||
log << log3 << "FP: Param: name=" << param.name;
|
||||
|
||||
@@ -323,15 +369,15 @@ void FunctionParser::ParseAnchor()
|
||||
while( *path )
|
||||
name_ascii += GetChar();
|
||||
|
||||
pt::utf8_to_wide(name_ascii, cur->request->anchor);
|
||||
pt::utf8_to_wide(name_ascii, request->anchor);
|
||||
|
||||
if( !cur->request->anchor.empty() )
|
||||
log << log3 << "FP: anchor: " << cur->request->anchor << logend;
|
||||
if( !request->anchor.empty() )
|
||||
log << log3 << "FP: anchor: " << request->anchor << logend;
|
||||
}
|
||||
else
|
||||
if( *path != 0 )
|
||||
{
|
||||
cur->request->http_status = Header::status_400_bad_request;
|
||||
request->http_status = Header::status_400_bad_request;
|
||||
status = false;
|
||||
}
|
||||
}
|
||||
@@ -362,7 +408,7 @@ int FunctionParser::FromHex(int c)
|
||||
}
|
||||
else
|
||||
{
|
||||
cur->request->http_status = Header::status_400_bad_request;
|
||||
request->http_status = Header::status_400_bad_request;
|
||||
status = false;
|
||||
}
|
||||
|
||||
@@ -383,7 +429,7 @@ int c;
|
||||
|
||||
if( c == 0 && status )
|
||||
{
|
||||
cur->request->http_status = Header::status_400_bad_request;
|
||||
request->http_status = Header::status_400_bad_request;
|
||||
status = false;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user