diff --git a/src/server/kiwix-serve.cpp b/src/server/kiwix-serve.cpp
index ecd3198..3bad96d 100644
--- a/src/server/kiwix-serve.cpp
+++ b/src/server/kiwix-serve.cpp
@@ -127,26 +127,19 @@ static std::string getMimeTypeForFile(const std::string& filename)
struct RequestContext {
struct MHD_Connection* connection;
int httpResponseCode;
- kiwix::Reader* reader;
- kiwix::Searcher* searcher;
const std::string urlStr;
- const std::string humanReadableBookId;
bool acceptEncodingDeflate;
bool acceptRange;
int range_start;
int range_end;
RequestContext(struct MHD_Connection* connection, int httpResponseCode,
- kiwix::Reader* reader, kiwix::Searcher* searcher,
- const std::string& urlStr, const std::string& humanReadableBookId,
+ const std::string& urlStr,
bool acceptEncodingDeflate,
bool acceptRange, int range_start, int range_end) :
connection(connection),
httpResponseCode(httpResponseCode),
- reader(reader),
- searcher(searcher),
urlStr(urlStr),
- humanReadableBookId(humanReadableBookId),
acceptEncodingDeflate(acceptEncodingDeflate),
acceptRange(acceptRange),
range_start(range_start),
@@ -285,7 +278,8 @@ static struct MHD_Response* build_response(const void* data,
}
-static struct MHD_Response* build_404(RequestContext* request) {
+static struct MHD_Response* build_404(RequestContext* request,
+ const std::string& humanReadableBookId) {
std::string content
= "\n
urlStr + "\" was not found on this server.";
auto mimeType = "text/html";
request->httpResponseCode = MHD_HTTP_NOT_FOUND;
- introduceTaskbar(content, request->humanReadableBookId);
+ introduceTaskbar(content, humanReadableBookId);
bool deflated
= request->acceptEncodingDeflate && compress_content(content, mimeType);
return build_response(
@@ -380,7 +374,9 @@ static struct MHD_Response* build_callback_response_from_article(
return response;
}
-static struct MHD_Response* handle_suggest(RequestContext* request)
+static struct MHD_Response* handle_suggest(RequestContext* request,
+ const std::string& humanReadableBookId,
+ kiwix::Reader* reader, kiwix::Searcher* searcher)
{
std::string content;
std::string mimeType;
@@ -399,10 +395,10 @@ static struct MHD_Response* handle_suggest(RequestContext* request)
pthread_mutex_lock(&searchLock);
/* Get the suggestions */
content = "[";
- if (request->reader != NULL) {
+ if (reader != nullptr) {
/* Get the suggestions */
- request->reader->searchSuggestionsSmart(term, maxSuggestionCount);
- while (request->reader->getNextSuggestion(suggestion)) {
+ reader->searchSuggestionsSmart(term, maxSuggestionCount);
+ while (reader->getNextSuggestion(suggestion)) {
kiwix::stringReplacement(suggestion, "\"", "\\\"");
content += (content == "[" ? "" : ",");
content += "{\"value\":\"" + suggestion + "\",\"label\":\"" + suggestion
@@ -413,7 +409,7 @@ static struct MHD_Response* handle_suggest(RequestContext* request)
pthread_mutex_unlock(&searchLock);
/* Propose the fulltext search if possible */
- if (request->searcher != NULL) {
+ if (searcher != NULL) {
content += (suggestionCount == 0 ? "" : ",");
content += "{\"value\":\"" + std::string(term)
+ " \", \"label\":\"containing '" + std::string(term)
@@ -433,7 +429,7 @@ static struct MHD_Response* handle_skin(RequestContext* request)
try {
content = getResource(request->urlStr.substr(rootLocation.size() + 6));
} catch (const ResourceNotFound& e) {
- return build_404(request);
+ return build_404(request, "");
}
std::string mimeType = getMimeTypeForFile(request->urlStr);
bool deflated = request->acceptEncodingDeflate && compress_content(content, mimeType);
@@ -441,7 +437,9 @@ static struct MHD_Response* handle_skin(RequestContext* request)
content.data(), content.size(), "", mimeType, deflated, true);
}
-static struct MHD_Response* handle_search(RequestContext* request)
+static struct MHD_Response* handle_search(RequestContext* request,
+ const std::string& humanReadableBookId,
+ kiwix::Reader* reader, kiwix::Searcher* searcher)
{
std::string content;
std::string mimeType;
@@ -476,31 +474,31 @@ static struct MHD_Response* handle_search(RequestContext* request)
/* Search results for searches from the welcome page should not
be cached
*/
- bool cacheEnabled = !(request->searcher == globalSearcher);
+ bool cacheEnabled = !(searcher == globalSearcher);
std::string patternCorrespondingUrl;
/* Try first to load directly the article */
- if (request->reader != NULL) {
- std::vector variants = request->reader->getTitleVariants(patternString);
+ if (reader != nullptr) {
+ std::vector variants = reader->getTitleVariants(patternString);
std::vector::iterator variantsItr = variants.begin();
while (patternCorrespondingUrl.empty() && variantsItr != variants.end()) {
- request->reader->getPageUrlFromTitle(*variantsItr, patternCorrespondingUrl);
+ reader->getPageUrlFromTitle(*variantsItr, patternCorrespondingUrl);
variantsItr++;
}
/* If article found then redirect directly to it */
if (!patternCorrespondingUrl.empty()) {
httpRedirection
- = rootLocation + "/" + request->humanReadableBookId + "/" + patternCorrespondingUrl;
+ = rootLocation + "/" + humanReadableBookId + "/" + patternCorrespondingUrl;
request->httpResponseCode = MHD_HTTP_FOUND;
return build_response("", 0, httpRedirection, "", false, true);
}
}
/* Make the search */
- if (request->searcher != NULL) {
+ if (searcher != nullptr) {
const char* start = MHD_lookup_connection_value(
request->connection, MHD_GET_ARGUMENT_KIND, "start");
const char* end = MHD_lookup_connection_value(
@@ -512,13 +510,13 @@ static struct MHD_Response* handle_search(RequestContext* request)
pthread_mutex_lock(&searchLock);
try {
if (patternString.empty() && has_geo_query) {
- request->searcher->geo_search(latitudeFloat, longitudeFloat, distanceFloat,
- startNumber, endNumber, isVerbose.load());
+ searcher->geo_search(latitudeFloat, longitudeFloat, distanceFloat,
+ startNumber, endNumber, isVerbose.load());
} else {
- request->searcher->search(patternString,
- startNumber, endNumber, isVerbose.load());
+ searcher->search(patternString,
+ startNumber, endNumber, isVerbose.load());
}
- content = request->searcher->getHtml();
+ content = searcher->getHtml();
} catch (const std::exception& e) {
std::cerr << e.what() << std::endl;
}
@@ -530,7 +528,7 @@ static struct MHD_Response* handle_search(RequestContext* request)
mimeType = "text/html; charset=utf-8";
- introduceTaskbar(content, request->humanReadableBookId);
+ introduceTaskbar(content, humanReadableBookId);
bool deflated = request->acceptEncodingDeflate && compress_content(content, mimeType);
return build_response(content.data(),
@@ -541,19 +539,23 @@ static struct MHD_Response* handle_search(RequestContext* request)
cacheEnabled);
}
-static struct MHD_Response* handle_random(RequestContext* request)
+static struct MHD_Response* handle_random(RequestContext* request,
+ const std::string& humanReadableBookId,
+ kiwix::Reader* reader, kiwix::Searcher* searcher)
{
std::string httpRedirection;
request->httpResponseCode = MHD_HTTP_FOUND;
- if (request->reader != NULL) {
- std::string randomUrl = request->reader->getRandomPageUrl();
+ if (reader != nullptr) {
+ std::string randomUrl = reader->getRandomPageUrl();
httpRedirection
- = rootLocation + "/" + request->humanReadableBookId + "/" + kiwix::urlEncode(randomUrl);
+ = rootLocation + "/" + humanReadableBookId + "/" + kiwix::urlEncode(randomUrl);
}
return build_response("", 0, httpRedirection, "", false, false);
}
-static struct MHD_Response* handle_content(RequestContext* request)
+static struct MHD_Response* handle_content(RequestContext* request,
+ const std::string& humanReadableBookId,
+ kiwix::Reader* reader, kiwix::Searcher* searcher)
{
std::string baseUrl;
std::string content;
@@ -562,7 +564,7 @@ static struct MHD_Response* handle_content(RequestContext* request)
bool found = false;
zim::Article article;
try {
- found = request->reader->getArticleObjectByDecodedUrl(context->urlStr, article);
+ found = reader->getArticleObjectByDecodedUrl(request->urlStr, article);
if (found) {
/* If redirect */
@@ -584,7 +586,7 @@ static struct MHD_Response* handle_content(RequestContext* request)
if (isVerbose.load())
printf("Failed to find %s\n", request->urlStr.c_str());
- return build_404(request);
+ return build_404(request, humanReadableBookId);
}
try {
@@ -611,21 +613,21 @@ static struct MHD_Response* handle_content(RequestContext* request)
+ article.getUrl();
pthread_mutex_lock(®exLock);
content = replaceRegex(content,
- "$1$2" + rootLocation + "/" + request->humanReadableBookId + "/$3/",
+ "$1$2" + rootLocation + "/" + humanReadableBookId + "/$3/",
"(href|src)(=[\"|\']{0,1})/([A-Z|\\-])/");
content = replaceRegex(content,
- "$1$2" + rootLocation + "/" + request->humanReadableBookId + "/$3/",
+ "$1$2" + rootLocation + "/" + humanReadableBookId + "/$3/",
"(@import[ ]+)([\"|\']{0,1})/([A-Z|\\-])/");
content = replaceRegex(
content,
- "humanReadableBookId + baseUrl + "\" />",
+ "",
"");
pthread_mutex_unlock(®exLock);
- introduceTaskbar(content, request->humanReadableBookId);
+ introduceTaskbar(content, humanReadableBookId);
} else if (mimeType.find("text/css") != string::npos) {
pthread_mutex_lock(®exLock);
content = replaceRegex(content,
- "$1$2" + rootLocation + "/" + request->humanReadableBookId + "/$3/",
+ "$1$2" + rootLocation + "/" + humanReadableBookId + "/$3/",
"(url|URL)(\\([\"|\']{0,1})/([A-Z|\\-])/");
pthread_mutex_unlock(®exLock);
}
@@ -770,15 +772,14 @@ static int accessHandlerCallback(void* cls,
}
RequestContext request(connection, httpResponseCode,
- reader, searcher,
- urlStr, humanReadableBookId,
+ urlStr,
acceptEncodingDeflate,
acceptRange, range_start, range_end);
/* Get suggestions */
if ((urlStr == (rootLocation + "/" + "suggest")) && reader != NULL) {
- response = handle_suggest(&request);
+ response = handle_suggest(&request, humanReadableBookId, reader, searcher);
}
/* Get static skin stuff */
@@ -788,17 +789,17 @@ static int accessHandlerCallback(void* cls,
/* Display the search restults */
else if (urlStr == (rootLocation + "/" + "search")) {
- response = handle_search(&request);
+ response = handle_search(&request, humanReadableBookId, reader, searcher);
}
/* Display a random article */
else if (urlStr == (rootLocation + "/" + "random")) {
- response = handle_random(&request);
+ response = handle_random(&request, humanReadableBookId, reader, searcher);
}
/* Display the content of a ZIM content (article, image, ...) */
else if (reader != NULL) {
- response = handle_content(&request);
+ response = handle_content(&request, humanReadableBookId, reader, searcher);
}
/* Display the global Welcome page */