diff --git a/src/server/internalServer.cpp b/src/server/internalServer.cpp index 282d622f7..9d61f0425 100644 --- a/src/server/internalServer.cpp +++ b/src/server/internalServer.cpp @@ -566,26 +566,36 @@ std::unique_ptr InternalServer::handle_search(const RequestContext& re /* Make the search */ // Try to get a search from the searchInfo, else build it std::shared_ptr search; - search = searchCache.getOrPut(searchInfo, - [=](){ - std::shared_ptr searcher; - if (archive) { - searcher = searcherCache.getOrPut(bookId, [=](){ return std::make_shared(*archive);}); - } else { - for (auto& bookId: mp_library->filter(kiwix::Filter().local(true).valid(true))) { - auto currentArchive = mp_library->getArchiveById(bookId); - if (currentArchive) { - if (! searcher) { - searcher = std::make_shared(*currentArchive); - } else { - searcher->addArchive(*currentArchive); + try { + search = searchCache.getOrPut(searchInfo, + [=](){ + std::shared_ptr searcher; + if (archive) { + searcher = searcherCache.getOrPut(bookId, [=](){ return std::make_shared(*archive);}); + } else { + for (auto& bookId: mp_library->filter(kiwix::Filter().local(true).valid(true))) { + auto currentArchive = mp_library->getArchiveById(bookId); + if (currentArchive) { + if (! searcher) { + searcher = std::make_shared(*currentArchive); + } else { + searcher->addArchive(*currentArchive); + } } - } + } } + return make_shared(searcher->search(searchInfo.getZimQuery(m_verbose.load()))); } - return make_shared(searcher->search(searchInfo.getZimQuery(m_verbose.load()))); - } - ); + ); + } catch(std::runtime_error& e) { + // Searcher->search will throw a runtime error if there is no valid xapian database to do the search. + // (in case of zim file not containing a index) + auto data = get_default_data(); + data.set("pattern", encodeDiples(searchInfo.pattern)); + auto response = ContentResponse::build(*this, RESOURCE::templates::no_search_result_html, data, "text/html; charset=utf-8"); + response->set_code(MHD_HTTP_NOT_FOUND); + return withTaskbarInfo(searchInfo.bookName, archive.get(), std::move(response)); + } auto start = 0;