/ Sources / FoundationNetworking / URLSession / URLSessionTaskMetrics.swift
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  }