views:

93

answers:

1

Hi,

I'm having trouble with a CFReadStream operation that seems to block for an extrodinarily long time after the last read. I can't seem to see anything wrong with my logic. I connect my readstream to a socket using the CFStreamCreatePairWithSocketToCFHost function. I'm sending a standard HTTP GET request over port 80 using a write stream and then attempting to load the ReadStream into a CFMTTHMessageRef object. I do this all from within a unit test which green-bars but takes for ever. I'm certain it has nothing to do with the server as I can get rapid responses using NSURLRequest using the same request. Here's my loop that hangs:

  CFDataRef responseBody = CFDataCreateMutable(kCFAllocatorDefault, 0);
  CFHTTPMessageRef myMessage = CFHTTPMessageCreateEmpty(kCFAllocatorDefault, FALSE);
  CFIndex blockReadSize = 1024;
  UInt8 readBuffer[blockReadSize];
  NSLog(@"About to read stream...");
  CFIndex totoalRead = 0;
  for(CFIndex bytesRead = CFReadStreamRead(readStream, readBuffer, blockReadSize); bytesRead > 0; bytesRead = CFReadStreamRead(readStream, readBuffer, blockReadSize)) {
    totoalRead += bytesRead;
    NSLog(@"Reading stream... %i bytes read.", bytesRead);
    if (!CFHTTPMessageAppendBytes(myMessage, readBuffer, bytesRead)) {
      //Parse error
      NSLog(@"HTTP Read/Parse error!");
    }else{
      if (CFHTTPMessageIsHeaderComplete(myMessage)) {
        // Perform processing.
        NSLog(@"Header Complete");
      }else NSLog(@"Reading header");
    }
  }
  NSLog(@"Total bytes read %i", totoalRead);
  responseBody = CFHTTPMessageCopyBody(myMessage);

It is at the last read which returns zero indicating EOF that hangs for about 1-3 minutes. Where am I going wrong?

A: 

I finally figured this out. I was testing HTTP Pipelining through the CF network API and because I wasn't closing my server connection on the write stream the last read on the read stream would block because the socket was still open and available for more server data.

Cliff