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
Pitaya.swift:39
    var pitayaManager: PitayaManager!
Pitaya.swift:51
        p.pitayaManager = PitayaManager.build(method, url: url)
PitayaManager+NSURLSessionDelegate.swift:31
private typealias URLSessionDelegate = PitayaManager
PitayaManager+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)
: NSObject, NSURLSessionDelegate { 0032 let boundary
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)
= "PitayaUGl0YXlh" 0033 let errorDomain
PitayaManager.swift:185
                    let e = NSError(domain: self?.errorDomain ?? "Pitaya", code: error!.code, userInfo: error!.userInfo)
= "com.lvwenhan.Pitaya" 0034 0035 var HTTPBodyRaw
PitayaManager.swift:102
        self.HTTPBodyRaw = rawString
PitayaManager.swift:131
        if self.HTTPBodyRaw != "" {
PitayaManager.swift:145
        if self.HTTPBodyRaw != "" {
PitayaManager.swift:146
            data.appendData(self.HTTPBodyRaw.nsdata)
= "" 0036 var HTTPBodyRawIsJSON
PitayaManager.swift:103
        self.HTTPBodyRawIsJSON = isJSON
PitayaManager.swift:132
            request.setValue(self.HTTPBodyRawIsJSON ? "application/json" : "text/plain;charset=UTF-8", forHTTPHeaderField: "Content-Type")
= false 0037 0038 let method
PitayaManager.swift:79
        self.method = method.rawValue
PitayaManager.swift:117
        if self.method == "GET" && self.params?.count > 0 {
PitayaManager.swift:121
        request.HTTPMethod = self.method
PitayaManager.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! 0039 var params
PitayaManager.swift:90
        self.params = params
PitayaManager.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)
: [String: AnyObject]? 0040 var files
PitayaManager.swift:93
        self.files = files
PitayaManager.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 {
: [File]? 0041 var cancelCallback
Pitaya.swift:193
        self.pitayaManager.cancelCallback = callback
PitayaManager.swift:182
                        self?.cancelCallback?()
: (() -> Void)? 0042 var errorCallback
PitayaManager.swift:96
        self.errorCallback = errorCallback
PitayaManager.swift:188
                        self?.errorCallback?(error: e)
: ((error: NSError) -> Void)? 0043 var callback
PitayaManager.swift:109
        self.callback = callback
PitayaManager.swift:194
                    self?.callback?(data: data, response: response as? NSHTTPURLResponse)
: ((data: NSData?, response: NSHTTPURLResponse?) -> Void)? 0044 0045 var session
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 in
PitayaManager.swift:189
                        self?.session.finishTasksAndInvalidate()
PitayaManager.swift:195
                    self?.session.finishTasksAndInvalidate()
: NSURLSession! 0046 let url
PitayaManager.swift:77
        self.url = url
PitayaManager.swift:118
            self.request = NSMutableURLRequest(URL: NSURL(string: url + "?" + Helper.buildParams(self.params!))!)
: String! 0047 var request
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.ReloadIgnoringLocalCacheData
PitayaManager.swift:121
        request.HTTPMethod = self.method
PitayaManager.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 = data
PitayaManager.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
: NSMutableURLRequest! 0048 var task
Pitaya.swift:194
        self.pitayaManager.task.cancel()
PitayaManager.swift:177
        task = session.dataTaskWithRequest(request, completionHandler: { [weak self] (data, response, error) -> Void in
PitayaManager.swift:199
        task.resume()
: NSURLSessionTask! 0049 var basicAuth
PitayaManager.swift:106
        self.basicAuth = auth
PitayaManager.swift:135
        if let auth = self.basicAuth {
: (String, String)! 0050 0051 var localCertData
PitayaManager+NSURLSessionDelegate.swift:42
        if let localCertificateData = self.localCertData {
PitayaManager.swift:86
        self.localCertData = data
: NSData! 0052 var sSLValidateErrorCallBack
PitayaManager+NSURLSessionDelegate.swift:53
                        self.sSLValidateErrorCallBack?()
PitayaManager.swift:87
        self.sSLValidateErrorCallBack = SSLValidateErrorCallBack
: (() -> Void)? 0053 0054 var extraHTTPHeaders
PitayaManager.swift:99
        self.extraHTTPHeaders.append((key, value))
PitayaManager.swift:139
        for i in self.extraHTTPHeaders {
= [(String, String)]() 0055 0056 // User-Agent Header; see http://tools.ietf.org/html/rfc7231#section-5.5.3 0057 let userAgent
PitayaManager.swift:134
        request.addValue(self.userAgent, forHTTPHeaderField: "User-Agent")
: 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+Static.swift:41
        return PitayaManager(url: url, method: method)
(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
Pitaya.swift:88
        self.pitayaManager.addSSLPinning(LocalCertData: data, SSLValidateErrorCallBack: SSLValidateErrorCallBack)
(LocalCertData data: NSData, SSLValidateErrorCallBack: (()->Void)? = nil) { 0086 self.localCertData = data 0087 self.sSLValidateErrorCallBack = SSLValidateErrorCallBack 0088 } 0089 func addParams
Pitaya.swift:63
        self.pitayaManager.addParams(params)
(params: [String: AnyObject]?) { 0090 self.params = params 0091 } 0092 func addFiles
Pitaya.swift:75
        self.pitayaManager.addFiles(files)
(files: [File]?) { 0093 self.files = files 0094 } 0095 func addErrorCallback
Pitaya.swift:140
        self.pitayaManager.addErrorCallback(errorCallback)
(errorCallback: ((error: NSError) -> Void)?) { 0096 self.errorCallback = errorCallback 0097 } 0098 func setHTTPHeader
Pitaya.swift:101
        self.pitayaManager.setHTTPHeader(Name: key, Value: value)
(Name key: String, Value value: String) { 0099 self.extraHTTPHeaders.append((key, value)) 0100 } 0101 func sethttpBodyRaw
Pitaya.swift:114
        self.pitayaManager.sethttpBodyRaw(string, isJSON: isJSON)
(rawString: String, isJSON: Bool = false) { 0102 self.HTTPBodyRaw = rawString 0103 self.HTTPBodyRawIsJSON = isJSON 0104 } 0105 func setBasicAuth
Pitaya.swift:127
        self.pitayaManager.setBasicAuth((username, password))
(auth: (String, String)) { 0106 self.basicAuth = auth 0107 } 0108 func fire
Pitaya.swift:151
        self.pitayaManager?.fire(callback)
(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
PitayaManager.swift:111
        self.buildRequest()
() { 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:112
        self.buildHeader()
() { 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:113
        self.buildBody()
() { 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:114
        self.fireTask()
() { 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