- ベストアンサー
環境変数に文字列をセット?必須ヘッダ?
perlから環境変数にある文字列をセットしてcgiに送信するには、どのようにすればよいのですか? また、perlからcgiにデータを送る際、ヘッダはどのように書けばよいのでしょうか? 例えば、自分は(perl)はPOSTでContent-Typeはtext/plainだということをcgiに伝えるなど…。 また、ヘッダをcgiへ送る際、必須のヘッダは何があるのでしょうか? 初心者なので、くだらない質問ですいません。 よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
長すぎなので回答を2つに分けました >また、ヘッダをcgiへ送る際、必須のヘッダは何があるのでしょうか? 下のサンプルから必須項目のみをピックアップします 例1. HTTP/1.0でGETで送る場合 print S "GET /~tarou/env.cgi HTTP/1.0\r\n\r\n"; # このように すごく単純ですね 例2. 同POSTで 送る場合 print S "POST /~tarou/env.cgi HTTP/1.0\r\n"; print S "Content-Length: $test_len\r\n\r\n"; # POSTの場合はContent-Lengthで送信バイト数が必要です 例3. HTTP/1.1 または 相手がネームベースのバーチャルサーバーの場合 print S "POST /~tarou/env.cgi HTTP/1.1\r\n"; print S "Host: umasika.com\r\n"; # この場合は Host情報が必須です print S "Content-Length: $test_len\r\n\r\n"; ######## あと、ついでに下のサンプルの変なところ (このままで動くがちょっと変) print S "Host: umasika.com\r\n"; #これじゃあ折角$Srvにセットした意味無し print S "Host: $Srv\r\n"; # こうですね #print S "Content-type: application/x-www-form-urlencoded\r\n"; ↑勿論不要ですね(笑)
その他の回答 (1)
- umasikajiro
- ベストアンサー率67% (545/803)
こういう事かな??と言うか下にサンプルを書くので設置して試してください #! /usr/bin/perl print"Content-type: text/html; charset=Shift_jis\n\n"; print"<html><body>\n"; print"<h1> [socketのTEST] </h1>\n\n"; print "<pre>\n"; print "http://$Srv$Uri から取得した値は -----\n\n "; $test_txt= "あいうえお \nおいらはumasika\n";# POSTで送る文字列 $test_len = length($test_txt);# それのバイト数 $Srv = 'umasika.com'; $Uri = "/~tarou/env.cgi"; $Ghb = (gethostbyname($Srv))[4]; $Con = pack("S n a4 x8", 2, 80, $Ghb); socket(S, 2, 1, 0); connect(S, $Con); binmode(S); select(S); $| = 1; select(stdout); # ここから空行までがリクエストヘッダ print S "POST $Uri HTTP/1.0\r\n";# リクエストヘッダの改行は\r\nである print S "User-Agent: hoge 5.0\r\n"; print S "Referer: http://hoge.com/hoge.htm\r\n"; print S "Connection: Keep-Alive\r\n"; print S "Host: umasika.com\r\n"; print S "Accept: image/gif, image/x-xbitmap, image/jpeg, */*\r\n"; print S "Content-type: text/plain\r\n"; #print S "Content-type: application/x-www-form-urlencoded\r\n"; print S "Content-Length: $test_len\r\n\r\n"; # ヘッダの終端なので空行も出力 print S "$test_txt"; print <S>; # 相手サーバーから返された文字列をそのまま出力 __END__ で受け取る側の http://umasika.com/~tarou/env.cgi は #! /usr/bin/perl print"Content-type: text/html; charset=Shift_jis\n\n"; print"<html><body>\n"; print"<h1> [環境変数のTEST] </h1><pre>\n"; print "\$0 = $0\n"; foreach(sort(keys %ENV)) {print" \$ENV{'$_'} = $ENV{$_} \n"; } ## form dataを受け取り そのままの形で出力 if($ENV{'REQUEST_METHOD'} eq "POST"){read(STDIN, $inputf, $ENV{'CONTENT_LENGTH'});} else{$inputf = $ENV{'QUERY_STRING'};} print "\$inputf = $inputf"; __END__ これでいろいろリクエストヘッダをいじるとどうなるかお試しください (但し他人のサーバーで試すと怒られますよ)
お礼
早速、実行してみました。わざわざご丁寧にありがとうございました。