0001 // The MIT License (MIT) 0002 0003 // Copyright (c) 2015 JohnLui <wenhanlv@gmail.com> https://github.com/johnlui 0004 0005 // Permission is hereby granted, free of charge, to any person obtaining a copy 0006 // of this software and associated documentation files (the "Software"), to deal 0007 // in the Software without restriction, including without limitation the rights 0008 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 0009 // copies of the Software, and to permit persons to whom the Software is 0010 // furnished to do so, subject to the following conditions: 0011 0012 // The above copyright notice and this permission notice shall be included in all 0013 // copies or substantial portions of the Software. 0014 0015 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 0016 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 0017 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 0018 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 0019 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 0020 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 0021 // SOFTWARE. 0022 // 0023 // PitayaManager.swift 0024 // Pitaya 0025 // 0026 // Created by 吕文翰 on 15/10/7. 0027 // 0028 0029 import Foundation 0030 0031 class PitayaManager: NSObject, NSURLSessionDelegate { 0032 let boundary
Pitaya.swift:39 var pitayaManager: PitayaManager!Pitaya.swift:51 p.pitayaManager = PitayaManager.build(method, url: url)PitayaManager+NSURLSessionDelegate.swift:31 private typealias URLSessionDelegate = PitayaManagerPitayaManager+Static.swift:31 extension PitayaManager {PitayaManager+Static.swift:40 static func build(method: HTTPMethod, url: String) -> PitayaManager {PitayaManager+Static.swift:41 return PitayaManager(url: url, method: method)= "PitayaUGl0YXlh" 0033 let errorDomain
PitayaManager.swift:129 request.setValue("multipart/form-data; boundary=" + self.boundary, forHTTPHeaderField: "Content-Type")PitayaManager.swift:153 data.appendData("--\(self.boundary)\r\n".nsdata)PitayaManager.swift:160 data.appendData("--\(self.boundary)\r\n".nsdata)PitayaManager.swift:168 data.appendData("--\(self.boundary)--\r\n".nsdata)= "com.lvwenhan.Pitaya" 0034 0035 var HTTPBodyRaw
PitayaManager.swift:185 let e = NSError(domain: self?.errorDomain ?? "Pitaya", code: error!.code, userInfo: error!.userInfo)= "" 0036 var HTTPBodyRawIsJSON
PitayaManager.swift:102 self.HTTPBodyRaw = rawStringPitayaManager.swift:131 if self.HTTPBodyRaw != "" {PitayaManager.swift:145 if self.HTTPBodyRaw != "" {PitayaManager.swift:146 data.appendData(self.HTTPBodyRaw.nsdata)= false 0037 0038 let method
PitayaManager.swift:103 self.HTTPBodyRawIsJSON = isJSONPitayaManager.swift:132 request.setValue(self.HTTPBodyRawIsJSON ? "application/json" : "text/plain;charset=UTF-8", forHTTPHeaderField: "Content-Type"): String! 0039 var params
PitayaManager.swift:79 self.method = method.rawValuePitayaManager.swift:117 if self.method == "GET" && self.params?.count > 0 {PitayaManager.swift:121 request.HTTPMethod = self.methodPitayaManager.swift:128 if self.files?.count > 0 && self.method != "GET" {PitayaManager.swift:148 if self.method == "GET" {PitayaManager.swift:170 } else if self.params?.count > 0 && self.method != "GET" {: [String: AnyObject]? 0040 var files
PitayaManager.swift:90 self.params = paramsPitayaManager.swift:117 if self.method == "GET" && self.params?.count > 0 {PitayaManager.swift:118 self.request = NSMutableURLRequest(URL: NSURL(string: url + "?" + Helper.buildParams(self.params!))!)PitayaManager.swift:125 if self.params?.count > 0 {PitayaManager.swift:151 if let ps = self.params {PitayaManager.swift:170 } else if self.params?.count > 0 && self.method != "GET" {PitayaManager.swift:171 data.appendData(Helper.buildParams(self.params!).nsdata): [File]? 0041 var cancelCallback
PitayaManager.swift:93 self.files = filesPitayaManager.swift:128 if self.files?.count > 0 && self.method != "GET" {PitayaManager.swift:147 } else if self.files?.count > 0 {PitayaManager.swift:158 if let fs = self.files {: (() -> Void)? 0042 var errorCallback
Pitaya.swift:193 self.pitayaManager.cancelCallback = callbackPitayaManager.swift:182 self?.cancelCallback?(): ((error: NSError) -> Void)? 0043 var callback
PitayaManager.swift:96 self.errorCallback = errorCallbackPitayaManager.swift:188 self?.errorCallback?(error: e): ((data: NSData?, response: NSHTTPURLResponse?) -> Void)? 0044 0045 var session
PitayaManager.swift:109 self.callback = callbackPitayaManager.swift:194 self?.callback?(data: data, response: response as? NSHTTPURLResponse): NSURLSession! 0046 let url
PitayaManager.swift:83 self.session = NSURLSession(configuration: NSURLSession.sharedSession().configuration, delegate: self, delegateQueue: NSURLSession.sharedSession().delegateQueue)PitayaManager.swift:177 task = session.dataTaskWithRequest(request, completionHandler: { [weak self] (data, response, error) -> Void inPitayaManager.swift:189 self?.session.finishTasksAndInvalidate()PitayaManager.swift:195 self?.session.finishTasksAndInvalidate(): String! 0047 var request
PitayaManager.swift:77 self.url = urlPitayaManager.swift:118 self.request = NSMutableURLRequest(URL: NSURL(string: url + "?" + Helper.buildParams(self.params!))!): NSMutableURLRequest! 0048 var task
PitayaManager.swift:78 self.request = NSMutableURLRequest(URL: NSURL(string: url)!)PitayaManager.swift:118 self.request = NSMutableURLRequest(URL: NSURL(string: url + "?" + Helper.buildParams(self.params!))!)PitayaManager.swift:120 request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringLocalCacheDataPitayaManager.swift:121 request.HTTPMethod = self.methodPitayaManager.swift:126 request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")PitayaManager.swift:129 request.setValue("multipart/form-data; boundary=" + self.boundary, forHTTPHeaderField: "Content-Type")PitayaManager.swift:132 request.setValue(self.HTTPBodyRawIsJSON ? "application/json" : "text/plain;charset=UTF-8", forHTTPHeaderField: "Content-Type")PitayaManager.swift:134 request.addValue(self.userAgent, forHTTPHeaderField: "User-Agent")PitayaManager.swift:137 request.addValue(authString, forHTTPHeaderField: "Authorization")PitayaManager.swift:140 request.setValue(i.1, forHTTPHeaderField: i.0)PitayaManager.swift:173 request.HTTPBody = dataPitayaManager.swift:176 if Pitaya.DEBUG { if let a = request.allHTTPHeaderFields { NSLog("Pitaya Request HEADERS: ", a.description); }; }PitayaManager.swift:177 task = session.dataTaskWithRequest(request, completionHandler: { [weak self] (data, response, error) -> Void in: NSURLSessionTask! 0049 var basicAuth
Pitaya.swift:194 self.pitayaManager.task.cancel()PitayaManager.swift:177 task = session.dataTaskWithRequest(request, completionHandler: { [weak self] (data, response, error) -> Void inPitayaManager.swift:199 task.resume(): (String, String)! 0050 0051 var localCertData
PitayaManager.swift:106 self.basicAuth = authPitayaManager.swift:135 if let auth = self.basicAuth {: NSData! 0052 var sSLValidateErrorCallBack
PitayaManager+NSURLSessionDelegate.swift:42 if let localCertificateData = self.localCertData {PitayaManager.swift:86 self.localCertData = data: (() -> Void)? 0053 0054 var extraHTTPHeaders
PitayaManager+NSURLSessionDelegate.swift:53 self.sSLValidateErrorCallBack?()PitayaManager.swift:87 self.sSLValidateErrorCallBack = SSLValidateErrorCallBack= [(String, String)]() 0055 0056 // User-Agent Header; see http://tools.ietf.org/html/rfc7231#section-5.5.3 0057 let userAgent
PitayaManager.swift:99 self.extraHTTPHeaders.append((key, value))PitayaManager.swift:139 for i in self.extraHTTPHeaders {: String = { 0058 if let info = NSBundle.mainBundle().infoDictionary { 0059 let executable: AnyObject = info[kCFBundleExecutableKey as String] ?? "Unknown" 0060 let bundle: AnyObject = info[kCFBundleIdentifierKey as String] ?? "Unknown" 0061 let version: AnyObject = info[kCFBundleVersionKey as String] ?? "Unknown" 0062 // could not tested 0063 let os: AnyObject = NSProcessInfo.processInfo().operatingSystemVersionString ?? "Unknown" 0064 0065 var mutableUserAgent = NSMutableString(string: "\(executable)/\(bundle) (\(version); OS \(os))") as CFMutableString 0066 let transform = NSString(string: "Any-Latin; Latin-ASCII; [:^ASCII:] Remove") as CFString 0067 if CFStringTransform(mutableUserAgent, nil, transform, false) { 0068 return mutableUserAgent as NSString as String 0069 } 0070 } 0071 0072 // could not tested 0073 return "Pitaya" 0074 }() 0075 0076 init
PitayaManager.swift:134 request.addValue(self.userAgent, forHTTPHeaderField: "User-Agent")(url: String, method: HTTPMethod!) { 0077 self.url = url 0078 self.request = NSMutableURLRequest(URL: NSURL(string: url)!) 0079 self.method = method.rawValue 0080 0081 super.init() 0082 // setup a session with delegate to self 0083 self.session = NSURLSession(configuration: NSURLSession.sharedSession().configuration, delegate: self, delegateQueue: NSURLSession.sharedSession().delegateQueue) 0084 } 0085 func addSSLPinning
PitayaManager+Static.swift:41 return PitayaManager(url: url, method: method)(LocalCertData data: NSData, SSLValidateErrorCallBack: (()->Void)? = nil) { 0086 self.localCertData = data 0087 self.sSLValidateErrorCallBack = SSLValidateErrorCallBack 0088 } 0089 func addParams
Pitaya.swift:88 self.pitayaManager.addSSLPinning(LocalCertData: data, SSLValidateErrorCallBack: SSLValidateErrorCallBack)(params: [String: AnyObject]?) { 0090 self.params = params 0091 } 0092 func addFiles
Pitaya.swift:63 self.pitayaManager.addParams(params)(files: [File]?) { 0093 self.files = files 0094 } 0095 func addErrorCallback
Pitaya.swift:75 self.pitayaManager.addFiles(files)(errorCallback: ((error: NSError) -> Void)?) { 0096 self.errorCallback = errorCallback 0097 } 0098 func setHTTPHeader
Pitaya.swift:140 self.pitayaManager.addErrorCallback(errorCallback)(Name key: String, Value value: String) { 0099 self.extraHTTPHeaders.append((key, value)) 0100 } 0101 func sethttpBodyRaw
Pitaya.swift:101 self.pitayaManager.setHTTPHeader(Name: key, Value: value)(rawString: String, isJSON: Bool = false) { 0102 self.HTTPBodyRaw = rawString 0103 self.HTTPBodyRawIsJSON = isJSON 0104 } 0105 func setBasicAuth
Pitaya.swift:114 self.pitayaManager.sethttpBodyRaw(string, isJSON: isJSON)(auth: (String, String)) { 0106 self.basicAuth = auth 0107 } 0108 func fire
Pitaya.swift:127 self.pitayaManager.setBasicAuth((username, password))(callback: ((data: NSData?, response: NSHTTPURLResponse?) -> Void)? = nil) { 0109 self.callback = callback 0110 0111 self.buildRequest() 0112 self.buildHeader() 0113 self.buildBody() 0114 self.fireTask() 0115 } 0116 private func buildRequest
Pitaya.swift:151 self.pitayaManager?.fire(callback)() { 0117 if self.method == "GET" && self.params?.count > 0 { 0118 self.request = NSMutableURLRequest(URL: NSURL(string: url + "?" + Helper.buildParams(self.params!))!) 0119 } 0120 request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringLocalCacheData 0121 request.HTTPMethod = self.method 0122 } 0123 private func buildHeader
PitayaManager.swift:111 self.buildRequest()() { 0124 // multipart Content-Type; see http://www.rfc-editor.org/rfc/rfc2046.txt 0125 if self.params?.count > 0 { 0126 request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") 0127 } 0128 if self.files?.count > 0 && self.method != "GET" { 0129 request.setValue("multipart/form-data; boundary=" + self.boundary, forHTTPHeaderField: "Content-Type") 0130 } 0131 if self.HTTPBodyRaw != "" { 0132 request.setValue(self.HTTPBodyRawIsJSON ? "application/json" : "text/plain;charset=UTF-8", forHTTPHeaderField: "Content-Type") 0133 } 0134 request.addValue(self.userAgent, forHTTPHeaderField: "User-Agent") 0135 if let auth = self.basicAuth { 0136 let authString = "Basic " + (auth.0 + ":" + auth.1).base64 0137 request.addValue(authString, forHTTPHeaderField: "Authorization") 0138 } 0139 for i in self.extraHTTPHeaders { 0140 request.setValue(i.1, forHTTPHeaderField: i.0) 0141 } 0142 } 0143 private func buildBody
PitayaManager.swift:112 self.buildHeader()() { 0144 let data = NSMutableData() 0145 if self.HTTPBodyRaw != "" { 0146 data.appendData(self.HTTPBodyRaw.nsdata) 0147 } else if self.files?.count > 0 { 0148 if self.method == "GET" { 0149 NSLog("\n\n------------------------\nThe remote server may not accept GET method with HTTP body. But Pitaya will send it anyway.\nBut it looks like iOS 9 SDK has prevented sending http body in GET method.\n------------------------\n\n") 0150 } else { 0151 if let ps = self.params { 0152 for (key, value) in ps { 0153 data.appendData("--\(self.boundary)\r\n".nsdata) 0154 data.appendData("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n".nsdata) 0155 data.appendData("\(value.description)\r\n".nsdata) 0156 } 0157 } 0158 if let fs = self.files { 0159 for file in fs { 0160 data.appendData("--\(self.boundary)\r\n".nsdata) 0161 data.appendData("Content-Disposition: form-data; name=\"\(file.name)\"; filename=\"\(NSString(string: file.url.description).lastPathComponent)\"\r\n\r\n".nsdata) 0162 if let a = NSData(contentsOfURL: file.url) { 0163 data.appendData(a) 0164 data.appendData("\r\n".nsdata) 0165 } 0166 } 0167 } 0168 data.appendData("--\(self.boundary)--\r\n".nsdata) 0169 } 0170 } else if self.params?.count > 0 && self.method != "GET" { 0171 data.appendData(Helper.buildParams(self.params!).nsdata) 0172 } 0173 request.HTTPBody = data 0174 } 0175 private func fireTask
PitayaManager.swift:113 self.buildBody()() { 0176 if Pitaya.DEBUG { if let a = request.allHTTPHeaderFields { NSLog("Pitaya Request HEADERS: ", a.description); }; } 0177 task = session.dataTaskWithRequest(request, completionHandler: { [weak self] (data, response, error) -> Void in 0178 if Pitaya.DEBUG { if let a = response { NSLog("Pitaya Response: ", a.description); }} 0179 if error != nil { 0180 if error?.code == -999 { 0181 dispatch_async(dispatch_get_main_queue()) { 0182 self?.cancelCallback?() 0183 } 0184 } else { 0185 let e = NSError(domain: self?.errorDomain ?? "Pitaya", code: error!.code, userInfo: error!.userInfo) 0186 NSLog("Pitaya Error: ", e.localizedDescription) 0187 dispatch_async(dispatch_get_main_queue()) { 0188 self?.errorCallback?(error: e) 0189 self?.session.finishTasksAndInvalidate() 0190 } 0191 } 0192 } else { 0193 dispatch_async(dispatch_get_main_queue()) { 0194 self?.callback?(data: data, response: response as? NSHTTPURLResponse) 0195 self?.session.finishTasksAndInvalidate() 0196 } 0197 } 0198 }) 0199 task.resume() 0200 } 0201 } 0202
PitayaManager.swift:114 self.fireTask()