diff --git a/Pulse/Sources/PulseCore/LoggerStore.swift b/Pulse/Sources/PulseCore/LoggerStore.swift index 7d3dee114..4ac88fe86 100644 --- a/Pulse/Sources/PulseCore/LoggerStore.swift +++ b/Pulse/Sources/PulseCore/LoggerStore.swift @@ -238,7 +238,7 @@ extension LoggerStore { request: NetworkLoggerRequest(urlRequest: urlRequest), response: context.response.map(NetworkLoggerResponse.init), error: context.error.map(NetworkLoggerError.init), - requestBody: urlRequest.httpBody, + requestBody: urlRequest.httpBody ?? urlRequest.httpBodyStreamData(), responseBody: context.data, metrics: context.metrics ) @@ -551,3 +551,32 @@ public enum LoggerStoreError: Error, LocalizedError { } } } + + +fileprivate extension URLRequest { + + func httpBodyStreamData() -> Data? { + guard let bodyStream = self.httpBodyStream else { + return nil + } + + bodyStream.open() + defer { + buffer.deallocate() + bodyStream.close() + } + + // Will read 16 chars per iteration. Can use bigger buffer if needed + let bufferSize: Int = 16 + let buffer = UnsafeMutablePointer.allocate(capacity: bufferSize) + + var bodyStreamData = Data() + + while bodyStream.hasBytesAvailable { + let readData = bodyStream.read(buffer, maxLength: bufferSize) + bodyStreamData.append(buffer, count: readData) + } + + return bodyStreamData + } +}