OSDN Git Service

HMAPIResponseをSwiftに変換した
[kcd/KCD.git] / KCD / HMAPIResponse.swift
1 //
2 //  HMAPIResponse.swift
3 //  KCD
4 //
5 //  Created by Hori,Masaki on 2017/01/20.
6 //  Copyright © 2017年 Hori,Masaki. All rights reserved.
7 //
8
9 import Cocoa
10
11 fileprivate func parseJSON(_ data: Data) -> [String:Any]? {
12     guard let j = try? JSONSerialization.jsonObject(with: data, options: [.allowFragments]),
13         let json = j as? [String:Any]
14         else { return nil }
15     return json
16 }
17 fileprivate func parseParameter(_ string: String) -> [String:String] {
18     let piar = string.components(separatedBy: "&")
19     return piar.reduce(Dictionary<String,String>()) {
20         var dict = $0
21         let p = $1.components(separatedBy: "=")
22         if p.count == 2 {
23             dict[p[0]] = p[1]
24         }
25         return dict
26     }
27 }
28
29 class HMAPIResponse: NSObject {
30     let api: String
31     let parameter: [String:String]
32     let json: [String:Any]
33     let date: Date
34     var success: Bool {
35         if let r = json["api_result"] as? Int { return r == 1 }
36         return false
37     }
38     
39     #if ENABLE_JSON_LOG
40     let argumentArray: [[String:String]]
41     #endif
42     
43     init?(request: NSURLRequest, data: Data) {
44         date = Date()
45         
46         let prefix = "svdata="
47         guard let string = String(data: data, encoding: .utf8),
48             string.hasPrefix(prefix)
49             else {
50                 print("data is wrong")
51                 return nil
52         }
53         let start = string.index(string.startIndex, offsetBy: prefix.characters.count)
54         let jsonString = string[start..<string.endIndex]
55         guard let jsonData = jsonString.data(using: .utf8),
56             let j = parseJSON(jsonData)
57             else {
58                 print("Can not parse JSON")
59                 return nil
60         }
61         json = j
62         
63         guard let requestBodyData = request.httpBody,
64             let paramStr = String(data: requestBodyData, encoding: .utf8),
65             let unescaped = paramStr.removingPercentEncoding
66             else {
67                 print("Can not parse Parameter")
68                 return nil
69         }
70         parameter = parseParameter(unescaped)
71         
72         guard let a = request.url?.path
73             else {
74                 print("URLRequest is wrong")
75                 return nil
76         }
77         api = a
78         
79         #if ENABLE_JSON_LOG
80             argumentArray = parameter.map { (key, value) in
81                 ["key": key, "value": value]
82             }
83         #endif
84         
85         super.init()
86     }
87 }