プログラマメモ2 - programmer no memo2

[delphi] https_file_getter - Indy使ってます。 2011/02/05
2011/02/05

delphiです。ことの発端は、httpsなファイルを取得したいという話から。windowsな環境で、いろいろ工夫すればデフォルトの環境でできるかなと思ったけど、せっかくだからdelphiで。

delphiですとIndy使うと簡単にできるということらしい。
コンソールアプリケーションとして作成してます。

まずは論よりコード

program https_file_getter;
{$APPTYPE CONSOLE}

uses
SysUtils, IdHTTP, IdSSLOpenSSL, Classes;

var
IdHTTP: TIdHTTP;
SSLIO: TIdSSLIOHandlerSocketOpenSSL;
paraCount: integer;
MS: TMemoryStream;// 使ってないけどね。
FS: TFileStream;
url: String;
filename: String;

begin

(*
一番目の引数はターゲットURL
2番目の引数は出力するファイル
*)
try

(*
コマンドライン引数を処理部
*)
begin
// コマンドライン引数の数
paraCount := ParamCount;

if paraCount = 0 then
begin
Writeln('*** 引数[1]必須 url [2]option 出力ファイル名');
exit;
end;

if 0 < paraCount then
begin
// コマンドラインから文字列を取得
url := ParamStr(1);
end;

if 1 < paraCount then
begin
// コマンドラインから文字列を取得
filename := ParamStr(2);
end;

end;

(*
Indyを使っている部分
*)
begin
IdHTTP := TIdHTTP.Create();
SSLIO := TIdSSLIOHandlerSocketOpenSSL.Create(nil); // これじゃないとhttpsできないよ
SSLIO.SSLOptions.Method := sslvSSLv3;
IdHTTP.ReadTimeout := 10000;
IdHTTP.ConnectTimeout := 10000;
IdHTTP.IOHandler := SSLIO;

// filenameがあれば
if 0 < Length(filename) then
begin
// fmCreate : ファイルがなければ作成、あれば再作成
FS := TFileStream.Create(filename, fmCreate);
// これだけストリーム書き出せるけど、巨大なファイル対応できる?
IdHTTP.Get(url, FS);
FS.Free;// これ必要?
end
else
begin
// 標準出力するだけ
Write(IdHTTP.Get(url));
end;
end; // Indy使ってる部分終了

except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);

end;

end.

(*
どこまで大きいファイルに対応できてるんだろう?

*)


最初の引数でurlを指定します。
二番目の引数で、取得したファイル名を指定。
なければ標準出力に出力します。エンコードは気にしてないので、リダイレクトしても役にたたないです。

https(SSL)に対応させるためにオープンソースのライブラリを利用してます。
これないとだめ
ssleay32.dll
libeay32.dll


参考

ちなみに高機能なコマンドにwgetとcurlがあります。windowsならcygwinとかで使えると思う。
wgetとcurlの根本的な違い - ctrlshiftの日記

: