-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy patherrors.go
More file actions
84 lines (69 loc) · 1.98 KB
/
Copy patherrors.go
File metadata and controls
84 lines (69 loc) · 1.98 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
package onedriveclient
import (
"encoding/json"
"errors"
"net/http"
"strings"
"github.com/koofr/go-httpclient"
)
const (
ErrorCodeItemNotFound = "itemNotFound"
ErrorCodeNameAlreadyExists = "nameAlreadyExists"
)
var ErrCompletedNoItem = errors.New("Async task completed but no item")
type OneDriveErrorDetails struct {
Code string `json:"code"`
Message string `json:"message"`
}
type OneDriveError struct {
Err OneDriveErrorDetails `json:"error"`
HttpClientError *httpclient.InvalidStatusError
}
func (e *OneDriveError) Error() string {
return e.Err.Message
}
func IsOneDriveError(err error) (oneDriveErr *OneDriveError, ok bool) {
if ode, ok := err.(*OneDriveError); ok {
return ode, true
} else {
return nil, false
}
}
func IsErrorResync(err error) bool {
if ode, ok := IsOneDriveError(err); ok {
return ode.Err.Code == "resyncRequired" ||
ode.Err.Code == "ResyncChangesApplyDifferences" ||
ode.Err.Code == "ResyncChangesUploadDifferences" ||
ode.Err.Code == "resyncChangesApplyDifferences" ||
ode.Err.Code == "resyncChangesUploadDifferences" ||
ode.Err.Code == "resyncApplyDifferences" ||
ode.Err.Code == "resyncUploadDifferences" ||
ode.Err.Code == ErrorCodeItemNotFound ||
ode.HttpClientError.Got == http.StatusGone
}
if strings.Contains(err.Error(), "Resync required") {
return true
}
return false
}
func HandleError(err error) error {
if ise, ok := httpclient.IsInvalidStatusError(err); ok {
oneDriveErr := &OneDriveError{}
if strings.HasPrefix(ise.Headers.Get("Content-Type"), "application/json") {
if jsonErr := json.Unmarshal([]byte(ise.Content), &oneDriveErr); jsonErr != nil {
oneDriveErr.Err.Code = "unknown"
oneDriveErr.Err.Message = ise.Content
}
} else {
oneDriveErr.Err.Code = "unknown"
oneDriveErr.Err.Message = ise.Content
}
if oneDriveErr.Err.Message == "" {
oneDriveErr.Err.Message = ise.Error()
}
oneDriveErr.HttpClientError = ise
return oneDriveErr
} else {
return err
}
}