Browse Source

access _config via GET requests in the webserver

Git-Dch: Ignore
tags/debian/0.9.12
David Kalnischkies 8 years ago
parent
commit
6beca0eb8b
1 changed files with 71 additions and 3 deletions
  1. +71
    -3
      test/interactive-helper/aptwebserver.cc

+ 71
- 3
test/interactive-helper/aptwebserver.cc View File

@@ -156,14 +156,28 @@ void sendError(int const client, int const httpcode, std::string const &request,
std::string response("<html><head><title>");
response.append(httpcodeToStr(httpcode)).append("</title></head>");
response.append("<body><h1>").append(httpcodeToStr(httpcode)).append("</h1>");
if (error.empty() == false)
response.append("<p><em>Error</em>: ").append(error).append("</p>");
response.append("This error is a result of the request: <pre>");
if (httpcode != 200)
{
if (error.empty() == false)
response.append("<p><em>Error</em>: ").append(error).append("</p>");
response.append("This error is a result of the request: <pre>");
}
else
{
if (error.empty() == false)
response.append("<p><em>Success</em>: ").append(error).append("</p>");
response.append("The successfully executed operation was requested by: <pre>");
}
response.append(request).append("</pre></body></html>");
addDataHeaders(headers, response);
sendHead(client, httpcode, headers);
if (content == true)
sendData(client, response);
}
void sendSuccess(int const client, std::string const &request,
bool content, std::string const &error = "")
{
sendError(client, 200, request, content, error);
}
/*}}}*/
void sendRedirect(int const client, int const httpcode, std::string const &uri,/*{{{*/
@@ -365,6 +379,49 @@ bool parseFirstLine(int const client, std::string const &request, /*{{{*/
return true;
}
/*}}}*/
bool handleOnTheFlyReconfiguration(int const client, std::string const &request, std::vector<std::string> const &parts)/*{{{*/
{
size_t const pcount = parts.size();
if (pcount == 4 && parts[1] == "set")
{
_config->Set(parts[2], parts[3]);
sendSuccess(client, request, true, "Option '" + parts[2] + "' was set to '" + parts[3] + "'!");
return true;
}
else if (pcount == 4 && parts[1] == "find")
{
std::list<std::string> headers;
std::string response = _config->Find(parts[2], parts[3]);
addDataHeaders(headers, response);
sendHead(client, 200, headers);
sendData(client, response);
return true;
}
else if (pcount == 3 && parts[1] == "find")
{
std::list<std::string> headers;
if (_config->Exists(parts[2]) == true)
{
std::string response = _config->Find(parts[2]);
addDataHeaders(headers, response);
sendHead(client, 200, headers);
sendData(client, response);
return true;
}
sendError(client, 404, request, "Requested Configuration option doesn't exist.");
return false;
}
else if (pcount == 3 && parts[1] == "clear")
{
_config->Clear(parts[2]);
sendSuccess(client, request, true, "Option '" + parts[2] + "' was cleared.");
return true;
}

sendError(client, 400, request, true, "Unknown on-the-fly configuration request");
return false;
}
/*}}}*/
int main(int const argc, const char * argv[])
{
CommandLine::Args Args[] = {
@@ -475,6 +532,17 @@ int main(int const argc, const char * argv[])
if (parseFirstLine(client, *m, filename, sendContent, closeConnection) == false)
continue;

// special webserver command request
if (filename.length() > 1 && filename[0] == '_')
{
std::vector<std::string> parts = VectorizeString(filename, '/');
if (parts[0] == "_config")
{
handleOnTheFlyReconfiguration(client, *m, parts);
continue;
}
}

// string replacements in the requested filename
::Configuration::Item const *Replaces = _config->Tree("aptwebserver::redirect::replace");
if (Replaces != NULL)


Loading…
Cancel
Save