WebブラウザーのFTPの動作

WebブラウザーのFTPの動作

[6] FTPftp:HTTP接続の処理もあわせて参照。

[1] ftp: URL record URL と、 利用者名合言葉の組 credentials と、 ブラウザー UA について、次のようにします。

  1. ホストを、URLホストに設定します。
  2. 利用者名を、 null に設定します。
  3. 合言葉を、 null に設定します。
  4. credentialsnull でなければ、
    1. UAIEcredentials匿名なら、
      1. 利用者名Anonymous に設定します。
      2. 合言葉ieuser@microsoft.com に設定します。
    2. それ以外なら、
      1. 利用者名を、 credentials利用者名に設定します。
      2. 合言葉を、 credentials合言葉に設定します。
  5. それ以外で、 URL利用者名空文字列でなければ、
    1. 利用者名を、URL利用者名に設定します。
    2. 合言葉を、 URL合言葉に設定します。
  6. それ以外なら、
    1. 利用者名を、 anonymous に設定します。
    2. 合言葉を、 UA により次の値に設定します。
      Firefox
      mozilla@example.com
      Chrome
      chrome@example.com
      IE
      User@
  7. を、 I に設定します。
  8. パス接頭辞を、空文字列に設定します。
  9. パスを、 URLパスに設定します。
  10. 種別を、不明に設定します。
  11. パス; が含まれるなら、
    1. 引数を、パスのうち、 ; とそれ以降に設定します。 UAChrome なら最後の ; 以降、それ以外なら最初の ; 以降とします。
    2. パスから引数を削除します。
    3. UAFirefox なら、
      1. URLパスを、 パスに設定します。
      2. URL へのリダイレクトを返し、ここで停止します。
    4. UAChrome なら、
      1. 引数;type=a なら、
        1. を、 A に設定します。
        2. 種別を、ファイルに設定します。
      2. それ以外で、 引数;type=i なら、
        1. を、 I に設定します。
        2. 種別を、ファイルに設定します。
      3. それ以外で、 引数;type=d なら、
        1. 種別を、ディレクトリーに設定します。
    5. UAIE なら、
      1. 引数;type=A から始まる (ASCII大文字・小文字不区別) なら、
        1. を、A に設定します。
      2. それ以外で、引数;type=D から始まる (ASCII大文字・小文字不区別) なら、
        1. 種別を、ディレクトリーに設定します。
      3. それ以外で、引数;type=I から始まる (ASCII大文字・小文字不区別) 場合を除き、
        1. ネットワークエラーを返し、ここで停止します。
  12. UAChrome でなければ、
    1. パスの末尾が / なら、
      1. 種別を、ディレクトリーに設定します。
  13. パスから、先頭の / を除去します。
  14. 再利用できる接続がなければ、接続を確立します。
  15. UAIEFirefox なら、
    1. 命令を送信します。 TYPEを引数とします。
    2. 返答を、返答の取得の結果に設定します。
    3. 返答符号の先頭が 2 以外なら、
      1. 異常終了とし、ここで停止します。
  16. UAFirefox なら、
    1. パス引数を、パスに設定します。
  17. それ以外で、UAIE なら、
    1. パス引数を、/パスを連結したものに設定します。
  18. それ以外で、UAChrome なら、
    1. パス引数を、パス接頭辞パスを連結したものに設定します。
  19. パス引数を、パス引数パーセント復号したバイト列に設定します。
  20. ファイルパス引数を、パス引数に設定します。
  21. ファイルパス引数の末尾が / なら、これを削除します。
  22. UAChrome なら、
    1. 種別ディレクトリー以外なら、
      1. 命令を送信します。 SIZEファイルパス引数を引数とします。
      2. 返答を、返答の取得の結果に設定します。
      3. 返答符号550 以外なら、
        1. 返答符号の先頭が 1234 のいずれでもないか、 返答残りASCII数字列でないなら、
          1. 異常終了とし、ここで停止します。
    2. 種別ファイル以外なら、
      1. 命令を送信します。 CWDパス引数を引数とします。
      2. 返答を、返答の取得の結果に設定します。
      3. 返答符号の先頭が 2 なら、
        1. 種別を、ディレクトリーに設定します。
      4. それ以外で、返答符号451550 なら、
        1. 種別ディレクトリーなら、
          1. 異常終了とし、ここで停止します。
        2. それ以外なら、
          1. 種別を、ファイルに設定します。
      5. それ以外で、返答符号の先頭が 5 以外なら、
        1. 異常終了とし、ここで停止します。
  23. UAChromeIPv6 なら、
  24. それ以外なら、
    1. 命令を送信します。 PASVnull を引数とします。
    2. 返答を、返答の取得の結果に設定します。
      • 返答符号の先頭が 2 以外
      • UAIE で、返答符号227 以外
      • UA の規則により返答残りを構文解析できない場合
        • UA により構文解析方法は異なるが、 \([0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+\) が含まれかつそれより前に ( が含まれないかつどこにも改行を含まないなら、構文解析できる
        • Firefox は、括弧が無くても認識します。また、接続先が IPv6アドレスなら、 このパターンのかわりに、 IPv6 用の構文を認識します。
      ... のいずれかを満たすなら、
      1. 異常終了とし、ここで停止します。
    3. UAIE なら、
      1. IPアドレスを、得られた最初の4つの十進数が表す IPv4アドレスに設定します。
      2. IPアドレスが接続先の IPアドレスと異なるなら、
        1. 異常終了とし、ここで停止します。
    4. ポートを、得られた最後の2つの十進数が表すポートに設定します。
    5. Chrome ではポートが1024未満port blocking 対象なら、 異常終了とし、ここで停止します。
    6. データ接続を、ホストポートTCP接続を確立した結果に設定します。 UAChrome なら、結果を待ちます。それ以外なら、並列に行います。 データ接続が得られた時、失敗なら、異常終了とし、ここで停止します。
  25. 種別ファイルか不明なら、
    1. UAFirefoxIE なら、
      1. 命令を送信します。 SIZEファイルパス引数を引数とします。
      2. Firefox では、結果は進捗表示などのファイルサイズとして使われます。
    2. UAFirefox なら、
      1. 命令を送信します。 MDTMファイルパス引数を引数とします。
    3. 命令を送信します。 RETRファイルパス引数を引数とします。
    4. 返答を、返答の取得の結果に設定します。
    5. UAFirefox なら、
      1. 返答符号の先頭が 2 なら、
        1. 何かを待ち続けます。
      2. それ以外で、返答符号の先頭が 1 以外なら、
        1. 421, 425, 426 なら、異常終了します。
        2. 種別を、非ファイルに設定します。
      3. それ以外なら、
        1. データ接続から受信したデータを返し、ここで停止します。 以後返答を受信したら、返信符号の先頭が 2 以外なら、 ネットワークエラーとして扱います。
    6. UAIE なら、
      1. 返答符号の先頭が 12 以外なら、
        1. 種別を、非ファイルに設定します。
      2. それ以外なら、
        1. データ接続から受信したデータを返し、ここで停止します。
    7. UAChrome なら、
      1. 返答符号の先頭が 12 以外なら、
        1. 異常終了とし、ここで停止します。
      2. それ以外なら、
        1. データ接続から受信したデータを返し、ここで停止します。
  26. 種別ファイルでないなら、
    1. UAFirefox なら、
      1. 命令を送信します。 CWDファイルパス引数/ を連結したものを引数とします。
      2. 返答を、返答の取得の結果に設定します。
      3. 返答符号の先頭が 2 以外なら、
        1. 異常終了とし、ここで停止します。
    2. UAIE なら、
      1. 命令を送信します。 CWDパス引数を引数とします。
      2. 返答を、返答の取得の結果に設定します。
      3. 返答符号の先頭が 2 以外なら、
        1. 異常終了とし、ここで停止します。
      4. @
    3. UAChrome なら、
      1. 命令を送信します。 LIST-l を引数とします。
        VMS なら、 -l ではなく *.*;0 を指定します。
    4. それ以外なら、
      1. 命令を送信します。 LISTnull を引数とします。
      2. FirefoxVMS なら、 *.*;0 を引数とします。
    5. 返答を、返答の取得の結果に設定します。
    6. UAFirefox なら、
      1. 返答符号の先頭が 2 なら、
        1. 何かを待ち続けます。
      2. それ以外で、返答符号の先頭が 1 以外なら、
        1. 異常終了とし、ここで停止します。
      3. それ以外なら、
        1. 種別が非ファイルなら、
          1. URLパスを、パス/ を連結したものに設定します。
          2. URL へのリダイレクトを返し、ここで停止します。
        2. それ以外なら、
          1. データ接続から受信したデータを application/http-index-format に変換したものを返し、ここで停止します。 Content-Type を、 application/http-index-format に設定します。 応答の状態200理由句OK に設定します。 以後返答を受信したら、返信符号の先頭が 2 以外なら、 ネットワークエラーとして扱います。
    7. UAIE なら、
      1. 返答符号の先頭が 12 以外なら、
        1. 異常終了とし、ここで停止します。
      2. それ以外なら、
        1. 種別が非ファイルなら、
          1. URLパスを、パス/引数を連結したものに設定します。
          2. URL について再帰的に本アルゴリズムを実行します。 (同じ接続を再利用します。) その結果を返し、ここで停止します。
        2. それ以外なら、
          1. データ接続から受信したデータを返し、ここで停止します。 FTP ディレクトリー一覧としてレンダリングします。 パスの末尾が / でない場合、 / を付加したものをディレクトリーパスとみなします。 以後返答を受信し、その符号の先頭が 2 以外なら、 ネットワークエラーとして扱います。
    8. UAChrome なら、
      1. 返答符号の先頭が 12 以外なら、
        1. 異常終了とし、ここで停止します。
      2. それ以外なら、
        1. データ接続から受信したデータを返し、ここで停止します。 URLクエリーraw なら、テキストとしてレンダリングします。 それ以外なら、 FTP ディレクトリー一覧としてレンダリングします。 応答の状態0理由句空文字列に設定します。
  27. UAChrome なら、
    1. QUIT
    2. ここで停止します。

[7] 異常終了とするとは、次のようにします。

  1. UAChrome なら、
    1. 命令を送信します。 QUITnull を引数とします。
  2. 接続を閉じます。
  3. ネットワークエラーを返します。

[2] 返答の取得は、次のようにします。

  1. 改行を、UAChrome なら 0x0D 0x0A、 それ以外なら省略可能な 0x0D と必須の 0x0A に設定します。
  2. 接続から改行に一致するバイト列が送られるのを待ちます。
  3. を、改行に最初に一致する直前までに設定します。
  4. 接続のうち改行に最初に一致する部分までを既読として除去します。
  5. が3つのASCII数字の後に - から始まるなら、
      • 次の行の「残り」と、改行を区切りに連結します。
      • 「符号」は、
        • IE なら、最後のものを採用します。
        • Firefox なら、最初のものを採用します。
        • Chrome なら、異なる返答は無視します。
  6. が3つのASCII数字の後に 0x20 から始まるなら、
    1. UAChrome でないか、先頭のASCII数字が [1, 5] の範囲内なら、
      1. 返答を、返答とします。
      2. 返答符号を、の先頭の3つのASCII数字の列とします。
      3. 返答残りを、0x20 の直後より後すべてとします。
      4. 返答を返します。
  7. 最初に戻ります。
  8. UAChrome で、RETRLIST 以外で2つ目の返答を受信したら、 異常終了として、ここで停止します。

[3] 接続の確立は、次のようにします。

  1. ポートを、URLポートに設定します。
  2. ポートnull なら、
    1. ポートを、 21 に設定します。
  3. 接続を、ホストポートTCP接続を確立した結果に設定します。
  4. 接続が失敗なら、
    1. ネットワークエラーを返し、ここで停止します。
  5. 返答を、返答の取得の結果に設定します。
  6. UAIE で、 返答符号の先頭が 2 以外なら、
    1. 401 応答を返し、ここで停止します。
  7. Firefox421521 なら異常終了とします。
  8. 命令を送信します。USER利用者名UTF-8符号化した結果を引数とします。
  9. 返答を、返答の取得の結果に設定します。
  10. 返答符号の先頭が 1 なら、
    1. UAIE なら、
      1. 401 応答を返し、ここで停止します。
    2. UAChrome なら、
      1. 命令を送信します。 QUITnull を引数とします。
    3. ここで停止します。
  11. それ以外で、返答符号の先頭が 45 なら、
    1. UAIE なら、
      1. ネットワークエラーを返し、ここで停止します。
    2. UAChrome なら、
      1. 命令を送信します。 QUITnull を引数とします。
    3. 401 応答を返し、ここで停止します。
  12. それ以外で、返答符号の先頭が 3 なら、
    1. 合言葉null なら、
      1. UAFirefox なら、
        1. 合言葉を、モーダルダイアログの結果に設定します。
        2. 合言葉null なら、
          1. 接続を閉じて、ここで停止します。
      2. UAChrome なら、
        1. 合言葉を、 空文字列に設定します。
    2. 命令を送信します。 PASS合言葉UTF-8符号化した結果を引数とします。
    3. 返答を、返答の取得の結果に設定します。
    4. 返答符号の先頭が 13UAChrome なら、
      1. 異常終了とし、ここで停止します。
    5. 返答符号の先頭が 3UAFirefox なら、
      1. 命令を送信します。 ACCTnoaccount を引数とします。
      2. @
    6. 返答符号の先頭が 2 以外なら、
      1. 401 応答を返し、ここで停止します。
  13. ChromeUSERPASS で切断され利用者名anonymous なら、 401 応答を返します。
  14. UAFirefoxChrome なら、
    1. 命令を送信します。 SYSTnull を引数とします。
    2. 返答を、返答の取得の結果に設定します。
    3. 返答符号の先頭が 2 でも 5 でもないなら、
      1. UAChrome なら、
        1. 異常終了とし、ここで停止します。
      2. UAFirefox なら、
        1. 401 応答を返します。
        2. ここで停止します。
    4. ChromeFirefox は結果が VMS ならパスの区切り文字を VMS 風に変換して送信します。 判定条件は微妙に違っています。
  15. UAFirefox なら、
    1. 命令を送信します。 FEATnull を引数とします。
  16. UAFirefoxChrome なら、
    1. 命令を送信します。 PWDnull を引数とします。
    2. 返答を、返答の取得の結果に設定します。
    3. UAChrome なら、
      1. 返答符号の先頭が 2 以外なら、
        1. 異常終了とし、ここで停止します。
      2. それ以外なら、
        1. パス接頭辞を、返答残りに設定します。
        2. ただし残りの先頭が " なら、次の " の直前までとします。 また改行があれば、その前までとします。
        3. パス接頭辞が空なら、異常終了とし、ここで停止します。
        4. パス接頭辞の末尾に / がなければ、追加します。
    4. Firefox は接続を再利用するかどうかの判定に使っています。 またソースコード上はパス引数の決定にも関与しているようですが、 外部から観測できません。
  17. UAFirefox なら、
    1. 命令を送信します。 TYPEを引数とします。
    2. 返答を、返答の取得の結果に設定します。
    3. 返答符号の先頭が 2 以外なら、
      1. 異常終了とし、ここで停止します。