curl のような wget のようなウェブクライアントの代替としてのStreamRelay.NET.exe

-LocalInputUrlFile/-RemoteInputUrlFile/-LocalOutputUrlFile/-RemoteOutputUrlFile オプションを使う事で、入力源/出力源をネットワーク上の Webサーバなどにする事ができる

---
### [Local|Remote][Input|Output]UrlFile オプション

ローカルと呼称されている側のストリームの入力源にしたい場合は、「-LocalInputURLFile [URL]」
リモートと呼称されている側のストリームの入力源にしたい場合は、「-RemoteInputFile [URL]」
ローカルと呼称されている側のストリームの出力源にしたい場合は、「-LocalOutputURLFile [URL]」
リモートと呼称されている側のストリームの出力源にしたい場合は、「-RemoteOutputFile [URL]」

を使えばよい。

---
### アップロードの仕様

「-LocalOutputURLFile/-RemoteOutputFile」は、出力先をネットワーク上のサーバに指定できるのだが、StreamRelay.NET.exeの仕様上、ストリームを開けっ放しにする必要があり、ネットワーク上のサーバに対して、そういう事はどうなんだろう(とは思いつつhttp/ftpの既定は開けっ放しなんですけど)、、、という事で、データは一時的に溜め込んでから(バッファリング)、ストリームのCloseイベントで、書き出す(ネットワーク上のサーバにアップロード)ようにする事ができる

そのためのオプションが

- tempFile
- tempMem

である。

---
### 全体的なオプション

全体的に SSL/TLS に対応している(https/ftps/smtps)に対応しているので、以下のオプションは共通

- CheckCert → サーバ側の証明書チェックを実施する
- CertFile=クライアント証明書
- CertPass=クライアント証明書のパスワード

---
### http

[System.Net.HttpWebRequest](https://msdn.microsoft.com/ja-jp/library/system.net.httpwebrequest(v=vs.110).aspx) クラスを使っているだけ。

[URL] の書式は、

http[s]://user:pass@host:port/path?query#option&option...

という感じ

- Upload(-[Local|Remote]OutputURLFile)は、WebDAV (のようなもの)が既定。
    - 既定のメソッドはPUT
    - ストリームデータはHTTPリクエスト・ボディ
    - 別途、header=translate:f を付けると完全にWebDAVになる
- Download(-[Local|Remote]InputURLFile)は、普通の HTTPクライアント
    - 既定のメソッドはGET
    - POST=[ファイル名]で、POSTデータを送信する事も可能
    - ストリームデータはHTTPレスポンス・ボディ

以下はoption

- header=name:value → HTTP ヘッダの名前と値を追加する
- post=[postedFile] → ボディとなるファイル(ボディが必要なら、既定のメソッドはGET→POSTになる)
- ProxyCredential=[user:pass] → Proxy の認証情報
- Proxy=[host:port]
- ProxyCredentialusedefaultCredential → Windowsの認証情報を転用する
- UseDefaultCredential → Windowsの認証情報を転用する
- UseDefaultProxy → Windowsのプロキシ設定を転用する
- http10 → HTTP/1.0 を使う
- http11 → HTTP/1.1 を使う
- ContentType=[value] Content-Type 値を設定する
- AutoRedirect System.Net.WebRequetオブジェクトのAutoRedirectの値をTrueにする
- Method=[POST|GET|HEAD|OPTIONS|PUT|DELETE|TRACE] → HTTPメソッドを明示する(既定は「GET」だが、OutputURLFileの場合は「PUT」でボディがストリームデータとなる)
- tempFile → アップロード時、一時ファイルをディスクに作成する
- tempMem → アップロード時、一時ファイルを作成しない(メモリ[System.IO.MemoryStream]上に保持する)

---
#### WebDAVとしてアップロードする事も可能

例えば、
> StreamRelay.NET.exe -LocalPort 0 -RemotePort 0 -LocalInputFile a.txt -RemoteOutputURLFile http://user:pass@www.example.com/share/a.txt#header=translate:f

とすると、ローカルのa.txtをWebDAVサーバ http://www.example.com/share/ へアップロードする事ができる

---
### ftp

[System.Net.FtpWebRequest](https://msdn.microsoft.com/ja-jp/library/system.net.ftpwebrequest(v=vs.110).aspx) クラスを使っているだけ。

[URL] の書式は、

ftp[s]://user:pass@host:port/path#option&option...

という感じ

以下はoption
- PASV → PASVモードで実施する
- tempFile → アップロード時、一時ファイルをディスクに作成する
- tempMem → アップロード時、一時ファイルを作成しない(メモリ[System.IO.MemoryStream]上に保持する)

---
### mailto スキーム

[System.Net.Mail.SmtpClient](https://msdn.microsoft.com/ja-jp/library/system.net.mail.smtpclient(v=vs.110).aspx) クラスを使っているだけ。

アップロード(LocalOutputFile/RemoteOutputFile)のみ

こちらの既定はバッファリング(サーバへの接続はデータが溜まってから)です。

データ(ストリームデータ)は、メール本文として送信されます。

[URL] の書式は、

mailto[s]:sendaddress?Option&Option...

という感じ

以下はoption
- Server=[SmtpServerHost:port]
- Subject=[Title]
- fromAddress=[MailAddress]
ここまでは必須

さらに
- toAddress=[MailAddress]
- ccAddress=[MailAddress]
- bccAddress=[MailAddress]
- Sender=[MailAddress]
- ReplyTo=[MailAddress]
- User=[SmtpAuthUser] → SMTP認証のユーザ名
- Pass=[SmtpAuthPassword] → SMTP認証のパスワード
- SSL → SMTPS を使う
- DataCharset=[CharsetName] (default=Encoding.Default)
- MailCharset=文字コード名 → 既定はiso-2022-jp
- MailBodyCharset=文字コード名 → 既定はiso-2022-jp
- MailSubjectCharset=文字コード名 → 既定はiso-2022-jp
- NewStyle → UTF-8 の現代的スタイルで送信する

---
#### mailto スキームの制限

- SSL というのは、STARTTLS
- 認証は、AUTH LOGIN のみのようです {[SMTP認証でメールを送信する - .NET Tips (VB.NET,C#...)](https://dobon.net/vb/dotnet/internet/smtpauth.html)}
- なんか、エラー(例外)のキャッチがうまく行かない場合があるんですよね

---
### file スキーム

[System.Net.FileWebRequest](https://msdn.microsoft.com/ja-jp/library/system.net.filewebrequest(v=vs.110).aspx) クラスを使っているだけ。

URL は
file:///ドライブ:/パス/ファイル名
な感じ。

ただ、絶対パスになるので、別途、-LocalOutputFile とか -RemoteOutputFile オプションに比べると、利点は特にない。

---
### webGetter.jar

もっと高機能なものは別途、作った。↓

[curl のような wget のような httping のようなウェブクライアント webGetter.jar](https://qiita.com/tomoki0sanaki/items/d4cc32059fac3bb9c12b)

---
### sendmail.net.exe

高機能かどうか分からんが、専用のコマンドを作った。

[BlatJ.exeのようなsendmailのようなメール送信するCLIコマンド sendmail.net.exe](https://qiita.com/tomoki0sanaki/items/927f3a1f8a36d96dbff3)

---
### 代理認証

[SMTP認証を代替するStreamRelay.NET.exe](https://qiita.com/tomoki0sanaki/items/57a0cdd2c448770f73d4)

---
### 目次へ戻る

[目次というか最初の一歩](http://qiita.com/tomoki0sanaki/items/85f20cbe18378e33cd6f)