Недавно я написал асинхронный HTTP-клиент на c ++ для iOS / OSX. Я был озадачен тем, почему заголовки не поступали в мой объект ответа 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);
и объект ответного сообщения потока действительно обновляется новыми данными тела.
Теперь мне любопытно, почему это не просто автоматически выполняется потоком?
Задача ещё не решена.