1*5e36fcbeSKudo Chien // Copyright 2015-present 650 Industries. All rights reserved.
2*5e36fcbeSKudo Chien 
3*5e36fcbeSKudo Chien import Foundation
4*5e36fcbeSKudo Chien 
5*5e36fcbeSKudo Chien /**
6*5e36fcbeSKudo Chien  `URLRequest.httpBodyData()` extension to read the underlying `httpBodyStream` as Data.
7*5e36fcbeSKudo Chien  */
8*5e36fcbeSKudo Chien extension URLRequest {
httpBodyDatanull9*5e36fcbeSKudo Chien   func httpBodyData(limit: Int = ExpoRequestInterceptorProtocol.MAX_BODY_SIZE) -> Data? {
10*5e36fcbeSKudo Chien     if let httpBody = self.httpBody {
11*5e36fcbeSKudo Chien       return httpBody
12*5e36fcbeSKudo Chien     }
13*5e36fcbeSKudo Chien 
14*5e36fcbeSKudo Chien     if let contentLength = self.allHTTPHeaderFields?["Content-Length"],
15*5e36fcbeSKudo Chien       let contentLengthInt = Int(contentLength),
16*5e36fcbeSKudo Chien       contentLengthInt > limit {
17*5e36fcbeSKudo Chien       return nil
18*5e36fcbeSKudo Chien     }
19*5e36fcbeSKudo Chien     guard let stream = self.httpBodyStream else {
20*5e36fcbeSKudo Chien       return nil
21*5e36fcbeSKudo Chien     }
22*5e36fcbeSKudo Chien 
23*5e36fcbeSKudo Chien     let bufferSize: Int = 8192
24*5e36fcbeSKudo Chien     let buffer = UnsafeMutablePointer<UInt8>.allocate(capacity: bufferSize)
25*5e36fcbeSKudo Chien 
26*5e36fcbeSKudo Chien     stream.open()
27*5e36fcbeSKudo Chien     defer {
28*5e36fcbeSKudo Chien       buffer.deallocate()
29*5e36fcbeSKudo Chien       stream.close()
30*5e36fcbeSKudo Chien     }
31*5e36fcbeSKudo Chien 
32*5e36fcbeSKudo Chien     var data = Data()
33*5e36fcbeSKudo Chien     while stream.hasBytesAvailable {
34*5e36fcbeSKudo Chien       let chunkSize = stream.read(buffer, maxLength: bufferSize)
35*5e36fcbeSKudo Chien       if data.count + chunkSize > limit {
36*5e36fcbeSKudo Chien         return nil
37*5e36fcbeSKudo Chien       }
38*5e36fcbeSKudo Chien       data.append(buffer, count: chunkSize)
39*5e36fcbeSKudo Chien     }
40*5e36fcbeSKudo Chien 
41*5e36fcbeSKudo Chien     return data
42*5e36fcbeSKudo Chien   }
43*5e36fcbeSKudo Chien }
44