在OSX / IOS中CFReadStreamCreateForHTTPRequest背后的推理

时间:2014-05-18 18:20:02

标签: c++ ios macos cfnetwork cfreadstream

我最近用c ++编写了一个用于iOS / OSX的异步HTTP客户端。我很困惑为什么标头没有到达我的CFHTTPMessageRef响应对象,直到我意识到有一个对象潜伏为包含标头的流的属性(在处理kCFStreamEventBytesAvailable事件之后)。

所以现在我在调用我的事件处理程序之前,在流结束通知期间将标题从属性复制到我的响应对象中。

(可根据要求提供代码,有相当多的代码)

Apple文档在这个主题上的特点是沉默,我想知道是否有人知道苹果这个设计决定的原因。我很想知道如果我在某处有一个根本的误解?

编辑:文档说明了这一点:

  

在运行循环上安排请求后,您最终会得到   标题完整回调。此时,你可以打电话   CFReadStreamCopyProperty从读取中获取消息响应   流

但是,似乎没有迹象表明此事件掩码的名称或值是什么。

编辑: 完成了一些实验后,我发现流在发送kCFStreamEventOpenCompleted通知后和第一次kCFStreamEventHasBytesAvailable通知之前的某个时间创建了自己的响应对象。

kCFStreamEventHasBytesAvailable事件处理程序中,我可以这样做:

auto response = (CFHTTPMessageRef)CFReadStreamCopyProperty(readStream,
                                          kCFStreamPropertyHTTPResponseHeader);
constexpr CFIndex bufferSize = 1024;
UInt8 buffer[bufferSize];
auto bytesRead = CFReadStreamRead(readStream, buffer, bufferSize);
if (bytesRead > 0) {
    CFHTTPMessageAppendBytes(response, buffer, bytesRead);
}
CFRelease(response);

并且确实使用新的正文数据更新了流的响应消息对象。 现在我很好奇为什么这不仅仅是由流自动完成的?

0 个答案:

没有答案