diff --git a/code/nel/include/nel/gui/group_html.h b/code/nel/include/nel/gui/group_html.h index ead873497..42da5da20 100644 --- a/code/nel/include/nel/gui/group_html.h +++ b/code/nel/include/nel/gui/group_html.h @@ -821,7 +821,7 @@ namespace NLGUI { public: CDataDownload(const std::string &u, const std::string &d, TDataType t, CViewBase *i, const std::string &s, const std::string &m, const CStyleParams &style = CStyleParams()) - : data(NULL), fp(NULL), url(u), dest(d), type(t), luaScript(s), md5sum(m) + : data(NULL), fp(NULL), url(u), dest(d), type(t), luaScript(s), md5sum(m), redirects(0) { if (t == ImgType) imgs.push_back(CDataImageDownload(i, style)); } @@ -833,6 +833,7 @@ namespace NLGUI std::string luaScript; std::string md5sum; TDataType type; + uint32 redirects; FILE *fp; std::vector imgs; }; diff --git a/code/nel/src/gui/group_html.cpp b/code/nel/src/gui/group_html.cpp index 79dfa77f1..3895f9521 100644 --- a/code/nel/src/gui/group_html.cpp +++ b/code/nel/src/gui/group_html.cpp @@ -651,17 +651,52 @@ namespace NLGUI string tmpfile = it->dest + ".tmp"; if(res != CURLE_OK || r < 200 || r >= 300 || (!it->md5sum.empty() && (it->md5sum != getMD5(tmpfile).toString()))) { - NLMISC::CFile::deleteFile(tmpfile.c_str()); - - // 304 Not Modified - if (res == CURLE_OK && r == 304) + if (it->redirects < DEFAULT_RYZOM_REDIRECT_LIMIT && ((r >= 301 && r <= 303) || r == 307 || r == 308)) { - CHttpCacheObject obj; - obj.Expires = it->data->getExpires(); - obj.Etag = it->data->getEtag(); - obj.LastModified = it->data->getLastModified(); + std::string location(it->data->getLocationHeader()); + if (!location.empty()) + { + CUrlParser uri(location); + if (!uri.isAbsolute()) + { + uri.inherit(it->url); + location = uri.toString(); + } - CHttpCache::getInstance()->store(it->dest, obj); + it->url = location; + it->fp = NULL; + + // release CCurlWWWData + delete it->data; + it->data = NULL; + + it->redirects++; + #ifdef LOG_DL + nlwarning("Redirect '%s'", location.c_str()); + #endif + // keep the request in queue + continue; + } + else + nlwarning("Redirected to empty url '%s'", it->url.c_str()); + } + else + { + if (it->redirects >= DEFAULT_RYZOM_REDIRECT_LIMIT) + nlwarning("Redirect limit reached for '%s'", it->url.c_str()); + + NLMISC::CFile::deleteFile(tmpfile.c_str()); + + // 304 Not Modified + if (res == CURLE_OK && r == 304) + { + CHttpCacheObject obj; + obj.Expires = it->data->getExpires(); + obj.Etag = it->data->getEtag(); + obj.LastModified = it->data->getLastModified(); + + CHttpCache::getInstance()->store(it->dest, obj); + } } } else