Skip to content

Commit 867c18d

Browse files
committed
minor code refractor and some changes for next release
1 parent cfc1103 commit 867c18d

File tree

10 files changed

+245
-105
lines changed

10 files changed

+245
-105
lines changed

HttpUtility.xcodeproj/project.pbxproj

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
objects = {
88

99
/* Begin PBXBuildFile section */
10-
86277C2024CB399B0078EB37 /* LazyImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 86277C1F24CB399B0078EB37 /* LazyImageView.swift */; };
10+
86010D0725CE240300A4E362 /* batman.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 86010D0625CE240300A4E362 /* batman.jpg */; };
1111
86521B5625C6FD7200E05422 /* HURequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 86521B5525C6FD7100E05422 /* HURequest.swift */; };
1212
8656BC582483E3C60023549D /* EncodableExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8656BC572483E3C60023549D /* EncodableExtension.swift */; };
1313
8656BC5B2483E43D0023549D /* EncodableExtensionUnitTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8656BC5A2483E43D0023549D /* EncodableExtensionUnitTest.swift */; };
@@ -32,7 +32,7 @@
3232
/* End PBXContainerItemProxy section */
3333

3434
/* Begin PBXFileReference section */
35-
86277C1F24CB399B0078EB37 /* LazyImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LazyImageView.swift; sourceTree = "<group>"; };
35+
86010D0625CE240300A4E362 /* batman.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = batman.jpg; sourceTree = "<group>"; };
3636
86521B5525C6FD7100E05422 /* HURequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HURequest.swift; sourceTree = "<group>"; };
3737
8656BC572483E3C60023549D /* EncodableExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EncodableExtension.swift; sourceTree = "<group>"; };
3838
8656BC5A2483E43D0023549D /* EncodableExtensionUnitTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EncodableExtensionUnitTest.swift; sourceTree = "<group>"; };
@@ -72,7 +72,6 @@
7272
isa = PBXGroup;
7373
children = (
7474
8656BC572483E3C60023549D /* EncodableExtension.swift */,
75-
86277C1F24CB399B0078EB37 /* LazyImageView.swift */,
7675
);
7776
path = Extensions;
7877
sourceTree = "<group>";
@@ -137,6 +136,7 @@
137136
86719EA324720BD1002A2AB0 /* HttpUtilityTests */ = {
138137
isa = PBXGroup;
139138
children = (
139+
86010D0625CE240300A4E362 /* batman.jpg */,
140140
8656BC5F248495620023549D /* TestModel */,
141141
8656BC5C248431200023549D /* IntegrationTests */,
142142
8656BC592483E4200023549D /* ExtensionsTests */,
@@ -245,6 +245,7 @@
245245
isa = PBXResourcesBuildPhase;
246246
buildActionMask = 2147483647;
247247
files = (
248+
86010D0725CE240300A4E362 /* batman.jpg in Resources */,
248249
);
249250
runOnlyForDeploymentPostprocessing = 0;
250251
};
@@ -256,7 +257,6 @@
256257
buildActionMask = 2147483647;
257258
files = (
258259
86CAEFE625BBBE98006A7791 /* HUNetworkError.swift in Sources */,
259-
86277C2024CB399B0078EB37 /* LazyImageView.swift in Sources */,
260260
86719EB124720E40002A2AB0 /* HttpUtility.swift in Sources */,
261261
8656BC582483E3C60023549D /* EncodableExtension.swift in Sources */,
262262
86521B5625C6FD7200E05422 /* HURequest.swift in Sources */,

HttpUtility/Extensions/LazyImageView.swift

Lines changed: 0 additions & 38 deletions
This file was deleted.

HttpUtility/HUNetworkError.swift

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,16 @@ public struct HUNetworkError : Error
1212
{
1313
let reason: String?
1414
let httpStatusCode: Int?
15+
let requestUrl: URL?
16+
let requestBody: String?
17+
let serverResponse: String?
18+
19+
init(withServerResponse response: Data? = nil, forRequestUrl url: URL, withHttpBody body: Data? = nil, errorMessage message: String, forStatusCode statusCode: Int)
20+
{
21+
self.serverResponse = response != nil ? String(data: response!, encoding: .utf8) : nil
22+
self.requestUrl = url
23+
self.requestBody = body != nil ? String(data: body!, encoding: .utf8) : nil
24+
self.httpStatusCode = statusCode
25+
self.reason = message
26+
}
1527
}

HttpUtility/HURequest.swift

Lines changed: 53 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,57 @@
88

99
import Foundation
1010

11-
public struct HURequest {
12-
13-
let url : URL
14-
let method : HUHttpMethods
15-
let request : Encodable
11+
protocol Request {
12+
var url: URL { get set }
13+
var method: HUHttpMethods {get set}
1614
}
15+
16+
public struct HURequest : Request {
17+
var url: URL
18+
var method: HUHttpMethods
19+
var requestBody: Data? = nil
20+
}
21+
22+
// the HUMedia will be part of next release
23+
public struct HUMultiPartRequest : Request {
24+
var url: URL
25+
var method: HUHttpMethods
26+
var request : Encodable
27+
//var media : [HUMedia]? = nil
28+
}
29+
30+
//public struct HUMedia
31+
//{
32+
// let fileName : String // the name of the file that you want to save on the server
33+
// let data: Data
34+
// let mimeType: String // mime type of the file image/jpeg or image/png etc
35+
// let parameterName : String // api parameter name
36+
//
37+
// init(withMediaData data: Data, name: String, mimeType: HUMimeType, parameterName: String) {
38+
//
39+
// self.data = data
40+
// self.fileName = name
41+
// self.mimeType = mimeType.rawValue
42+
// self.parameterName = parameterName
43+
// }
44+
//}
45+
//
46+
//public enum HUMimeType : String
47+
//{
48+
// // images mime type
49+
// case gif = "image/gif"
50+
// case jpeg = "image/jpeg"
51+
// case pjpeg = "image/pjpeg"
52+
// case png = "image/png"
53+
// case svgxml = "image/svg+xml"
54+
// case tiff = "image/tiff"
55+
// case bmp = "image/bmp"
56+
//
57+
// // document mime type
58+
// case csv = "text/csv"
59+
// case wordDocument = "application/msword"
60+
// case pdf = "application/pdf"
61+
// case richTextFormat = "application/rtf"
62+
// case plainText = "text/plain"
63+
//
64+
//}

HttpUtility/HttpUtility.swift

Lines changed: 29 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -16,31 +16,31 @@ public struct HttpUtility
1616

1717
private init(){}
1818

19-
public func request<T:Decodable>(requestUrl: URL, method: HUHttpMethods, requestBody: Data? = nil, resultType: T.Type, completionHandler:@escaping(Result<T?, HUNetworkError>)-> Void)
19+
public func request<T:Decodable>(huRequest: HURequest, resultType: T.Type, completionHandler:@escaping(Result<T?, HUNetworkError>)-> Void)
2020
{
21-
switch method
21+
switch huRequest.method
2222
{
2323
case .get:
24-
getData(requestUrl: requestUrl, resultType: resultType) { completionHandler($0)}
24+
getData(requestUrl: huRequest.url, resultType: resultType) { completionHandler($0)}
2525
break
2626

2727
case .post:
28-
postData(requestUrl: requestUrl, requestBody: requestBody!, resultType: T.self) { completionHandler($0)}
28+
postData(request: huRequest, resultType: resultType) { completionHandler($0)}
2929
break
3030

3131
case .put:
32-
putData(requestUrl: requestUrl, resultType: resultType) { completionHandler($0)}
32+
putData(requestUrl: huRequest.url, resultType: resultType) { completionHandler($0)}
3333
break
3434

3535
case .delete:
36-
deleteData(requestUrl: requestUrl, resultType: resultType) { completionHandler($0)}
36+
deleteData(requestUrl: huRequest.url, resultType: resultType) { completionHandler($0)}
3737
break
3838
}
3939
}
4040

4141
// MARK: - Multipart
42-
public func requestWithMultiPartFormData<T:Decodable>(huRequest: HURequest, responseType: T.Type, completionHandler:@escaping(Result<T?, HUNetworkError>)-> Void) {
43-
postMultiPartFormData(huRequest: huRequest) { completionHandler($0) }
42+
public func requestWithMultiPartFormData<T:Decodable>(multiPartRequest: HUMultiPartRequest, responseType: T.Type, completionHandler:@escaping(Result<T?, HUNetworkError>)-> Void) {
43+
postMultiPartFormData(request: multiPartRequest) { completionHandler($0) }
4444
}
4545

4646
// MARK: - Private functions
@@ -66,9 +66,9 @@ public struct HttpUtility
6666
private func decodeJsonResponse<T: Decodable>(data: Data, responseType: T.Type) -> T?
6767
{
6868
let decoder = createJsonDecoder()
69-
do{
69+
do {
7070
return try decoder.decode(responseType, from: data)
71-
}catch let error{
71+
}catch let error {
7272
debugPrint("deocding error =>\(error.localizedDescription)")
7373
}
7474
return nil
@@ -86,29 +86,29 @@ public struct HttpUtility
8686
}
8787

8888
// MARK: - POST Api
89-
private func postData<T:Decodable>(requestUrl: URL, requestBody: Data, resultType: T.Type, completionHandler:@escaping(Result<T?, HUNetworkError>)-> Void)
89+
private func postData<T:Decodable>(request: HURequest, resultType: T.Type, completionHandler:@escaping(Result<T?, HUNetworkError>)-> Void)
9090
{
91-
var urlRequest = self.createUrlRequest(requestUrl: requestUrl)
91+
var urlRequest = self.createUrlRequest(requestUrl: request.url)
9292
urlRequest.httpMethod = HUHttpMethods.post.rawValue
93-
urlRequest.httpBody = requestBody
93+
urlRequest.httpBody = request.requestBody
9494
urlRequest.addValue("application/json", forHTTPHeaderField: "content-type")
9595

9696
performOperation(requestUrl: urlRequest, responseType: T.self) { (result) in
9797
completionHandler(result)
9898
}
9999
}
100100

101-
private func postMultiPartFormData<T:Decodable>(huRequest: HURequest, completionHandler:@escaping(Result<T?, HUNetworkError>)-> Void)
101+
private func postMultiPartFormData<T:Decodable>(request: HUMultiPartRequest, completionHandler:@escaping(Result<T?, HUNetworkError>)-> Void)
102102
{
103103
let boundary = "-----------------------------\(UUID().uuidString)"
104104
let lineBreak = "\r\n"
105-
var urlRequest = self.createUrlRequest(requestUrl: huRequest.url)
105+
var urlRequest = self.createUrlRequest(requestUrl: request.url)
106106
urlRequest.httpMethod = HUHttpMethods.post.rawValue
107107
urlRequest.addValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
108108

109109
var postBody = Data()
110110

111-
let requestDictionary = huRequest.request.convertToDictionary()
111+
let requestDictionary = request.request.convertToDictionary()
112112
if(requestDictionary != nil)
113113
{
114114
requestDictionary?.forEach({ (key, value) in
@@ -122,6 +122,17 @@ public struct HttpUtility
122122
}
123123
})
124124

125+
// TODO: Next release
126+
// if(huRequest.media != nil) {
127+
// huRequest.media?.forEach({ (media) in
128+
// postBody.append("--\(boundary + lineBreak)" .data(using: .utf8)!)
129+
// postBody.append("Content-Disposition: form-data; name=\"\(media.parameterName)\"; filename=\"\(media.fileName)\" \(lineBreak + lineBreak)" .data(using: .utf8)!)
130+
// postBody.append("Content-Type: \(media.mimeType + lineBreak + lineBreak)" .data(using: .utf8)!)
131+
// postBody.append(media.data)
132+
// postBody.append(lineBreak .data(using: .utf8)!)
133+
// })
134+
// }
135+
125136
postBody.append("--\(boundary)--\(lineBreak)" .data(using: .utf8)!)
126137

127138
urlRequest.addValue("\(postBody.count)", forHTTPHeaderField: "Content-Length")
@@ -161,18 +172,16 @@ public struct HttpUtility
161172
URLSession.shared.dataTask(with: requestUrl) { (data, httpUrlResponse, error) in
162173

163174
let statusCode = (httpUrlResponse as? HTTPURLResponse)?.statusCode
164-
debugPrint(String(data: data!, encoding: .utf8)!)
165175
if(error == nil && data != nil && data?.count != 0) {
166176
let response = self.decodeJsonResponse(data: data!, responseType: responseType)
167177
if(response != nil) {
168178
completionHandler(.success(response))
169179
}else {
170-
let responseJsonString = String(data: data!, encoding: .utf8)
171-
completionHandler(.failure(HUNetworkError(reason: "error = \(String(describing: responseJsonString))", httpStatusCode: statusCode)))
180+
completionHandler(.failure(HUNetworkError(withServerResponse: data, forRequestUrl: requestUrl.url!, withHttpBody: requestUrl.httpBody, errorMessage: error.debugDescription, forStatusCode: statusCode!)))
172181
}
173182
}
174183
else {
175-
let networkError = HUNetworkError(reason: error.debugDescription,httpStatusCode: statusCode)
184+
let networkError = HUNetworkError(withServerResponse: data, forRequestUrl: requestUrl.url!, withHttpBody: requestUrl.httpBody, errorMessage: error.debugDescription, forStatusCode: statusCode!)
176185
completionHandler(.failure(networkError))
177186
}
178187

0 commit comments

Comments
 (0)