From b619ef1865dd7400a82614d051aa99513a3196c4 Mon Sep 17 00:00:00 2001
From: Nimetu <nimetu@gmail.com>
Date: Sat, 14 May 2016 12:53:09 +0300
Subject: [PATCH] Changed: Remove legacy HTTPCurrentDomain variable

---
 code/nel/include/nel/gui/group_html.h |  2 +-
 code/nel/include/nel/gui/url_parser.h |  1 +
 code/nel/src/gui/group_html.cpp       | 24 +++++++++++++-----------
 code/nel/src/gui/libwww.cpp           | 22 +++-------------------
 code/nel/src/gui/url_parser.cpp       | 21 +++++++++++++++++++--
 5 files changed, 37 insertions(+), 33 deletions(-)

diff --git a/code/nel/include/nel/gui/group_html.h b/code/nel/include/nel/gui/group_html.h
index 635136220..aecf5f855 100644
--- a/code/nel/include/nel/gui/group_html.h
+++ b/code/nel/include/nel/gui/group_html.h
@@ -39,7 +39,6 @@ namespace NLGUI
 	class CGroupParagraph;
 
 	extern std::string CurrentCookie;
-	extern std::string HTTPCurrentDomain;
 
 	// HTML group
 	/**
@@ -376,6 +375,7 @@ namespace NLGUI
 		std::string		_URL;
 		// Current URL
 		std::string		_DocumentUrl;
+		std::string		_DocumentDomain;
 		// Valid base href was found
 		bool            _IgnoreBaseUrlTag;
 		// Fragment from loading url
diff --git a/code/nel/include/nel/gui/url_parser.h b/code/nel/include/nel/gui/url_parser.h
index 915d7d85a..758f1d340 100644
--- a/code/nel/include/nel/gui/url_parser.h
+++ b/code/nel/include/nel/gui/url_parser.h
@@ -52,6 +52,7 @@ namespace NLGUI
 	public:
 		std::string scheme;
 		std::string authority;
+		std::string host;
 		std::string path;
 		std::string query;
 		std::string hash;
diff --git a/code/nel/src/gui/group_html.cpp b/code/nel/src/gui/group_html.cpp
index 30dd3ec3f..18aa3e1eb 100644
--- a/code/nel/src/gui/group_html.cpp
+++ b/code/nel/src/gui/group_html.cpp
@@ -506,7 +506,7 @@ namespace NLGUI
 							}
 							else
 							{
-								receiveCookies(_CurlWWW->Request, HTTPCurrentDomain, _TrustedDomain);
+								receiveCookies(_CurlWWW->Request, _DocumentDomain, _TrustedDomain);
 
 								// redirect, get the location and try browse again
 								// we cant use curl redirection because 'addHTTPGetParams()' must be called on new destination
@@ -533,7 +533,7 @@ namespace NLGUI
 						}
 						else
 						{
-							receiveCookies(_CurlWWW->Request, HTTPCurrentDomain, _TrustedDomain);
+							receiveCookies(_CurlWWW->Request, _DocumentDomain, _TrustedDomain);
 
 							_RedirectsRemaining = DEFAULT_RYZOM_REDIRECT_LIMIT;
 
@@ -2548,6 +2548,7 @@ namespace NLGUI
 		_SelectOption = false;
 		_GroupListAdaptor = NULL;
 		_DocumentUrl = "";
+		_DocumentDomain = "";
 		_UrlFragment.clear();
 		_RefreshUrl.clear();
 		_NextRefreshTime = 0.0;
@@ -4657,9 +4658,12 @@ namespace NLGUI
 			string finalUrl;
 			bool isLocal = lookupLocalFile (finalUrl, _URL.c_str(), true);
 
-			// Save new url
 			_URL = finalUrl;
 
+			CUrlParser uri (_URL);
+			_TrustedDomain = isTrustedDomain(uri.host);
+			_DocumentDomain = uri.host;
+
 			// file is probably from bnp (ingame help)
 			if (isLocal)
 			{
@@ -4667,8 +4671,6 @@ namespace NLGUI
 			}
 			else
 			{
-				_TrustedDomain = isTrustedDomain(setCurrentDomain(finalUrl));
-
 				SFormFields formfields;
 				if (_PostNextTime)
 				{
@@ -4704,9 +4706,11 @@ namespace NLGUI
 		// Ref the form
 		CForm &form = _Forms[_PostFormId];
 
-		// Save new url
 		_URL = form.Action;
-		_TrustedDomain = isTrustedDomain(setCurrentDomain(_URL));
+
+		CUrlParser uri(_URL);
+		_TrustedDomain = isTrustedDomain(uri.host);
+		_DocumentDomain = uri.host;
 
 		for (i=0; i<form.Entries.size(); i++)
 		{
@@ -4814,6 +4818,7 @@ namespace NLGUI
 	#endif
 
 		_TrustedDomain = true;
+		_DocumentDomain = "localhost";
 
 		// Stop previous browse, remove content
 		stopBrowse ();
@@ -4899,7 +4904,7 @@ namespace NLGUI
 		curl_easy_setopt(curl, CURLOPT_USERAGENT, userAgent.c_str());
 
 		// Cookies
-		sendCookies(curl, HTTPCurrentDomain, _TrustedDomain);
+		sendCookies(curl, _DocumentDomain, _TrustedDomain);
 
 		// Referer
 		if (!referer.empty())
@@ -4983,9 +4988,6 @@ namespace NLGUI
 		nlwarning("(%s) HTML download finished, content length %d, type '%s', code %d", _Id.c_str(), content.size(), type.c_str(), code);
 	#endif
 
-		// set trusted domain for parsing
-		_TrustedDomain = isTrustedDomain(setCurrentDomain(_URL));
-
 		// create <html> markup for image downloads
 		if (type.find("image/") == 0 && content.size() > 0)
 		{
diff --git a/code/nel/src/gui/libwww.cpp b/code/nel/src/gui/libwww.cpp
index 800c4d1e3..53cc9e403 100644
--- a/code/nel/src/gui/libwww.cpp
+++ b/code/nel/src/gui/libwww.cpp
@@ -31,7 +31,6 @@ namespace NLGUI
 
 	/// store all cookies we receive and resent them depending of the domain
 	static std::map<std::string, std::map<std::string, std::string> > HTTPCookies;
-	std::string HTTPCurrentDomain;	// The current domain that will be used to get which cookies to send
 
 	// ***************************************************************************
 
@@ -332,24 +331,6 @@ namespace NLGUI
 		return dst;
 	}
 
-	// set current HTTPCurrentDomain for cookie selection, return new domain
-	const std::string &setCurrentDomain(const std::string &uri)
-	{
-		if (uri.find("http://") == 0)
-			HTTPCurrentDomain = uri.substr(7, uri.find("/", 7) - 7);
-		else
-		if (uri.find("https://") == 0)
-			HTTPCurrentDomain = uri.substr(8, uri.find("/", 8) - 8);
-		else
-		if (uri.find("//") == 0)
-			HTTPCurrentDomain = uri.substr(2, uri.find("/", 2) - 2);
-		else
-		if (uri.find("/") != std::string::npos)
-			HTTPCurrentDomain = uri.substr(0, uri.find("/") - 1);
-
-		return HTTPCurrentDomain;
-	}
-
 	// update HTTPCookies list
 	static void receiveCookie(const char *nsformat, const std::string &domain, bool trusted)
 	{
@@ -371,6 +352,9 @@ namespace NLGUI
 			chunks[0] = chunks[0].substr(10);
 		}
 
+		// make sure domain is lowercase
+		chunks[0] = toLower(chunks[0]);
+
 		if (chunks[0] != domain && chunks[0] != std::string("." + domain))
 		{
 			// cookie is for different domain
diff --git a/code/nel/src/gui/url_parser.cpp b/code/nel/src/gui/url_parser.cpp
index 043defd78..5db7f6d72 100644
--- a/code/nel/src/gui/url_parser.cpp
+++ b/code/nel/src/gui/url_parser.cpp
@@ -14,8 +14,7 @@
 // You should have received a copy of the GNU Affero General Public License
 // along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
-#include <string>
-#include "nel/misc/types_nl.h"
+#include "nel/misc/common.h"
 #include "nel/gui/url_parser.h"
 
 using namespace std;
@@ -72,6 +71,24 @@ namespace NLGUI
 				uri = uri.substr(pos);
 			else
 				uri.clear();
+
+			// strip empty port from authority
+			if (authority.find_last_of(":") == authority.length() - 1)
+				authority = authority.substr(0, authority.length() - 1);
+
+			// extract host from user:pass@host:port
+			pos = authority.find("@");
+			if (pos != npos)
+				host = authority.substr(pos + 1);
+			else
+				host = authority.substr(2);
+
+			// case-insensitive
+			host = NLMISC::toLower(host);
+
+			pos = host.find(":");
+			if (pos != npos)
+				host = host.substr(0, pos);
 		}
 
 		// scan for query