http: Make sure we don't hang checking existence.

It's not great to delay loading when the server is down - we'll do a
proper check when we display the games.

This also fixes shutdown being slow.
This commit is contained in:
Unknown W. Brackets committed 2016-07-04 00:46:42 -07:00
1 parent c793efd69a
commit 429346bb94
12 files changed
+90 -14

No files matched your search

+18 -3
View File
@@ -21,7 +21,15 @@
#include "Core/FileLoaders/HTTPFileLoader.h"
HTTPFileLoader::HTTPFileLoader(const std::string &filename)
: filesize_(0), filepos_(0), url_(filename), filename_(filename), connected_(false) {
: filesize_(0), filepos_(0), url_(filename), filename_(filename), connected_(false), prepared_(false) {
}
void HTTPFileLoader::Prepare() {
if (prepared_) {
return;
}
prepared_ = true;
if (!client_.Resolve(url_.Host().c_str(), url_.Port())) {
// TODO: Should probably set some flag?
return;
@@ -39,7 +47,7 @@ HTTPFileLoader::HTTPFileLoader(const std::string &filename)
int code = client_.ReadResponseHeaders(&readbuf, responseHeaders);
if (code != 200) {
// Leave size at 0, invalid.
ERROR_LOG(LOADER, "HTTP request failed, got %03d for %s", code, filename.c_str());
ERROR_LOG(LOADER, "HTTP request failed, got %03d for %s", code, filename_.c_str());
Disconnect();
return;
}
@@ -78,7 +86,7 @@ HTTPFileLoader::HTTPFileLoader(const std::string &filename)
WARN_LOG(LOADER, "HTTP server did not advertise support for range requests.");
}
if (filesize_ == 0) {
ERROR_LOG(LOADER, "Could not determine file size for %s", filename.c_str());
ERROR_LOG(LOADER, "Could not determine file size for %s", filename_.c_str());
}
// If we didn't end up with a filesize_ (e.g. chunked response), give up. File invalid.
@@ -89,15 +97,21 @@ HTTPFileLoader::~HTTPFileLoader() {
}
bool HTTPFileLoader::Exists() {
Prepare();
return url_.Valid() && filesize_ > 0;
}
bool HTTPFileLoader::ExistsFast() {
return url_.Valid();
}
bool HTTPFileLoader::IsDirectory() {
// Only files.
return false;
}
s64 HTTPFileLoader::FileSize() {
Prepare();
return filesize_;
}
@@ -110,6 +124,7 @@ void HTTPFileLoader::Seek(s64 absolutePos) {
}
size_t HTTPFileLoader::ReadAt(s64 absolutePos, size_t bytes, void *data) {
Prepare();
s64 absoluteEnd = std::min(absolutePos + (s64)bytes, filesize_);
if (absolutePos >= filesize_ || bytes == 0) {
// Read outside of the file or no read at all, just fail immediately.