WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:perlのソケットでPOST送信で

0:[投稿] 滝 [2006/07/12 16:29 ] [環境:WINXP FreeBSD apache]

perlで以下のようなPOST送信をソケットを利用して行いたいのですが、どのようなスクリプトを書けば良いのでしょうか?
色々調べて実践してみたのですが、
何故か上手くPOST送信できないようです。

<form action="http://localhost/123" method="POST">

<input type="hidden" name="a" value="http://www.hogehoge.com/">
<input type="hidden" name="b" value="http://www.hogehoge.com/">
<input type="hidden" name="c" value="abcd1234">
<input type="hidden" name="d" value="1">
<input type="hidden" name="e" value="r">
<input type="hidden" name="f" value="c">
<input type="hidden" name="g" value="1_2_3">
<input type="hidden" name="h" value="jp">
<input type="submit" value="送信">

</form>


以下が実行してみたスクリプトです。
(POST送信方法として公開されていたものを利用しています)

use Socket;

$HOST    = 'localhost;
$PORT    = '80';
$PATH   = '123';
$TIMEOUT = '10';

$QUERY = "a=http://www.hogehoge.com/&b=http://www.hogehoge.com/&c=abcd1234&d=1&e=r&f=c&g=1_2_3&h=jp";

print "Content-Type: text/html\n\n";
print Header_Cut(Location_Post($HOST, $PORT, $PATH, $QUERY));

exit;

#
#==============================================//
#    Postで送信する                 //
#    $host ホスト名                //
#    $port ポート番号            //
#    $path ホストのHomeからのパス(/で始まる)    //
#    $msg  送信内容                //
#    返り値:ヘッダーつきデータ        //
#==============================================//

sub Location_Post($$$$)
{

       my($host, $port, $file, $query) = @_;
       my($len) = length($QUERY);

       # ソケットのオープン
       if (!socket(SOCK, PF_INET, SOCK_STREAM, getprotobyname('tcp')))
    {
        return "error:open socket";
       }

       # ポートへの接続
       if (!connect(SOCK, sockaddr_in($port,inet_aton($host))))
    {
               close(SOCK);
        return "error:connect socket";
       }

       # ソケットのバッファリングを停止
       select(SOCK);
       $| = 1;
       select(STDOUT);


       # HTTP 要求ヘッダー
       # POST メソッドで要求します。
       print SOCK "POST $file HTTP/1.0" . "\r\n";

       # Content-Length: を送る(クエリーのバイト数)
       # ヘッダーの最後は2回改行する
       print SOCK "Content-Length: $len" . "\r\n\r\n";

       # POST 内容送信
       print SOCK $query;

       # タイムアウトアラーム開始
       $SIG{'ALRM'} = \&_socket_timeout;
       alarm($TIMEOUT);

       # 受信
    $ret = "";
       while(<SOCK>)
    {
        $ret = $ret . $_;
       }

       # タイムアウトアラーム解除
       alarm(0);

       # ソケットを閉じる
       close(SOCK);

    return $ret;
}


#===============================================//
# ソケット通信タイムアウト時の処理        //
#==============================================//
sub _socket_timeout
{
       close(SOCK);
       exit;
}
#==============================================//
#    ヘッダーをきる                 //
#    $buf  :ヘッダーつきデータ        //
#    返り値:ヘッダをカットした本文        //
#==============================================//
sub Header_Cut($)
{
       my($msg) = @_;
    $pos = index($msg,"\r\n\r\n");
    if ( $pos >= 0 )
    {
        $pos += 4;
    }
    else
    {
        $pos = index($msg,"\n\n");
        if ( $pos >= 0 )
        {
            $pos += 2;
        }
    }

    if ( $pos    <    0 )
    {
        return "error";
    }

    return substr($msg,$pos);
}


結果

a=http://www.hogehoge.com/&b=http://www.hogehoge.com/&c=abcd1234&d=1&e=r&f=c&g=1_2_3&h=jpabcd1234&h=jp&h=

なぜか上記のように末尾に余分なデータが送られているような結果になってしまいます。
length値が正しくないのではと思い、値を調べてみたのですが、
間違ってはいないようです。

どなたか原因のわかる方がいらっしゃいましたらご教授いただければ幸いです。

宜しくお願い致します。


1:[回答] AC1号 [2006/07/14 22:32 ]

無限ループになっているのでは?
http://localhost/123http://localhost/123にPOSTしているというような感じで。

回答(必須): 状態:

お名前(必須):

URL:




[戻る]