Skip to content

Commit a8c8334

Browse files
committed
Fix semantic of the single_resource option
1 parent 7fa1af5 commit a8c8334

File tree

3 files changed

+42
-9
lines changed

3 files changed

+42
-9
lines changed

src/httpserver/create_webserver.hpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ class create_webserver
8080
_ban_system_enabled(true),
8181
_post_process_enabled(true),
8282
_comet_enabled(false),
83-
_single_resource(0x0),
83+
_single_resource(false),
8484
_not_found_resource(0x0),
8585
_method_not_allowed_resource(0x0),
8686
_method_not_acceptable_resource(0x0),
@@ -122,7 +122,7 @@ class create_webserver
122122
_ban_system_enabled(true),
123123
_post_process_enabled(true),
124124
_comet_enabled(false),
125-
_single_resource(0x0),
125+
_single_resource(false),
126126
_not_found_resource(0x0),
127127
_method_not_allowed_resource(0x0),
128128
_method_not_acceptable_resource(0x0),
@@ -304,9 +304,9 @@ class create_webserver
304304
{
305305
_post_process_enabled = false; return *this;
306306
}
307-
create_webserver& single_resource(render_ptr single_resource)
307+
create_webserver& single_resource()
308308
{
309-
_single_resource = single_resource; return *this;
309+
_single_resource = true; return *this;
310310
}
311311
create_webserver& not_found_resource(render_ptr not_found_resource)
312312
{
@@ -367,7 +367,7 @@ class create_webserver
367367
bool _ban_system_enabled;
368368
bool _post_process_enabled;
369369
bool _comet_enabled;
370-
render_ptr _single_resource;
370+
bool _single_resource;
371371
render_ptr _not_found_resource;
372372
render_ptr _method_not_allowed_resource;
373373
render_ptr _method_not_acceptable_resource;

src/webserver.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -180,10 +180,6 @@ webserver::webserver(const create_webserver& params):
180180
next_to_choose(0),
181181
internal_comet_manager(new details::comet_manager())
182182
{
183-
if(single_resource != 0x0)
184-
this->single_resource = true;
185-
else
186-
this->single_resource = false;
187183
ignore_sigpipe();
188184
pthread_mutex_init(&mutexwait, NULL);
189185
pthread_rwlock_init(&runguard, NULL);
@@ -222,6 +218,11 @@ void webserver::request_completed (
222218

223219
bool webserver::register_resource(const std::string& resource, http_resource* hrm, bool family)
224220
{
221+
if (single_resource && ((resource != "" && resource != "/") || !family))
222+
{
223+
throw std::invalid_argument("The resource should be '' or '/' and be marked as family when using a single_resource server");
224+
}
225+
225226
details::http_endpoint idx(resource, family, true, regex_checking);
226227

227228
pair<map<details::http_endpoint, http_resource*>::iterator, bool> result = registered_resources.insert(

test/integ/ws_start_stop.cpp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,38 @@ LT_BEGIN_AUTO_TEST(ws_start_stop_suite, custom_socket)
260260
ws.stop();
261261
LT_END_AUTO_TEST(custom_socket)
262262

263+
LT_BEGIN_AUTO_TEST(ws_start_stop_suite, single_resource)
264+
webserver ws = create_webserver(8080).single_resource();
265+
ok_resource* ok = new ok_resource();
266+
ws.register_resource("/", ok, true);
267+
ws.start(false);
268+
269+
curl_global_init(CURL_GLOBAL_ALL);
270+
std::string s;
271+
CURL *curl = curl_easy_init();
272+
CURLcode res;
273+
curl_easy_setopt(curl, CURLOPT_URL, "localhost:8080/any/url/works");
274+
curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L);
275+
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc);
276+
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s);
277+
res = curl_easy_perform(curl);
278+
LT_ASSERT_EQ(res, 0);
279+
LT_CHECK_EQ(s, "OK");
280+
curl_easy_cleanup(curl);
281+
282+
ws.stop();
283+
LT_END_AUTO_TEST(single_resource)
284+
285+
LT_BEGIN_AUTO_TEST(ws_start_stop_suite, single_resource_not_default_resource)
286+
webserver ws = create_webserver(8080).single_resource();
287+
ok_resource* ok = new ok_resource();
288+
LT_CHECK_THROW(ws.register_resource("/other", ok, true));
289+
LT_CHECK_THROW(ws.register_resource("/", ok, false));
290+
ws.start(false);
291+
292+
ws.stop();
293+
LT_END_AUTO_TEST(single_resource_not_default_resource)
294+
263295
LT_BEGIN_AUTO_TEST_ENV()
264296
AUTORUN_TESTS()
265297
LT_END_AUTO_TEST_ENV()

0 commit comments

Comments
 (0)