###########################################################################
# Http for INCM_MODULE
# INCM Plug-in用 HTTPモジュール  by GETWILD'74
# 2004/04/07  Ver0.98
###########################################################################

 # 一　五明さんのCMLIB15を参考にしました

package Http;

###########################################################################
#                                                                         #
#  +++ 接続関係 +++                                                       #
#                                                                         #
#                                                                         #

# 接続数
my $Count;

#--------------------------------------------------------------------------
#  Httpクラスのインスタンス生成
#--------------------------------------------------------------------------
sub new{
	my $Class = shift;
	my $DATA = $INCM_MODULE::DATA;
	my $INI = $DATA->CallObj('INI');
	my $Param = { Port => 80, @_ };
	$Param->{Host} = $INI->GetParam('Host') if (!$Param->{Host});
	$Param->{Uri} = $INI->GetParam('Uri') if (!$Param->{Uri});
	$Param->{Port} = $INI->GetParam('Port') if ($INI->GetParam('Port'));
	$Param->{Proxy} = $INI->GetParam('Proxy'); $Count++;
	$Param->{Count} = $Count;
	$Param->{DATA} = $DATA;
	bless $Param, $Class;
}

#--------------------------------------------------------------------------
#  URL設定
#--------------------------------------------------------------------------
sub SetUrl{
	my $Class = shift;
	my $Host = shift;
	my $Uri = shift;
	$Class->{Host} = $Host if ($Host);
	$Class->{Uri} = $Uri if ($Uri);
	my $Debug = '$Class->{Host} = '.$Class->{Host}."\n";
	$Debug .= '			$Class->{Uri} = '.$Class->{Uri};
	$Class->{DATA}->DebugWrite(Code => $Debug);
}

#--------------------------------------------------------------------------
#  認証設定
#--------------------------------------------------------------------------
sub Authorization{
	my $Class = shift;
	my $INI = $Class->{DATA}->CallObj('INI');
	$Class->{UserBasic} = "Authorization: Basic "
		.CodeCnv->b64ex($INI->GetParam('User').':'.$INI->GetParam('Pass'))
		."\r\n" if ($INI->GetParam('User'));
	$Class->{DATA}->DebugWrite(Code => '$Class->{UserBasic} = '.$Class->{UserBasic});
}

#--------------------------------------------------------------------------
#  Agent設定
#--------------------------------------------------------------------------
sub Agent{
	my $Class = shift;
	my $Agent = shift;
	my $Proxy = shift;
	if ($Agent || $Proxy) {
		# 偽装AGENT
		$Class->{AGENT} = 'Mozilla/4.0 (compatible; INCM/1.21)';
	} else {
		# 通常AGENT
		$Class->{AGENT} = 'INCM/1.21';
	}
	$Class->{DATA}->DebugWrite(Code => '$Class->{AGENT} = '.$Class->{AGENT});
}

#--------------------------------------------------------------------------
#  Referer設定
#--------------------------------------------------------------------------
sub Referer{
	my $Class = shift;
	my $Mode = $Class->{DATA}->GetBasic('Http', 'Referer');
	if ($Mode) {
		$Class->{Referer} = $Mode;
	} else {
		# 対象URLをリンク元とする
		$Class->{Referer} = 'http://'.$Class->{Host}.$Class->{Uri};
	}
	$Class->{DATA}->DebugWrite(Code => '$Class->{Referer} = '.$Class->{Referer});
}

#--------------------------------------------------------------------------
# HTTP Reqest 処理
#  GetHttp(Skip => 1, NoMes => 1, TEMP => '>001.CM$', Method => 'POST' or 'GET')
#  TEMPは出力ファイル名（""だとファイルを開かない）
#  Skipが真ならヘッダ部を飛ばす（HTTP_HEADに入る）
#  NoMesが真なら、接続メッセージを表示しない
#  Methodが""だとGET
#--------------------------------------------------------------------------
sub GetHttp{

	my $Class = shift;
	my $Param = { @_ };

	my $Error = 1; my $Read;

	# 巡回ウィンドウへの接続中メッセージ
	unless ($Param->{NoMes}) {
		print STDOUT "\nConnecting...";
		$Param->{NoMes} = 1;
	}

	($Class->{Handle}, my $r) = $Class->HttpReq(Method => $Param->{Method}
						, NoMes => $Param->{NoMes}, Param => $Param->{Param}, Uri => $Param->{Uri});

	my $HTTP = $Class->{Handle};

	if ($HTTP) {
		$/ = "\n";
		$Read = <$HTTP>; $Class->{HEAD} = $Read; $Read =~ s/[\r\n]*$//;
		print STDOUT $Read unless ($Param->{NoMes});		# 接続時の表示

		$Read =~ / (\d\d\d) /;
		if ($1 > 399 || $1 == 304) { $Error = 0; }

		# ヘッダ読み飛ばし
		if ($Param->{Skip}) {
			while ($Read !~ /^\r?\n$/) { $Read = <$HTTP>; $Class->{HEAD} .= $Read; }
		}

	} else {
		print STDOUT "\nConnection unsuccessful." unless ($Param->{NoMes});
		$Error = 0;
	}

	my $Debug = 'NoMes = '.$Param->{NoMes}."\n";
	$Debug .= '			Method = '.$Param->{Method}."\n";
	$Debug .= '			Uri = '.$Param->{Uri}."\n";
	$Debug .= '			$Param->{Skip} = '.$Param->{Skip}."\n";
	$Debug .= '			$Class->{HEAD} = '.$Class->{HEAD}."\n";
	$Debug .= '			$Error = '.$Error;
	$Class->{DATA}->DebugWrite(Code => $Debug);
	IO->Error('接続に失敗しました') if (!$Error && !$Param->{IO});
	return $Error;
}

#--------------------------------------------------------------------------
# HTTP Reqest 処理
#  MethodはPOST か GET(後者が無難）
#   " *HEAD"　だとHEAD
#  $adcache に実アドレスをキャッシュする(別ホストに接続する場合は""にする)
#--------------------------------------------------------------------------
sub HttpReq{
	my $Class = shift;
	my $Param = { @_ };
	my $DATA = $Class->{DATA};
	my $Type = $DATA->GetRound('Type');
	my $Parse = $DATA->CallObj('Parse');
	my $PrmMethod = $Parse->GetPrm('Pages', $Type, 'Method') if ($Parse);
	my $Debug = '$Type = '.$Type."\n";
	$Class->{Cookie} = $DATA->GetBasic('Http', 'Cookie') if ($DATA->GetBasic('Http', 'Cookie'));

	$Param->{Method} = $PrmMethod || 'GET' if (!$Param->{Method});
	$Debug .= '			$Param->{Method} = '.$Param->{Method}."\n";

	my($Host, $Uri) = ($Class->{Host}, $Class->{Uri});
	$Param->{Uri} = $Param->{Param}{Uri} if (!$Param->{Uri});
	$Uri = $Param->{Uri} if ($Param->{Uri});
	if (my $EvalUri = $DATA->GetBasic($Type, 'EvalUri')) {
		eval($EvalUri);
	}
	my($Addr, $p, $HttpErr, $RET) = ("", "", "", 0);

	if ($Param->{Param} && $Param->{Param} !~ /^HASH\(/) {
		$Uri =~ s/\?(.*)$// ;
		my $oParam = $1;
		if ($Param->{Method} eq 'GET') {
			if ($Uri =~ /\?([^\?]+)$/) {
				$Uri .= '&'.$Param->{Param}
			} elsif ($Uri =~ /[^\.]+\.[^\.]+$/) {
				$Uri .= '?'.$Param->{Param}
			} else {
				$Uri .= $Param->{Param}
			}
		}
		if ($Uri !~ /$oParam/) {
			if ($Uri =~ /\?([^\?]+)$/) {
				$Uri .= '&'.$oParam
			} elsif ($Uri =~ /[^\.]+\.[^\.]+$/) {
				$Uri .= '?'.$oParam
			} else {
				$Uri .= $oParam
			}
		}
	}

	print STDOUT "\nConnecting..." unless ($Param->{NoMes});

	{
		if ($Class->{Proxy}) {
			$Uri = "http://$Host$Uri"; $Host = $Class->{Proxy};
			$p="Pragma: no-cache\r\n";
		}
	$Debug .= '			$Host = '.$Host."\n";
	$Debug .= '			$Uri = '.$Uri."\n";
	$Debug .= '			$Class->{Proxy} = '.$Class->{Proxy}."\n";
	$Debug .= '			$Class->{UserBasic} = '.$Class->{UserBasic}."\n";
	$Debug .= '			$Class->{AGENT} = '.$Class->{AGENT}."\n";
	$Debug .= '			$Class->{Cookie} = '.$Class->{Cookie}."\n";
	$Debug .= '			$Class->{Referer} = '.$Class->{Referer}."\n";
	$Debug .= '			$Param->{Param} = '.$Param->{Param}."\n";

		if ($Class->{AdCache}) { $Addr = $Class->{AdCache}; }
		elsif ($Host =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/) {
			$Addr = pack("c4",$1,$2,$3,$4);
		} else {											#hostが見つからない場合
			$HttpErr = 0;
			last unless($Addr = (gethostbyname($Host))[4]);
			$Class->{Proxy} = join(".",unpack("c4",$Addr))  if ($Class->{Proxy});
			$Class->{AdCache} = $Addr;								#DNSキャッシュ
		}

		my $HD = $Class->{Count};
		socket(HTTP.$HD, 2, 1, 0);
		$RET = \*{HTTP.$HD};
		$HD = $Class->{Handle} = $RET = *$RET{IO};

		$HttpErr = 0;
		last unless(connect($HD, pack("S n a4 x8", 2, $Class->{Port} ,$Addr)));
		select((select($HD),$|=1)[0]);		# 出力をバッファリングしない

		if ($Param->{Method} eq " *HEAD") {
			print $HD "HEAD $Uri HTTP/1.0\r\n",
				   "User-Agent: $Class->{AGENT}\r\n",
					   "Host: $Class->{Host}\r\n",
						$p,$Class->{UserBasic},"\r\n";
			$Debug .= '			Connect [HEAD]'."\n";

		} elsif ($Param->{Method} eq 'POST' || $Param->{Method} eq 'Multipart') {
			my $ContentType = 'application/x-www-form-urlencoded';
			my $Boundary = $DATA->CallObj('INCM')->{Boundary};
			$ContentType = 'multipart/form-data; boundary='.$Boundary if ($Boundary);
			$Debug .= '			$ContentType = '.$ContentType."\n";
			print $HD "POST $Uri HTTP/1.0\r\n",
					   "User-Agent: $Class->{AGENT}\r\n",
					   "Host: $Class->{Host}\r\n",
					   "Cookie: $Class->{Cookie}\r\n",
					   "Referer: $Class->{Referer}\r\n",
					   $p,$Class->{UserBasic},
					   "Content-Type: $ContentType\r\n",
					   "Content-Length: ",length($Param->{Param}),"\r\n\r\n",$Param->{Param};
			$Debug .= '			Connect [POST]'."\n";

		} else {
			print $HD "GET $Uri HTTP/1.0\r\n",
					   "User-Agent: $Class->{AGENT}\r\n",
					   "Host: $Class->{Host}\r\n",
					   "Cookie: $Class->{Cookie}\r\n",
					   "Referer: $Class->{Referer}\r\n",
					   $p,$Class->{UserBasic},"\r\n";
			$Debug .= '			Connect [GET]'."\n";
		}

		$HttpErr = 1;

		if ($Param->{Check}) {
			$/ = "\n";
			while (my $Read = <$HD>) {
				$Class->{HEAD} .= $Read; $Read =~ s/[\r\n]*$//;
				print STDOUT $Read unless ($Param->{NoMes});		# 接続時の表示
				$Read =~ / (\d\d\d) /;
				if ($1 > 399 || $1 == 304) { $HttpErr = 0; last;}
				if ($Read =~ /$Param->{CheckFalse}/) {
					if (!$1) {
						$HttpErr = 0;
						last;
					}
				}
				last if (!$Read);
			}
		}
	}
	$Debug .= '			$HttpErr = '.$HttpErr."\n";
	$Debug .= '			$Param->{Check} = '.$Param->{Check}."\n";
	$Debug .= '			$Count = '.$Class->{Count}."\n";
	$Debug .= '			$RET = '.$RET;
	$DATA->DebugWrite(Code => $Debug);
	return $RET, $HttpErr;
}

#--------------------------------------------------------------------------
#  HTTPのクローズ
#--------------------------------------------------------------------------
sub Close{
	my $Class = shift;
	close $Class->{Handle};
}

#--------------------------------------------------------------------------
#  HTTPの読み込み
#--------------------------------------------------------------------------
sub Read{
	my $Class = shift;
	my $Step = shift;
	my $FH = $Class->{Handle};
	$/ = $Step if ($Step);
	return <$FH>;
}

#--------------------------------------------------------------------------
#  HTTP読込と区切りの設定
#--------------------------------------------------------------------------
sub ReadStep {
	my $Class = shift;
	my $Param = { @_ };
	my $Step;
	my $DATA = $Class->{DATA};
	my $Type = $DATA->GetRound('Type');
	my $INI = $DATA->CallObj('INI');
	my $Parse = $DATA->CallObj('Parse');

	$Class->{Step} = $Param->{Step} || $DATA->CallObj('Parse')->GetPrm($Type, 'Step');
	$Class->{StepTop} = $Param->{StepTop} || $DATA->CallObj('Parse')->GetPrm($Type, 'StepTop');
	$Class->{StepBottom} = $Param->{StepBottom}  || $DATA->CallObj('Parse')->GetPrm($Type, 'StepBottom');
	if ($Param->{Set} eq 'Step') {
		$/ = $Step = $Class->{Step};
	} elsif ($Param->{Read} eq 'Top') {
		$/ = $Step = $Class->{StepTop};
	} elsif ($Param->{Read} eq 'Bottom') {
		$Step = $Class->{StepBottom};
	}

	if ($Param->{Read} && $Step) {
		if ($Param->{Read} eq 'Bottom') {
			if ($DATA->{String} =~ /$Step/) {
				$DATA->{String} = (split(/$Step/, $DATA->{String}))[0];
				$DATA->SetRound(Name => $Type.',ReadEnd', Data => 1);
			}
		} elsif ($Param->{Read} eq 'Top') {
			my $Read = $Class->Read($Step);
			# 次ページ解析
			$Parse->GetNextPage(\$Read) if (!$Parse->GetResult($Type, 'NextParam'));
			# 投稿用Url解析
			$Parse->GetUpUrl(\$Read) if ($DATA->GetBasic('UpUrl', 'Type') eq 'Main' && !$DATA->GetBasic('UpUrl', 'Parse'));
			my $CnvMethode = $DATA->GetRound('CnvMethod');
			CodeCnv->$CnvMethode(\$Read) if ($CnvMethode);
			$Read .= "\n\n<!-- ### StepTop ### -->\n\n" if ($DATA->CallObj('DEBUG'));
			$DATA->CallObj('LOG')->Write($Read);
		}
	}
}

#--------------------------------------------------------------------------
#  HTTP再読込の読み飛ばし設定
#--------------------------------------------------------------------------
#sub Skip {
#	my $Class = shift;
#	my $Param = shift;
#
#	$Class->{Skip} = $Param if ($Param);
#	return $Class->{Skip};
#}
#
##--------------------------------------------------------------------------
#  次のページまたは標準で引数が必要な場合の設定
#--------------------------------------------------------------------------
sub SetPageParam{
	my $Class = shift;
	my $DATA = $Class->{DATA};
	my $Type = $DATA->GetRound('Type');
	my $Parse = $DATA->CallObj('Parse');
	my $Pages = $Parse->GetPrm('Pages',$Type);
	my $Params;
	my $UriParam = $DATA->CallObj('INI')->GetParam('Uri');
	$UriParam =~ s/.+\??(.*)/$1/;

	$Params = $Pages->{Frame};
	$Params .= '&'.$Pages->{Mode} if ($Pages->{Mode});
	$Params .= '&'.$UriParam if ($UriParam);
	$Params =~ s/^&//;

	my $Debug = '$Type = '.$Type."\n";
	$Debug .= '			Frame = '.$Pages->{Frame}."\n";
	$Debug .= '			Mode = '.$Pages->{Mode}."\n";
	$Debug .= '			$UriParam = '.$UriParam."\n";
	$Debug .= '			$Params = '.$Params;
	$Class->{DATA}->DebugWrite(Code => $Debug);
	return $Params;
}

#--------------------------------------------------------------------------
#  次のページ処理
#--------------------------------------------------------------------------
sub NextPage{
	my $Class = shift;
	my $DATA = $Class->{DATA};
	my $Type = $DATA->GetRound('Type');
	my $Param2 = $DATA->CallObj('HeadCMT')->{Param}{Files}{$DATA->{Round}{CMT}{No}}{Point} || $DATA->CallObj('INI')->GetParam('Param2');
	my $Parse = $DATA->CallObj('Parse');
	my $NextParam = $Parse->GetResult($Type, 'NextParam');
	my $NextPages = $Parse->GetPrm('Pages', $Type, 'NextPage');
	my $Debug = '$Type = '.$Type."\n";
	$Debug .= '			$Param2(1) = '.$Param2."\n";

	if (!$NextPages->{Found}) {
		$Debug .= '			return 0 [Not $NextPages->{Found}]';
		$DATA->DebugWrite(Code => $Debug);
		return 0;
	}

	if (!$NextParam) {
		my $Step = $NextPages->{Step};
		while (my $STR = $DATA->CallObj('HTTP')->Read($Step)) {
			$NextParam = $Parse->GetNextPage(\$STR);
		}
	}

	if (!$NextParam && !$NextPages->{Url}) {
		$Debug .= '			return 0 [Not $NextParam || Not $NextPages->{Url}]';
		$DATA->DebugWrite(Code => $Debug);
		return 0;
	}
	$Parse->{Result}{$Type}{NextParam} = undef;

	$Debug .= '			$NextParam = '.$NextParam."\n";

	# 未読ポインタがページ数指定ならカウントダウンする
	if ($Param2 && $Param2 =~ /^\d+$/) {
		$Param2--;
		$Debug .= '			$Param2(2) = '.$Param2."\n";
	}
	# 未読ポインタより古い記事なら抜ける
	my $ReadPoint = $Parse->GetPrm($Type, 'ReadPoint');
	if($DATA->CompareDate >= 0 && $ReadPoint && $ReadPoint ne 'None') {
		$Debug .= '			return 0 [CompareDate >= 0 && Not ReadPoint]';
		$DATA->DebugWrite(Code => $Debug);
		return 0;
	}
	# ローカルファイルなら抜ける
	if ($DATA->CallObj('INCM')->GetMode('Local')) {
		$Debug .= '			return 0 [Local Mode]';
		$DATA->DebugWrite(Code => $Debug);
		return 0;
	}
	# 未読ポインタがなければ抜ける
	if (!$Param2 && !$NextPages->{AllRead}) {
		$Debug .= '			return 0 [Not $Param2]';
		$DATA->DebugWrite(Code => $Debug);
		return 0;
	}

	if (my $Point = $DATA->CallObj('HeadCMT')->{Param}{Files}{$DATA->{Round}{CMT}{No}}{Point}) {
		$DATA->CallObj('HeadCMT')->{Param}{Files}{$DATA->{Round}{CMT}{No}}{Point} = $Param2;
	} else {
		$DATA->CallObj('INI')->SetParam('Param2', '', $Param2);
	}

	# 最初のページの数がページ毎の最大値に
	my $AtclMax = $DATA->GetRound($Type,'Count','AtclMax');
	my $AtclCount = $DATA->GetRound($Type,'Count','AtclCount');
	$AtclMax = $DATA->SetRound(Name => "$Type,Count,AtclMax", Data => $AtclCount) unless ($AtclMax);
	# 最大値より少ないなら最終ページ(終了)
	if ($AtclCount < $AtclMax) {
		$Debug .= '			$AtclCount = '.$AtclCount."\n";
		$Debug .= '			$AtclMax = '.$AtclMax."\n";
		$Debug .= '			return 0 [$AtclCount < $AtclMax]';
		$DATA->DebugWrite(Code => $Debug);
		return 0;
	}

	# 次ページのアドレス設定
	my $ResultUri = $Parse->GetResult($Type, 'NextUri');
	my $SetUri;
	if ($NextPages->{Url} || $ResultUri) {
		my $Uri = $Class->{Uri};
		$Uri = '/'.$NextPages->{Url}{Uri} if ($NextPages->{Url}{Uri});
		$Uri = '/'.$ResultUri if ($ResultUri);
		$Uri =~ s/^[\/]+/\//;
		my $Param = $NextPages->{Url}{Param};
		my $Cgi = $Parse->GetResult($Type, 'NextCgi') || $NextPages->{Url}{Cgi};
		if ($Cgi) {
			$Uri =~ s#/[^/]+$#/#;
			$Uri .= $Cgi;
		}
		if ($Class->{Uri} eq $Uri.$Param && !$ResultUri) {
			$Debug .= '			$Class->{Uri} = '.$Class->{Uri}."\n";
			$Debug .= '			return 0 [$Class->{Uri} == $Uri.$Param]';
			$DATA->DebugWrite(Code => $Debug);
			return 0;
		}
		$SetUri = $Uri.$Param;
		$Debug .= '			$Class->{Uri} = '.$Class->{Uri}."\n";
	} elsif (my $NextUrl = $Parse->GetResult($Type, 'NextUrl')) {
		$NextUrl =~ /^http:\/\/([^\/]+)(.*)$/;
		$Class->{Host} = $1;
		$SetUri  = $2;
	}

	my $NextMethod = $Parse->GetPrm('Pages',$Type,'Method');
	$NextMethod = $NextPages->{Method} if ($NextPages->{Method});

	if ($Class->HttpReq(Param => $NextParam, Method => $NextMethod, Uri => $SetUri)){
		$Debug .= '			return 1 [Read Next Html]';
		$DATA->DebugWrite(Code => $Debug);
		$DATA->SetRound(Name => $Type.',NextPageFlag', Data => 1);
		my $Title = $DATA->CallObj('HeadCMT')->{Param}{Files}{$DATA->GetRound('CMT', 'No')}{Title};
		$Parse->GetTitle($Title);
		return 1;
	}

	print STDOUT "\nPage ",$DATA->GetRound($Type,'Count','PageCount') + 1, " and before cannot read.";		# 読めなかった
	$Debug .= '			return 0 [Cannot Read]';
	$DATA->DebugWrite(Code => $Debug);
	return 0;
}

#--------------------------------------------------------------------------
#  添付ファイルダウンロード
#--------------------------------------------------------------------------
sub FileDownLoad {
	my $Class = shift;
	my $URL = shift;
	my $File = shift;
	my $Type = $Class->{DATA}->GetRound('Type');

	if ($URL =~ /^http:\/\/[^\/]+(.*)$/) {
		$URL = $1;
	}

	return if (-e "DownLoad/$File");
	my $HTTP = Http->new(Uri => $URL);
	if (!(-d "DownLoad")) {
		mkdir ("DownLoad", 0777);
	}
	opendir(DIR, 'DownLoad');
	my $FH = IO->new->Open("DownLoad/$File", 1, 1);
	$HTTP->GetHttp(Method => 'GET', NoMes => 1, Skip => 1);
	while (my $Data = $HTTP->Read) { $FH->Write($Data); }
	$FH->Close;
	$HTTP->Close;
	closedir DIR;
	$/ = $Class->{DATA}->CallObj('Parse')->GetPrm($Type, 'Step');

	my $Debug = '$URL = '.$URL."\n";
	$Debug .= '			$File = '.$File."\n";
	$Debug .= '			$Type = '.$Type."\n";
	$Debug .= '			Step = '.$/;
	$Class->{DATA}->DebugWrite(Code => $Debug);
}

1;

#--------------------------------------------------------------------------
#  ログイン
#--------------------------------------------------------------------------
sub Login {
	my $Class = shift;
	my $DATA = $Class->{DATA};
	my $Param = $DATA->GetBasic('Http', 'Login');

	my $Login = Http->new(Host => $Param->{Host}, Uri => $Param->{Uri});
	$Login->HttpReq(Param => $Param->{Param}, Method => $Param->{Method}, NoMes => 1);
	print "\nLogin...";
	while ($Class->{DATA}{String} = $Login->Read("\n")) {
		$DATA->CallObj('LOG')->PrintLog;
		if ($Class->{DATA}{String} =~ /^Set-cookie: ([^;]+);/) {
			$Class->{Cookie} .= "$1; ";
		}
	}
	$Login->Close;
	my $Debug = 'Host = '.$Param->{Host}."\n";
	$Debug .= '			Uri = '.$Param->{Uri}."\n";
	$Debug .= '			Param = '.$Param->{Param}."\n";
	$Debug .= '			Method = '.$Param->{Method}."\n";
	$Debug .= '			Cookie = '.$Class->{Cookie};
	$Class->{DATA}->DebugWrite(Code => $Debug);
}

1;

#####  Http : 覚え書き等  #################################################
__END__

#・Ver0.01 2002/05/20
#  INCM_MODULEから分離

#・Ver0.02 2002/07/08
#  ページめくり処理の追加（未完成）

#・Ver0.03 2002/08/27
#  ページめくり処理をページ数指定対応に

#・Ver0.04 2002/10/21
#  index.html表示の場合に次のページURLをセットするように変更

#・Ver0.05 2002/11/02
#  HttpReqメソッドに関して記述のおかしな点を修正

#・Ver0.06 2002/11/02
#  再びHttpReqメソッドに関して記述のおかしな点を修正

#・Ver0.07 2002/11/03
#  デバッグ出力用のソースが残っていたので削除

#・Ver0.08〜0.10 2002/11/19
#  記事の区切り、読み飛ばしを詳細設定の正規表現に対応

#・Ver0.11〜0.20 2002/11/20
#  全体的な修正
#  ファイルダウンロードメソッドの追加

#・Ver0.21 2002/11/24
#  読み飛ばし時にログファイルに書き込む内容を文字コード変換するようにした

#・Ver0.22 2002/11/28
#  ページめくり処理で最終ページ判定にミスがあったのを修正

#・Ver0.23 2002/12/07
#  フレーム処理に関するエラー修正

#・Ver0.24〜0.35 2003/02/07
#  全体的な修正、インスタンスを生成するように変更
#  クッキー送信に対応

#・Ver0.36 2003/02/08
#  ページ末尾切捨て処理の不具合修正

#・Ver0.37 2003/02/14
#  次ページ読み取り関連の不具合修正

#・Ver0.38 2003/02/20
#  Uri設定メソッド追加

#・Ver0.39〜0.40 2003/02/24
#  ページめくり時に日付形式の未読ポインタの比較判断処理を追加
#  ページめくり設定関連の不具合修正

#・Ver0.41 2003/03/04
#  リクエストメソッドGETに感する引数の不具合修正

#・Ver0.42 2003/03/11
#  ページめくり時に未読ポインタに記事番号がある時の回避処理追加

#・Ver0.43 2003/03/12
#  未読ポインタが記事番号の場合のページめくりに対応

#・Ver0.44 2003/03/13
#  ページめくり時の回避処理の不具合修正

#・Ver0.45〜0.46 2003/04/09
#  ページめくり時のURLと引数の処理を変更
#  ページめくり用の設定処理修正

#・Ver0.47〜0.55 2003/04/09
#  Dataクラスに対応
#  デバッグ出力に対応
#  Http接続処理を一部修正
#  ReadStepの処理を修正
#  SetPageParamの処理を修正
#  NextPageの処理を修正

#・Ver0.56〜0.58 2003/05/07
#  HttReqのUri設定処理を修正
#  ページめくり時の設定処理を修正
#  ページ頭読み飛ばし時に一部の解析を行うように修正

#・Ver0.59 2003/05/11
#  ページめくり時の未読ポインタ判定の不具合修正

#・Ver0.60〜0.70 2003/05/20
#  GetHttpにUri設定を追加
#  HttpReqのUri設定の修正とクッキー対応
#  HttpReqに拡張Uri設定の追加
#  NextPageの不具合修正とページめくりフラグの処理追加
#  SetPageParamの不具合修正
#  ReadStepにHTMLログのデバッグ出力追加

#・Ver0.71〜0.75 2003/05/22
#  HttpReqのmultipart/form-data対応

#・Ver0.76 2003/05/23
#  HttpReqのUri設定処理を修正

#・Ver0.77 2003/05/26
#  Authorizationの不具合修正

#・Ver0.78〜0.90 2003/06/04
#  クラスカウントに関する修正
#  Loginメソッドの追加

#・Ver0.91 2003/06/07
#  NextPageの抜け出し判定を修正

#・Ver0.92〜0.93 2003/06/10
#  FileDownloadの不具合修正
#  デバッグ出力の見直し

#・Ver0.94〜0.95 2004/01/08
#  HTTP_REFERERの送信に対応
#  Refererの設定メソッド追加

#・Ver0.96 2004/01/27
#  SetUrlメソッド追加

#・Ver0.97 2004/03/25
#  Refererメソッドの記述ミス修正

#・Ver0.98 2004/04/07
#  RefererのSelfを廃止し、未記入で同等の動作に変更
