知りたいのですが、応答ストリームでヘッダーが終了する場所を見つける可能性はありますか?
質問の背景は次のとおりです。私は c でソケットを使用して Web サイトからコンテンツを取得しています。コンテンツは gzip でエンコードされています。コンテンツをストリームから直接読み取り、gzip コンテンツを zlib でエンコードしたいと考えています。しかし、gzip コンテンツが開始され、http ヘッダーが終了したことをどのように知ることができますか。
私の意見では、奇妙な結果が得られる2つの方法を大まかに試しました。最初に、ストリーム全体を読み取り、ターミナルで出力します。http ヘッダーは、予想どおり「\r\n\r\n」で終わりますが、2 回目は、ヘッダーを取得するために応答を 1 回取得するだけです。次に、while ループでコンテンツを読み取ります。ここでは、ヘッダーは「\r\n\r\n」なしで終了します。
なんで?そして、コンテンツを読む正しい方法はどれですか?
サーバーからの応答をどのように取得しているかを確認できるように、コードを提供します。
//first way (gives rnrn)
char *output, *output_header, *output_content, **output_result;
size_t size;
FILE *stream;
stream = open_memstream (&output, &size);
char BUF[BUFSIZ];
while(recv(socket_desc, BUF, (BUFSIZ - 1), 0) > 0)
{
fprintf (stream, "%s", BUF);
}
fflush(stream);
fclose(stream);
output_result = str_split(output, "\r\n\r\n");
output_header = output_result[0];
output_content = output_result[1];
printf("Header:\n%s\n", output_header);
printf("Content:\n%s\n", output_content);
.
//second way (doesnt give rnrn)
char *content, *output_header;
size_t size;
FILE *stream;
stream = open_memstream (&content, &size);
char BUF[BUFSIZ];
if((recv(socket_desc, BUF, (BUFSIZ - 1), 0) > 0)
{
output_header = BUF;
}
while(recv(socket_desc, BUF, (BUFSIZ - 1), 0) > 0)
{
fprintf (stream, "%s", BUF); //i would just use this as input stream to zlib
}
fflush(stream);
fclose(stream);
printf("Header:\n%s\n", output_header);
printf("Content:\n%s\n", content);
どちらも同じ結果を端末に出力しますが、2番目の結果は、文字列の分割で失われるため、少なくともいくつかのブレークを出力するはずです。
私はcが初めてなので、簡単なことを監督するだけかもしれません。