[Scummvm-git-logs] scummvm master -> 5b5a89e3e7b880907f99675a68c5e0a8e2460470

bluegr bluegr at gmail.com
Sun Aug 25 11:15:18 CEST 2019


This automated email contains information about 2 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
24b1ec0ded CLOUD: Handle HTTP response headers case-insensitively
5b5a89e3e7 CLOUD: Make Network::ErrorResponse messages more verbose


Commit: 24b1ec0dedf31097396741aa811dfabf9335b397
    https://github.com/scummvm/scummvm/commit/24b1ec0dedf31097396741aa811dfabf9335b397
Author: Alexander Tkachev (alexander at tkachov.ru)
Date: 2019-08-25T12:15:14+03:00

Commit Message:
CLOUD: Handle HTTP response headers case-insensitively

RFC 2616 states that HTTP headers are not case-sensitive and also allows
arbitrary number of whitespace characters around header value. Previous
implementation was dependant on headers to be in "Title-Case" and to
have only one space before header value. That has lead to cloud sync
failure on Debian x64 (user's network environment was probably the
reason though).

This commit adds a new method, which parses headers name-value pairs
into HashMap. To ensure case-insensitivity, all headers names are
converted to lowercase, and thus code that uses this method should
specify headers in lowercase. All usages of raw headers contents were
updated to use this method.

Changed paths:
    backends/cloud/googledrive/googledriveuploadrequest.cpp
    backends/networking/curl/curlrequest.cpp
    backends/networking/curl/networkreadstream.cpp
    backends/networking/curl/networkreadstream.h


diff --git a/backends/cloud/googledrive/googledriveuploadrequest.cpp b/backends/cloud/googledrive/googledriveuploadrequest.cpp
index f921f5c..c4728c5 100644
--- a/backends/cloud/googledrive/googledriveuploadrequest.cpp
+++ b/backends/cloud/googledrive/googledriveuploadrequest.cpp
@@ -152,20 +152,10 @@ void GoogleDriveUploadRequest::startUploadCallback(Networking::JsonResponse resp
 		const Networking::NetworkReadStream *stream = rq->getNetworkReadStream();
 		if (stream) {
 			long code = stream->httpResponseCode();
-			Common::String headers = stream->responseHeaders();
 			if (code == 200) {
-				const char *cstr = headers.c_str();
-				const char *position = strstr(cstr, "Location: ");
-
-				if (position) {
-					Common::String result = "";
-					char c;
-					for (const char *i = position + 10; c = *i, c != 0; ++i) {
-						if (c == '\n' || c == '\r')
-							break;
-						result += c;
-					}
-					_uploadUrl = result;
+				Common::HashMap<Common::String, Common::String> headers = stream->responseHeadersMap();
+				if (headers.contains("location")) {
+					_uploadUrl = headers["location"];
 					uploadNextPart();
 					return;
 				}
@@ -230,25 +220,19 @@ bool GoogleDriveUploadRequest::handleHttp308(const Networking::NetworkReadStream
 	if (stream->httpResponseCode() != 308)
 		return false; //seriously
 
-	Common::String headers = stream->responseHeaders();
-	const char *cstr = headers.c_str();
-	for (int rangeTry = 0; rangeTry < 2; ++rangeTry) {
-		const char *needle = (rangeTry == 0 ? "Range: 0-" : "Range: bytes=0-");
-		uint32 needleLength = (rangeTry == 0 ? 9 : 15);
-
-		const char *position = strstr(cstr, needle); //if it lost the first part, I refuse to talk with it
-
-		if (position) {
-			Common::String result = "";
-			char c;
-			for (const char *i = position + needleLength; c = *i, c != 0; ++i) {
-				if (c == '\n' || c == '\r')
-					break;
-				result += c;
+	Common::HashMap<Common::String, Common::String> headers = stream->responseHeadersMap();
+	if (headers.contains("range")) {
+		Common::String range = headers["range"];
+		for (int rangeTry = 0; rangeTry < 2; ++rangeTry) {
+			const char *needle = (rangeTry == 0 ? "0-" : "bytes=0-"); //if it lost the first part, I refuse to talk with it
+			uint32 needleLength = (rangeTry == 0 ? 2 : 8);
+
+			if (range.hasPrefix(needle)) {
+				range.erase(0, needleLength);
+				_serverReceivedBytes = range.asUint64() + 1;
+				uploadNextPart();
+				return true;
 			}
-			_serverReceivedBytes = result.asUint64() + 1;
-			uploadNextPart();
-			return true;
 		}
 	}
 
diff --git a/backends/networking/curl/curlrequest.cpp b/backends/networking/curl/curlrequest.cpp
index a9de30c..cb117b7 100644
--- a/backends/networking/curl/curlrequest.cpp
+++ b/backends/networking/curl/curlrequest.cpp
@@ -71,20 +71,9 @@ void CurlRequest::restart() {
 
 Common::String CurlRequest::date() const {
 	if (_stream) {
-		Common::String headers = _stream->responseHeaders();
-		const char *cstr = headers.c_str();
-		const char *position = strstr(cstr, "Date: ");
-
-		if (position) {
-			Common::String result = "";
-			char c;
-			for (const char *i = position + 6; c = *i, c != 0; ++i) {
-				if (c == '\n' || c == '\r')
-					break;
-				result += c;
-			}
-			return result;
-		}
+		Common::HashMap<Common::String, Common::String> headers = _stream->responseHeadersMap();
+		if (headers.contains("date"))
+			return headers["date"];
 	}
 	return "";
 }
diff --git a/backends/networking/curl/networkreadstream.cpp b/backends/networking/curl/networkreadstream.cpp
index ac8800b..dee4885 100644
--- a/backends/networking/curl/networkreadstream.cpp
+++ b/backends/networking/curl/networkreadstream.cpp
@@ -240,6 +240,78 @@ Common::String NetworkReadStream::responseHeaders() const {
 	return _responseHeaders;
 }
 
+Common::HashMap<Common::String, Common::String> NetworkReadStream::responseHeadersMap() const {
+	// HTTP headers are described at RFC 2616: https://tools.ietf.org/html/rfc2616#section-4.2
+	// this implementation tries to follow it, but for simplicity it does not support multi-line header values
+
+	Common::HashMap<Common::String, Common::String> headers;
+	Common::String headerName, headerValue, trailingWhitespace;
+	char c;
+	bool readingName = true;
+
+	for (uint i = 0; i < _responseHeaders.size(); ++i) {
+		c = _responseHeaders[i];
+
+		if (readingName) {
+			if (c == ' ' || c == '\r' || c == '\n' || c == '\t') {
+				// header names should not contain any whitespace, this is invalid
+				// ignore what's been before
+				headerName = "";
+				continue;
+			}
+			if (c == ':') {
+				if (!headerName.empty()) {
+					readingName = false;
+				}
+				continue;
+			}
+			headerName += c;
+			continue;
+		}
+
+		// reading value:
+		if (c == ' ' || c == '\t') {
+			if (headerValue.empty()) {
+				// skip leading whitespace
+				continue;
+			} else {
+				// accumulate trailing whitespace
+				trailingWhitespace += c;
+				continue;
+			}
+		}
+
+		if (c == '\r' || c == '\n') {
+			// not sure if RFC allows empty values, we'll ignore such
+			if (!headerName.empty() && !headerValue.empty()) {
+				// add header value
+				// RFC allows header with the same name to be sent multiple times
+				// and requires it to be equivalent of just listing all header values separated with comma
+				// so if header already was met, we'll add new value to the old one
+				headerName.toLowercase();
+				if (headers.contains(headerName)) {
+					headers[headerName] += "," + headerValue;
+				} else {
+					headers[headerName] = headerValue;
+				}
+			}
+
+			headerName = "";
+			headerValue = "";
+			trailingWhitespace = "";
+			readingName = true;
+			continue;
+		}
+
+		// if we meet non-whitespace character, turns out those "trailing" whitespace characters were not so trailing
+		headerValue += trailingWhitespace;
+		trailingWhitespace = "";
+		headerValue += c;
+	}
+
+	return headers;
+}
+
 uint32 NetworkReadStream::fillWithSendingContents(char *bufferToFill, uint32 maxSize) {
 	uint32 sendSize = _sendingContentsSize - _sendingContentsPos;
 	if (sendSize > maxSize)
diff --git a/backends/networking/curl/networkreadstream.h b/backends/networking/curl/networkreadstream.h
index b83ab27..7d19286 100644
--- a/backends/networking/curl/networkreadstream.h
+++ b/backends/networking/curl/networkreadstream.h
@@ -136,6 +136,14 @@ public:
 	*/
 	Common::String responseHeaders() const;
 
+	/**
+	* Return response headers as HashMap. All header names in
+	* it are lowercase.
+	*
+	* @note This method should be called when eos() == true.
+	*/
+	Common::HashMap<Common::String, Common::String> responseHeadersMap() const;
+
 	/** Returns a number in range [0, 1], where 1 is "complete". */
 	double getProgress() const;
 


Commit: 5b5a89e3e7b880907f99675a68c5e0a8e2460470
    https://github.com/scummvm/scummvm/commit/5b5a89e3e7b880907f99675a68c5e0a8e2460470
Author: Alexander Tkachev (alexander at tkachov.ru)
Date: 2019-08-25T12:15:14+03:00

Commit Message:
CLOUD: Make Network::ErrorResponse messages more verbose

This commit updates all usages of Network::ErrorResponse to specify at
least method name if not precise reason why operation failed.

Changed paths:
    backends/cloud/box/boxlistdirectorybyidrequest.cpp
    backends/cloud/box/boxtokenrefresher.cpp
    backends/cloud/downloadrequest.cpp
    backends/cloud/dropbox/dropboxcreatedirectoryrequest.cpp
    backends/cloud/dropbox/dropboxinforequest.cpp
    backends/cloud/dropbox/dropboxlistdirectoryrequest.cpp
    backends/cloud/dropbox/dropboxuploadrequest.cpp
    backends/cloud/googledrive/googledrivelistdirectorybyidrequest.cpp
    backends/cloud/googledrive/googledrivetokenrefresher.cpp
    backends/cloud/googledrive/googledriveuploadrequest.cpp
    backends/cloud/onedrive/onedrivecreatedirectoryrequest.cpp
    backends/cloud/onedrive/onedrivelistdirectoryrequest.cpp
    backends/cloud/onedrive/onedrivetokenrefresher.cpp
    backends/cloud/onedrive/onedriveuploadrequest.cpp
    backends/cloud/savessyncrequest.cpp
    backends/networking/curl/curlrequest.cpp
    backends/networking/curl/request.cpp
    backends/networking/curl/request.h


diff --git a/backends/cloud/box/boxlistdirectorybyidrequest.cpp b/backends/cloud/box/boxlistdirectorybyidrequest.cpp
index 0258e3e..c51c0f5 100644
--- a/backends/cloud/box/boxlistdirectorybyidrequest.cpp
+++ b/backends/cloud/box/boxlistdirectorybyidrequest.cpp
@@ -83,7 +83,7 @@ void BoxListDirectoryByIdRequest::responseCallback(Networking::JsonResponse resp
 	if (response.request)
 		_date = response.request->date();
 
-	Networking::ErrorResponse error(this);
+	Networking::ErrorResponse error(this, "BoxListDirectoryByIdRequest::responseCallback: unknown error");
 	Networking::CurlJsonRequest *rq = (Networking::CurlJsonRequest *)response.request;
 	if (rq && rq->getNetworkReadStream())
 		error.httpResponseCode = rq->getNetworkReadStream()->httpResponseCode();
diff --git a/backends/cloud/box/boxtokenrefresher.cpp b/backends/cloud/box/boxtokenrefresher.cpp
index 19cdd92..db52672 100644
--- a/backends/cloud/box/boxtokenrefresher.cpp
+++ b/backends/cloud/box/boxtokenrefresher.cpp
@@ -41,7 +41,7 @@ void BoxTokenRefresher::tokenRefreshed(Storage::BoolResponse response) {
 	if (!response.value) {
 		//failed to refresh token, notify user with NULL in original callback
 		warning("BoxTokenRefresher: failed to refresh token");
-		finishError(Networking::ErrorResponse(this, false, true, "", -1));
+		finishError(Networking::ErrorResponse(this, false, true, "BoxTokenRefresher::tokenRefreshed: failed to refresh token", -1));
 		return;
 	}
 
diff --git a/backends/cloud/downloadrequest.cpp b/backends/cloud/downloadrequest.cpp
index c07a23b..994a9b3 100644
--- a/backends/cloud/downloadrequest.cpp
+++ b/backends/cloud/downloadrequest.cpp
@@ -73,13 +73,13 @@ void DownloadRequest::streamErrorCallback(Networking::ErrorResponse error) {
 void DownloadRequest::handle() {
 	if (!_localFile) {
 		warning("DownloadRequest: no file to write");
-		finishError(Networking::ErrorResponse(this, false, true, "", -1));
+		finishError(Networking::ErrorResponse(this, false, true, "DownloadRequest::handle: no file to write into", -1));
 		return;
 	}
 
 	if (!_localFile->isOpen()) {
 		warning("DownloadRequest: failed to open file to write");
-		finishError(Networking::ErrorResponse(this, false, true, "", -1));
+		finishError(Networking::ErrorResponse(this, false, true, "DownloadRequest::handle: failed to open file to write", -1));
 		return;
 	}
 
@@ -93,7 +93,7 @@ void DownloadRequest::handle() {
 	if (readBytes != 0)
 		if (_localFile->write(_buffer, readBytes) != readBytes) {
 			warning("DownloadRequest: unable to write all received bytes into output file");
-			finishError(Networking::ErrorResponse(this, false, true, "", -1));
+			finishError(Networking::ErrorResponse(this, false, true, "DownloadRequest::handle: failed to write all bytes into a file", -1));
 			return;
 		}
 
@@ -113,7 +113,7 @@ void DownloadRequest::handle() {
 
 void DownloadRequest::restart() {
 	warning("DownloadRequest: can't restart as there are no means to reopen DumpFile");
-	finishError(Networking::ErrorResponse(this, false, true, "", -1));
+	finishError(Networking::ErrorResponse(this, false, true, "DownloadRequest::restart: can't restart as there are no means to reopen DumpFile", -1));
 	//start();
 }
 
diff --git a/backends/cloud/dropbox/dropboxcreatedirectoryrequest.cpp b/backends/cloud/dropbox/dropboxcreatedirectoryrequest.cpp
index d6937d9..e410f0a 100644
--- a/backends/cloud/dropbox/dropboxcreatedirectoryrequest.cpp
+++ b/backends/cloud/dropbox/dropboxcreatedirectoryrequest.cpp
@@ -74,7 +74,7 @@ void DropboxCreateDirectoryRequest::responseCallback(Networking::JsonResponse re
 	}
 	if (response.request) _date = response.request->date();
 
-	Networking::ErrorResponse error(this);
+	Networking::ErrorResponse error(this, "DropboxCreateDirectoryRequest::responseCallback: unknown error");
 	Networking::CurlJsonRequest *rq = (Networking::CurlJsonRequest *)response.request;
 	if (rq && rq->getNetworkReadStream())
 		error.httpResponseCode = rq->getNetworkReadStream()->httpResponseCode();
diff --git a/backends/cloud/dropbox/dropboxinforequest.cpp b/backends/cloud/dropbox/dropboxinforequest.cpp
index ebf2d12..08f5ca5 100644
--- a/backends/cloud/dropbox/dropboxinforequest.cpp
+++ b/backends/cloud/dropbox/dropboxinforequest.cpp
@@ -71,7 +71,7 @@ void DropboxInfoRequest::userResponseCallback(Networking::JsonResponse response)
 		return;
 	}
 
-	Networking::ErrorResponse error(this);
+	Networking::ErrorResponse error(this, "DropboxInfoRequest::userResponseCallback: unknown error");
 	Networking::CurlJsonRequest *rq = (Networking::CurlJsonRequest *)response.request;
 	if (rq && rq->getNetworkReadStream())
 		error.httpResponseCode = rq->getNetworkReadStream()->httpResponseCode();
@@ -125,7 +125,7 @@ void DropboxInfoRequest::quotaResponseCallback(Networking::JsonResponse response
 		return;
 	}
 
-	Networking::ErrorResponse error(this);
+	Networking::ErrorResponse error(this, "DropboxInfoRequest::quotaResponseCallback: unknown error");
 	Networking::CurlJsonRequest *rq = (Networking::CurlJsonRequest *)response.request;
 	if (rq && rq->getNetworkReadStream())
 		error.httpResponseCode = rq->getNetworkReadStream()->httpResponseCode();
diff --git a/backends/cloud/dropbox/dropboxlistdirectoryrequest.cpp b/backends/cloud/dropbox/dropboxlistdirectoryrequest.cpp
index 0b90ec6..84a1918 100644
--- a/backends/cloud/dropbox/dropboxlistdirectoryrequest.cpp
+++ b/backends/cloud/dropbox/dropboxlistdirectoryrequest.cpp
@@ -84,7 +84,7 @@ void DropboxListDirectoryRequest::responseCallback(Networking::JsonResponse resp
 	if (response.request)
 		_date = response.request->date();
 
-	Networking::ErrorResponse error(this);
+	Networking::ErrorResponse error(this, "DropboxListDirectoryRequest::responseCallback: unknown error");
 	Networking::CurlJsonRequest *rq = (Networking::CurlJsonRequest *)response.request;
 	if (rq && rq->getNetworkReadStream())
 		error.httpResponseCode = rq->getNetworkReadStream()->httpResponseCode();
diff --git a/backends/cloud/dropbox/dropboxuploadrequest.cpp b/backends/cloud/dropbox/dropboxuploadrequest.cpp
index 361d8ac..7330bae 100644
--- a/backends/cloud/dropbox/dropboxuploadrequest.cpp
+++ b/backends/cloud/dropbox/dropboxuploadrequest.cpp
@@ -54,12 +54,12 @@ void DropboxUploadRequest::start() {
 		_workingRequest->finish();
 	if (!_contentsStream) {
 		warning("DropboxUploadRequest: cannot start because stream is invalid");
-		finishError(Networking::ErrorResponse(this, false, true, "", -1));
+		finishError(Networking::ErrorResponse(this, false, true, "DropboxUploadRequest::start: cannot start because stream is invalid", -1));
 		return;
 	}
 	if (!_contentsStream->seek(0)) {
 		warning("DropboxUploadRequest: cannot restart because stream couldn't seek(0)");
-		finishError(Networking::ErrorResponse(this, false, true, "", -1));
+		finishError(Networking::ErrorResponse(this, false, true, "DropboxUploadRequest::start: cannot restart because stream couldn't seek(0)", -1));
 		return;
 	}
 	_ignoreCallback = false;
diff --git a/backends/cloud/googledrive/googledrivelistdirectorybyidrequest.cpp b/backends/cloud/googledrive/googledrivelistdirectorybyidrequest.cpp
index 24db75b..caa6486 100644
--- a/backends/cloud/googledrive/googledrivelistdirectorybyidrequest.cpp
+++ b/backends/cloud/googledrive/googledrivelistdirectorybyidrequest.cpp
@@ -81,7 +81,7 @@ void GoogleDriveListDirectoryByIdRequest::responseCallback(Networking::JsonRespo
 	if (response.request)
 		_date = response.request->date();
 
-	Networking::ErrorResponse error(this);
+	Networking::ErrorResponse error(this, "GoogleDriveListDirectoryByIdRequest::responseCallback");
 	Networking::CurlJsonRequest *rq = (Networking::CurlJsonRequest *)response.request;
 	if (rq && rq->getNetworkReadStream())
 		error.httpResponseCode = rq->getNetworkReadStream()->httpResponseCode();
diff --git a/backends/cloud/googledrive/googledrivetokenrefresher.cpp b/backends/cloud/googledrive/googledrivetokenrefresher.cpp
index f28f73a..c6c7ab6 100644
--- a/backends/cloud/googledrive/googledrivetokenrefresher.cpp
+++ b/backends/cloud/googledrive/googledrivetokenrefresher.cpp
@@ -41,7 +41,7 @@ void GoogleDriveTokenRefresher::tokenRefreshed(Storage::BoolResponse response) {
 	if (!response.value) {
 		//failed to refresh token, notify user with NULL in original callback
 		warning("GoogleDriveTokenRefresher: failed to refresh token");
-		finishError(Networking::ErrorResponse(this, false, true, "", -1));
+		finishError(Networking::ErrorResponse(this, false, true, "GoogleDriveTokenRefresher::tokenRefreshed: failed to refresh token", -1));
 		return;
 	}
 
diff --git a/backends/cloud/googledrive/googledriveuploadrequest.cpp b/backends/cloud/googledrive/googledriveuploadrequest.cpp
index c4728c5..1a533e1 100644
--- a/backends/cloud/googledrive/googledriveuploadrequest.cpp
+++ b/backends/cloud/googledrive/googledriveuploadrequest.cpp
@@ -55,7 +55,7 @@ void GoogleDriveUploadRequest::start() {
 		_workingRequest->finish();
 	if (_contentsStream == nullptr || !_contentsStream->seek(0)) {
 		warning("GoogleDriveUploadRequest: cannot restart because stream couldn't seek(0)");
-		finishError(Networking::ErrorResponse(this, false, true, "", -1));
+		finishError(Networking::ErrorResponse(this, false, true, "GoogleDriveUploadRequest::start: couldn't restart because failed to seek(0)", -1));
 		return;
 	}
 	_resolvedId = ""; //used to update file contents
@@ -146,7 +146,7 @@ void GoogleDriveUploadRequest::startUploadCallback(Networking::JsonResponse resp
 	if (_ignoreCallback)
 		return;
 
-	Networking::ErrorResponse error(this, false, true, "", -1);
+	Networking::ErrorResponse error(this, false, true, "GoogleDriveUploadRequest::startUploadCallback", -1);
 	Networking::CurlJsonRequest *rq = (Networking::CurlJsonRequest *)response.request;
 	if (rq) {
 		const Networking::NetworkReadStream *stream = rq->getNetworkReadStream();
@@ -158,11 +158,19 @@ void GoogleDriveUploadRequest::startUploadCallback(Networking::JsonResponse resp
 					_uploadUrl = headers["location"];
 					uploadNextPart();
 					return;
+				} else {
+					error.response += ": response must provide Location header, but it's not there";
 				}
+			} else {
+				error.response += ": response is not 200 OK";
 			}
 
 			error.httpResponseCode = code;
+		} else {
+			error.response += ": missing response stream [improbable]";
 		}
+	} else {
+		error.response += ": missing request object [improbable]";
 	}
 
 	Common::JSONValue *json = response.value;
@@ -192,7 +200,7 @@ void GoogleDriveUploadRequest::uploadNextPart() {
 	if (oldPos != _serverReceivedBytes) {
 		if (!_contentsStream->seek(_serverReceivedBytes)) {
 			warning("GoogleDriveUploadRequest: cannot upload because stream couldn't seek(%lu)", _serverReceivedBytes);
-			finishError(Networking::ErrorResponse(this, false, true, "", -1));
+			finishError(Networking::ErrorResponse(this, false, true, "GoogleDriveUploadRequest::uploadNextPart: seek() didn't work", -1));
 			return;
 		}
 		oldPos = _serverReceivedBytes;
diff --git a/backends/cloud/onedrive/onedrivecreatedirectoryrequest.cpp b/backends/cloud/onedrive/onedrivecreatedirectoryrequest.cpp
index f7e995f..e38d278 100644
--- a/backends/cloud/onedrive/onedrivecreatedirectoryrequest.cpp
+++ b/backends/cloud/onedrive/onedrivecreatedirectoryrequest.cpp
@@ -96,7 +96,7 @@ void OneDriveCreateDirectoryRequest::responseCallback(Networking::JsonResponse r
 	if (response.request)
 		_date = response.request->date();
 
-	Networking::ErrorResponse error(this);
+	Networking::ErrorResponse error(this, "OneDriveCreateDirectoryRequest::responseCallback: unknown error");
 	Networking::CurlJsonRequest *rq = (Networking::CurlJsonRequest *)response.request;
 	if (rq && rq->getNetworkReadStream())
 		error.httpResponseCode = rq->getNetworkReadStream()->httpResponseCode();
diff --git a/backends/cloud/onedrive/onedrivelistdirectoryrequest.cpp b/backends/cloud/onedrive/onedrivelistdirectoryrequest.cpp
index f160976..0bf57a6 100644
--- a/backends/cloud/onedrive/onedrivelistdirectoryrequest.cpp
+++ b/backends/cloud/onedrive/onedrivelistdirectoryrequest.cpp
@@ -102,7 +102,7 @@ void OneDriveListDirectoryRequest::listedDirectoryCallback(Networking::JsonRespo
 	if (response.request)
 		_date = response.request->date();
 
-	Networking::ErrorResponse error(this);
+	Networking::ErrorResponse error(this, "OneDriveListDirectoryRequest::listedDirectoryCallback: unknown error");
 	Networking::CurlJsonRequest *rq = (Networking::CurlJsonRequest *)response.request;
 	if (rq && rq->getNetworkReadStream())
 		error.httpResponseCode = rq->getNetworkReadStream()->httpResponseCode();
diff --git a/backends/cloud/onedrive/onedrivetokenrefresher.cpp b/backends/cloud/onedrive/onedrivetokenrefresher.cpp
index 10992c5..b456732 100644
--- a/backends/cloud/onedrive/onedrivetokenrefresher.cpp
+++ b/backends/cloud/onedrive/onedrivetokenrefresher.cpp
@@ -41,7 +41,7 @@ void OneDriveTokenRefresher::tokenRefreshed(Storage::BoolResponse response) {
 	if (!response.value) {
 		//failed to refresh token, notify user with NULL in original callback
 		warning("OneDriveTokenRefresher: failed to refresh token");
-		finishError(Networking::ErrorResponse(this, false, true, "", -1));
+		finishError(Networking::ErrorResponse(this, false, true, "OneDriveTokenRefresher::tokenRefreshed: failed to refresh token", -1));
 		return;
 	}
 
diff --git a/backends/cloud/onedrive/onedriveuploadrequest.cpp b/backends/cloud/onedrive/onedriveuploadrequest.cpp
index 85e0525..5e7011a 100644
--- a/backends/cloud/onedrive/onedriveuploadrequest.cpp
+++ b/backends/cloud/onedrive/onedriveuploadrequest.cpp
@@ -56,12 +56,12 @@ void OneDriveUploadRequest::start() {
 		_workingRequest->finish();
 	if (_contentsStream == nullptr) {
 		warning("OneDriveUploadRequest: cannot restart because no stream given");
-		finishError(Networking::ErrorResponse(this, false, true, "No stream given", -1));
+		finishError(Networking::ErrorResponse(this, false, true, "OneDriveUploadRequest::start: can't restart, because no stream given", -1));
 		return;
 	}
 	if (!_contentsStream->seek(0)) {
 		warning("OneDriveUploadRequest: cannot restart because stream couldn't seek(0)");
-		finishError(Networking::ErrorResponse(this, false, true, "", -1));
+		finishError(Networking::ErrorResponse(this, false, true, "OneDriveUploadRequest::start: can't restart, because seek(0) didn't work", -1));
 		return;
 	}
 	_ignoreCallback = false;
diff --git a/backends/cloud/savessyncrequest.cpp b/backends/cloud/savessyncrequest.cpp
index b952d07..6e0efc5 100644
--- a/backends/cloud/savessyncrequest.cpp
+++ b/backends/cloud/savessyncrequest.cpp
@@ -72,7 +72,7 @@ void SavesSyncRequest::start() {
 		new Common::Callback<SavesSyncRequest, Storage::ListDirectoryResponse>(this, &SavesSyncRequest::directoryListedCallback),
 		new Common::Callback<SavesSyncRequest, Networking::ErrorResponse>(this, &SavesSyncRequest::directoryListedErrorCallback)
 	);
-	if (!_workingRequest) finishError(Networking::ErrorResponse(this));
+	if (!_workingRequest) finishError(Networking::ErrorResponse(this, "SavesSyncRequest::start: Storage couldn't create Request to list directory"));
 }
 
 void SavesSyncRequest::directoryListedCallback(Storage::ListDirectoryResponse response) {
@@ -235,7 +235,7 @@ void SavesSyncRequest::directoryListedErrorCallback(Networking::ErrorResponse er
 		new Common::Callback<SavesSyncRequest, Networking::ErrorResponse>(this, &SavesSyncRequest::directoryCreatedErrorCallback)
 	);
 	if (!_workingRequest)
-		finishError(Networking::ErrorResponse(this));
+		finishError(Networking::ErrorResponse(this, "SavesSyncRequest::directoryListedErrorCallback: Storage couldn't create Request to create remote directory"));
 }
 
 void SavesSyncRequest::directoryCreatedCallback(Storage::BoolResponse response) {
@@ -245,7 +245,7 @@ void SavesSyncRequest::directoryCreatedCallback(Storage::BoolResponse response)
 
 	//stop syncing if failed to create saves directory
 	if (!response.value) {
-		finishError(Networking::ErrorResponse(this, false, true, "", -1));
+		finishError(Networking::ErrorResponse(this, false, true, "SavesSyncRequest::directoryCreatedCallback: failed to create remote directory", -1));
 		return;
 	}
 
@@ -284,7 +284,7 @@ void SavesSyncRequest::downloadNextFile() {
 		new Common::Callback<SavesSyncRequest, Networking::ErrorResponse>(this, &SavesSyncRequest::fileDownloadedErrorCallback)
 	);
 	if (!_workingRequest)
-		finishError(Networking::ErrorResponse(this));
+		finishError(Networking::ErrorResponse(this, "SavesSyncRequest::downloadNextFile: Storage couldn't create Request to download a file"));
 }
 
 void SavesSyncRequest::fileDownloadedCallback(Storage::BoolResponse response) {
@@ -296,7 +296,7 @@ void SavesSyncRequest::fileDownloadedCallback(Storage::BoolResponse response) {
 	if (!response.value) {
 		//delete the incomplete file
 		g_system->getSavefileManager()->removeSavefile(_currentDownloadingFile.name());
-		finishError(Networking::ErrorResponse(this, false, true, "", -1));
+		finishError(Networking::ErrorResponse(this, false, true, "SavesSyncRequest::fileDownloadedCallback: failed to download a file", -1));
 		return;
 	}
 
@@ -343,7 +343,7 @@ void SavesSyncRequest::uploadNextFile() {
 			new Common::Callback<SavesSyncRequest, Networking::ErrorResponse>(this, &SavesSyncRequest::fileUploadedErrorCallback)
 		);
 	}
-	if (!_workingRequest) finishError(Networking::ErrorResponse(this));
+	if (!_workingRequest) finishError(Networking::ErrorResponse(this, "SavesSyncRequest::uploadNextFile: Storage couldn't create Request to upload a file"));
 }
 
 void SavesSyncRequest::fileUploadedCallback(Storage::UploadResponse response) {
diff --git a/backends/networking/curl/curlrequest.cpp b/backends/networking/curl/curlrequest.cpp
index cb117b7..f7d169c 100644
--- a/backends/networking/curl/curlrequest.cpp
+++ b/backends/networking/curl/curlrequest.cpp
@@ -53,7 +53,7 @@ void CurlRequest::handle() {
 	if (_stream && _stream->eos()) {
 		if (_stream->httpResponseCode() != 200) {
 			warning("CurlRequest: HTTP response code is not 200 OK (it's %ld)", _stream->httpResponseCode());
-			ErrorResponse error(this, false, true, "", _stream->httpResponseCode());
+			ErrorResponse error(this, false, true, "HTTP response code is not 200 OK", _stream->httpResponseCode());
 			finishError(error);
 			return;
 		}
diff --git a/backends/networking/curl/request.cpp b/backends/networking/curl/request.cpp
index 398af04..b8393f7 100644
--- a/backends/networking/curl/request.cpp
+++ b/backends/networking/curl/request.cpp
@@ -24,8 +24,8 @@
 
 namespace Networking {
 
-ErrorResponse::ErrorResponse(Request *rq):
-	request(rq), interrupted(false), failed(true), response(""), httpResponseCode(-1) {}
+ErrorResponse::ErrorResponse(Request *rq, Common::String resp):
+	request(rq), interrupted(false), failed(true), response(resp), httpResponseCode(-1) {}
 
 ErrorResponse::ErrorResponse(Request *rq, bool interrupt, bool failure, Common::String resp, long httpCode):
 	request(rq), interrupted(interrupt), failed(failure), response(resp), httpResponseCode(httpCode) {}
@@ -50,7 +50,7 @@ void Request::handleRetry() {
 void Request::pause() { _state = PAUSED; }
 
 void Request::finish() {
-	ErrorResponse error(this, true, false, "", -1);
+	ErrorResponse error(this, true, false, "Request::finish() was called (i.e. interrupted)", -1);
 	finishError(error);
 }
 
diff --git a/backends/networking/curl/request.h b/backends/networking/curl/request.h
index b1261f2..e23b677 100644
--- a/backends/networking/curl/request.h
+++ b/backends/networking/curl/request.h
@@ -78,7 +78,7 @@ struct ErrorResponse {
 	Common::String response;
 	long httpResponseCode;
 
-	ErrorResponse(Request *rq);
+	ErrorResponse(Request *rq, Common::String resp);
 	ErrorResponse(Request *rq, bool interrupt, bool failure, Common::String resp, long httpCode);
 };
 





More information about the Scummvm-git-logs mailing list