From c3087f04c74ed5f377559f94aeafce6c5e24824c Mon Sep 17 00:00:00 2001
From: Mathieu Loiseau <loizbek@lezinter.net>
Date: Tue, 13 Mar 2018 11:16:42 +0100
Subject: [PATCH] error handling

---
 R/class.R | 77 +++++++++++++++++++++++++++++++++----------------------
 1 file changed, 46 insertions(+), 31 deletions(-)

diff --git a/R/class.R b/R/class.R
index 9cec4ff..bb76052 100644
--- a/R/class.R
+++ b/R/class.R
@@ -7,35 +7,43 @@ setClass("Mediawikir", representation(url = "character", user_name = "character"
 setGeneric("connect", function(.Object, pass){})
   #'Connects to mediawiki instance and gets token (to be called by constructor)
   setMethod("connect", "Mediawikir", function(.Object, pass){
-    #get login token
-    query <- httr::POST(.Object@url,
-                        body = list(action="query",
-                                    meta="tokens",
-                                    type="login",
-                                    lgname = .Object@user_name,
+    tryCatch(
+      { #get login token
+        query <- httr::POST(.Object@url,
+                            body = list(action="query",
+                                        meta="tokens",
+                                        type="login",
+                                        lgname = .Object@user_name,
+                                        format= "json"))
+        httr::stop_for_status(query)
+        #parse query response to retrieve token
+        response <- httr::content(query, "parsed", "application/json")
+        token <- response$query$tokens$logintoken
+        #login query
+        query <- httr::POST(.Object@url,
+                        body = list(action="clientlogin",
+                                    username = .Object@user_name,
+                                    password = pass,
+                                    logintoken = token,
+                                    loginreturnurl="http://wiki.lezinter.net",
                                     format= "json"))
-    httr::stop_for_status(query)
-    response <- httr::content(query, "parsed", "application/json")
-    print("query 1")#debug
-    token <- response$query$tokens$logintoken
-    print(token)#debug
-    query <- httr::POST(.Object@url,
-                    body = list(action="clientlogin",
-                                username = .Object@user_name,
-                                password = pass,
-                                logintoken = token,
-                                loginreturnurl="http://wiki.lezinter.net",
-                                format= "json"))
-    httr::stop_for_status(query)
-    response <- httr::content(query, "parsed", "application/json")
-    print("query 2")#debug
-    print(response)#debug
-    if(response$clientlogin$status=="PASS"){
-      return(token)
-    }
-    else{
-      return("0")
-    }
+        httr::stop_for_status(query)
+        #parse query response to make sure login worked
+        response <- httr::content(query, "parsed", "application/json")
+        if(response$clientlogin$status!="PASS"){
+          stop(paste(response$clientlogin,"\n"))
+        }
+        else{
+          return(token)
+        }
+      },
+      error = function(e)
+      {
+        print(paste("Could not login to", .Object@url, e$message))
+        token <- 0
+      }
+    )
+    return(token)
   })
 
 #'Creates a new Mediawikir object instance
@@ -46,8 +54,15 @@ setGeneric("connect", function(.Object, pass){})
 #'@examples
 #' new("Mediawikir", "http://wiki.example.com", "admin", "theadmin'spassword")
 setMethod("initialize", "Mediawikir", function (.Object, instance_url, user, pass){
-  .Object@url <- paste(instance_url,"/","api.php",sep="")
-  .Object@user_name <- user
-  .Object@auth_token=connect(.Object, pass)
+  tryCatch({
+      .Object@url <- paste(instance_url,"/","api.php",sep="")
+      .Object@user_name <- user
+      .Object@auth_token=connect(.Object, pass)
+    },
+    error = function(e){
+      print(e$message)
+      .Object <- FALSE
+    }
+  )
   return(.Object)
 })
-- 
GitLab