From bf6e5e9536a889a11d36e8ecd3e3f8a615ca263e Mon Sep 17 00:00:00 2001 From: YangSen-qn Date: Fri, 9 Oct 2020 19:14:06 +0800 Subject: [PATCH 01/19] change CF client error logic --- .../HttpClient/UrlProtocol/QNCFHttpClient.m | 221 +++++++++++++++++- 1 file changed, 220 insertions(+), 1 deletion(-) diff --git a/QiniuSDK/Http/Request/HttpClient/UrlProtocol/QNCFHttpClient.m b/QiniuSDK/Http/Request/HttpClient/UrlProtocol/QNCFHttpClient.m index ec92a78d..026eba70 100644 --- a/QiniuSDK/Http/Request/HttpClient/UrlProtocol/QNCFHttpClient.m +++ b/QiniuSDK/Http/Request/HttpClient/UrlProtocol/QNCFHttpClient.m @@ -9,6 +9,7 @@ #import "QNDefine.h" #import "QNCFHttpClient.h" #import "NSURLRequest+QNRequest.h" +#import @interface QNCFHttpClient() @@ -286,8 +287,8 @@ - (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode{ break; case NSStreamEventErrorOccurred:{ [self endProgress: YES]; + [self delegate_onError:[self translateCFNetworkErrorIntoUrlError:[self.inputStream streamError]]]; [self closeInputStream]; - [self delegate_onError:[self.inputStream streamError]]; } break; case NSStreamEventEndEncountered:{ @@ -361,6 +362,224 @@ - (void)timerAction{ } } +- (NSError *)translateCFNetworkErrorIntoUrlError:(NSError *)cfError{ + if (cfError == nil) { + return nil; + } + + NSInteger errorCode = NSURLErrorUnknown; + NSString *errorInfo = cfError.localizedDescription; + switch (cfError.code) { + case ENOENT: /* No such file or directory */ + errorCode = NSURLErrorCannotOpenFile; + break; + case EIO: /* Input/output error */ + break; + case E2BIG: /* Argument list too long */ + break; + case ENOEXEC: /* Exec format error */ + break; + case EBADF: /* Bad file descriptor */ + break; + case ECHILD: /* No child processes */ + break; + case EDEADLK: /* Resource deadlock avoided */ + break; + case ENOMEM: /* Cannot allocate memory */ + break; + case EACCES: /* Permission denied */ + break; + case EFAULT: /* Bad address */ + errorCode = NSURLErrorBadURL; + break; + case EBUSY: /* Device / Resource busy */ + break; + case EEXIST: /* File exists */ + break; + case ENODEV: /* Operation not supported by device */ + break; + case EISDIR: /* Is a directory */ + errorCode = NSURLErrorFileIsDirectory; + break; + case ENOTDIR: /* Not a directory */ + break; + case EINVAL: /* Invalid argument */ + break; + case ENFILE: /* Too many open files in system */ + break; + case EMFILE: /* Too many open files */ + break; + case EFBIG: /* File too large */ + break; + case ENOSPC: /* No space left on device */ + break; + case ESPIPE: /* Illegal seek */ + break; + case EMLINK: /* Too many links */ + break; + case EPIPE: /* Broken pipe */ + break; + case EDOM: /* Numerical argument out of domain */ + break; + case ERANGE: /* Result too large */ + break; + case EAGAIN: /* Resource temporarily unavailable */ + break; + case ENOTSOCK: /* Socket operation on non-socket */ + break; + case EDESTADDRREQ: /* Destination address required */ + errorCode = NSURLErrorBadURL; + break; + case EMSGSIZE: /* Message too long */ + break; + case EPROTOTYPE: /* Protocol wrong type for socket */ + break; + case ENOPROTOOPT: /* Protocol not available */ + break; + case EPROTONOSUPPORT: /* Protocol not supported */ + break; + case ENOTSUP: /* Operation not supported */ + break; + case EPFNOSUPPORT: /* Protocol family not supported */ + break; + case EAFNOSUPPORT: /* Address family not supported by protocol family */ + break; + case EADDRINUSE: /* Address already in use */ + break; + case EADDRNOTAVAIL: /* Can't assign requested address */ + break; + case ENETDOWN: /* Network is down */ + errorCode = NSURLErrorCannotConnectToHost; + break; + case ENETUNREACH: /* Network is unreachable */ + errorCode = NSURLErrorNetworkConnectionLost; + break; + case ENETRESET: /* Network dropped connection on reset */ + errorCode = NSURLErrorNetworkConnectionLost; + break; + case ECONNABORTED: /* Software caused connection abort */ + errorCode = NSURLErrorNetworkConnectionLost; + break; + case ECONNRESET: /* Connection reset by peer */ + errorCode = NSURLErrorNetworkConnectionLost; + break; + case ENOBUFS: /* No buffer space available */ + break; + case EISCONN: /* Socket is already connected */ + break; + case ENOTCONN: /* Socket is not connected */ + errorCode = NSURLErrorCannotConnectToHost; + break; + case ESHUTDOWN: /* Can't send after socket shutdown */ + break; + case ETOOMANYREFS: /* Too many references: can't splice */ + break; + case ETIMEDOUT: /* Operation timed out */ + errorCode = NSURLErrorTimedOut; + break; + case ECONNREFUSED: /* Connection refused */ + errorCode = NSURLErrorCannotConnectToHost; + break; + case ELOOP: /* Too many levels of symbolic links */ + break; + case ENAMETOOLONG: /* File name too long */ + break; + case EHOSTDOWN: /* Host is down */ + break; + case EHOSTUNREACH: /* No route to host */ + break; + case ENOTEMPTY: /* Directory not empty */ + break; + case EPROCLIM: /* Too many processes */ + break; + case EUSERS: /* Too many users */ + break; + case EDQUOT: /* Disc quota exceeded */ + break; + case ESTALE: /* Stale NFS file handle */ + break; + case EREMOTE: /* Too many levels of remote in path */ + break; + case EBADRPC: /* RPC struct is bad */ + break; + case ERPCMISMATCH: /* RPC version wrong */ + break; + case EPROGUNAVAIL: /* RPC prog. not avail */ + break; + case EPROGMISMATCH: /* Program version wrong */ + break; + case EPROCUNAVAIL: /* Bad procedure for program */ + break; + case ENOLCK: /* No locks available */ + break; + case ENOSYS: /* Function not implemented */ + break; + case EFTYPE: /* Inappropriate file type or format */ + break; + case EAUTH: /* Authentication error */ + break; + case ENEEDAUTH: /* Need authenticator */ + break; + case EPWROFF: /* Device power is off */ + break; + case EDEVERR: /* Device error, e.g. paper out */ + break; + case EOVERFLOW: /* Value too large to be stored in data type */ + break; + case EBADEXEC: /* Bad executable */ + break; + case EBADARCH: /* Bad CPU type in executable */ + break; + case ESHLIBVERS: /* Shared library version mismatch */ + break; + case EBADMACHO: /* Malformed Macho file */ + break; + case ECANCELED: /* Operation canceled */ + errorCode = NSURLErrorCancelled; + break; + case EIDRM: /* Identifier removed */ + break; + case ENOMSG: /* No message of desired type */ + break; + case EILSEQ: /* Illegal byte sequence */ + break; + case ENOATTR: /* Attribute not found */ + break; + case EBADMSG: /* Bad message */ + break; + case EMULTIHOP: /* Reserved */ + break; + case ENODATA: /* No message available on STREAM */ + break; + case ENOLINK: /* Reserved */ + break; + case ENOSR: /* No STREAM resources */ + break; + case ENOSTR: /* Not a STREAM */ + break; + case EPROTO: /* Protocol error */ + break; + case ETIME: /* STREAM ioctl timeout */ + errorCode = NSURLErrorTimedOut; + break; + case EOPNOTSUPP: /* Operation not supported on socket */ + break; + case ENOPOLICY: /* No such policy registered */ + break; + case ENOTRECOVERABLE: /* State not recoverable */ + break; + case EOWNERDEAD: /* Previous owner died */ + break; + case EQFULL: /* Interface output queue is full */ + break; + + default: + break; + } + + return [NSError errorWithDomain:NSURLErrorDomain code:errorCode userInfo:@{@"UserInfo" : errorInfo ?: @""}]; +} + //MARK: -- delegate action - (void)delegate_redirectedToRequest:(NSURLRequest *)request From bf8a49d578698590d295f87160fdb36678787d56 Mon Sep 17 00:00:00 2001 From: YangSen-qn Date: Sat, 10 Oct 2020 11:22:49 +0800 Subject: [PATCH 02/19] demo add cancel logic & change recover upload info logic --- .gitignore | 3 + QiniuDemo/QiniuDemo.xcodeproj/project.pbxproj | 14 +++++ .../QiniuDemo/Base.lproj/Main.storyboard | 4 +- QiniuDemo/QiniuDemo/ViewController.m | 61 ++++++++++++++++--- QiniuSDK/Storage/QNPartsUpload.m | 2 +- 5 files changed, 73 insertions(+), 11 deletions(-) diff --git a/.gitignore b/.gitignore index 80667581..d607a8db 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ +#Demo +DemoTestResource/ + # System .DS_Store diff --git a/QiniuDemo/QiniuDemo.xcodeproj/project.pbxproj b/QiniuDemo/QiniuDemo.xcodeproj/project.pbxproj index b588cb95..038c590e 100644 --- a/QiniuDemo/QiniuDemo.xcodeproj/project.pbxproj +++ b/QiniuDemo/QiniuDemo.xcodeproj/project.pbxproj @@ -9,6 +9,7 @@ /* Begin PBXBuildFile section */ 26F62ADDD5B6306E978C9A3F /* libPods-QiniuDemoTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 14CB2139715DD7B6FD5B146E /* libPods-QiniuDemoTests.a */; }; 2B848FF719DFA7ECB394CA9F /* libPods-QiniuDemo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 6B9BC5A8D93F988C1240E05F /* libPods-QiniuDemo.a */; }; + 318191AB2531516F00D18536 /* UploadResource.dmg in Resources */ = {isa = PBXBuildFile; fileRef = 318191AA2531516F00D18536 /* UploadResource.dmg */; }; 93D230241C86D7F700434F6D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D230231C86D7F700434F6D /* main.m */; }; 93D230271C86D7F700434F6D /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D230261C86D7F700434F6D /* AppDelegate.m */; }; 93D2302A1C86D7F700434F6D /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D230291C86D7F700434F6D /* ViewController.m */; }; @@ -39,6 +40,8 @@ /* Begin PBXFileReference section */ 14CB2139715DD7B6FD5B146E /* libPods-QiniuDemoTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-QiniuDemoTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 24EE530BBB100BED89B08A3D /* Pods-QiniuDemo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-QiniuDemo.release.xcconfig"; path = "Pods/Target Support Files/Pods-QiniuDemo/Pods-QiniuDemo.release.xcconfig"; sourceTree = ""; }; + 318191AA2531516F00D18536 /* UploadResource.dmg */ = {isa = PBXFileReference; lastKnownFileType = file; path = UploadResource.dmg; sourceTree = ""; }; + 318191AF25315F3500D18536 /* Configure.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Configure.h; sourceTree = ""; }; 6B9BC5A8D93F988C1240E05F /* libPods-QiniuDemo.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-QiniuDemo.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 93D2301F1C86D7F700434F6D /* QiniuDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = QiniuDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; 93D230231C86D7F700434F6D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; @@ -88,6 +91,15 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 318191A92531516F00D18536 /* DemoTestResource */ = { + isa = PBXGroup; + children = ( + 318191AF25315F3500D18536 /* Configure.h */, + 318191AA2531516F00D18536 /* UploadResource.dmg */, + ); + path = DemoTestResource; + sourceTree = ""; + }; 63D8EA8E5532E578D972E007 /* Pods */ = { isa = PBXGroup; children = ( @@ -133,6 +145,7 @@ 93D230211C86D7F700434F6D /* QiniuDemo */ = { isa = PBXGroup; children = ( + 318191A92531516F00D18536 /* DemoTestResource */, 93D230251C86D7F700434F6D /* AppDelegate.h */, 93D230261C86D7F700434F6D /* AppDelegate.m */, 93D230281C86D7F700434F6D /* ViewController.h */, @@ -279,6 +292,7 @@ buildActionMask = 2147483647; files = ( 93D230321C86D7F700434F6D /* LaunchScreen.storyboard in Resources */, + 318191AB2531516F00D18536 /* UploadResource.dmg in Resources */, 93D2302F1C86D7F700434F6D /* Assets.xcassets in Resources */, 93D2302D1C86D7F700434F6D /* Main.storyboard in Resources */, ); diff --git a/QiniuDemo/QiniuDemo/Base.lproj/Main.storyboard b/QiniuDemo/QiniuDemo/Base.lproj/Main.storyboard index e97430d2..1757995d 100755 --- a/QiniuDemo/QiniuDemo/Base.lproj/Main.storyboard +++ b/QiniuDemo/QiniuDemo/Base.lproj/Main.storyboard @@ -49,16 +49,16 @@ -