Download.swift 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. //
  2. // Download.swift
  3. // Runner
  4. //
  5. // Created by Yayan Dwi on 24/04/20.
  6. // Copyright © 2020 The Chromium Authors. All rights reserved.
  7. //
  8. import Foundation
  9. import Alamofire
  10. public class Download {
  11. public init() {}
  12. var delegate : DownloadDelegate?
  13. public func getDelegate() -> DownloadDelegate? {
  14. return delegate
  15. }
  16. private var downloadBufferQueue = DispatchQueue(label: "DOWNLOAD_BUFFER", attributes: .concurrent)
  17. var DOWNLOAD_BUFFER = [Data?]()
  18. var DOWNLOAD_SESSION = [Session]()
  19. var DOWNLOAD_URL = Utils.getURLBase() + "filepalio/image/"
  20. var DOWNLOAD_URL_BACKUP = Utils.getURLBase() + "filepalio/backuprestore/"
  21. public func start(forKey: String, delegate: DownloadDelegate){
  22. self.delegate = delegate
  23. let download = Nexilis.getDownload(forKey: forKey)
  24. if download == nil {
  25. Nexilis.addDownload(forKey: forKey, download: self)
  26. }
  27. _ = Nexilis.write(message: CoreMessage_TMessageBank.getImageDownload(p_image_id: forKey))
  28. }
  29. var onDownloadProgress: ((String, Double) -> ())?
  30. public func start(forKey: String, completion: @escaping (String, Double)->()) {
  31. self.onDownloadProgress = completion
  32. let download = Nexilis.getDownload(forKey: forKey)
  33. if download == nil {
  34. Nexilis.addDownload(forKey: forKey, download: self)
  35. }
  36. _ = Nexilis.write(message: CoreMessage_TMessageBank.getImageDownload(p_image_id: forKey))
  37. }
  38. public func startHTTP(forKey: String, downloadUrl: String, completion: @escaping (String, Double)->()) {
  39. startHTTP(filename: forKey, baseURL: downloadUrl, completion: completion)
  40. }
  41. public func startHTTP(forKey: String, isBackup: Bool = false, completion: @escaping (String, Double)->()) {
  42. startHTTP(filename: forKey, baseURL: isBackup ? DOWNLOAD_URL_BACKUP : DOWNLOAD_URL, completion: completion)
  43. }
  44. public func startHTTP(filename: String, baseURL: String, completion: @escaping (String, Double)->()) {
  45. let download = Nexilis.getDownload(forKey: filename)
  46. if download == nil {
  47. Nexilis.addDownload(forKey: filename, download: self)
  48. var sep = ""
  49. if baseURL.last != "/" {
  50. sep = "/"
  51. }
  52. var fullURL = "\(baseURL)\(sep)\(filename)"
  53. if let encodedUrlString = fullURL.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) {
  54. fullURL = encodedUrlString
  55. }
  56. let BOUNDARY = "esuploader-" + "\(Date().currentTimeMillis())"
  57. let MIME_TYPE = "multipart/form-data; boundary=" + BOUNDARY
  58. let headers: HTTPHeaders = [
  59. "Content-Type": MIME_TYPE,
  60. "Host": Utils.getURLBase().components(separatedBy: "/")[2],
  61. "Accept-Encoding": "gzip, deflate, br",
  62. "Connection": "Keep-Alive",
  63. "Accept": "*/*",
  64. "User-Agent": Utils.getUserAgent(),
  65. "Cookie": Utils.getCookiesMobile()
  66. ]
  67. // print("FULL URL: \(fullURL)")
  68. do {
  69. _ = SessionManager.shared.session.download(fullURL, headers: headers)
  70. .downloadProgress(queue: downloadBufferQueue) { progress in
  71. let frac = progress.fractionCompleted*100
  72. if frac != 100.0 {
  73. completion(filename,frac)
  74. }
  75. }
  76. .responseData { result in
  77. if let response = result.response, response.statusCode == 200, let successResponse = result.value {
  78. // print("Response success")
  79. do {
  80. let dResponse = FileEncryption.shared.decryptFileFromServer(data: successResponse)
  81. if dResponse != nil {
  82. try FileEncryption.shared.writeSecure(filename: filename, data: dResponse!)
  83. } else {
  84. try FileEncryption.shared.writeSecure(filename: filename, data: successResponse)
  85. }
  86. _ = Nexilis.removeDownload(forKey: filename)
  87. }
  88. catch {}
  89. completion(filename,100)
  90. }
  91. else {
  92. // let statusCode = result.response?.statusCode
  93. // print("Response fail: \(result.debugDescription)")
  94. completion(filename,-100)
  95. }
  96. }
  97. }
  98. catch {}
  99. }
  100. }
  101. func put(part: Int, buffer: Data){
  102. downloadBufferQueue.async (flags: .barrier){
  103. self.DOWNLOAD_BUFFER.insert(buffer, at: part)
  104. }
  105. }
  106. func size() -> Int {
  107. var size = 0
  108. downloadBufferQueue.sync {
  109. for b in DOWNLOAD_BUFFER {
  110. size += b?.count ?? 0
  111. }
  112. }
  113. return size
  114. }
  115. func remove() -> Data {
  116. var result = Data()
  117. downloadBufferQueue.sync {
  118. for i in DOWNLOAD_BUFFER {
  119. if let b = i {
  120. result.append(contentsOf: b)
  121. }
  122. }
  123. }
  124. return result
  125. }
  126. }
  127. public class SessionManager {
  128. static let shared = SessionManager()
  129. let session: Session
  130. private init() {
  131. let sessionConfiguration = URLSessionConfiguration.default
  132. sessionConfiguration.timeoutIntervalForRequest = 60
  133. let serverTrustManager = ServerTrustManager(allHostsMustBeEvaluated: false,
  134. evaluators: [Utils.getURLBase().components(separatedBy: "/")[2]: DisabledTrustEvaluator()])
  135. self.session = Session(configuration: sessionConfiguration, serverTrustManager: serverTrustManager)
  136. }
  137. }