1

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

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

(代码可根据要求提供,有很多)

Apple 文档在这个主题上通常保持沉默,我想知道是否有人知道 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);

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

4

0 回答 0