cgi-lib.pl: Unknown Content-type: application/x-www-form-urlencoded;charset=shift_jis

いまどきでも、Perl で cgi のご依頼も時々あります。

そんなときに必ずぶつかるのが
『 cgi-lib.pl: Unknown Content-type: application/x-www-form-urlencoded;charset=shift_jis 』
au の 特定機種(W53CA,W54CA,etc..)でのみ発生します。

回避策は80行目あたりの

if (!defined $meth || $meth eq '' || $meth eq 'GET' ||
$meth eq 'HEAD' ||
$type eq 'application/x-www-form-urlencoded') {

の部分を下のように変更する。

if (!defined $meth || $meth eq '' || $meth eq 'GET' ||
$meth eq 'HEAD' ||
$type eq 'application/x-www-form-urlencoded' ||
$type eq 'application/x-www-form-urlencoded;charset=shift_jis') {

しかし、これだとPCブラウザでエラーになってしまう。
↓ こんな感じのエラーです。
『 cgi-lib.pl: Request to receive too much data: 175522 bytes 』
au のときだけ処理を変えるのが好ましい。

# UA 取得(モバイル振り分け)
$env2="";
$ag=$ENV{'HTTP_USER_AGENT'};
# UP.Browser が先頭だったらezweb
if(index($ag,"UP.Browser")==0){$env2 = 'au';}
# UP.Browser が先頭でなかったらezweb2
elsif(index($ag,"UP.Browser") > 0){$env2 = 'au';}


if($env2 eq 'au'){
	if (!defined $meth || $meth eq '' || $meth eq 'GET' || $meth eq 'HEAD' ||
	$type eq 'application/x-www-form-urlencoded' ||
	$type eq 'application/x-www-form-urlencoded;charset=shift_jis') {
}else{
	if (!defined $meth || $meth eq '' || $meth eq 'GET' || $meth eq 'HEAD' ||
	$type eq 'application/x-www-form-urlencoded') {
}
    local ($key, $val, $i);
	
    # Read in text
    if (!defined $meth || $meth eq '') {
      $in = $ENV{'QUERY_STRING'};
      $cmdflag = 1;  # also use command-line options

↑このような考え方ですが、これでは構文エラーになるので下記のようにします。


# UA 取得(au振り分け)
$URL="";
$ag=$ENV{'HTTP_USER_AGENT'};
if(index($ag,"UP.Browser")==0){$env2 = 'au';}
elsif(index($ag,"UP.Browser") > 0){$env2 = 'au';}

if($env2 eq 'au'){
		if (!defined $meth || $meth eq '' || $meth eq 'GET' || $meth eq 'HEAD' ||
		$type eq 'application/x-www-form-urlencoded' || $type eq 'application/x-www-form-urlencoded;charset=shift_jis'){
			$hogehoge = '1';
		}
}else{
		if (!defined $meth || $meth eq '' || $meth eq 'GET' || $meth eq 'HEAD' ||
		$type eq 'application/x-www-form-urlencoded') {
			$hogehoge = '1';
		}
}

if ($hogehoge eq '1') {
local ($key, $val, $i);

コメントを残す