6.コマンドラインオプション

コマンドラインの入力フォームは、下記の通りです。
SYSYA [オプション] (任意のURLアドレス)

 URLアドレス及びオプションは、それぞれをスペース文字で区切って指定します。
 URLアドレスやオプションがスペース文字を含む場合は、ダブルクォーテーション(")で囲って下さい。
 URLアドレスやオプションがダブルクォーテーションを含む場合は、ダブルクォーテーションで囲った上で、 該当するダブルクォーテーションの直前に、バックスラッシュ記号(\)を挿入して下さい。

 あと、コマンドラインに何も指定せずに SYSYA を実行させると、簡単なヘルプを表示します。


URLアドレス記述ルール

 URLアドレスは、HTTPプロトコル(http://)及びFTPプロトコル(ftp://)のみサポートしています。
https:// 等は不可)

 URLアドレスは1つしか指定できません。
(2つ以上指定すると、エラーになる)

 HTTPのURLアドレスは、プロトコル表記(http://)を省略可能です。 まるごと省略しても構いませんし、掲示板でよく使われる、「ttp://」や「tp://」といった中途半端な表記でも、 SYSYA 側で「http://」と解釈します。 また、「http:」の後ろの2つのスラッシュも、省略しても構いません。

例:
SYSYA www.sysya.net/
SYSYA http:www.sysya.net/
SYSYA ttp://www.sysya.net/
全部「http://www.sysya.net/」と解釈する

 FTPのURLアドレスは、プロトコル表記(ftp://)を省略できません。 ただし、「ftp:」の後ろの2つのスラッシュだけは、省略しても構いません。


オプション記述ルール

 オプションは、スラッシュ(/)と、1〜2字のアルファベット、というフォームで記述します。
(アルファベットの大小文字は、同一視します)
 オプションによっては、その後ろに更に、設定の詳細を定義するための数値や文字列を追記する必要がある場合があります。 その場合は、スペース文字などで区切らず、前記のアルファベットの後に直接追記して下さい。

 オプションは、URLアドレスの前にあっても後にあっても構いません。

 同類のオプションが複数指定されている場合は、後のオプションを優先します。

 環境変数 SYSYACMD が定義されている場合は、その内容をデフォルトのオプションとして読み込みます。
(コマンドラインで直接指定されたオプションの方が、優先順位は高い)


オプション一覧

 行末に「※」が付いているオプションは、デフォルトで有効になっています。
 有効であるオプションを明示的に無効にする場合は、スラッシュ(/)とアルファベットの間に、 ハイフン(-)を挿入します。

例:
SYSYA /-V http://www.sysya.net/
進行状況出力を出力しないようにします

 HTTPのURLアドレスに対しては、「/N」以外の全てのオプションが有効です。
 FTPのURLアドレスに対しては、幾つかのオプションは効果がありません。
(無効なオプションを指定してもエラーにはなりませんが、無視します)
 以下の説明において、HTTP/FTP各々に対してのみ効果があるオプションには、見出しの右隣に 「※HTTP only」「※FTP only」などと記してあります。


/C[AOQ]  ※/CA is HTTP only

 エンティティボディをローカルディスクに保存する際に、同じ名前のファイルが既に存在した場合の動作を設定します。
 デフォルトではその旨のメッセージを出力し、処置の選択を要求します。
継続受信をするかしないか···/G」のオプションの解説を参照して下さい

 「/CA」のオプションを指定した場合、継続受信を許可します。
(「Append」の「A」です)

 「/CO」のオプションを指定した場合、既存のファイルを破棄し、ファイルの先頭から受信し直します。
(「Overwrite」の「O」です)

 「/CQ」のオプションを指定した場合、プログラムを即座に終了します(戻り値2)。
(「Quit」の「Q」です)

互換性維持のために、ver1.x 以前のバージョンと同様の「/C」のオプションの記述方法もサポートしています。
 「/C」と記述すれば、「/CA」と解釈します。
 「/C-」と記述すれば、「/CO」と解釈します。
(「/CQ」に該当するオプションは、元々ありません)

 「/CA」オプションによる継続受信についてですが、具体的には、URLアドレスのファイル名と同じ名前のファイルがローカルディスクに存在する場合、 そのファイルサイズ以降のみを返信するようにサーバーに通知し、 受信したエンティティボディを、そのファイルの末尾に追加します。
 また、「/CA」のオプションを指定しておくと、受信途中でプログラムが異常終了した場合でも、 ローカルディスクのファイルを、受信途中の状態で保存します。
(これは「/K」のオプションを指定したのと同じです)

 ただし、「/CA」のオプションを指定していても、サーバー側が途中からのデータ返信を認めなかった場合 (レスポンスコードが 206(Partial Content) でなかった場合)は、ファイルの先頭から受信処理を行います。
(その際、既存のファイルは、無条件で破棄します)
 また、エンティティボディを特定のファイルに保存しないようにコマンドラインで指定している場合も、「/CA」のオプションの指定を無視して、ファイルの先頭から受信処理を行います。
(例えば「/G*」のオプションで標準出力(stdout)に出力するよう指示している場合)

 これらのオプションは、基本的には「/G」のオプションと併用した場合などに、 エンティティボディをファイルに保存する際の挙動を指定するための物ですが、 エンティティボディの受信を伴わない「HEAD」のリクエストメソッドを選択している場合(デフォルト)にも、効果はあります。
 同じ名前のファイルが既に存在した場合、「/CA」のオプションを指定していれば、 既存のファイルのサイズの情報を(「GET」等のリクエストを行う場合と同様に)リクエストヘッダに追記します。 それ以外のオプションを指定するか、何れのオプションも指定しなければ、既存のファイルを無視します。
 何れの場合も、既存のファイルには手を付けず、そのまま残します。

 「/CA」のオプションは、HTTPのURLアドレスに対してのみ、且つ「HEAD」「GET」「TRACE」の何れかのリクエストメソッドを選択している場合のみ意味を持ちます。
(それ以外のリクエストメソッドを選択している場合は、無視します)
 「/CO」のオプションは、HTTPとFTPの双方に対して、且つ全てのリクエストメソッドに対して使用可能です。
 「/CQ」のオプションオプションは、「/G」のオプションと併用した場合のみ意味を持ちます。
(「/G」のオプションを指定していないと、無視します)

 なお、リクエストメソッドの選択、およびエンティティボディの受信については、 「/G」のオプション及び「/M」のオプションの解説を参照して下さい。


/D[+][0-2]

 標準出力(stdout)への、リクエストヘッダの出力の有無を設定します。
(このオプションは、デフォルトで有効になっています)
 「/D」の後ろに 0〜2 の数値を追記する必要があります。

0···リクエストヘッダを出力しない。
1···リクエストヘッダだけを出力し、プログラムを終了する(サーバーに接続しない)。
2···リクエストヘッダを出力する(デフォルト)。

 「/D1」のオプションは、デバッグなど、リクエストヘッダの内訳を目視確認したい場合に使用します。

 エンティティボディの送信状況は、約64Kバイト送信毎にアスタリスク記号(*)を連ねる形で表示します。
(更にその後ろに、送信済みの比率をパーセント表示する)
 ただしこの方式だと、大きなファイルを送信する場合に、画面がアスタリスク記号で埋め尽くされてしまいます。 それを避けたい場合は、「/D」の直後にプラス記号(+)を付けます。すると、送信状況の表示が1文字の簡単なアニメーションで表示されるようになります。


/E[charcode]

 送信するエンティティボディを、OSのデフォルトの文字コード(日本語版はシフトJISコード)から、JIS コード、EUC コード、Unicode(UTF-8)の何れかに変換します。
 「/E」の後ろに、「JIS」「EUC」「UTF8」の何れかを指定する必要があります。
(「JIS」「EUC」は、日本語環境向けの選択肢です)

以下、OS/2版のみ
OS/2 版は、UTF-8 の取り扱いは、Warp4 以降でのみ利用可能です。
また、UTF-8 の文字テーブルは、Windows の物に合わせてあります。 「~」等の、Windows と OS/2 でコードが異なる文字を取り扱う際には注意して下さい。

 このオプションは、エンティティボディの送信を伴うリクエストメソッドである、 「POST」「PUT」「APPEND」の何れかと併用した場合のみ意味を持ちます。
(リクエストメソッドの選択については、「/M」のオプションの解説を参照して下さい)
 また、このオプションの変換対象は送信時のエンティティボディのみで、受信時のエンティティボディは変換しません。


/F[charcode]

 URLアドレスの文字列が、何の文字コードで記述されているかを明示します。
 「/F」の後ろに、「JIS」「EUC」「UTF8」の何れかを指定する必要があります。
(「JIS」「EUC」は、日本語環境向けの選択肢です)

以下、OS/2版のみ
OS/2 版は、UTF-8 の取り扱いは、Warp4 以降でのみ利用可能です。
また、UTF-8 の文字テーブルは、Windows の物に合わせてあります。 「~」等の、Windows と OS/2 でコードが異なる文字を取り扱う際には注意して下さい。

 このオプションは、エンティティボディをローカルディスクへ保存する際に、そのファイル名を決めるために使用します。
 デフォルトでは、URLアドレスのファイル名の部位、またはレスポンスヘッダの「Content-Disposition:」の行のファイル名の部位を、 そのままファイル名として用います。このオプションを用いて、それらのファイル名がどの文字コードで記述されているかを明示すれば、 その文字列を、OSのデフォルトの文字コード(日本語版はシフトJISコード)に変換し、ファイル名として用います。

 なお、このオプションは、「/C」「/G」のオプションなど、 ローカルディスクのファイルと関連するオプションと併用している場合のみ意味を持ちます。
(それらのオプションを指定していないと、無視します)

例:
SYSYA /G /FUTF8 http://www.sysya.net/%CE%B1%CE%B2%CE%B3.html
αβγ.html」というファイル名で保存する


/G[+][path or filename]

 エンティティボディをローカルディスクに保存します。
 また、デフォルトのリクエストメソッドを「GET」にします。
(リクエストメソッドの選択については、「/M」のオプションの解説を参照して下さい)

 「/G」の後ろに、保存するパス、またはファイル名を指定できます。
 ファイル名が省略された場合は、URLアドレスのファイル名で保存します。
 URLアドレスにファイル名が含まれていない(末尾がスラッシュ(/)である)場合は、 HTTPの場合は「index.htm」、FTPの場合は「listing.txt」という名前で保存します。
 ファイル名の部位に、疑問符(?)等の、ファイル名に使えない文字が含まれる場合は、 「%」+ASCIIコードの16進数の表記に置き換えます。

例:
SYSYA /GC:\ http://www.sysya.net/download.php?id=1234
ドライブ C: のルートディレクトリに、「download.php%3Fid=1234」というファイル名で保存する

 なお、同じ名前のファイルが既に存在した場合、その旨のメッセージを出力し、処置の選択を要求します。
(同名ファイルの扱いを、「/C」のオプションで指定してない場合のみ)
 「A」「O」「Q」の何れかのキーに続いて、Enter キーを押してください。

 レスポンスヘッダにファイル名が明記されている(「Content-Disposition:」 または「Content-Location:」の行が存在する)場合は、 受信完了後に、そのファイル名に名称変更します。
 くれぐれも「受信完了後」である事に注意して下さい。完了するまでは、 前記の命名規制に沿ったファイル名で、受信処理が行われます。
 なお、既に同名のファイルが存在する場合は、名称変更は行いません。
(その場合、警告メッセージを表示します)

 なお、上記のファイル命名規制において、ファイルを作成するローカルディスクのファイルシステムの仕様は、全く考慮されません。 例えば、8.3字の制限があるFATドライブ上にて、上記の例のようなファイル保存を行うと、「File open failed」のエラーになります。 その場合は、明示的に、そのファイルシステムの仕様に沿ったファイル名を指定して下さい。

 この機能で受信できるのは、デフォルトではレスポンスコードが200台(200(OK) 206(Partial Content) など)の場合のみです。 他のレスポンスコードが戻された場合、受信処理は行わず、異常終了扱いにします(戻り値2)。
 レスポンスコードに関わらずエンティティボディを保存したい場合は、「/G」の直後、 パスまたはファイル名の前にプラス記号(+)を付けます。 この場合、レスポンスコードが幾つであるかに関わらず、受信が完了さえすれば、正常終了にします(戻り値0)。

 あと、特殊な指定法で、ファイル名にアスタリスク1字(*)を指定すると標準出力(stdout)に、 アスタリスク2字(**)を指定すると標準エラー出力(stderr)に、エンティティボディを出力できます。
(バイナリデータも出力可能)
 シェル(CMD.EXE または COMMAND.COM)のパイプ機能を用いて、他のプログラムと組み合わせて実行させる、等の用途が考えられます。

 注意を要するのは、その際に、ただ単に「/G*」のオプションを用いただけでは、エンティティボディだけではなく、 リクエストヘッダやレスポンスヘッダ、各種メッセージ等の余計なデータも、標準出力(stdout)へ出力されてしまう事です。
 これを抑制するためには、「/D0」「/S0」「/-V」のオプションも同時に指定し、 エンティティボディ以外は一切、標準出力(stdout)へ出力しないようにします。
(詳細は、各オプションの解説と「オプション使用例」を参照して下さい)


/HA[+][protocol:][user:pass][:acct]

 リクエストヘッダに「Authorization:」の行を追記し、 HTTPサーバーに対して、ユーザー名およびパスワードを通知します。
 ユーザー名とパスワードは、コロン(:)で区切って下さい。

 また、このオプションは、FTPの認証情報を定義するためにも使えます。
 FTPのURLアドレスに対して、アカウント情報を送る必要がある場合は、 パスワードの後ろにコロン(:)を挟んで、アカウント情報を追記して下さい。

 なお、FTPのデフォルトのログイン方法は、ユーザー名は「anonymous」になります。同じくパスワードは「-sysya@」になります。
(匿名(anonymous)でのログイン時に、パスワードの代わりにメールアドレスの入力を要求するFTPサーバーがよくあるので、試しにそれっぽい文字列を送ってみる)

 ところで、FTPにおいてユーザー名を指定する際に、FTPサーバーのホスト名およびポート番号を、ユーザー名に追記する必要がある場合があります。
(FTPプロクシを経由する場合など)
 その場合、ユーザー名の記述方法は「username@hostname:portnum」になります。
(パスワードやアカウント情報が必要なら、その後にコロン(:)を挟んで追記する)

 上記のようなユーザー名の記述を行い、且つパスワードやアカウント情報を省略する場合、そのまま省略すると問題が生じます。 ホスト名とポート番号の間のコロン(:)を、「/HA」のオプションにおける、 パスワードやアカウント情報の区切りのためのコロン(:)であると誤認してしまうからです。
 その場合は、パスワードやアカウント情報の区切りのコロン(:)を、全て省略せずに追記する必要があります。
(区切りのコロン(:)は、文字列の後ろにある方を優先して認知する)

例:
SYSYA /HAanonymous@ftp.sysya.net:21:: ftp://proxy.sysya.net:8021/
プロキシ「proxy.sysya.net:8021」を経由して「ftp.sysya.net:21」に、匿名(anonymous)でログインします。
 「/HA」の末尾の2つのコロン(:)は、それぞれパスワード/アカウント情報のための区切り文字です。 このように記述すれば、「パスワード/アカウント情報ともに未指定である」と判断されます。

SYSYA /HAanonymous@ftp.sysya.net:21 ftp://proxy.sysya.net:8021/
因みにこれだと、末尾の「21」の部位をパスワードだと誤認してしまうのでNGです。

 「/HA」の直後にユーザー名およびパスワードを記述した場合、コマンドラインで指定されたURLアドレスのプロトコルに対して、その認証情報を適用します。
 明示的に、どちらのプロトコルに対しての認証情報かを指定したい場合は、「/HA」の直後に「http:」か「ftp:」を追記して下さい。

例:
SYSYA /HAhttp:hoge:fuga /HAftp:foo:bar http://www.sysya.net/
HTTPには「hoge:fuga」、FTPには「foo:bar」という認証情報を用います。
HTTPからFTPへの移動が発生した際に、必要になる場合があります。

 「/HA」のオプションを使用した場合、リクエストヘッダを標準出力(stdout)に出力する際には、 パスワードの部位は、アスタリスク記号(*)で隠して出力します。
 ただし、「/D1」のオプションを併用し、 ヘッダは標準出力(stdout)に出力するがサーバーへの接続は行わない場合に限り、 パスワードの部位も、隠蔽処理無しでそのまま出力してしまいますので注意。
(「/D1」のオプションはデバッグ用に用意されている機能なので、こういう仕様になっています)

 なお、ユーザー名及びアカウント情報は、常に隠蔽処理無しでそのまま出力します。 問題がある場合は、「/D0」のオプションで、 リクエストヘッダの標準出力(stdout)への出力を行わないようにして下さい。

 サポートする認証方法は、デフォルトでは基本認証のみです。 「/HA」の直後にプラス記号(+)を追記することで、ダイジェストアクセス認証をサポートします。
HTTPのみ、FTPは不可)

 「ダイジェストアクセス認証」とは、パスワードを MD5 アルゴリズムで暗号化してサーバーへ送信するための取り決めです。 具体的には、まず、パスワード等の個人情報を送らずサーバーへ接続を試み、サーバーからのレスポンスを確認します。 「ダイジェストアクセス認証」のために必要な情報が含まれていれば、パスワードを暗号化して再接続を試みます。
(含まれていなければ、暗号化せずに再接続を試みます。これが「基本認証」)

 「/HA+」のオプションを使用すると、ユーザー認証には常に2段階の手順を踏む事になります。
(実際に「ダイジェストアクセス認証」を行うかどうかに関わらず)

======== サンプルのトップ ========
1→[C:\temp]sysya /ha+user:pass http://www.sysya.net/secret.html
  SYSYA:Connecting to [www.sysya.net:80]...done.
  SYSYA:Send request header.
  ________
  HEAD /secret.html HTTP/1.0
  Host: www.sysya.net
2→
  ~~~~~~~~
  SYSYA:Start receive process.
  ________
  HTTP/1.1 401 Unauthorized
  Date: Fri, 30 Nov 2007 12:34:56 GMT
  Connection: close
3→WWW-Authenticate: Digest realm="Password Required", nonce="********", algorithm=MD5, qop="auth"
  Content-type: text/html
  
  ~~~~~~~~
  SYSYA:Connection closed.
  
4→SYSYA.Warning:Authenication Required.
  
  SYSYA:Connecting to [www.sysya.net:80]...done.
  SYSYA:Send request header.
  ________
  HEAD /secret.html HTTP/1.0
  Host: www.sysya.net
5→Authorization: Digest username="user", realm="Password Required", nonce="********", uri="/secret.html", algorithm=MD5, qop=auth, nc=00000001, cnonce="********", response="********"
  
  ~~~~~~~~
  SYSYA:Start receive process.
  ________
6→HTTP/1.1 200 OK
  Date: Fri, 30 Nov 2007 12:34:56 GMT
  Authentication-Info: rspauth="********", cnonce="********", nc=00000001, qop=auth
  Accept-Ranges: bytes
  Content-Length: 1234
  Connection: close
  Content-Type: text/html
  
  ~~~~~~~~
  SYSYA:Connection closed.
  
  [C:\temp]
======== サンプルのボトム ========

···コマンドライン入力です。「/HA+」が追記されています。
···1回目に送信されるリクエストヘッダには、個人情報は含まれていません。
···サーバーから「401(Unauthorized)」が返されました。この例では、レスポンスヘッダには、ダイジェストアクセス認証に必要な情報が含まれています。
···再接続を行います。
···2回目に送信されるリクエストヘッダには、個人情報が含まれています。この例では、MD5 による暗号化が行われています。
···認証に成功しました。


/HC[charset]  ※HTTP only

 リクエストヘッダに「Accept-Charset:」の行を追記します。

/HH[host]  ※HTTP only

 リクエストヘッダに「Host:」の行を追記します。
(このオプションは、デフォルトで有効になっています)
 デフォルトでは、URLアドレスのホスト名を、そのまま「Host:」の行に適用します。
(「/HH」だけを指定した場合も同様)
 このオプションで、任意のホスト名を「Host:」の行に適用できます。 また、「/-HH」のオプションで、「Host:」の行を削除できます。

/HL[language]  ※HTTP only

 リクエストヘッダに「Accept-Language:」の行を追記します。
 「/HL」だけを指定すると、環境変数 LANG の文字列を、「Accept-Language:」の行に適用します。

/HR[referer]  ※HTTP only

 リクエストヘッダに「Referer:」の行を追記します。
 「/HR」だけを指定すると、URLアドレスのパスの部位だけを切り出して、「Referer:」の行に適用します。

/HT[type]  ※HTTP only

 リクエストヘッダに「Content-Type:」の行を追記します。
 このオプションは、それ以外の仕事は全く行わないので注意して下さい。例えば、シフトJISコード(日本語)のテキストを 「Content-Type: text/plain; charset=UTF-8」などと記述して送信したとしても、 文字コードのチェックも変換も行わず、そのまま素通しします。
(文字コードの変換には、「/E」のオプションを使用して下さい)

 このオプションは、「/MPOST」または「/MPUT」のオプションと併用した場合のみ意味を持ちます。
(「/MPOST」または「/MPUT」のオプションを指定していないと、無視します)


/HU[useragent]  ※HTTP only

 リクエストヘッダに「User-Agent:」の行を追記します。
 なお、デフォルトでは、ユーザーエージェントは未定義です。

/HZ[string]  ※HTTP only

 その他のリクエストヘッダを追記します。
 HTTPプロトコルのリクエストヘッダの記述方法に則って、1行ずつ記述します。 また、繰り返し記述する事で、複数行の追記が可能です。

例:
SYSYA /HZ"Cookie: USERID=13579;" http://www.sysya.net/
クッキー「USERID」を定義

リクエストヘッダについて補足

 デフォルトのリクエストヘッダは、リクエストメソッドを記述した1行目と、 「Host:」の行だけです。
 「POST」または「PUT」のリクエストメソッドを選択した場合は、 送信するエンティティボディに合わせて「Content-Length:」の行も自動で追記します。
 「/CA」のオプション指定による継続受信時や、エンティティボディ受信時に再試行が発生した場合は、 必要に応じて「If-Unmodified-Since:」及び「Range:」の行も自動で追記します。 なお、「If-Unmodified-Since:」には、直前に取得したレスポンスヘッダに「Last-Modified:」の行が含まれていればそれを、 含まれていなければ「Date:」の行の内容を反映します。

/J  ※HTTP only

 レスポンスヘッダ内の「Location:」のアドレスを追跡します。
 デフォルトでは、「Location:」のチェックは行わず、 レスポンスの値に応じた処理を行います。
(例えば「Invalid response code.」のエラー扱いをする、等)
 「/J」のオプションを指定すると、レスポンスヘッダに「Location:」の記述が含まれている場合、 接続対象URLアドレスをそのアドレスに変更して、再接続を試みます。

 因みに、レスポンスヘッダに「Location:」の記述が含まれるケースは、 例えばそのURLアドレスのコンテンツが、別のURLアドレスに移転された場合が考えられます。
(その場合、レスポンスが 301(Moved Permanently)302(Moved Temporarily) 等になる)

 なお、再接続を試みるのは、「Location:」のアドレスが HTTP/FTP である場合のみです。 例えば HTTPS だった場合は、そこで処理を中断します。

======== サンプルのトップ ========
1→[C:\temp]sysya /j http://www.sysya.net/old.html
  SYSYA:Connecting to [www.sysya.net:80]...done.
  SYSYA:Send request header.
  ________
  HEAD /old.html HTTP/1.0
  Host: www.sysya.net
  
  ~~~~~~~~
  SYSYA:Start receive process.
  ________
  HTTP/1.1 302 Moved Temporarily
  Date: Sat, 31 Dec 2005 12:34:56 GMT
  Connection: close
2→Location: http://www.sysya.net/new.html
  Content-type: text/html
  
  ~~~~~~~~
  SYSYA:Connection closed.
  
3→SYSYA.Information:The line of 'Locatiton:' was found.
   -> http://www.sysya.net/new.html
  
  SYSYA:Connecting to [www.sysya.net:80]...done.
  SYSYA:Send request header.
  ________
  HEAD /new.html HTTP/1.0
  Host: www.sysya.net
  
  ~~~~~~~~
  SYSYA:Start receive process.
  ________
  HTTP/1.1 200 OK
  Date: Sat, 31 Dec 2005 12:34:56 GMT
  Accept-Ranges: bytes
  Content-Length: 1234
  Connection: close
  Content-Type: text/html
  
  ~~~~~~~~
  SYSYA:Connection closed.
  
4→[C:\temp]
======== サンプルのボトム ========

···コマンドライン入力です。「/J」が追記されています。
···レスポンスヘッダに「Location:」の記述が含まれています。
···対象URLアドレスを「Location:」の物に変更し、再接続します。
···レスポンスヘッダに「Location:」の記述が含まれていないので、終了します。


/K

 受信途中でプログラムが異常終了した場合でも、ローカルディスクのファイルを、受信途中の状態で保存します。
(指定していない状態で異常終了すると、ファイルを削除します)

 なお、このオプションは、「/G」のオプションと併用時など、 エンティティボディ受信を指定している場合のみ意味を持ちます。
(エンティティボディ受信を指定していないと、無視します)


/L[-][type][*]  ※HTTP only

 受信するコンテンツタイプを限定します。
 該当しないタイプであった場合は、受信処理を中断し、仮想的にレスポンスコード 406(Not Acceptable) を受信したように振る舞います。

 「/L」の後ろに、受信を認めるコンテンツタイプを指定する必要があります。
 コンテンツタイプの末尾にアスタリスク(*)を付けると、それ以前の文字列が一致していれば、受信を許可するようになります。
 コンテンツタイプ指定の直後にセミコロン(;)を挟んで、更に詳細な条件を指定できます(複数指定可)。 例えば、「/Ltext/html;charset=Shift-JIS」と記述すれば、コンテンツタイプがHTMLテキストであり、 且つ文字コードがシフトJIS(日本語)である場合のみ、受信を許可します。

 「/L-」のオプションは、「/L」とは逆に、受信を認めないコンテンツタイプを指定する際に用います。記述ルールは、「/L」と同じです。
 なお、「/L」と「/L-」を同時に指定する事はできません。
(コマンドラインの後で指定された方を優先します)

例:
SYSYA /Ltext/* http://www.sysya.net/view.php?id=5678
テキストデータであれば、受信を許可(例えば「text/html」)


/M[method][,type]

 送信するリクエストメソッドを選択します。
 HTTPのURLアドレスに対しては、「/M」の後ろに、下記の何れかのリクエストメソッドを追記する必要があります。
HEAD ···レスポンスヘッダのみの返信
GET ···レスポンスヘッダ及びコンテンツそのものの返信
POST ···クライアントからサーバーへの通知
PUT ···クライアントからサーバーへのファイルの送信
DELETE ···サーバー上のファイルの削除
OPTIONS ···サーバー側で受け付けるリクエストメソッド一覧を返信
TRACE ···サーバーが受け取っているリクエストのループバック

 FTPのURLアドレスに対しては、「/M」の後ろに、下記の何れかのリクエストメソッドを追記する必要があります。

LIST ···ファイル/ディレクトリの情報一覧の返信
NLST ···ファイル/ディレクトリの名前一覧の返信
GET ···サーバーからクライアントへのファイルのダウンロード
PUT ···クライアントからサーバーへのファイルのアップロード
APPEND ···クライアントからサーバーへのファイルの追加アップロード
DELETE ···サーバー上のファイルの削除

 FTPのURLアドレスに対しては更に、上記のリクエストメソッドの後ろにカンマを挟んで、 テキストまたはバイナリの何れのモードでデータの送受信を行うのかを指定できます(省略可)。

ASCII ···テキストモード
BINARY ···バイナリモード(デフォルト)

 なお、テキストモードにおける制御コード(改行など)の変換処理は、送信先であるFTPサーバーに委ねられます。
SYSYA は「テキストモードを選ぶ」という事をFTPサーバーに通知するだけで、あとはバイナリモードと同じようにデータを転送する)

 HTTPにおけるデフォルトのリクエストメソッドは「HEAD」です。
 FTPにおけるデフォルトのリクエストメソッドは「LIST」です。
 HTTP/FTPに固有のリクエストメソッドを、プロトコルの異なるURLアドレスに対して指定すると、エラーになります。

 なお、各リクエストメソッドの詳細は、専門の書籍などを参照して下さい。

 「HEAD」以外のリクエストメソッドを選択し、レスポンスにエンティティボディが含まれている場合、 デフォルトではそれを標準出力(stdout)に出力します。
 ファイルに保存したい場合は、「/G」のオプションを併用して下さい。

 逆に、「/MHEAD」オプションで明示的に「HEAD」のリクエストメソッドを選択した場合、「/G」のオプションの指定は無視されます。
(「HEAD」のリクエストでは、保存対象であるエンティティボディは戻されないので、「/G」のオプションを指定しても意味が無い)

 「POST」「PUT」「APPEND」の何れかを選択した場合は、後述の 「/O」または「/P」のオプションを併用して、 送信するエンティティボディを定義する必要があります。

 FTPのリクエストとHTTPのリクエストは、本来は名前も機能も異なりますが、 SYSYA においては、FTPのURLアドレスも、HTTPのように扱います。
SYSYA がプロトコルの差異を吸収する)
 FTPのURLアドレスに対して「GET」のリクエストを選択すると、 実際には「RETR」または「LIST」のリクエストが行われます(詳細は後述)。
 同様に、「PUT」のリクエストを選択すると、実際には「STOR」のリクエストが行われます。

 FTPのURLアドレスに対して「GET」のリクエストを選択した場合、実際に送られるリクエストは、対象がファイルかディレクトリかで異なります。
(ファイルなら「RETR」) (ディレクトリなら「LIST」)
 なお、ファイルなのかディレクトリなのかは、URLアドレスの末尾が「/」かどうかで判定します。

 FTPのURLアドレスに対して「PUT」または「APPEND」のリクエストを選択する場合、 コマンドラインオプションからファイル名が確定できなければなりません。
 つまり、FTPサーバーにどんなファイル名でアップロードすれば良いのか、コマンドライン読みとれなければならない、という事です。
 具体的には、下記の何れかの条件を満たしている必要があります。

  1. URLアドレスがファイル名を含んでいる。
  2. /O」のオプションで、ファイル名を明記している。
 HTTPのURLアドレスに対しては、このような制限はありません。
(そのリクエストをどう処理するかは、サーバーに任せる)

 FTPのURLアドレスに対して「DELETE」のリクエストメソッドを選択する場合、 そのURLアドレスがファイル名を含んでいる必要があります。
(具体的には、URLアドレスの末尾が「/」で終わってはいけない、という事)
SYSYA は、ディレクトリを削除する機能を持っていない)
 HTTPのURLアドレスに対しては、このような制限はありません。
(そのリクエストをどう処理するかは、サーバーに任せる)


/N[method]  ※FTP only

 FTPのデータポートの準備方法を選択します。
 「/N」の後ろに、「PASV」「PORT」「BOTH」の何れかを指定する必要があります。
PASV ···サーバーに準備を要求する
PORT ···ローカルマシン側で準備し、それをサーバーに通知する
BOTH ···PASV」と「PORT」の両方を試す

 デフォルトの準備方法は「BOTH」です。具体的には、まずはサーバー側に準備を要求します(PASV)。 それでエラーが返された場合、ローカルマシン側で準備し、それをサーバーに通知します(PORT)。
 「PASV」または「PORT」を選択すると、何れか片側の手段しか行わなくなります。

 「PASV」及び「PORT」は、FTP のコマンドの名前です。
 「PASV」の場合、データポートをサーバー側で準備するので、ローカルマシンのネットワーク環境(ファイアウォールなど)に依存しないのが長所です。 ただし、サーバー側が「PASV」をサポートしている必要があります。
 「PORT」の場合、データポートをローカルマシン側で準備するので、サーバーの仕様に依存しないのが長所です。 ただし、ローカルマシン側にファイアウォール等を導入していると、データポートのオープンが認められない場合があります。


/O[filename] /P[content]

 「POST」「PUT」「APPEND」のリクエストで送信するエンティティボディを定義します。

 「/O」は、ローカルディスク上にあるファイルをエンティティボディにします。
 「/O」の後ろに、送信したいファイル名(1つのみ)を追記する必要があります。 ファイル名にアスタリスク1字(*)を指定すると、標準入力(stdin)を読み込みます。
(バイナリデータを含むファイルも送信可能)

 「/P」は、コマンドライン上で直接エンティティボディを記述します。
 「/P」の後ろに、送信したいエンティティボディを追記する必要があります。 この場合、エンティティボディは、コマンドライン上で記述可能なものに限られます。
(基本的に、バイナリデータや改行は含められない)

 エンティティボディの送信の際には、標準出力(stdout)に出力したリクエストヘッダの直後に、送信状況を出力します。
(「**** 50%」←この様な物)
 「/D0」のオプションを用いて、リクエストヘッダの標準出力を止めると、送信状況の出力も止まります。

 「/O」及び「/P」のオプションは、エンティティボディの送信を伴うリクエストメソッドである、 「POST」「PUT」「APPEND」の何れかを選択している場合、必須です。
(逆に、何れのリクエストメソッドも選択していないと、無視します)
(リクエストメソッドの選択については、「/M」のオプションの解説を参照して下さい)
 また、「/O」「/P」のオプションを同時に使用する事はできません。
(コマンドラインの後で記述された方を優先します)

 FTPのURLアドレスに対して「/O」「/P」のオプションを用いる場合···つまり「PUT」または「APPEND」のリクエストを行う場合、 コマンドラインオプションからファイル名が確定できなければなりません。
(詳細は、「/M」のオプションの解説を参照して下さい)
 HTTPのURLアドレスに対しては、このような制限はありません。
(そのリクエストをどう処理するかは、サーバーに任せる)

 なお、HTTPのURLアドレスに対して、「POST」または「PUT」のリクエストを送信する際には、リクエストヘッダに 「Content-Type:」等の行を追記する必要がある場合が多いのですが、SYSYA は自動では追記しません。 必要に応じて、下記の例のように、「/HT」や「/HZ」等のオプションを併用し、手作業で追記してください。

例:
SYSYA /MPUT /Oupdate.zip /HT"application/x-zip" /HZ"From: webmaster@www.sysya.net" /HA"username:password" http://www.sysya.net/update.zip
更新のために必要な情報を網羅して「update.zip」をアップロード

 なお、「/O」のオプションと「/G」のオプションを併用する場合は、注意が必要です。 上記の例のように、ローカルディスク上のファイル名と、アップロード先のファイル名が同じである場合、 「/G」のオプションによってエンティティボディが保存されるファイル名も同じ名前になり、 「File open failed」のエラーで、プログラムが異常終了します。
(オリジナルのファイルが上書きされる事はありません)
 これを回避するには、「/G」のオプションの機能で、保存先のファイル名に、 明示的に別名を指定しなければなりません。
(例えば、「/Gupdate.log」など)


/R

 HTTP/FTPサーバーからのレスポンスコードを、プログラムの戻り値にします。
 例えば、HTTPのURLアドレスのヘッダを正しく参照できた場合は、戻り値は200になります。

 このオプションを、バッチファイル内で利用する場合は、例えばこんな記述になるでしょう。

例:
SYSYA /R http://www.sysya.net/
IF ERRORLEVEL 300 GOTO ERROR
IF ERRORLEVEL 200 GOTO OK
GOTO ERROR

 受信が正常終了すると、レスポンスコード200台が戻される筈なので、300台以上が戻された場合は、エラー処理へ分岐させています。
 また、戻り値以前の要素に起因するエラー(サーバーに接続できなかった場合など)は通常通りのエラーコード(前記「戻り値」の欄を参照)を返すので、 最後で200未満の値をエラー扱いにしています。

 「/G」のオプションと併用時などに、エンティティボディ受信時に再試行が発生した場合は、 再試行の前後でレスポンスコードが異なる場合があります。 その場合は、基本的には最後に取得したレスポンスコードを戻り値にします。
 例外的に、再試行前に 200(OK)、再試行後に 206(Partial Content) を戻してきた場合に限り、 再試行処理によって生じた後者は無視し、最初のレスポンスコード(200)を戻します。

 対象URLアドレスがFTPの場合、コール&レスポンスの段取りが何度も行われますが、基本的には最後に戻されたレスポンスコードを戻り値にします。
(ただし最後の、ログアウト要求(QUIT)のレスポンスコードは無視する)
 具体的には、通信処理が滞り無く完了したならば、226(Transfer complete)が戻されるでしょう。


/S[0-3]

 標準出力(stdout)への受信状況の出力の有無を設定します。
(このオプションは、デフォルトで有効になっています)
 「/S」の後ろに 0〜3 の数値を追記する必要があります。

0···何も出力しない。
1···再試行発生時/取得完了時のメッセージ「Retry」「saved」、 及びエンティティボディの受信状況を出力する。
(「**** 50%」←この様な物)
2···レスポンスヘッダを出力する。
3···両方出力する(デフォルト)。

 なお、エンティティボディの受信状況の出力の設定は、「/G」のオプションと併用時など、 エンティティボディ受信を指定している場合のみ意味を持ちます。
(エンティティボディ受信を指定していないと、無視します)
 あと、エンティティボディの出力先に標準出力(stdout)または標準エラー出力(stderr)を指定した場合は、 エンティティボディの受信状況等は出力しなくなります。
(明示的に「/S3」などと出力指定しても、無視します)

 エンティティボディの受信状況は、約64Kバイト受信毎にアスタリスク記号(*)を連ねる形で表示します。
(エンティティボディのサイズが判明している場合は更にその後ろに、受信済みの比率をパーセント表示する)
 ただしこの方式だと、大きなファイルを受信する場合に、画面がアスタリスク記号で埋め尽くされてしまいます。 それを避けたい場合は、「/S」の直後にプラス記号(+)を付けます。すると、受信状況の表示が1文字の簡単なアニメーションで表示されるようになります。


/T[+][time]

 通信中断時の再試行回数を指定します。
(デフォルトは16回)
 ただし、最初の接続時に、いきなりサーバーとの接続に失敗した場合は、デフォルトでは再試行を行いません。 その場合でも再試行したい場合は、数値の前にプラス記号(+)を付けます。

 あと、回数に負の数を指定すると、無制限に再試行を行います。
モラル的に多少問題がある機能なので、必ず人の管理下にある状況で指定してください···^^;


/U[+][interval]

 エンティティボディ受信時に、レスポンスコードが「Service Unavailable」に該当する場合も再試行します。
(HTTPならば503、FTPならば421
 再試行前に待機する時間を、秒単位で指定できます。
(デフォルトは10秒)
 数値の前にプラス記号(+)を追記すると、 エラーと見なせるレスポンスコードであれば、常に再試行するようになります。 また、「/L」のオプションと併用時に、受信を認めないコンテンツタイプが返された場合も、再試行を行います。
406(Not Acceptable) のレスポンスコードを、仮想的に受信したと見なすため)

 なお、このオプションは、「/G」のオプションと併用時など、 エンティティボディ受信を指定している場合のみ意味を持ちます。
(エンティティボディ受信を指定していないと、無視します)
 あと、「/G+」のオプションにより、 無条件のエンティティボディ保存が指示されている場合も、「/U」の指定は無視します。


/V

 プログラム処理の進行状況を、標準出力(stdout)に出力します。
(このオプションは、デフォルトで有効になっています)
 具体的には、プログラム処理状況を示すメッセージ(行頭に「SYSYA:」が付いている)、 及びリクエスト/レスポンスヘッダの前後の境界線(「________」と「~~~~~~~~」)を標準出力(stdout)に出力します。 「/-V」のオプションを指定すると、それらを出力しなくなります。
(なお、エラー発生時のメッセージ出力は、止める事はできません)

======== サンプルのトップ ========
  [C:\temp]sysya /-v http://www.sysya.net/
  HEAD / HTTP/1.0
  Host: www.sysya.net
  
  HTTP/1.1 200 OK
  Date: Sat, 31 Dec 2005 12:34:56 GMT
  Accept-Ranges: bytes
  Content-Length: 1234
  Connection: close
  Content-Type: text/html
  
  [C:\temp]
======== サンプルのボトム ========

 なお、エンティティボディの受信状況の表示を止めたい場合は、「/S」のオプションを併用して下さい。


/W[sec]

 サーバーからのレスポンスの待ち時間を設定します。
(デフォルトは120秒)
 しばしば接続中断が発生する場合は、このオプションで待ち時間を延ばしてみて下さい。 なお、「/-W」のオプションを指定すると、サーバーからのレスポンスを、無期限に待機するようになります。

 なお、このオプションで設定するのは、あくまでも「レスポンスの待ち時間」であり、「接続の待ち時間」は対象外です。 たとえ「/-W」のオプションを指定していても、長時間サーバーとの接続が確立できなければ、処理を中断し、 プログラムは異常終了します(「Host not found.」のエラーなど)。
(接続の待ち時間は、設定できません)


/X[+][host:port][@user:pass]

 プロキシを介してHTTP/FTPサーバーに接続します。
 ホスト名とポート番号は、コロン(:)で区切って下さい。
 ユーザー名及びパスワードが必要な場合は、その後ろにアットマーク(@)を付け、 続けてユーザー名とパスワードを、コロン(:)で区切って追記して下さい。

 「/X」のオプションを使用した場合、リクエストヘッダを標準出力(stdout)に出力する際には、パスワードの部位は、 アスタリスク記号(*)で隠して出力します。
 ただし、「/D1」のオプションを併用し、 ヘッダは標準出力(stdout)に出力するがサーバーへの接続は行わない場合に限り、 パスワードの部位も、隠蔽処理無しでそのまま出力してしまいますので注意。
(「/D1」のオプションはデバッグ用に用意されている機能なので、こういう仕様になっています)

 サポートする認証方法は、デフォルトでは基本認証のみです。 「/X」の直後にプラス記号(+)を追記することで、ダイジェストアクセス認証をサポートします。
 認証方法の選択の仕様、および挙動の相違については、「/HA」のオプションの解説を参照して下さい。

 なお、FTPのURLアドレスに対して指定できるプロキシは、HTTP/FTP 両対応のプロキシのみです。
(いわゆる「FTP over HTTP」のプロキシ)
 プロキシを介してFTPのURLアドレスにアクセスする場合、ネットワーク間におけるやり取りは、HTTPとほぼ同じになります。 そのため、これまでのコマンドラインオプションの説明で、「※HTTP only」と注意書きされている機能も、 FTPのURLアドレスに対して使用可能になります。
(ただし、SYSYA が使用を禁じていないだけで、使用した結果がどうなるかは保証できません)

 なお、FTP専用のプロキシを指定したい場合は、「/X」のオプションは使えません。
 使いたい場合は、まずURLアドレスのホスト名の部位をプロキシのものに書き換えます。 更に「/HA」のオプションのユーザー名の部位の直後に、そのホスト名を追記します。
(詳細は、「/HA」のオプションの解説を参照して下さい)


/?

 簡単なヘルプを表示します。
 なお、このヘルプは、コマンドラインオプションに何も指定しないで SYSYA を実行させた場合も表示します。

オプション使用例

SYSYA /D0 /G* /S0 /-V http://www.sysya.net/
リクエストヘッダやレスポンスヘッダ、各種メッセージ等の出力を抑制し、 そのURLアドレスのエンティティボディのみを、標準出力(stdout)に出力します。 他のコマンドラインツール(sedとかawkとかetc)と組み合わせて使うのに便利です。
SYSYA /G /HU"Mozilla/5.0" http://www.sysya.net/
Mozillaの振りをして受信します。:-)
SYSYA /Limage/jpg http://www.sysya.net/otakara.jpg
お宝画像のリンク先が、本当に画像ファイルかどうかチェックします。B-)

戻る