postされた生データを取得する
2007-08-09-1 / カテゴリ: [CGI][perl] / [permlink]

use CGI;
my $q = new CGI;
my $buf = $q->param('POSTDATA');
でゲット。

ただし、メソッドがpostでかつ、リクエストヘッダの Content-type が application/x-www-form-urlencoded でも multipart/form-data でもないとき。
HANDLING NON-URLENCODED ARGUMENTS

加えて、Content-type リクエストヘッダがない場合も読めないっぽい。

結局、<STDIN> を読むのが手っ取り早いかな…

POST されるデータサイズの制限
2005-09-21-1 / カテゴリ: [programming][CGI][perl] / [permlink]

CGI.pm では、$CGI::POST_MAX に値(byte単位)を設定することで、そのサイズを超えた POST データのハンドリングができる。
$CGI::POST_MAX = 1024 * 1024 * 5; # 5MB
$obj_cgi = new CGI;
:
CGI を new するより前にセットしないと無効。

指定サイズを超えるデータが POST された場合は、cgi_error() にエラーメッセージがセットされるので、
if ($msg = $obj_cgi->cgi_error) {
	print "Error: ", $msg, "\n";
	exit;
}
みたいなかんじで。

chalow ラッパー CGI (ChangeLog to HTML)
2005-06-06-1 / カテゴリ: [perl][programming][changelog][CGI][chalow] / [permlink]

[2005-06-03-1] のやつ。
まず、CGI でファイルアップローダ(chlogup.cgi)をテキトーに作成
#!/usr/bin/perl
use CGI;
my $cgi = new CGI;
my $updata = $cgi->param('file');
my $chfile = "ChangeLog";

print $cgi->header('text/plain');

unless (open F, "> $chfile") {
  print "open error $chfile: $!\n";
  exit 1;
}
while (<$updata>) {
  print F;
}
close F;

print "exec chalow start\n";
print `/foo/bar/exec.sh 2>&1`;
print "exec chalow done\n";

で、ChangeLog をさくらへ up し、chalow を実行するシェルスクリプト(exec.sh)を作成
#!/bin/sh

/bin/cat ChangeLog | /usr/bin/ssh -i sshの鍵 username@sakura 'cat | env PERL5LIB=local/chalow/ local/chalow/chalow -c local/chalow/cl.conf -o www/changelog -'

CGI を呼ぶ HTML もテキトーに。
<html>
<body>
<form action="chlogup.cgi" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit">
</form>
</body>
</html>

さくらのサーバ上の ~/local/chalow 以下に chalow があるのが前提。

あとは、https でアクセスできるサーバにおいて、BASIC認証なりなんなりで制限すればいい(httpsなんでBASIC認証で十分でしょ)

Webしかアクセスできない環境からの chalow 更新方法の考察
2005-06-03-1 / カテゴリ: [diary][changelog][CGI][chalow] / [permlink]

平たく言うと、会社から update できないかな〜、と。
会社のインターネットへの接続は Web のみで http proxy は 80 と 443 しか空いてなく、さくらのサーバは https は利用不可。Digest 認証も使用できない[2005-05-29-1]ので「Webアップローダから ChangeLog をアップして、CGI 使って chalow 実行」もできない。Basic 認証じゃパスがつつぬけだから、js と CGI でワンタイムパスワード認証するプログラムでも作って…面白そうではあるが、さすがにメンドイぞ。

あ、自宅サーバという手(抜け道)があった。自宅なら https 上がってるから、そっちに Web アップローダ置いて、バックグラウンドで ssh でさくらへ接続・chalow 実行ってやればクリアできそう。

つか、自宅で chalow 実行して、生成 html だけさくらへ転送すれば、ChangeLog を置かなくて良いじゃん…(private や仕事的な内容を外に一瞬でも置かなくて済む)
Referrer (Inside): [2005-06-06-1]

use CGI での未定義
2004-10-07-1 / カテゴリ: [programming][perl][CGI] / [permlink]

my $hoge = $query->param('hoge');
で取得した場合、
?hoge=xx
は当然 xx
?hoge=
は空文字(defined)
なにもなければ
undef
になる

CGI/Fork (Apache2)
2004-05-06-5 / カテゴリ: [Apache][CGI] / [permlink]

Content-Length ヘッダのほかに、
「子プロセスで STDOUT を close してはいけない」
ようだ。(親プロセスは close しても動作に違いはない)
場合によっては、下記の KeepAlive を無効にする必要もあり。

KeepAlive の無効化 (Apache2)
2004-05-06-4 / カテゴリ: [Apache][CGI] / [permlink]

print "Connection: close\n";
を HTTP ヘッダにいれとく

Apache2 文字化け関連
2004-05-06-1 / カテゴリ: [Apache][CGI] / [permlink]

AddDefaultCharset を無効にするか、
index.html.var に
URI: index.html.ja.euc-jp
Content-language: ja
Content-type: text/html;charset=EUC-JP
みたいに記述し、
index.html.ja.euc-jp に euc-jp でファイルを記述する。
.euc-jp は必須(httpd.conf参照)

CGI の場合は、
"Content-type: text/html; charset=EUC-JP\n\n"
を出力しておけばよい

forkで重いプログラムのするcgiがApache2でうごかない件
2004-04-27-1 / カテゴリ: [Apache][CGI] / [permlink]

http://mm.apache.or.jp/pipermail/apache-users/2003-November/003529.html
からのスレッドをたどる
http://mm.apache.or.jp/pipermail/apache-users/2003-November/003531.html
が答え
print "Content-Type: text/html\n";
print "Content-Length: 6\n\ntest.\n";
と、Content-Length を加えると、とりあえず表示されるぽい

オープンした画像ファイルをCGIで表示
2004-04-02-1 / カテゴリ: [programming][perl][CGI] / [permlink]

print "Content-type: application/octet-stream\n\n";
open(F, "gazou.xxx");
binmode(F);
print while(<F>);
close(F);
カテゴリ: CGI

最終更新時間: 2013-05-02 16:12