Skip to content

Commit

Permalink
properly handle more complex URLs inside the CGI script
Browse files Browse the repository at this point in the history
  • Loading branch information
paulbarbu committed May 10, 2014
1 parent e1e31f1 commit 823ec91
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 36 deletions.
87 changes: 53 additions & 34 deletions cgiplugin/cgihttprequesthandler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
#include "cgiresponseparser.h"

CgiHTTPRequestHandler::CgiHTTPRequestHandler(const QHash<QString, QVariant> &s) :
HTTPRequestHandler(s), scriptName(""), timeout(5000)
HTTPRequestHandler(s), pathInfo(""), timeout(5000)
{
int timeout_val;
bool ok;
Expand All @@ -19,10 +19,42 @@ CgiHTTPRequestHandler::CgiHTTPRequestHandler(const QHash<QString, QVariant> &s)

void CgiHTTPRequestHandler::createResponse(const HTTPRequest &requestData)
{
//TODO: on some setups the plugins blocks on process.waitForFinished
//TODO: correctly parse CGI output

// http://127.0.0.1:8282/cgi/info.php/asd
// => SCRIPT_FILENAME cgi-bin-dir + /info.php/
// => SCRIPT_NAME /cgi/info.php
// => PATH_INFO /asd

// http://127.0.0.1:8282/cgi/wp/index.php/asd
// => SCRIPT_FILENAME cgi-bin-dir + /wp/index.php/
// => SCRIPT_NAME /cgi/wp/index.php
// => PATH_INFO /asd

if(requestData.url.isEmpty()){
response.setStatusCode(404);
response.setReasonPhrase("Not Found");

emit responseWritten(response);
emit endOfWriting();
return;
}

clear();
urlParts = requestData.url.path().split("/", QString::SkipEmptyParts);
int slashPos = requestData.url.path().indexOf('/', 1);
urlParts << requestData.url.path().left(slashPos);
urlParts << requestData.url.path().right(requestData.url.path().size() - slashPos);

if(urlParts[1].endsWith('/'))
{
urlParts[1].truncate(urlParts[1].size()-1);
}

foreach(QString part, urlParts){
qDebug()<<requestData.url.path() << "part:" << part;
}

setScriptName();
qDebug() << settings;

QFileInfo info(settings.value("cgi-dir", "").toString());
Expand All @@ -38,7 +70,9 @@ void CgiHTTPRequestHandler::createResponse(const HTTPRequest &requestData)
return;
}

if(scriptName.isEmpty()){
int extPos = urlParts[1].indexOf(".");

if(-1 == extPos){
response.setStatusCode(404);
response.setReasonPhrase("Not Found");

Expand All @@ -47,16 +81,12 @@ void CgiHTTPRequestHandler::createResponse(const HTTPRequest &requestData)
return;
}

setEnvironment(requestData);

QProcess process;
slashPos = urlParts[1].indexOf('/', extPos);

process.setProcessEnvironment(env);
process.setWorkingDirectory(settings["cgi-dir"].toString());
QString extension(urlParts[1].mid(extPos+1, slashPos-extPos-1));

int pos = urlParts[1].indexOf(".");

if(-1 == pos){
qDebug() << "Extension:" << extension;
if(!settings.contains(extension)){
response.setStatusCode(404);
response.setReasonPhrase("Not Found");

Expand All @@ -65,17 +95,14 @@ void CgiHTTPRequestHandler::createResponse(const HTTPRequest &requestData)
return;
}

QString extension(urlParts[1].right(urlParts[1].size() - pos -1));
pathInfo = urlParts[1].right(urlParts[1].size() - slashPos);

qDebug() << "Extension:" << extension;
if(!settings.contains(extension)){
response.setStatusCode(404);
response.setReasonPhrase("Not Found");
setEnvironment(requestData);

emit responseWritten(response);
emit endOfWriting();
return;
}
QProcess process;

process.setProcessEnvironment(env);
process.setWorkingDirectory(settings["cgi-dir"].toString());

QString path = settings[extension].toString();

Expand Down Expand Up @@ -159,20 +186,12 @@ void CgiHTTPRequestHandler::createResponse(const HTTPRequest &requestData)

void CgiHTTPRequestHandler::clear()
{
pathInfo.clear();
response.clear();
scriptName.clear();
urlParts.clear();
env.clear();
}

void CgiHTTPRequestHandler::setScriptName()
{
qDebug() << urlParts.size();
if(2 <= urlParts.size()){
scriptName = "/" + urlParts[0] + "/" + urlParts[1];
}
}

void CgiHTTPRequestHandler::setEnvironment(const HTTPRequest &requestData)
{
env.insert("REDIRECT_STATUS", "200");
Expand All @@ -181,11 +200,11 @@ void CgiHTTPRequestHandler::setEnvironment(const HTTPRequest &requestData)
env.insert("SCRIPT_FILENAME", settings["cgi-dir"].toString() + urlParts[1]);
qDebug() << "SCRIPT_FILENAME" << settings["cgi-dir"].toString() + urlParts[1];

env.insert("SCRIPT_NAME", scriptName);
qDebug() << "SCRIPT_NAME" << scriptName;
env.insert("SCRIPT_NAME", requestData.url.path());
qDebug() << "SCRIPT_NAME" << requestData.url.path();

env.insert("PATH_INFO", requestData.url.path().replace(0, scriptName.length(), ""));
qDebug() << "PATH_INFO" << requestData.url.path().replace(0, scriptName.length(), "");
env.insert("PATH_INFO", pathInfo);
qDebug() << "PATH_INFO" << pathInfo;

env.insert("REQUEST_METHOD", requestData.method);
qDebug() << "REQUEST_METHOD" << requestData.method;
Expand Down
3 changes: 1 addition & 2 deletions cgiplugin/cgihttprequesthandler.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,9 @@ class CgiHTTPRequestHandler : public HTTPRequestHandler
void createResponse(const HTTPRequest &requestData);
private:
void clear();
void setScriptName();
void setEnvironment(const HTTPRequest &requestData);

QString scriptName;
QString pathInfo;
QStringList urlParts;
CgiResponse response;
int timeout;
Expand Down

0 comments on commit 823ec91

Please sign in to comment.