2222// THE SOFTWARE.
2323
2424#if os(Linux)
25- import Dispatch
25+ import Dispatch
2626#endif
2727import Foundation
2828import SKCore
2929
3030public struct NetworkInterface {
31-
31+
3232 private let apiUrl = " https://slack.com/api/ "
3333 private let session = URLSession ( configuration: . default)
34-
34+
3535 internal init ( ) { }
36-
37- internal func request( _ endpoint: Endpoint , parameters: [ String : Any ? ] , successClosure: @escaping ( [ String : Any ] ) -> Void , errorClosure: @escaping ( SlackError ) -> Void ) {
36+
37+ internal func request(
38+ _ endpoint: Endpoint ,
39+ parameters: [ String : Any ? ] ,
40+ successClosure: @escaping ( [ String : Any ] ) -> Void ,
41+ errorClosure: @escaping ( SlackError ) -> Void
42+ ) {
3843 var components = URLComponents ( string: " \( apiUrl) \( endpoint. rawValue) " )
3944 if parameters. count > 0 {
4045 components? . queryItems = filterNilParameters ( parameters) . map { URLQueryItem ( name: $0. 0 , value: " \( $0. 1 ) " ) }
@@ -44,7 +49,7 @@ public struct NetworkInterface {
4449 return
4550 }
4651 let request = URLRequest ( url: url)
47-
52+
4853 session. dataTask ( with: request) { ( data, response, publicError) in
4954 do {
5055 successClosure ( try NetworkInterface . handleResponse ( data, response: response, publicError: publicError) )
@@ -53,7 +58,7 @@ public struct NetworkInterface {
5358 }
5459 } . resume ( )
5560 }
56-
61+
5762 //Adapted from https://gist.github.com/erica/baa8a187a5b4796dab27
5863 internal func synchronusRequest( _ endpoint: Endpoint , parameters: [ String : Any ? ] ) -> [ String : Any ] ? {
5964 var components = URLComponents ( string: " \( apiUrl) \( endpoint. rawValue) " )
@@ -78,8 +83,13 @@ public struct NetworkInterface {
7883 _ = semaphore. wait ( timeout: DispatchTime . distantFuture)
7984 return try ? NetworkInterface . handleResponse ( data, response: response, publicError: error)
8085 }
81-
82- internal func customRequest( _ url: String , data: Data , success: @escaping ( Bool ) -> Void , errorClosure: @escaping ( SlackError ) -> Void ) {
86+
87+ internal func customRequest(
88+ _ url: String ,
89+ data: Data ,
90+ success: @escaping ( Bool ) -> Void ,
91+ errorClosure: @escaping ( SlackError ) -> Void
92+ ) {
8393 guard let string = url. removingPercentEncoding, let url = URL ( string: string) else {
8494 errorClosure ( SlackError . clientNetworkError)
8595 return
@@ -89,22 +99,30 @@ public struct NetworkInterface {
8999 let contentType = " application/json "
90100 request. setValue ( contentType, forHTTPHeaderField: " Content-Type " )
91101 request. httpBody = data
92-
93- session. dataTask ( with: request) { ( data , response , publicError) in
102+
103+ session. dataTask ( with: request) { ( _ , _ , publicError) in
94104 if publicError == nil {
95105 success ( true )
96106 } else {
97107 errorClosure ( SlackError . clientNetworkError)
98108 }
99109 } . resume ( )
100110 }
101-
102- internal func uploadRequest( data: Data , parameters: [ String : Any ? ] , successClosure: @escaping ( [ String : Any ] ) -> Void , errorClosure: @escaping ( SlackError ) -> Void ) {
111+
112+ internal func uploadRequest(
113+ data: Data ,
114+ parameters: [ String : Any ? ] ,
115+ successClosure: @escaping ( [ String : Any ] ) -> Void , errorClosure: @escaping ( SlackError ) -> Void
116+ ) {
103117 var components = URLComponents ( string: " \( apiUrl) \( Endpoint . filesUpload. rawValue) " )
104118 if parameters. count > 0 {
105119 components? . queryItems = filterNilParameters ( parameters) . map { URLQueryItem ( name: $0. 0 , value: " \( $0. 1 ) " ) }
106120 }
107- guard let url = components? . url, let filename = parameters [ " filename " ] as? String , let filetype = parameters [ " filetype " ] as? String else {
121+ guard
122+ let url = components? . url,
123+ let filename = parameters [ " filename " ] as? String ,
124+ let filetype = parameters [ " filetype " ] as? String
125+ else {
108126 errorClosure ( SlackError . clientNetworkError)
109127 return
110128 }
@@ -116,22 +134,27 @@ public struct NetworkInterface {
116134 let boundaryEnd = " -- \( boundaryConstant) -- \r \n "
117135 let contentDispositionString = " Content-Disposition: form-data; name= \" file \" ; filename= \" \( filename) \" \r \n "
118136 let contentTypeString = " Content-Type: \( filetype) \r \n \r \n "
119-
120- guard let boundaryStartData = boundaryStart. data ( using: . utf8) , let dispositionData = contentDispositionString. data ( using: . utf8) , let contentTypeData = contentTypeString. data ( using: . utf8) , let boundaryEndData = boundaryEnd. data ( using: . utf8) else {
137+
138+ guard
139+ let boundaryStartData = boundaryStart. data ( using: . utf8) ,
140+ let dispositionData = contentDispositionString. data ( using: . utf8) ,
141+ let contentTypeData = contentTypeString. data ( using: . utf8) ,
142+ let boundaryEndData = boundaryEnd. data ( using: . utf8)
143+ else {
121144 errorClosure ( SlackError . clientNetworkError)
122145 return
123146 }
124-
147+
125148 var requestBodyData = Data ( )
126149 requestBodyData. append ( contentsOf: boundaryStartData)
127150 requestBodyData. append ( contentsOf: dispositionData)
128151 requestBodyData. append ( contentsOf: contentTypeData)
129152 requestBodyData. append ( contentsOf: data)
130153 requestBodyData. append ( contentsOf: boundaryEndData)
131-
154+
132155 request. setValue ( contentType, forHTTPHeaderField: " Content-Type " )
133156 request. httpBody = requestBodyData as Data
134-
157+
135158 session. dataTask ( with: request) { ( data, response, publicError) in
136159 do {
137160 successClosure ( try NetworkInterface . handleResponse ( data, response: response, publicError: publicError) )
@@ -140,7 +163,7 @@ public struct NetworkInterface {
140163 }
141164 } . resume ( )
142165 }
143-
166+
144167 internal static func handleResponse( _ data: Data ? , response: URLResponse ? , publicError: Error ? ) throws -> [ String : Any ] {
145168 guard let data = data, let response = response as? HTTPURLResponse else {
146169 throw SlackError . clientNetworkError
@@ -149,10 +172,10 @@ public struct NetworkInterface {
149172 guard let json = try JSONSerialization . jsonObject ( with: data, options: [ ] ) as? [ String : Any ] else {
150173 throw SlackError . clientJSONError
151174 }
152-
175+
153176 switch response. statusCode {
154177 case 200 :
155- if ( json [ " ok " ] as! Bool == true ) {
178+ if json [ " ok " ] as? Bool == true {
156179 return json
157180 } else {
158181 if let errorString = json [ " error " ] as? String {
@@ -174,16 +197,16 @@ public struct NetworkInterface {
174197 }
175198 }
176199 }
177-
200+
178201 private func randomBoundary( ) -> String {
179202 #if os(Linux)
180203 return " slackkit.boundary. \( Int ( random ( ) ) ) \( Int ( random ( ) ) ) "
181204 #else
182205 return " slackkit.boundary. \( arc4random ( ) ) \( arc4random ( ) ) "
183206 #endif
184207 }
185-
186- //MARK: - Filter Nil Parameters
208+
209+ // MARK: - Filter Nil Parameters
187210 private func filterNilParameters( _ parameters: [ String : Any ? ] ) -> [ String : Any ] {
188211 var finalParameters = [ String: Any] ( )
189212 for (key, value) in parameters {
0 commit comments