What is kCFStreamErrorCodeKey=-4 (kCFStreamErrorDomainKey=4)

Hi,

Got the following error when connecting to a server (which I'm not in control of): Error Domain=NSURLErrorDomain Code=-1005 "The network connection was lost." UserInfo={_kCFStreamErrorCodeKey=-4, NSUnderlyingError=0x6000034bd530 {Error Domain=kCFErrorDomainCFNetwork Code=-1005 "(null)" UserInfo={NSErrorPeerAddressKey=<CFData 0x6000018f02d0 [0x7fff8a349bf0]>{length = 16, capacity = 16, bytes = 0x100201bb8b7011830000000000000000}, _kCFStreamErrorCodeKey=-4, _kCFStreamErrorDomainKey=4}

Looks like NSURLErrorDomain Code=-1005 is: https://developer.apple.com/documentation/cfnetwork/cfnetworkerrors/cfurlerrornetworkconnectionlost

But couldn't find what kCFStreamErrorCodeKey=-4 means.

Is this error code defined anywhere (for example in a header file)? Or is it only an internal error code?

Br, Johan

Answered by DTS Engineer in 691913022

With regards the domain value in CFStreamError, here’s a quick decoder ring:

NumberIdentifierHeader
-1CFStreamErrorDomain.custom<CoreFoundation/CFStream.h>
1CFStreamErrorDomain.POSIX<CoreFoundation/CFStream.h>
2CFStreamErrorDomain.macOSStatus<CoreFoundation/CFStream.h>
3kCFStreamErrorDomainSSL<CoreFoundation/CFStream.h>
4kCFStreamErrorDomainHTTP<CFNetwork/CFHTTPStream.h>
5kCFStreamErrorDomainSOCKS<CoreFoundation/CFStream.h>
6kCFStreamErrorDomainFTP<CFNetwork/CFFTPStream.h>
7kCFStreamErrorDomainWinSock<CFNetwork/CFSocketStream.h>
10kCFStreamErrorDomainNetServices<CFNetwork/CFNetServices.h>
11kCFStreamErrorDomainMach<CFNetwork/CFNetServices.h>
12kCFStreamErrorDomainNetDB<CFNetwork/CFHost.h>

So a domain of 4 translates to kCFStreamErrorDomainHTTP.

The code value of -4 is trickier. AFAICT this isn’t in any public header (the closest public declaration is kCFStreamErrorHTTPBadURL, which is -3). Looking at the code it seems that -4 translates to a ‘connection lost’ error.

Share and Enjoy

Quinn “The Eskimo!” @ Developer Technical Support @ Apple
let myEmail = "eskimo" + "1" + "@" + "apple.com"

ps Here’s the code that generates that table:

import Foundation

struct ErrorDomainInfo {
    var number: Int
    var name: String
    var header: String
    init(_ number: Int, _ name: String, _ header: String) {
        self.number = number ; self.name = name ; self.header = header
    }
    init(_ number: Int32, _ name: String, _ header: String) {
        self.number = Int(number) ; self.name = name ; self.header = header
    }
}

let domains: [ErrorDomainInfo] = [
    .init(kCFStreamErrorDomainSOCKS, "kCFStreamErrorDomainSOCKS", "<CoreFoundation/CFStream.h>"),
    .init(kCFStreamErrorDomainFTP, "kCFStreamErrorDomainFTP", "<CFNetwork/CFFTPStream.h>"),
    .init(kCFStreamErrorDomainHTTP, "kCFStreamErrorDomainHTTP", "<CFNetwork/CFHTTPStream.h>"),
    .init(kCFStreamErrorDomainNetDB, "kCFStreamErrorDomainNetDB", "<CFNetwork/CFHost.h>"),
    .init(kCFStreamErrorDomainMach, "kCFStreamErrorDomainMach", "<CFNetwork/CFNetServices.h>"),
    .init(kCFStreamErrorDomainNetServices, "kCFStreamErrorDomainNetServices", "<CFNetwork/CFNetServices.h>"),
    .init(kCFStreamErrorDomainWinSock, "kCFStreamErrorDomainWinSock", "<CFNetwork/CFSocketStream.h>"),
    .init(kCFStreamErrorDomainSSL, "kCFStreamErrorDomainSSL", "<CoreFoundation/CFStream.h>"),
    .init(CFStreamErrorDomain.custom.rawValue, "CFStreamErrorDomain.custom", "<CoreFoundation/CFStream.h>"),
    .init(CFStreamErrorDomain.POSIX.rawValue, "CFStreamErrorDomain.POSIX", "<CoreFoundation/CFStream.h>"),
    .init(CFStreamErrorDomain.macOSStatus.rawValue, "CFStreamErrorDomain.macOSStatus", "<CoreFoundation/CFStream.h>"),
]

func main() {
    func pad(_ s: String, _ width: Int) -> String {
        s.withCString {
            String(format: "%\(width < 0 ? "-" : "")*s", abs(width), $0)
        }
    }
    print("|", pad("**Number**", 10), "|", pad("**Identifier**", -33), "|", pad("**Header**", -30), "|")
    print("|", pad("----------", 10), "|", pad("--------------", -33), "|", pad("----------", -30), "|")
    for d in domains.sorted(by: { $0.number < $1.number }) {
        print("|", pad("\(d.number)", 10), "|", pad("`\(d.name)`", -33), "|", pad("`\(d.header)`", -30), "|")
    }
}

main()
Accepted Answer

With regards the domain value in CFStreamError, here’s a quick decoder ring:

NumberIdentifierHeader
-1CFStreamErrorDomain.custom<CoreFoundation/CFStream.h>
1CFStreamErrorDomain.POSIX<CoreFoundation/CFStream.h>
2CFStreamErrorDomain.macOSStatus<CoreFoundation/CFStream.h>
3kCFStreamErrorDomainSSL<CoreFoundation/CFStream.h>
4kCFStreamErrorDomainHTTP<CFNetwork/CFHTTPStream.h>
5kCFStreamErrorDomainSOCKS<CoreFoundation/CFStream.h>
6kCFStreamErrorDomainFTP<CFNetwork/CFFTPStream.h>
7kCFStreamErrorDomainWinSock<CFNetwork/CFSocketStream.h>
10kCFStreamErrorDomainNetServices<CFNetwork/CFNetServices.h>
11kCFStreamErrorDomainMach<CFNetwork/CFNetServices.h>
12kCFStreamErrorDomainNetDB<CFNetwork/CFHost.h>

So a domain of 4 translates to kCFStreamErrorDomainHTTP.

The code value of -4 is trickier. AFAICT this isn’t in any public header (the closest public declaration is kCFStreamErrorHTTPBadURL, which is -3). Looking at the code it seems that -4 translates to a ‘connection lost’ error.

Share and Enjoy

Quinn “The Eskimo!” @ Developer Technical Support @ Apple
let myEmail = "eskimo" + "1" + "@" + "apple.com"

ps Here’s the code that generates that table:

import Foundation

struct ErrorDomainInfo {
    var number: Int
    var name: String
    var header: String
    init(_ number: Int, _ name: String, _ header: String) {
        self.number = number ; self.name = name ; self.header = header
    }
    init(_ number: Int32, _ name: String, _ header: String) {
        self.number = Int(number) ; self.name = name ; self.header = header
    }
}

let domains: [ErrorDomainInfo] = [
    .init(kCFStreamErrorDomainSOCKS, "kCFStreamErrorDomainSOCKS", "<CoreFoundation/CFStream.h>"),
    .init(kCFStreamErrorDomainFTP, "kCFStreamErrorDomainFTP", "<CFNetwork/CFFTPStream.h>"),
    .init(kCFStreamErrorDomainHTTP, "kCFStreamErrorDomainHTTP", "<CFNetwork/CFHTTPStream.h>"),
    .init(kCFStreamErrorDomainNetDB, "kCFStreamErrorDomainNetDB", "<CFNetwork/CFHost.h>"),
    .init(kCFStreamErrorDomainMach, "kCFStreamErrorDomainMach", "<CFNetwork/CFNetServices.h>"),
    .init(kCFStreamErrorDomainNetServices, "kCFStreamErrorDomainNetServices", "<CFNetwork/CFNetServices.h>"),
    .init(kCFStreamErrorDomainWinSock, "kCFStreamErrorDomainWinSock", "<CFNetwork/CFSocketStream.h>"),
    .init(kCFStreamErrorDomainSSL, "kCFStreamErrorDomainSSL", "<CoreFoundation/CFStream.h>"),
    .init(CFStreamErrorDomain.custom.rawValue, "CFStreamErrorDomain.custom", "<CoreFoundation/CFStream.h>"),
    .init(CFStreamErrorDomain.POSIX.rawValue, "CFStreamErrorDomain.POSIX", "<CoreFoundation/CFStream.h>"),
    .init(CFStreamErrorDomain.macOSStatus.rawValue, "CFStreamErrorDomain.macOSStatus", "<CoreFoundation/CFStream.h>"),
]

func main() {
    func pad(_ s: String, _ width: Int) -> String {
        s.withCString {
            String(format: "%\(width < 0 ? "-" : "")*s", abs(width), $0)
        }
    }
    print("|", pad("**Number**", 10), "|", pad("**Identifier**", -33), "|", pad("**Header**", -30), "|")
    print("|", pad("----------", 10), "|", pad("--------------", -33), "|", pad("----------", -30), "|")
    for d in domains.sorted(by: { $0.number < $1.number }) {
        print("|", pad("\(d.number)", 10), "|", pad("`\(d.name)`", -33), "|", pad("`\(d.header)`", -30), "|")
    }
}

main()
What is kCFStreamErrorCodeKey=-4 (kCFStreamErrorDomainKey=4)
 
 
Q