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"
},
};