Delphi 5 + Indy 9.0.0.10 で発生するバグを一つ発見。
Content-Type を multipart/form-data にして POST すると、最後のパートに余計な CRLF が付いてしまう。送信するときに付いているのか、Request オブジェクトを作成しているときに付いているのかなどは、ソースがないので不明。
最後にダミーのデータを付けることで対処。
追記。当メモは Indy が No data to read エラーを出すという件の回避方法でもあるはず。
Content-Type を multipart/form-data にして POST すると、最後のパートに余計な CRLF が付いてしまう。送信するときに付いているのか、Request オブジェクトを作成しているときに付いているのかなどは、ソースがないので不明。
最後にダミーのデータを付けることで対処。
request.AddFile(SearchRec.Name, target_file_path, 'application/octet-stream');
// 最後のパートに余計な CRLF が付くという Indy 9.0.0.10 のバグ回避
request.AddFormField('dummy', 'str');
追記。当メモは Indy が No data to read エラーを出すという件の回避方法でもあるはず。
Delphi5 ヘルプ
インデント/アウトデントしたい範囲を選択してコマンドを入力する。
VS.NET はペーストしたコードでもなんでも勝手にインデントを揃えてくれるんだけど、Delphi5 はやってくれないので自分で揃える。
コメントアウトとコメントアウト解除のキーボードショートカットも探したけど、見つからなかった。複数行を一気にコメントにしたいときに使いたいんだけどな。Delphi だと {} で囲んだ部分が複数行対応のコメントになるから、それを使えばいいか。
〔Ctrl〕+〔Shift〕+〔I〕 ブロックをインデントする
〔Ctrl〕+〔Shift〕+〔U〕 ブロックをアウトデントする
インデント/アウトデントしたい範囲を選択してコマンドを入力する。
VS.NET はペーストしたコードでもなんでも勝手にインデントを揃えてくれるんだけど、Delphi5 はやってくれないので自分で揃える。
コメントアウトとコメントアウト解除のキーボードショートカットも探したけど、見つからなかった。複数行を一気にコメントにしたいときに使いたいんだけどな。Delphi だと {} で囲んだ部分が複数行対応のコメントになるから、それを使えばいいか。
Delphi5 + Indy 9.0.0.10 で HTTP Cookie を扱う方法。
2003-12-16 の「indy で HTTP の拡張ヘッダを扱う」とやってることは同じ。HTTP ヘッダを直読み・直書きしてるだけ。CookieManager クラスを使う方法もあるが、上記の方法が一番シンプルで簡単。ただし、上記方法は Cookie の有効期限やドメイン、path は一切無視しているので注意。それらを扱いたければ CookieManager を使う。
Google を検索したら ExtraHeaders を使う方法が見つかったが、Indy のバージョンが異なるのかプロパティが見つからなかった。
Indy Tips
http://www.monazilla.org/document/indytips.html
http://66.102.7.104/search?q=cache:aXMyyoN584QJ:www.studying ...
なぜか 403 Forbidden になってしまうので Google キャッシュ。
HTTP := TIdHTTP.Create(nil);
HTTP.Request.CustomHeaders.Add('Cookie: ' + cookie_string); // Set Cookie
cookie_string := HTTP.Response.RawHeaders.Values['Cookie']; // Get Cookie
2003-12-16 の「indy で HTTP の拡張ヘッダを扱う」とやってることは同じ。HTTP ヘッダを直読み・直書きしてるだけ。CookieManager クラスを使う方法もあるが、上記の方法が一番シンプルで簡単。ただし、上記方法は Cookie の有効期限やドメイン、path は一切無視しているので注意。それらを扱いたければ CookieManager を使う。
Google を検索したら ExtraHeaders を使う方法が見つかったが、Indy のバージョンが異なるのかプロパティが見つからなかった。
Indy Tips
http://www.monazilla.org/document/indytips.html
クッキーを添えて送信する
FIdHttp.Request.ExtraHeaders.Add('Cookie:NAME=HOGEHOGE'); // こんなかんじ
FIdHttp.Post(Url, Source, Res);
- Cookie の仕様
HTTP Cookieshttp://66.102.7.104/search?q=cache:aXMyyoN584QJ:www.studying ...
なぜか 403 Forbidden になってしまうので Google キャッシュ。
Delphi5 で CSV を扱うならカンマ区切りのデータが扱いやすい。TStrings.CommaText を使えるからだ。ちなみに、TStringList.DelimitedText は Delphi5 にはないので、タブ区切りなどにしてしまうとかえって大変。
Delphi5 ヘルプ TStrings.CommaText
Delphi5 ヘルプ TStrings.CommaText
TStrings.CommaText
CommaText プロパティは,システムデータ形式(SDF)でリストに入っている TStrings オブジェクト内の文字列リストです。
property CommaText: string;
説明
CommaText プロパティは TStrings オブジェクト内のすべての文字列を単一のカンマ区切り文字列として取得および設定できます。
CommaText を取得するときに文字列リストの文字列にスペース,カンマ,または引用符がある場合には,文字列は二重引用符で囲まれ,二重引用符がある場合には二重引用符が連続して付けられます。たとえば,文字列リストに次の文字列があるとします。
Stri,ng 1
Stri"ng 2
String 3
String4
CommaText は次を返します。
"Stri,ng 1","Stri""ng 2","String 3",String4
CommaText を割り当てる場合,値は SDF 書式付きテキストとして解析されます。SDF 形式の場合,文字列はスペースまたはカンマで区切られ,任意で二重引用符で囲まれます。文字列に二重引用符がある場合,元の文字列と文字列を囲む引用符を区別するために続けて引用符を付けます。二重引用符で囲まれていないスペースおよびカンマは区切り記号です。2 つ並んだカンマは空の文字列を意味しますが,区切り記号の前後にあるスペースは無視されます。たとえば,CommaText を次のように設定するとします。
"Stri,ng 1", "Stri""ng 2", String 3,String4
リストには次の文字列が含まれます。
Stri,ng 1
Stri"ng 2
String
3
String4
- 拡張レスポンスヘッダの取得
拡張レスポンスヘッダは RawHeaders オブジェクトから取得する。str := IdHTTP1.Response.RawHeaders.Values['X-SpecialResponse'];
- 拡張リクエストヘッダの設定
拡張リクエストヘッダは CustomHeaders.Add() を利用して設定する。IdHTTP1.Request.CustomHeaders.Add('X-SpecialRequest: F-ZERO GX');
- CustomHeaders からは取得できない
レスポンスヘッダの取得は CustomHeaders オブジェクトでもできるかなと思ってアクセスしたが、Indy ver 9.0.0.10 では取得できなかった。IdHTTP1.Response.CustomHeaders.Count も 0 だった。マニュアルを読み試行錯誤した結果、RawHeaders でないとダメと言うことがわかった。RawHeaders だけでなく CustomHeaders でも取得できても良いと思うんだけどなあ。以下の方法では取得できない。
// NG
str := IdHTTP1.Response.CustomHeaders.Values['X-SpecialResponse'];