diff --git a/src/server/request_context.cpp b/src/server/request_context.cpp index e7cfd1b4a..272c7f737 100644 --- a/src/server/request_context.cpp +++ b/src/server/request_context.cpp @@ -68,12 +68,13 @@ fullURL2LocalURL(const std::string& full_url, const std::string& rootLocation) } // unnamed namespace RequestContext::RequestContext(struct MHD_Connection* connection, - std::string rootLocation, + std::string _rootLocation, const std::string& _url, const std::string& _method, const std::string& version) : + rootLocation(_rootLocation), full_url(_url), - url(fullURL2LocalURL(_url, rootLocation)), + url(fullURL2LocalURL(_url, _rootLocation)), method(str2RequestMethod(_method)), version(version), requestIndex(s_requestIndex++), @@ -193,6 +194,10 @@ std::string RequestContext::get_full_url() const { return full_url; } +std::string RequestContext::get_root_path() const { + return rootLocation.empty() ? "/" : rootLocation; +} + bool RequestContext::is_valid_url() const { return !url.empty(); } diff --git a/src/server/request_context.h b/src/server/request_context.h index 46bc81464..689e5445d 100644 --- a/src/server/request_context.h +++ b/src/server/request_context.h @@ -91,6 +91,7 @@ class RequestContext { std::string get_url() const; std::string get_url_part(int part) const; std::string get_full_url() const; + std::string get_root_path() const; std::string get_query() const { return queryString; } @@ -136,6 +137,7 @@ class RequestContext { }; private: // data + std::string rootLocation; std::string full_url; std::string url; RequestMethod method; diff --git a/src/server/response.cpp b/src/server/response.cpp index d8127f3c4..3ec50b8ca 100644 --- a/src/server/response.cpp +++ b/src/server/response.cpp @@ -388,7 +388,9 @@ MHD_Result Response::send(const RequestContext& request, MHD_Connection* connect } if ( ! request.user_language_comes_from_cookie() ) { - const std::string cookie = "userlang=" + request.get_user_language(); + const std::string cookie = "userlang=" + request.get_user_language() + + ";Path=" + request.get_root_path() + + ";Max-Age=31536000"; MHD_add_response_header(response, MHD_HTTP_HEADER_SET_COOKIE, cookie.c_str()); } diff --git a/test/server.cpp b/test/server.cpp index 0a1027eac..78f56ecdc 100644 --- a/test/server.cpp +++ b/test/server.cpp @@ -1007,7 +1007,7 @@ TEST_F(ServerTest, UserLanguageControl) /*url*/ "/ROOT/content/zimfile/invalid-article", /*Accept-Language:*/ "", /*Request Cookie:*/ NO_COOKIE, - /*Response Set-Cookie:*/ "userlang=en", + /*Response Set-Cookie:*/ "userlang=en;Path=/ROOT;Max-Age=31536000", /* expected

*/ "Not Found" }, { @@ -1015,7 +1015,7 @@ TEST_F(ServerTest, UserLanguageControl) /*url*/ "/ROOT/content/zimfile/invalid-article?userlang=en", /*Accept-Language:*/ "", /*Request Cookie:*/ NO_COOKIE, - /*Response Set-Cookie:*/ "userlang=en", + /*Response Set-Cookie:*/ "userlang=en;Path=/ROOT;Max-Age=31536000", /* expected

*/ "Not Found" }, { @@ -1023,7 +1023,7 @@ TEST_F(ServerTest, UserLanguageControl) /*url*/ "/ROOT/content/zimfile/invalid-article?userlang=test", /*Accept-Language:*/ "", /*Request Cookie:*/ NO_COOKIE, - /*Response Set-Cookie:*/ "userlang=test", + /*Response Set-Cookie:*/ "userlang=test;Path=/ROOT;Max-Age=31536000", /* expected

*/ "[I18N TESTING] Content not found, but at least the server is alive" }, { @@ -1031,7 +1031,7 @@ TEST_F(ServerTest, UserLanguageControl) /*url*/ "/ROOT/content/zimfile/invalid-article", /*Accept-Language:*/ "*", /*Request Cookie:*/ NO_COOKIE, - /*Response Set-Cookie:*/ "userlang=en", + /*Response Set-Cookie:*/ "userlang=en;Path=/ROOT;Max-Age=31536000", /* expected

*/ "Not Found" }, { @@ -1039,7 +1039,7 @@ TEST_F(ServerTest, UserLanguageControl) /*url*/ "/ROOT/content/zimfile/invalid-article", /*Accept-Language:*/ "test", /*Request Cookie:*/ NO_COOKIE, - /*Response Set-Cookie:*/ "userlang=test", + /*Response Set-Cookie:*/ "userlang=test;Path=/ROOT;Max-Age=31536000", /* expected

*/ "[I18N TESTING] Content not found, but at least the server is alive" }, { @@ -1087,7 +1087,7 @@ TEST_F(ServerTest, UserLanguageControl) /*url*/ "/ROOT/content/zimfile/invalid-article?userlang=en", /*Accept-Language:*/ "test", /*Request Cookie:*/ NO_COOKIE, - /*Response Set-Cookie:*/ "userlang=en", + /*Response Set-Cookie:*/ "userlang=en;Path=/ROOT;Max-Age=31536000", /* expected

*/ "Not Found" }, { @@ -1095,7 +1095,7 @@ TEST_F(ServerTest, UserLanguageControl) /*url*/ "/ROOT/content/zimfile/invalid-article?userlang=en", /*Accept-Language:*/ "", /*Request Cookie:*/ "userlang=test", - /*Response Set-Cookie:*/ "userlang=en", + /*Response Set-Cookie:*/ "userlang=en;Path=/ROOT;Max-Age=31536000", /* expected

*/ "Not Found" }, { @@ -1113,7 +1113,7 @@ TEST_F(ServerTest, UserLanguageControl) /*url*/ "/ROOT/content/zimfile/invalid-article", /*Accept-Language:*/ "test;q=0.9, en;q=0.2", /*Request Cookie:*/ NO_COOKIE, - /*Response Set-Cookie:*/ "userlang=test", + /*Response Set-Cookie:*/ "userlang=test;Path=/ROOT;Max-Age=31536000", /* expected

*/ "[I18N TESTING] Content not found, but at least the server is alive" }, { @@ -1123,7 +1123,7 @@ TEST_F(ServerTest, UserLanguageControl) /*url*/ "/ROOT/content/zimfile/invalid-article", /*Accept-Language:*/ "test;q=0.2, en;q=0.9", /*Request Cookie:*/ NO_COOKIE, - /*Response Set-Cookie:*/ "userlang=en", + /*Response Set-Cookie:*/ "userlang=en;Path=/ROOT;Max-Age=31536000", /* expected

*/ "Not Found" }, };