/** Process any HTTP errors states. @param res : The http response @param rs : The iutput stream from the response @param url : The url originally called @exception Mantid::Kernel::Exception::InternetError : Coded for the failure state. */ int InternetHelper::processErrorStates(const Poco::Net::HTTPResponse &res, std::istream &rs, const std::string &url) { int retStatus = res.getStatus(); g_log.debug() << "Answer from web: " << res.getStatus() << " " << res.getReason() << std::endl; // get github api rate limit information if available; int rateLimitRemaining; DateAndTime rateLimitReset; try { rateLimitRemaining = boost::lexical_cast<int>(res.get("X-RateLimit-Remaining", "-1")); rateLimitReset.set_from_time_t( boost::lexical_cast<int>(res.get("X-RateLimit-Reset", "0"))); } catch (boost::bad_lexical_cast const &) { rateLimitRemaining = -1; } if (retStatus == HTTP_OK) { throw Exception::InternetError("Response was ok, processing should never " "have entered processErrorStates", retStatus); } else if (retStatus == HTTP_FOUND) { throw Exception::InternetError("Response was HTTP_FOUND, processing should " "never have entered processErrorStates", retStatus); } else if (retStatus == HTTP_MOVED_PERMANENTLY) { throw Exception::InternetError("Response was HTTP_MOVED_PERMANENTLY, " "processing should never have entered " "processErrorStates", retStatus); } else if (retStatus == HTTP_NOT_MODIFIED) { throw Exception::InternetError("Not modified since provided date" + rateLimitReset.toSimpleString(), retStatus); } else if ((retStatus == HTTP_FORBIDDEN) && (rateLimitRemaining == 0)) { throw Exception::InternetError( "The Github API rate limit has been reached, try again after " + rateLimitReset.toSimpleString(), retStatus); } else { std::stringstream info; std::stringstream ss; Poco::StreamCopier::copyStream(rs, ss); if (retStatus == HTTP_NOT_FOUND) info << "Failed to download " << url << " with the link " << "<a href=\"" << url << "\">.\n" << "Hint. Check that link is correct</a>"; else { // show the error info << res.getReason(); info << ss.str(); g_log.debug() << ss.str(); } throw Exception::InternetError(info.str() + ss.str(), retStatus); } }
void GitHubApiHelper::processResponseHeaders( const Poco::Net::HTTPResponse &res) { // get github api rate limit information if available; int rateLimitRemaining = 0; int rateLimitLimit; DateAndTime rateLimitReset; try { rateLimitLimit = boost::lexical_cast<int>(res.get("X-RateLimit-Limit", "-1")); rateLimitRemaining = boost::lexical_cast<int>(res.get("X-RateLimit-Remaining", "-1")); rateLimitReset.set_from_time_t( boost::lexical_cast<int>(res.get("X-RateLimit-Reset", "0"))); } catch (boost::bad_lexical_cast const &) { rateLimitLimit = -1; } if (rateLimitLimit > -1) { g_log.debug() << "GitHub API " << rateLimitRemaining << " of " << rateLimitLimit << " calls left. Resets at " << rateLimitReset.toSimpleString() << " GMT\n"; } }