Skip to content

Commit 754a092

Browse files
author
Sebastiano Merlino
committed
Introduced file_not_found management in file_responses.
Enhanced response exceptions management.
1 parent 7176ec3 commit 754a092

File tree

5 files changed

+41
-6
lines changed

5 files changed

+41
-6
lines changed

src/http_response.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,8 @@ void http_file_response::get_raw_response(MHD_Response** response, webserver* ws
149149
size_t size = http::load_file(filename.c_str(), &page);
150150
if(size)
151151
*response = MHD_create_response_from_buffer(size, page, MHD_RESPMEM_MUST_FREE);
152-
//TODO: At the moment if the file does not exist the system returns empty response
152+
else
153+
*response = MHD_create_response_from_buffer(size, (void*) "", MHD_RESPMEM_PERSISTENT);
153154
}
154155

155156
void cache_response::get_raw_response(MHD_Response** response, webserver* ws)

src/http_utils.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -437,7 +437,8 @@ size_t load_file (const char* filename, char** content)
437437
fp.close();
438438
return size;
439439
}
440-
return 0;
440+
else
441+
throw file_access_exception();
441442
}
442443

443444
char* load_file (const char *filename)

src/httpserver/http_utils.hpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,14 @@ class bad_ip_format_exception: public std::exception
4848
}
4949
};
5050

51+
class file_access_exception: public std::exception
52+
{
53+
virtual const char* what() const throw()
54+
{
55+
return "Unable to open file!";
56+
}
57+
};
58+
5159
class http_utils
5260
{
5361
public:

src/httpserver/webserver.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -363,7 +363,7 @@ class webserver
363363
void clean_connections();
364364

365365
void method_not_allowed_page(http_response** dhrs, details::modded_request* mr);
366-
void internal_error_page(http_response** dhrs, details::modded_request* mr);
366+
void internal_error_page(http_response** dhrs, details::modded_request* mr, bool force_our = false);
367367
void not_found_page(http_response** dhrs, details::modded_request* mr);
368368

369369
static int method_not_acceptable_page

src/webserver.cpp

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1063,9 +1063,9 @@ void webserver::method_not_allowed_page(http_response** dhrs, details::modded_re
10631063
*dhrs = new http_string_response(METHOD_ERROR, http_utils::http_method_not_allowed);
10641064
}
10651065

1066-
void webserver::internal_error_page(http_response** dhrs, details::modded_request* mr)
1066+
void webserver::internal_error_page(http_response** dhrs, details::modded_request* mr, bool force_our)
10671067
{
1068-
if(internal_error_resource != 0x0)
1068+
if(internal_error_resource != 0x0 || !force_our)
10691069
((internal_error_resource)->*(mr->callback))(*mr->dhr, dhrs);
10701070
else
10711071
*dhrs = new http_string_response(GENERIC_ERROR, http_utils::http_internal_server_error);
@@ -1271,7 +1271,32 @@ int webserver::finalize_answer(MHD_Connection* connection, struct details::modde
12711271
#endif //WITH_PYTHON
12721272
mr->dhrs = dhrs;
12731273
mr->dhrs->underlying_connection = connection;
1274-
dhrs->get_raw_response(&raw_response, this);
1274+
try
1275+
{
1276+
try
1277+
{
1278+
dhrs->get_raw_response(&raw_response, this);
1279+
}
1280+
catch(const file_access_exception& fae)
1281+
{
1282+
not_found_page(&dhrs, mr);
1283+
dhrs->get_raw_response(&raw_response, this);
1284+
}
1285+
catch(const std::exception& e)
1286+
{
1287+
internal_error_page(&dhrs, mr);
1288+
dhrs->get_raw_response(&raw_response, this);
1289+
}
1290+
catch(...)
1291+
{
1292+
internal_error_page(&dhrs, mr);
1293+
dhrs->get_raw_response(&raw_response, this);
1294+
}
1295+
}
1296+
catch(...)
1297+
{
1298+
internal_error_page(&dhrs, mr, true);
1299+
}
12751300
dhrs->decorate_response(raw_response);
12761301
to_ret = dhrs->enqueue_response(connection, raw_response);
12771302
MHD_destroy_response (raw_response);

0 commit comments

Comments
 (0)