DDRouter/Utility/NetworkLogger.swift (57 lines of code) (raw):

import Foundation class NetworkLogger { static func log(request: URLRequest) { let urlString = request.url?.absoluteString ?? "" let urlComponents = NSURLComponents(string: urlString) let method = request.httpMethod ?? "" let path = "\(urlComponents?.path ?? "")" let query = "\(urlComponents?.query ?? "")" let host = "\(urlComponents?.host ?? "")" var logOutput = """ \(urlString) \n\n \(method) \(path)?\(query) HTTP/1.1 \n HOST: \(host)\n """ for (key, value) in request.allHTTPHeaderFields ?? [:] { logOutput += "\(key): \(value)\n" } if let body = request.httpBody { logOutput += "\n \(String(data: body, encoding: .utf8) ?? "")" } print("\n - - - - - - - - - - OUTGOING - - - - - - - - - - \n") print(logOutput) print("\n - - - - - - - - - - - - - - - - - - - - - - - - \n") } static func log(response: URLResponse) { guard let httpResponse = response as? HTTPURLResponse else { print("Not HTTP response.") print("MIME-TYPE: \(response.mimeType ?? "nil")") return } var logOutput = "\(httpResponse.statusCode)\n\n" httpResponse.allHeaderFields.forEach { logOutput += "\($0): \($1)\n" } print("\n - - - - - - - - - - INCOMING - - - - - - - - - - \n") print(logOutput) print("\n - - - - - - - - - - - - - - - - - - - - - - - - \n") } static func printJSONData(data: Data) { guard let object = try? JSONSerialization.jsonObject( with: data, options: [] ), let prettyData = try? JSONSerialization.data( withJSONObject: object, options: [.prettyPrinted] ), let prettyPrintedString = String( data: prettyData, encoding: .utf8 ) else { let rawString = String(data: data, encoding: .utf8) ?? "" print("----- Non-JSON Response\n\n\(rawString)") return } print(prettyPrintedString) } }