From 0c4def83f8d51749a75d69cfc1229b3ec50d6989 Mon Sep 17 00:00:00 2001 From: abraunegg Date: Sat, 5 May 2018 17:00:50 +1000 Subject: [PATCH] Resolve 500 & 504 HTTP Status Codes * When completing some operations on OneDrive, a 504 error can be returned when Microsoft Graph times out when communicating with internal resources. Rather than failing, handle the 504 and retry the request. * When performing numerous changes via OneDrive online, Microsoft Graph has an issue in interpreting the the response, thus generates a 500 internal server error. As this is something we cannot fix, handle the 500 error by gracefully exiting. --- src/sync.d | 43 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 39 insertions(+), 4 deletions(-) diff --git a/src/sync.d b/src/sync.d index d5260a16..2d8ced3c 100644 --- a/src/sync.d +++ b/src/sync.d @@ -327,9 +327,24 @@ final class SyncEngine log.vlog("Delta link expired, resyncing..."); deltaLink = null; continue; - } else { - throw e; } + + if (e.httpStatusCode == 500) { + // HTTP request returned status code 500 (Internal Server Error) + // Exit Application + log.vlog("\n\nOneDrive returned a 'HTTP 500 - Internal Server Error'"); + log.vlog("This is a OneDrive API Bug - https://github.com/OneDrive/onedrive-api-docs/issues/844\n\n"); + return; + } + + if (e.httpStatusCode == 504) { + // HTTP request returned status code 504 (Gateway Timeout) + // Retry + log.vlog("OneDrive returned a 'HTTP 504 - Gateway Timeout' - gracefully handling error"); + changes = onedrive.viewChangesById(driveId, defaultRootId, deltaLink); + } + + else throw e; } foreach (item; changes["value"].array) { bool isRoot = false; @@ -751,7 +766,17 @@ final class SyncEngine write("Uploading file ", path, "..."); JSONValue response; if (getSize(path) <= thresholdFileSize) { - response = onedrive.simpleUploadReplace(path, item.driveId, item.id, item.eTag); + try { + response = onedrive.simpleUploadReplace(path, item.driveId, item.id, item.eTag); + } catch (OneDriveException e) { + if (e.httpStatusCode == 504) { + // HTTP request returned status code 504 (Gateway Timeout) + // Try upload as a session + log.vlog("OneDrive returned a 'HTTP 504 - Gateway Timeout' - gracefully handling error"); + response = session.upload(path, item.driveId, item.parentId, baseName(path), eTag); + } + else throw e; + } writeln(" done."); } else { writeln(""); @@ -943,7 +968,17 @@ final class SyncEngine write("Uploading file ", path, "..."); JSONValue response; if (getSize(path) <= thresholdFileSize) { - response = onedrive.simpleUpload(path, parent.driveId, parent.id, baseName(path)); + try { + response = onedrive.simpleUpload(path, parent.driveId, parent.id, baseName(path)); + } catch (OneDriveException e) { + if (e.httpStatusCode == 504) { + // HTTP request returned status code 504 (Gateway Timeout) + // Try upload as a session + log.vlog("OneDrive returned a 'HTTP 504 - Gateway Timeout' - gracefully handling error"); + response = session.upload(path, parent.driveId, parent.id, baseName(path)); + } + else throw e; + } writeln(" done."); } else { writeln("");