ビデオと字幕 · ダイレクト メディア ダウンローダー
リダイレクト、Content-Length、および最初のバイト: 直接ダウンロードの寿命
· 仕組み
http ダウンロード 開発者ワークフロー
ダウンロードが開始された瞬間から最初のバイトが到着するまで、いくつかの HTTP ステップが目に見えずに発生します。この投稿では、リダイレクト、応答ヘッダー、フェッチがそれらをレポートする方法、およびホストを事前に指定するツールにとってそれが何を意味するかについて説明します。
ダウンロードが開始されましたが、5 秒間何も起こりませんでした – クリックと最初のバイトの間の目に見えないステップ
[ダウンロード] を押してから 5 秒間の沈黙の間には、接続のセットアップ、リダイレクト、サーバー認証チェック、および本文チャンクが使用可能になるまでの応答ヘッダーの待機が含まれる場合があります。プログレスバーはバイトが到着するまで進むことができないため、最初の更新前の遅延によってインターフェイスが自動的にフリーズされることはありません。
ホストがクロスオリジンヘッダー読み取りを許可している場合、オプションの Check リンクは、HEAD を通じてステータス、Content-Type、Content-Length、およびバイト範囲のサポートを公開できます。どちらの呼び出しも `cache: no-store` を使用するため、これは別のリクエストであり、後の GET を高速化することが保証されたウォームアップではありません。タイミングの内訳を含むトレースは、キューイング、接続、サーバー待機、およびブラウザーによって公開される本体ダウンロードのフェーズを分離するため、感覚で待機するよりも便利です。
リクエストラインとヘッダー: ブラウザーが送信するもの — メソッド、パス、Accept、およびクロスサイトフェッチがデフォルトで保留するもの
ダウンロードでは、検証された HTTPS URL に対して GET を使用します。フェッチし、ブラウザが実際のリクエスト ヘッダーを構築します。アプリケーション コードは資格情報を明示的に省略し、リファラーを抑制します。ユーザーエージェントやリファラーのなりすまし、ログイン Cookie の添付、プラットフォーム トークンの追加は行いません。
クロスサイトリクエストには、Origin などのブラウザで制御されるコンテキストを含めることができます。正確なヘッダーはブラウザーや環境によって異なるため、DevTools が特定の実行の証拠となります。ソースは、設定されたメソッド、資格情報モード、リファラー ポリシー、キャッシュ モード、リダイレクト ポリシー、および中止シグナルを証明します。 HTTP 応答ではヘッダーの存在はオプションであり、CORS によってスクリプトの可視性が制限される可能性があるため、合計が表示されないことはファイルが空であるという証拠にはなりません。
リダイレクト: 指定したホストが別のホストに引き渡すとき - 301、302、307 の応答にどのようにフェッチが従うか、および response.url が最終アドレスを明らかにする方法
HEAD と GET の両方で `redirect: follow` を指定します。したがって、301、302、307、または別のサポートされているリダイレクトによって、リクエストをアナウンスされた最初の URL から最終リソースに移動できます。フェッチは、チェーンが応答に到達するか、ブラウザー ポリシーに基づいて失敗した後にのみ解決されます。
フェッチ応答で最終アドレスが公開されていても、ダウンローダーは `response.url` を表示しません。ホップを監査するには、ネットワーク ログを保存し、そこにあるリダイレクト行を検査します。これは、連絡前のアナウンスで提供されたホストの名前が指定されるため、重要です。サーバーが選択する場所を後で通知することはできません。 307 スタイルの保存では、メソッドのセマンティクスが一般的な書き換え動作とは異なります。これが、すべてのホップを同一であると要約するのではなくブラウザ トレースを信頼するもう 1 つの理由です。
Content-Length および Content-Type: 応答ヘッダーが約束するもの — 本文が終了する前にサイズとタイプがどのように認識されるか
Content-Type は応答にラベルを付けて Blob タイプになり、正の有限の Content-Length は予想される合計を提供します。 GET パスは、ストリーミング前に宣言された合計が 2 GiB を超えると拒否します。ヘッダーが欠落している場合、進行状況は不定のままとなり、実際に受信したバイトによってガードが適用されます。
ヘッダーはサーバーからのステートメントであり、本文が完全であること、またはそのラベルと一致することを保証するものではありません。接続が早期に終了したり、アプリケーションが MIME メタデータを誤って構成したりする可能性があります。 ToolAcre は、メディア内部の検証を主張することなく、これらの値を説明、進行状況、および命名決定に使用します。また、コードは蓄積されたバイト数をその最大値に対して再チェックし、長さが存在しない、または不正確であるためにアプリケーションのメモリ境界が無効にならないことを確認します。
動作例: リンク短縮機能を介してバウンスする「直接」リンク - ネットワーク パネルで各ホップを読み取る
短縮された許可されたリンクの場合は、DevTools を開き、ログの保存を有効にして、リンクの確認またはダウンロードから開始します。最初の行を展開してリダイレクト ステータスと公開時の場所を確認し、本文がファイルを提供する応答へのチェーンをたどります。各ホスト名を予想される発行者インフラストラクチャと比較します。
最初のバイトのタイミング列は、待機と転送を区別します。チャンクが到着すると、ToolAcre は蓄積されたバイト数を報告します。 Content-Length を使用すると、分数を計算できます。遅い最初のバイトとそれに続く速いボディは、即時の応答とそれに続く遅い持続的な転送とは異なるボトルネックを示唆しています。再試行間の比較により、キャッシュ設定とネットワーク状態の一貫性が保たれる必要があります。そうしないと、変更されたタイミング プロファイルが原点ではなくテスト セットアップを記述する可能性があります。
通知されたホストにとってリダイレクトが重要な理由 — ツールは、指定した URL を通知します。リダイレクトは他の場所につながる可能性があり、ネットワーク パネルにはその場所が表示されます。
送信されたホスト名のアナウンスは便利ですが、リダイレクトが許可されている場合は必ずしも不完全になります。信頼された短縮者は正当にストレージ CDN を指すことができますが、予期しないチェーンが組織を横断する可能性があります。インターフェイスはそのチェーンを事前に解決しません。そうすること自体に連絡が必要になるためです。
ホワイトリストを必要とするレビュー担当者は、観察されたすべてのホスト名を検証するか、短縮リンクを完全に避ける必要があります。 ToolAcre は、送信された URL 内の明らかなプライベート宛先をブロックしますが、アプリケーション コード内の各リダイレクト ターゲットを再検証するとは主張しません。ブラウザのネットワーク保護は別の層のままです。最終的な CDN は、短縮サービスとは異なるプライバシー ポリシーと管轄権を持つことができるため、送信先のレビューは、送信されたリンクに表示されるブランドを超えて行われる必要があります。
これでカバーされないもの — 範囲リクエスト、再開、またはチャンクエンコーディングと長さなしでストリーミングするサーバー
このワークフローは、範囲リクエストの送信、中断されたバイトの再開、Content-Length の強制、または既知の合計としてのチャンク転送フレームの再解釈を行いません。 HEAD は `Accept-Ranges: bytes` を報告できますが、現在のダウンロードでは依然として通常の GET が 1 回実行され、最初からの応答が蓄積されます。
また、認証されません。 Cookie が省略されているため、サインイン ページへのリダイレクトでは HTML または HTTP 拒否が発生する可能性があります。そのページをダウンロード可能なメディアとして扱うのは間違いであるため、事前の MIME 警告と最終応答ヘッダーの検査は有効な安全策です。チャンク フレームまたはプロトコル レベルのフレームを使用するサーバーは、Content-Length なしで完全な本文を配信でき、UI は正当な不確実性がゼロになることを適切に回避します。
要点: ホップを知る — ダイレクト メディア ダウンローダーとネットワーク パネルを併用して、実際に接続されているすべてのホストを確認する方法
直接リンクは HTTP ジャーニーの開始を示しますが、必ずしも 1 つの物理サーバーを示す必要はありません。監視可能なシーケンスは、最初の GET、その後のリダイレクト、応答ヘッダー、最初の本文チャンク、後続のチャンク、Blob の作成、および完了後の個別のローカル保存アクションです。
宛先の出自が重要な場合は、ダイレクト メディア ダウンローダーの初期ホスト アナウンスをネットワーク パネルと組み合わせます。この組み合わせにより、再開可能な転送、非表示のプロキシ、またはリダイレクト予測のサポートを発明することなく、連絡前に約束された内容とその後に実際に何が起こったのかがわかります。この年表は、保存が完了後にのみ表示される理由も説明しています。実装では、部分的に組み立てられた Blob が検証済みの完全な応答であるかのように公開されません。