@blog.justoneplanet.info

日々勉強

PerlでクロスドメインAjax用のプロキシ

■前置き

  • 自己責任でソースをご利用ください
  • 正直、美しくない部分はある↓
  • 結構適当なのでサンプルソース程度に見てください

■ソースコード

#!/usr/bin/perl
#ここで送信データーを読み取る
&getFormData();
%query;
$query{'par1'} = 'ここにリクエスト用のパラメーター1';
$query{'par2'} = 'ここにリクエスト用のパラメーター2';
$query{'par3'} = 'ここにリクエスト用のパラメーター3';
$query{'par4'} = 'ここにリクエスト用のパラメーター4';
#下記はHTML上からname="data"ハッシュキーを送信させ
#上記に該当するときは他サーバーとの通信を行う。
#それ以外はエラー処理。
if($query{$FORM{'data'}}){
    &socketCom($query{$FORM{'data'}});
}
else{
    &errorPrint();
}
#=================================
#下記、他のサーバーとソケット通信するためのサブルーチン
sub socketCom{
    my($addr, $name);
    #下記、ホスト名を$addrへ
    $addr = (gethostbyname('api.gnavi.co.jp'));
    $name = pack("S n a4 x8″, 2, 80, $addr);
    #下記、ソケットの生成。
    #引数はソケットハンドラ、ソケットのドメイン、タイプ、プロトコル
    socket(GNAVIHANDLE, 2, 1, 0);
    #下記、接続。引数はハンドラ、IPアドレスとポート番号
    connect(GNAVIHANDLE, $name);
    binmode(GNAVIHANDLE);#バイナリモード
    select(GNAVIHANDLE);#出力先デフォルトハンドルの設定
    $| = 1;#バッファリングの設定(0以外でバッファリングを無効に)
    select(stdout);#出力先を初期の状態に
    #下記で接続先にリクエストを送信
    print GNAVIHANDLE "GET http://api.gnavi.co.jp/ver1/$_[0] HTTP1.0\r\n\r\n";
    while(<GNAVIHANDLE>){
        #APIから返ってくるXMLをクライアントに返す時はこんな感じ
        #<?xml以降をクライアントに送信
        if($_ =~/<?xml/){$boolean = 1;}
        if($boolean){print $_;}#前行の処理が実行されるとprintが実行される
    }
    close(GNAVIHANDLE);#soketをclose
}
#————–
sub getFormData{
    my($query, $pair);
    if($ENV{'REQUEST_METHOD'} eq 'POST'){
        read(STDIN, $query, $ENV{'CONTENT_LENGTH'});;
    }else{$query = $ENV{'QUERY_STRING'};}
    foreach $pair(split(/&/,$query)){
        my($key, $value) = split(/=/, $pair);
        $value =~ tr/+/ /;
        $FORM{$key} = $value;
    }
}
#————–
sub errorPrint{
    #エラー用処理の記述
}
#--------------

■注意点

  • http://api.gnavi.co.jp/ver1/はぐるナビのAPIのアドレス
  • 悪用される危険があるため、サーバーの接続先URLに任意の文字列が入力されてしまうソースは決して書かないで下さい
  • http://api.gnavi.co.jp/ver1/$_[0]部分にクライアント側から任意の文字列を入れられると危険
  • ソースの解説はコメント形式で上記に載せてみました(#以降~行末がコメント)