multipartの解析部分の変更

まだうまく行ってるのかどうか疑問だけど、multipart解析部分で、今回変更したのは。
/usr/local/lib/perl5/site_perl/5.8.6/CGI/Lite.pm
の中の
sub_parse_multipart_data
から、
current_bufferに対して正規表現で disposition header body を取得する部分。
出力用ファイルハンドルを変更する部分(CL00がすでに使われていたら、インクリメントしてファイルハンドルを変更する)
を取り込んでみた。
ファイルハンドルを変更するところは、use strict 環境下では、ブロック内で
no strict ’refs’
が必要。
自作ルーチンでは、disposition データ部分の切り分けで失敗することが多かった、ようなので、すでに枯れて落ち着いてる車輪を導入。
mod_perl下でメモリのキャッシュの挙動がよくわからんし、同時アクセス制御にもなるだろう、ということでファイルハンドルの変更を導入。
といった感じか。
multipart/form-dataを使って、画像などのアップロードするCGIはこのやり口が定番、らしい。Mac版IE5.23のバグも吸収してるっぽいし、これで安定してくれるといいんだけど…。
read(STDIN, $buf, $ENV{’CONTENT_LENGTH’});
my($boundary) = $ENV{’CONTENT_TYPE’} =~ /boundary=-(\S+)$/; バウンダリの取得
my @form_body = split(/\-*${boundary}\-*/, $buf);
foreach my $c ( @form_body ){
next if ! $c;
my ($disposition,$header,$body);
if($c =~ /[Cc]ontent-[Dd]isposition: ([^\x0D\x0A]+)\x0D?\x0A Disposition
(?:([A-Za-z].*?)(?:\x0D?\x0A){2})? ヘッダ情報の取得
(?:\x0D?\x0A)? 予約空行
(?=(.+))/xs){ データ行(次のヘッダ情報が含まれていることもある)
($disposition,$header,$body) = ($1,$2,$3);
}
next if ! $disposition;
if( $disposition =~ /name=\"([^\"]+)\"; *filename=\"([^\"]+)\"/i ){
my $name = $1;my $filename = $2; $filename =~ s!\\!/!g; $filename =~ s!^.+/!!;
$form_file{$filename} = $body if $filename && $body;
$form{$name} = $filename;
$name=""; $filename =""; $body = "";
}
else{
my ( $name ) = $disposition =~ /.+name=\"([^\"]+)\"/i;
next if ! $name;
$body =~ s/(\r\n)+$//
$form{$name} = $body;
}
}
BLOCK_RTAG| << | 2026/1 | >> | ||||
|---|---|---|---|---|---|---|
| 日 | 月 | 火 | 水 | 木 | 金 | 土 |
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
【最近の20件】
- 20260129 ブログをレスポンシブ対応にリニューアル
- 20260126 ブログのふり返り
- 20260121 小ネタ:ed25519秘密鍵公開鍵とJson serialized canonical
- 20260120 ActivityPubは自作実装しよう!
- 20260117 RFC9421版HTTP Signatureに対応
- 20260111 HTTP Signatureの署名対象文字列
- 20260109 web本棚のActivityPub対応
- 20260106 web本棚のソースコード公開
- 20260104 web本棚
- 20260101 謹賀新年2026
- 20251231 2025年ふりかえり
- 20251213 perlと30年
- 20251210 ActivityPubの投稿削除
- 20251101 日常雑感
- 20251026 テキトーフェッチメール
- 20251014 ActivityPubサーバーで投稿の編集
- 20251008 元WINDOWS10のノパソにlinux mint
- 20251002 GBLシーズン「変わりゆく物語」でACE到達
- 20250925 ブログのアクセス制限
- 20250922 ActivityPubサーバーに引用を実装


