@@ -190,12 +190,6 @@ ParameterizedMessage tooManyBooksMsg(size_t nbBooks, size_t limit)
190
190
);
191
191
}
192
192
193
- ParameterizedMessage nonParameterizedMessage (const std::string& msgId)
194
- {
195
- const ParameterizedMessage::Parameters noParams;
196
- return ParameterizedMessage (msgId, noParams);
197
- }
198
-
199
193
struct Error : public std ::runtime_error {
200
194
explicit Error (const ParameterizedMessage& message)
201
195
: std::runtime_error(" Error while handling request" ),
@@ -564,7 +558,7 @@ MHD_Result InternalServer::handlerCallback(struct MHD_Connection* connection,
564
558
response->set_etag_body (getLibraryId ());
565
559
}
566
560
567
- auto ret = response->send (request, connection);
561
+ auto ret = response->send (request, m_verbose. load (), connection);
568
562
auto end_time = std::chrono::steady_clock::now ();
569
563
auto time_span = std::chrono::duration_cast<std::chrono::duration<double >>(end_time - start_time);
570
564
if (m_verbose.load ()) {
@@ -593,20 +587,19 @@ std::unique_ptr<Response> InternalServer::handle_request(const RequestContext& r
593
587
{
594
588
try {
595
589
if (! request.is_valid_url ()) {
596
- return HTTP404Response (*this , request)
597
- + urlNotFoundMsg;
590
+ return UrlNotFoundResponse (request);
598
591
}
599
592
600
593
if ( request.get_url () == " " ) {
601
594
// Redirect /ROOT_LOCATION to /ROOT_LOCATION/ (note the added slash)
602
595
// so that relative URLs are resolved correctly
603
596
const std::string query = getSearchComponent (request);
604
- return Response::build_redirect (* this , m_root + " /" + query);
597
+ return Response::build_redirect (m_root + " /" + query);
605
598
}
606
599
607
600
const ETag etag = get_matching_if_none_match_etag (request, getLibraryId ());
608
601
if ( etag )
609
- return Response::build_304 (* this , etag);
602
+ return Response::build_304 (etag);
610
603
611
604
const auto url = request.get_url ();
612
605
if ( isLocallyCustomizedResource (url) )
@@ -647,15 +640,15 @@ std::unique_ptr<Response> InternalServer::handle_request(const RequestContext& r
647
640
648
641
const std::string contentUrl = m_root + " /content" + urlEncode (url);
649
642
const std::string query = getSearchComponent (request);
650
- return Response::build_redirect (* this , contentUrl + query);
643
+ return Response::build_redirect (contentUrl + query);
651
644
} catch (std::exception & e) {
652
645
fprintf (stderr, " ===== Unhandled error : %s\n " , e.what ());
653
- return HTTP500Response (* this , request)
654
- + e.what ();
646
+ return HTTP500Response (request)
647
+ + ParameterizedMessage ( " non-translated-text " , {{ " MSG " , e.what ()}} );
655
648
} catch (...) {
656
649
fprintf (stderr, " ===== Unhandled unknown error\n " );
657
- return HTTP500Response (* this , request)
658
- + " Unknown error" ;
650
+ return HTTP500Response (request)
651
+ + nonParameterizedMessage ( " unknown- error" ) ;
659
652
}
660
653
}
661
654
@@ -668,7 +661,7 @@ MustacheData InternalServer::get_default_data() const
668
661
669
662
std::unique_ptr<Response> InternalServer::build_homepage (const RequestContext& request)
670
663
{
671
- return ContentResponse::build (* this , m_indexTemplateString, get_default_data (), " text/html; charset=utf-8" );
664
+ return ContentResponse::build (m_indexTemplateString, get_default_data (), " text/html; charset=utf-8" );
672
665
}
673
666
674
667
/* *
@@ -697,8 +690,7 @@ std::unique_ptr<Response> InternalServer::handle_suggest(const RequestContext& r
697
690
}
698
691
699
692
if ( startsWith (request.get_url (), " /suggest/" ) ) {
700
- return HTTP404Response (*this , request)
701
- + urlNotFoundMsg;
693
+ return UrlNotFoundResponse (request);
702
694
}
703
695
704
696
std::string bookName, bookId;
@@ -712,7 +704,7 @@ std::unique_ptr<Response> InternalServer::handle_suggest(const RequestContext& r
712
704
}
713
705
714
706
if (archive == nullptr ) {
715
- return HTTP404Response (* this , request)
707
+ return HTTP404Response (request)
716
708
+ noSuchBookErrorMsg (bookName);
717
709
}
718
710
@@ -747,7 +739,7 @@ std::unique_ptr<Response> InternalServer::handle_suggest(const RequestContext& r
747
739
results.addFTSearchSuggestion (request.get_user_language (), queryString);
748
740
}
749
741
750
- return ContentResponse::build (* this , results.getJSON (), " application/json; charset=utf-8" );
742
+ return ContentResponse::build (results.getJSON (), " application/json; charset=utf-8" );
751
743
}
752
744
753
745
std::unique_ptr<Response> InternalServer::handle_viewer_settings (const RequestContext& request)
@@ -762,7 +754,7 @@ std::unique_ptr<Response> InternalServer::handle_viewer_settings(const RequestCo
762
754
{" enable_library_button" , m_withLibraryButton ? " true" : " false" },
763
755
{" default_user_language" , request.get_user_language () }
764
756
};
765
- return ContentResponse::build (* this , RESOURCE::templates::viewer_settings_js, data, " application/javascript; charset=utf-8" );
757
+ return ContentResponse::build (RESOURCE::templates::viewer_settings_js, data, " application/javascript; charset=utf-8" );
766
758
}
767
759
768
760
std::string InternalServer::getNoJSDownloadPageHTML (const std::string& bookId, const std::string& userLang) const
@@ -817,19 +809,13 @@ std::unique_ptr<Response> InternalServer::handle_no_js(const RequestContext& req
817
809
const auto bookId = mp_nameMapper->getIdForName (urlParts[2 ]);
818
810
content = getNoJSDownloadPageHTML (bookId, userLang);
819
811
} catch (const std::out_of_range&) {
820
- return HTTP404Response (*this , request)
821
- + urlNotFoundMsg;
812
+ return UrlNotFoundResponse (request);
822
813
}
823
814
} else {
824
- return HTTP404Response (*this , request)
825
- + urlNotFoundMsg;
815
+ return UrlNotFoundResponse (request);
826
816
}
827
817
828
- return ContentResponse::build (
829
- *this ,
830
- content,
831
- " text/html; charset=utf-8"
832
- );
818
+ return ContentResponse::build (content, " text/html; charset=utf-8" );
833
819
}
834
820
835
821
namespace
@@ -867,14 +853,12 @@ std::unique_ptr<Response> InternalServer::handle_skin(const RequestContext& requ
867
853
try {
868
854
const auto accessType = staticResourceAccessType (request, resourceCacheId);
869
855
auto response = ContentResponse::build (
870
- *this ,
871
856
getResource (resourceName),
872
857
getMimeTypeForFile (resourceName));
873
858
response->set_kind (accessType);
874
859
return std::move (response);
875
860
} catch (const ResourceNotFound& e) {
876
- return HTTP404Response (*this , request)
877
- + urlNotFoundMsg;
861
+ return UrlNotFoundResponse (request);
878
862
}
879
863
}
880
864
@@ -887,20 +871,17 @@ std::unique_ptr<Response> InternalServer::handle_search(const RequestContext& re
887
871
if ( startsWith (request.get_url (), " /search/" ) ) {
888
872
if (request.get_url () == " /search/searchdescription.xml" ) {
889
873
return ContentResponse::build (
890
- *this ,
891
874
RESOURCE::ft_opensearchdescription_xml,
892
875
get_default_data (),
893
876
" application/opensearchdescription+xml" );
894
877
}
895
- return HTTP404Response (*this , request)
896
- + urlNotFoundMsg;
878
+ return UrlNotFoundResponse (request);
897
879
}
898
880
899
881
try {
900
882
return handle_search_request (request);
901
883
} catch (const Error& e) {
902
- return HTTP400Response (*this , request)
903
- + invalidUrlMsg
884
+ return HTTP400Response (request)
904
885
+ e.message ();
905
886
}
906
887
}
@@ -942,7 +923,7 @@ std::unique_ptr<Response> InternalServer::handle_search_request(const RequestCon
942
923
// Searcher->search will throw a runtime error if there is no valid xapian database to do the search.
943
924
// (in case of zim file not containing a index)
944
925
const auto cssUrl = renderUrl (m_root, RESOURCE::templates::url_of_search_results_css);
945
- HTTPErrorResponse response (* this , request, MHD_HTTP_NOT_FOUND,
926
+ HTTPErrorResponse response (request, MHD_HTTP_NOT_FOUND,
946
927
" fulltext-search-unavailable" ,
947
928
" 404-page-heading" ,
948
929
cssUrl);
@@ -972,13 +953,11 @@ std::unique_ptr<Response> InternalServer::handle_search_request(const RequestCon
972
953
renderer.setPageLength (pageLength);
973
954
if (request.get_requested_format () == " xml" ) {
974
955
return ContentResponse::build (
975
- *this ,
976
956
renderer.getXml (*mp_nameMapper, mp_library.get ()),
977
957
" application/rss+xml; charset=utf-8"
978
958
);
979
959
}
980
960
auto response = ContentResponse::build (
981
- *this ,
982
961
renderer.getHtml (*mp_nameMapper, mp_library.get ()),
983
962
" text/html; charset=utf-8"
984
963
);
@@ -1001,8 +980,7 @@ std::unique_ptr<Response> InternalServer::handle_random(const RequestContext& re
1001
980
}
1002
981
1003
982
if ( startsWith (request.get_url (), " /random/" ) ) {
1004
- return HTTP404Response (*this , request)
1005
- + urlNotFoundMsg;
983
+ return UrlNotFoundResponse (request);
1006
984
}
1007
985
1008
986
std::string bookName;
@@ -1016,15 +994,15 @@ std::unique_ptr<Response> InternalServer::handle_random(const RequestContext& re
1016
994
}
1017
995
1018
996
if (archive == nullptr ) {
1019
- return HTTP404Response (* this , request)
997
+ return HTTP404Response (request)
1020
998
+ noSuchBookErrorMsg (bookName);
1021
999
}
1022
1000
1023
1001
try {
1024
1002
auto entry = archive->getRandomEntry ();
1025
1003
return build_redirect (bookName, getFinalItem (*archive, entry));
1026
1004
} catch (zim::EntryNotFound& e) {
1027
- return HTTP404Response (* this , request)
1005
+ return HTTP404Response (request)
1028
1006
+ nonParameterizedMessage (" random-article-failure" );
1029
1007
}
1030
1008
}
@@ -1037,13 +1015,12 @@ std::unique_ptr<Response> InternalServer::handle_captured_external(const Request
1037
1015
} catch (const std::out_of_range& e) {}
1038
1016
1039
1017
if (source.empty ()) {
1040
- return HTTP404Response (*this , request)
1041
- + urlNotFoundMsg;
1018
+ return UrlNotFoundResponse (request);
1042
1019
}
1043
1020
1044
1021
auto data = get_default_data ();
1045
1022
data.set (" source" , source);
1046
- return ContentResponse::build (* this , RESOURCE::templates::captured_external_html, data, " text/html; charset=utf-8" );
1023
+ return ContentResponse::build (RESOURCE::templates::captured_external_html, data, " text/html; charset=utf-8" );
1047
1024
}
1048
1025
1049
1026
std::unique_ptr<Response> InternalServer::handle_catch (const RequestContext& request)
@@ -1056,8 +1033,7 @@ std::unique_ptr<Response> InternalServer::handle_catch(const RequestContext& req
1056
1033
return handle_captured_external (request);
1057
1034
}
1058
1035
1059
- return HTTP404Response (*this , request)
1060
- + urlNotFoundMsg;
1036
+ return UrlNotFoundResponse (request);
1061
1037
}
1062
1038
1063
1039
std::vector<std::string>
@@ -1117,7 +1093,7 @@ InternalServer::build_redirect(const std::string& bookName, const zim::Item& ite
1117
1093
{
1118
1094
const auto contentPath = " /content/" + bookName + " /" + item.getPath ();
1119
1095
const auto url = m_root + kiwix::urlEncode (contentPath);
1120
- return Response::build_redirect (* this , url);
1096
+ return Response::build_redirect (url);
1121
1097
}
1122
1098
1123
1099
std::unique_ptr<Response> InternalServer::handle_content (const RequestContext& request)
@@ -1141,15 +1117,14 @@ std::unique_ptr<Response> InternalServer::handle_content(const RequestContext& r
1141
1117
1142
1118
if (archive == nullptr ) {
1143
1119
const std::string searchURL = m_root + " /search?pattern=" + kiwix::urlEncode (pattern);
1144
- return HTTP404Response (*this , request)
1145
- + urlNotFoundMsg
1120
+ return UrlNotFoundResponse (request)
1146
1121
+ suggestSearchMsg (searchURL, kiwix::urlDecode (pattern));
1147
1122
}
1148
1123
1149
1124
const std::string archiveUuid (archive->getUuid ());
1150
1125
const ETag etag = get_matching_if_none_match_etag (request, archiveUuid);
1151
1126
if ( etag )
1152
- return Response::build_304 (* this , etag);
1127
+ return Response::build_304 (etag);
1153
1128
1154
1129
auto urlStr = url.substr (prefixLength + bookName.size ());
1155
1130
if (urlStr[0 ] == ' /' ) {
@@ -1168,7 +1143,7 @@ std::unique_ptr<Response> InternalServer::handle_content(const RequestContext& r
1168
1143
// '-' namespaces, in which case that resource is returned instead.
1169
1144
return build_redirect (bookName, getFinalItem (*archive, entry));
1170
1145
}
1171
- auto response = ItemResponse::build (* this , request, entry.getItem ());
1146
+ auto response = ItemResponse::build (request, entry.getItem ());
1172
1147
response->set_etag_body (archiveUuid);
1173
1148
1174
1149
if ( !startsWith (entry.getItem ().getMimetype (), " application/pdf" ) ) {
@@ -1189,8 +1164,7 @@ std::unique_ptr<Response> InternalServer::handle_content(const RequestContext& r
1189
1164
printf (" Failed to find %s\n " , urlStr.c_str ());
1190
1165
1191
1166
std::string searchURL = m_root + " /search?content=" + bookName + " &pattern=" + kiwix::urlEncode (pattern);
1192
- return HTTP404Response (*this , request)
1193
- + urlNotFoundMsg
1167
+ return UrlNotFoundResponse (request)
1194
1168
+ suggestSearchMsg (searchURL, kiwix::urlDecode (pattern));
1195
1169
}
1196
1170
}
@@ -1208,13 +1182,11 @@ std::unique_ptr<Response> InternalServer::handle_raw(const RequestContext& reque
1208
1182
bookName = request.get_url_part (1 );
1209
1183
kind = request.get_url_part (2 );
1210
1184
} catch (const std::out_of_range& e) {
1211
- return HTTP404Response (*this , request)
1212
- + urlNotFoundMsg;
1185
+ return UrlNotFoundResponse (request);
1213
1186
}
1214
1187
1215
1188
if (kind != " meta" && kind!= " content" ) {
1216
- return HTTP404Response (*this , request)
1217
- + urlNotFoundMsg
1189
+ return UrlNotFoundResponse (request)
1218
1190
+ invalidRawAccessMsg (kind);
1219
1191
}
1220
1192
@@ -1225,15 +1197,14 @@ std::unique_ptr<Response> InternalServer::handle_raw(const RequestContext& reque
1225
1197
} catch (const std::out_of_range& e) {}
1226
1198
1227
1199
if (archive == nullptr ) {
1228
- return HTTP404Response (*this , request)
1229
- + urlNotFoundMsg
1200
+ return UrlNotFoundResponse (request)
1230
1201
+ noSuchBookErrorMsg (bookName);
1231
1202
}
1232
1203
1233
1204
const std::string archiveUuid (archive->getUuid ());
1234
1205
const ETag etag = get_matching_if_none_match_etag (request, archiveUuid);
1235
1206
if ( etag )
1236
- return Response::build_304 (* this , etag);
1207
+ return Response::build_304 (etag);
1237
1208
1238
1209
// Remove the beggining of the path:
1239
1210
// /raw/<bookName>/<kind>/foo
@@ -1244,24 +1215,23 @@ std::unique_ptr<Response> InternalServer::handle_raw(const RequestContext& reque
1244
1215
try {
1245
1216
if (kind == " meta" ) {
1246
1217
auto item = archive->getMetadataItem (itemPath);
1247
- auto response = ItemResponse::build (* this , request, item);
1218
+ auto response = ItemResponse::build (request, item);
1248
1219
response->set_etag_body (archiveUuid);
1249
1220
return response;
1250
1221
} else {
1251
1222
auto entry = archive->getEntryByPath (itemPath);
1252
1223
if (entry.isRedirect ()) {
1253
1224
return build_redirect (bookName, entry.getItem (true ));
1254
1225
}
1255
- auto response = ItemResponse::build (* this , request, entry.getItem ());
1226
+ auto response = ItemResponse::build (request, entry.getItem ());
1256
1227
response->set_etag_body (archiveUuid);
1257
1228
return response;
1258
1229
}
1259
1230
} catch (zim::EntryNotFound& e ) {
1260
1231
if (m_verbose.load ()) {
1261
1232
printf (" Failed to find %s\n " , itemPath.c_str ());
1262
1233
}
1263
- return HTTP404Response (*this , request)
1264
- + urlNotFoundMsg
1234
+ return UrlNotFoundResponse (request)
1265
1235
+ rawEntryNotFoundMsg (kind, itemPath);
1266
1236
}
1267
1237
}
@@ -1286,12 +1256,10 @@ std::unique_ptr<Response> InternalServer::handle_locally_customized_resource(con
1286
1256
1287
1257
auto byteRange = request.get_range ().resolve (resourceData.size ());
1288
1258
if (byteRange.kind () != ByteRange::RESOLVED_FULL_CONTENT) {
1289
- return Response::build_416 (* this , resourceData.size ());
1259
+ return Response::build_416 (resourceData.size ());
1290
1260
}
1291
1261
1292
- return ContentResponse::build (*this ,
1293
- resourceData,
1294
- crd.mimeType );
1262
+ return ContentResponse::build (resourceData, crd.mimeType );
1295
1263
}
1296
1264
1297
1265
}
0 commit comments