“Stream is sending an event before being opened”

2019-01-22 07:11发布

问题:

I'm trying to make a SOAP request with Swift. Running the latest Xcode/iOS as of 9/9/14. I use an NSMutableURLRequest that I add an HTTPBody to with the request info. However, Once I start an NSURLConnection with the request, I get an error "Stream xxxxxxxxx is sending an event before being opened". I'm not using any networking libraries, just a plain old NSURLConnection. Any thoughts on what could cause this error? Thanks!

Relevant code in use:

func createSOAPRequestWithEnvelope(soapEnvelope : String) {
    //create request
    var url = NSURL(string: "https://my-service-url")
    var req = NSMutableURLRequest(URL: url, cachePolicy: NSURLRequestCachePolicy.UseProtocolCachePolicy, timeoutInterval: 5000)

    req.addValue("text/xml",    forHTTPHeaderField: "Content-Type")
    req.HTTPMethod = "POST"
    req.HTTPBody = soapEnvelope.dataUsingEncoding(NSUTF8StringEncoding)

    //begin connection
    var connection = NSURLConnection(request: req, delegate: self, startImmediately: false)
    connection.scheduleInRunLoop(NSRunLoop.mainRunLoop(), forMode: NSDefaultRunLoopMode)

    connection.start() //error happens after this command :(
}

//takes care of NTLM Authentication
func connection(connection: NSURLConnection!, didReceiveAuthenticationChallenge challenge: NSURLAuthenticationChallenge!) {
    var authMethod = challenge.protectionSpace.authenticationMethod

    if authMethod == NSURLAuthenticationMethodNTLM {
        var credential = NSURLCredential(user: self.username,
            password: self.password,
            persistence: NSURLCredentialPersistence.ForSession)

        challenge.sender.useCredential(credential, forAuthenticationChallenge: challenge)
    }
}

func connection(connection: NSURLConnection!, didReceiveResponse response: NSURLResponse!) {
    // Response received, clear out data
    self.transactionData = NSMutableData()
}

func connection(connection: NSURLConnection!, didReceiveData data: NSData!) {
    // Store received data
    self.transactionData?.appendData(data)
}

回答1:

The issue with Stream not Open seems to be directly i CFNetwork implementation. (reproducible when using NSConnection and also NSSession). It occurs for requests (responses) that needs to be chunked. A side-effect of this issue is that windows authentication is not working properly and each request needs to go through complete handshaking process. And it is not fixed also in iOS 8.1.



回答2:

I searched everywhere for this problem and ultimately I was passing the wrong credentials at didReceiveAuthenticationChallenge :(

Check if you are accidentally doing the same too

If that doesn't work try this:

Embed your credentials in the url string

NSString *urlString = @"http://username:password@domain.com/home";
[webview loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:urlString]]];