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