URLSessionTaskMetrics.swift
1 // Foundation/URLSession/URLSessionTaskMetrics.swift - URLSession API 2 // 3 // This source file is part of the Swift.org open source project 4 // 5 // Copyright (c) 2020 Apple Inc. and the Swift project authors 6 // Licensed under Apache License v2.0 with Runtime Library Exception 7 // 8 // See http://swift.org/LICENSE.txt for license information 9 // See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors 10 // 11 // ----------------------------------------------------------------------------- 12 /// 13 /// URLSession API code. 14 /// - SeeAlso: URLSession.swift 15 /// 16 // ----------------------------------------------------------------------------- 17 18 #if os(macOS) || os(iOS) || os(watchOS) || os(tvOS) 19 import SwiftFoundation 20 #else 21 import Foundation 22 #endif 23 @_implementationOnly import CoreFoundation 24 25 open class URLSessionTaskMetrics : NSObject { 26 public internal(set) var transactionMetrics: [URLSessionTaskTransactionMetrics] = [] 27 public internal(set) var taskInterval: DateInterval = .init() 28 public internal(set) var redirectCount = 0 29 30 public enum ResourceFetchType: Int { 31 case unknown = 0 32 case networkLoad = 1 33 case serverPush = 2 34 case localCache = 3 35 } 36 37 public enum DomainResolutionProtocol: Int { 38 case unknown = 0 39 case udp = 1 40 case tcp = 2 41 case tls = 3 42 case https = 4 43 } 44 } 45 46 open class URLSessionTaskTransactionMetrics: NSObject { 47 public let request: URLRequest 48 public internal(set) var response: URLResponse? 49 50 public internal(set) var fetchStartDate: Date? 51 public internal(set) var domainLookupStartDate: Date? 52 public internal(set) var domainLookupEndDate: Date? 53 public internal(set) var connectStartDate: Date? 54 public internal(set) var secureConnectionStartDate: Date? 55 public internal(set) var secureConnectionEndDate: Date? 56 public internal(set) var connectEndDate: Date? 57 public internal(set) var requestStartDate: Date? 58 public internal(set) var requestEndDate: Date? 59 public internal(set) var responseStartDate: Date? 60 public internal(set) var responseEndDate: Date? 61 62 public internal(set) var countOfRequestBodyBytesBeforeEncoding: Int64 = 0 63 public internal(set) var countOfRequestBodyBytesSent: Int64 = 0 64 public internal(set) var countOfRequestHeaderBytesSent: Int64 = 0 65 public internal(set) var countOfResponseBodyBytesAfterDecoding: Int64 = 0 66 public internal(set) var countOfResponseBodyBytesReceived: Int64 = 0 67 public internal(set) var countOfResponseHeaderBytesReceived: Int64 = 0 68 69 public internal(set) var networkProtocolName: String? 70 public internal(set) var remoteAddress: String? 71 public internal(set) var remotePort: String? 72 public internal(set) var localAddress: String? 73 public internal(set) var localPort: String? 74 public internal(set) var negotiatedTLSCipherSuite: tls_ciphersuite_t? 75 public internal(set) var negotiatedTLSProtocolVersion: tls_protocol_version_t? 76 public internal(set) var isCellular: Bool = false 77 public internal(set) var isExpensive: Bool = false 78 public internal(set) var isConstrained: Bool = false 79 public internal(set) var isProxyConnection: Bool = false 80 public internal(set) var isReusedConnection: Bool = false 81 public internal(set) var isMultipath: Bool = false 82 public internal(set) var resourceFetchType: URLSessionTaskMetrics.ResourceFetchType = .unknown 83 public internal(set) var domainResolutionProtocol: URLSessionTaskMetrics.DomainResolutionProtocol = .unknown 84 85 init(request: URLRequest) { 86 self.request = request 87 } 88 } 89 90 public enum tls_ciphersuite_t: UInt16 { 91 case AES_128_GCM_SHA256 = 4865 92 case AES_256_GCM_SHA384 = 4866 93 94 case CHACHA20_POLY1305_SHA256 = 4867 95 96 case ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA = 49160 97 case ECDHE_ECDSA_WITH_AES_128_CBC_SHA = 49161 98 case ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 = 49187 99 case ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 = 49195 100 case ECDHE_ECDSA_WITH_AES_256_CBC_SHA = 49162 101 case ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 = 49188 102 case ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 = 49196 103 case ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 = 52393 104 case ECDHE_RSA_WITH_3DES_EDE_CBC_SHA = 49170 105 case ECDHE_RSA_WITH_AES_128_CBC_SHA = 49171 106 case ECDHE_RSA_WITH_AES_128_CBC_SHA256 = 49191 107 case ECDHE_RSA_WITH_AES_128_GCM_SHA256 = 49199 108 case ECDHE_RSA_WITH_AES_256_CBC_SHA = 49172 109 case ECDHE_RSA_WITH_AES_256_CBC_SHA384 = 49192 110 case ECDHE_RSA_WITH_AES_256_GCM_SHA384 = 49200 111 case ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 = 52392 112 113 case RSA_WITH_3DES_EDE_CBC_SHA = 10 114 case RSA_WITH_AES_128_CBC_SHA = 47 115 case RSA_WITH_AES_128_CBC_SHA256 = 60 116 case RSA_WITH_AES_128_GCM_SHA256 = 156 117 case RSA_WITH_AES_256_CBC_SHA = 53 118 case RSA_WITH_AES_256_CBC_SHA256 = 61 119 case RSA_WITH_AES_256_GCM_SHA384 = 157 120 } 121 122 public enum tls_protocol_version_t: UInt16 { 123 case TLSv10 = 769 124 case TLSv11 = 770 125 case TLSv12 = 771 126 case TLSv13 = 772 127 case DTLSv10 = 65279 128 case DTLSv12 = 65277 129 }