|
| 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 | +} |
0 commit comments