4

簡単な質問 - HTTP 応答のステータス行の最大サイズはありますか?

RFC では、この情報を見つけることができませんでした。次のようなものです。

Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF

これによると、次のように推測できます。

  • HTTP バージョンは通常 8 バイトです (例HTTP/1.1 )
  • ステータス コードは 3 バイトです
  • 2 スペース + CRLF は 4 バイト
  • Reason-Phrase -> RFC によると最長はRequested range not satisfiable31 バイト

これは合計 46 バイトになります。

この仮定は正しいですか、それとも何か見逃しましたか?

アップデート:

以下の回答により、私の問題を少しだけ特定したいと思います。

サーバーからの TCP メッセージを含むある種のログ ファイルを解析しています。今、私が気にしないランダムなデータと、読みたいHTTPメッセージがいくつかあります。取得したすべてのデータを解析して\r\n、ステータス ラインを見つけます。ヘッダーがいくつかの TCP パッケージに分割されていると仮定する必要があるため、すべてのデータをバッファリングして解析します。

ヘッダー ステータス ラインの最大サイズがない場合は、次に\r\n発生するまですべてのデータをバッファリングする必要があります。最悪の場合、これはランダム データを数キロバイト単位で保存することを意味します。これは、ヘッダー ステータス ラインの一部になる可能性があるためです (おそらくそうではないでしょう)。

それとも、この場合、CRLF の代わりに HTTP バージョン文字列を解析するのが適切でしょうか?

4

2 に答える 2

4

RFC 2616、6.1.1:

ここにリストされている理由フレーズは単なる推奨事項です。プロトコルに影響を与えることなく、ローカルの同等のフレーズに置き換えることができます。

これとは別に、新しいコードがHTTPクライアントに追加の要件を導入しない限り、HTTPプロトコルはHTTPバージョンを1.2に変更せずに(新しいRFCで)ステータスコードを追加することを「許可」されます。クライアントは、応答をキャッシュしてはならないことを除いて、不明なステータスコードをx00(xは取得したコードの最初の桁で応答のカテゴリを示す)であるかのように扱うことになっています。

したがって、唯一の制限は、HTTPヘッダー行または応答ヘッダーの合計の最大長です。私が見る限り、RFCは制限を定義していませんが、特定のサーバーが独自の制限を課しています。

確信できるのは、ユーザーエージェントが理由フレーズを完全に無視する可能性があるということです。したがって、大きい場合は、小さな断片で読んで、CRLFに到達するまで一度に1つずつ捨てることができます。人間が読める形式のメッセージを表示する場合は、サーバーが送信する理由フレーズに関係なく、サーバーが提供するステータスコードに推奨される理由フレーズを使用できます。

于 2012-03-01T09:20:30.943 に答える
0

ReasonPHrase の長さに制限はないと思います。W3C のドキュメントでは、これは「短いメッセージ」であると述べられていますが、これは正規のものではありません。

バージョンが8文字だとは思いません。おそらく、将来のバージョンは 3 桁になる可能性があります。つまり、HTTP/10.1 です。構文では、Version が SPACE で区切られていることを指定しているため、最初の SPACE で停止して解析します。

https://www.w3.org/Protocols/rfc2616/rfc2616-sec6.html

Reason-Phrase は、Status-Code の短いテキスト記述を提供することを目的としています。Status-Code はオートマトンによる使用を意図しており、Reason-Phrase は人間のユーザーを対象としています。クライアントは、Reason-Phrase を調べたり表示したりする必要はありません。

于 2016-05-24T20:01:14.963 に答える