Browse Source

UPD: MacCloud/DropBox step-9: improve token related exception handling mechanism

rich2014 5 months ago
parent
commit
c3af2a6e20
1 changed files with 45 additions and 23 deletions
  1. 45 23
      plugins/wfx/MacCloud/src/dropbox/udropboxclient.pas

+ 45 - 23
plugins/wfx/MacCloud/src/dropbox/udropboxclient.pas

@@ -29,6 +29,7 @@ type
   { EDropBoxException }
 
   EDropBoxException = class( Exception );
+  EDropBoxTokenException = class( EDropBoxException );
   EDropBoxConflictException = class( EDropBoxException );
   EDropBoxPermissionException = class( EDropBoxException );
   EDropBoxRateLimitException = class( EDropBoxException );
@@ -79,9 +80,10 @@ type
     function isValidAccessToken: Boolean;
     function isValidFreshToken: Boolean;
   public
+    procedure setExpiration( const seconds: Integer );
+    procedure invalid;
     property access: String read _access write _access;
     property refresh: String read _refresh write _refresh;
-    procedure setExpiration( const seconds: Integer );
   end;
 
   { TDropBoxAuthPKCESession }
@@ -286,9 +288,13 @@ var
   httpResult: TMiniHttpResult;
   httpError: NSError;
   httpErrorDescription: String;
+  dropBoxMessage: String;
 
   procedure processHttpError;
   begin
+    httpResult:= dropBoxResult.httpResult;
+    httpError:= httpResult.error;
+
     if Assigned(httpError) then begin
       httpErrorDescription:= httpError.localizedDescription.UTF8String;
       case httpError.code of
@@ -298,36 +304,37 @@ var
     end;
   end;
 
+  procedure processDropBox401Error;
+  begin
+    if dropBoxMessage.IndexOf('access_token') >= 0 then
+      raise EDropBoxTokenException.Create( dropBoxMessage );
+    raise EDropBoxException.Create( dropBoxMessage );
+  end;
+
   procedure processDropBox409Error;
   begin
-    if dropBoxResult.resultMessage.IndexOf('not_found') >= 0 then
-      raise EFileNotFoundException.Create( dropBoxResult.resultMessage );
-    if dropBoxResult.resultMessage.IndexOf('conflict') >= 0 then
-      raise EDropBoxConflictException.Create( dropBoxResult.resultMessage );
-    raise EDropBoxPermissionException.Create( dropBoxResult.resultMessage );
+    if dropBoxMessage.IndexOf('not_found') >= 0 then
+      raise EFileNotFoundException.Create( dropBoxMessage );
+    if dropBoxMessage.IndexOf('conflict') >= 0 then
+      raise EDropBoxConflictException.Create( dropBoxMessage );
+    raise EDropBoxPermissionException.Create( dropBoxMessage );
   end;
 
   procedure processDropBoxError;
   begin
+    dropBoxMessage:= dropBoxResult.resultMessage;
+
     if (httpResult.resultCode>=200) and (httpResult.resultCode<=299) then
       Exit;
     case httpResult.resultCode of
+      401: processDropBox401Error;
       409: processDropBox409Error;
-      403: raise EDropBoxPermissionException.Create( dropBoxResult.resultMessage );
-      429: raise EDropBoxRateLimitException.Create( dropBoxResult.resultMessage );
-      else raise EDropBoxException.Create( dropBoxResult.resultMessage );
+      403: raise EDropBoxPermissionException.Create( dropBoxMessage );
+      429: raise EDropBoxRateLimitException.Create( dropBoxMessage );
+      else raise EDropBoxException.Create( dropBoxMessage );
     end;
   end;
 
-  procedure processError;
-  begin
-    httpResult:= dropBoxResult.httpResult;
-    httpError:= httpResult.error;
-
-    processHttpError;
-    processDropBoxError;
-  end;
-
   procedure logException( const e: Exception );
   var
     message: String;
@@ -340,7 +347,8 @@ var
 
 begin
   try
-    processError;
+    processHttpError;
+    processDropBoxError;
   except
     on e: Exception do begin
       logException( e );
@@ -395,6 +403,12 @@ begin
   now.release;
 end;
 
+procedure TDropBoxToken.invalid;
+begin
+  _access:= EmptyStr;
+  _refresh:= EmptyStr;
+end;
+
 { TDropBoxAuthPKCESession }
 
 procedure TDropBoxAuthPKCESession.requestAuthorization;
@@ -549,10 +563,18 @@ end;
 
 function TDropBoxAuthPKCESession.getAccessToken: String;
 begin
-  if NOT _token.isValidAccessToken then begin
-    if _token.isValidFreshToken then begin
-      self.refreshToken;
-    end else begin
+  try
+    if NOT _token.isValidAccessToken then begin
+      if _token.isValidFreshToken then begin
+        self.refreshToken;
+      end else begin
+        self.authorize;
+      end;
+    end;
+  except
+    on e: EDropBoxTokenException do begin
+      TLogUtil.log( 6, 'Token Error: ' + e.ClassName + ': ' + e.Message );
+      _token.invalid;
       self.authorize;
     end;
   end;