最近、iOS/OSX 用の c++ で非同期 HTTP クライアントを作成しました。ヘッダーを含むストリームのプロパティとしてオブジェクトが潜んでいることに気付くまで (kCFStreamEventBytesAvailable イベントを処理した後)、CFHTTPMessageRef 応答オブジェクトにヘッダーが到着しない理由について混乱しました。
そのため、イベント ハンドラーを呼び出す前に、ストリーム終了の通知中にヘッダーをプロパティから応答オブジェクトにコピーします。
(コードはリクエストに応じて入手できます。かなりたくさんあります)
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);
ストリームの応答メッセージ オブジェクトは実際に新しい本文データで更新されます。なぜこれがストリームによって自動的に行われないのか、私は興味がありますか?