このページは福井県立大学の田中求之が2006年1月まで運用していた Mac のサーバ運用に関する会議室 「Web Scripter's Meeting」の記録です。情報が古くなっている可能性がありますのでご注意ください。

MacPealでのCGIエラーについて

発言者:T.kojima
( Date Sunday, March 15, 1998 21:18:47 )


無免許でMacPeal CGIを実技から入っています。
ラクダ本?を買ってみましたがその厚さに目が点、とりあえずやってみるこ
とにしました。
WebSTAR2.1+MacPeal 5.1.9r4の環境で皆様の協力を得ながらサーチエンジンと
BBSが何とか動いています。
更にもう一つ動かそうとしたところエラーが出てしまいました。
ご教授をお願いいたします。
今までと同様にPerlのスクリプトをMacPealのCGI Scriptでセーブしてsyntax 
CheckもOK!の状態でアクセスすると
<返信データが要求された型(文字)になりません>のエラーが出ます。
どなたか宜しくお願いいたします。

もう一つ

参考にさせていただいています よしもとさんの MacPeal IslandでEnv.acgi
を実行したときに下記のエラーがでました。
# Can't find string terminator "HEADER" anywhere before EOF.
File 'WEBSTAR:WebSTAR1:cgi-bin:Env.acgi'; Line 3
スクリプト
#! perl -w

        print <<HEADER;
        <HTML>
                <HEAD>
                <TITLE>Environment Values</TITLE>
                </HEAD>
                <BODY>
                <BLOCKQUOTE>
                <H2>Environment Values</H2>
                <PRE>
        HEADER

                my $key;
                foreach $key (sort(keys(%ENV)))
                { 
                        print "<B>$key</B>=$ENV{$key}\n"; 
                }
                
        print <<FOOTER;
                </PRE>
                </BLOCKQUOTE>
                </BODY>
        </HTML>
        FOOTER

どのように対処したら宜しいのでしょうか。
お願い致します。

よしもと さんからのコメント
( Sunday, March 15, 1998 21:35:47 )

エラーによれば、「HEADER」が見つけられないようですね。

ラクダ本を持っているなら、p49の「ヒア」ドキュメントの所を
読んで下さい。そこに答えが書いています。

田中求之(Perlチョー初心者) さんからのコメント
( Sunday, March 15, 1998 22:31:53 )

>ラクダ本を持っているなら、p49の「ヒア」ドキュメントの所を
>読んで下さい。そこに答えが書いています。

よしもとセンセ、これは「終端文字列をクォートで囲んだり、前後に空白文字をおいては
ならない」という規則に反しているということでよろしいのでしょうか?

つまり、Kojima さんのスクリプトでは、終端文字列がインデントされている(前にタ
ブが入っている)のがエラー(端末文字列が見つからないというエラー)の原因だとい
うことですよね?

よしもと さんからのコメント
( Sunday, March 15, 1998 22:40:05 )

田中(Perlチョー初心者)さん、正解です。
これで、次の段階に進んで結構です (^^;

#田中さん、丁寧なフォロー有り難うございます m(..)m

まあ、あの分厚い「らくだ本」を隅から、隅まで読むのは無理としても、
何かエラーがあったとき、辞書代りに使えるようになっておけば、これか
ら色々と助けられることと思いますよ>Kojimaさん

#と、偉そうな事を言っていますが、僕だって隅から隅まで読んでいるわけ
#ではありませんから... (^^;

何か、今の勢いだと、田中さんがそのうちらくだ本を読破しそうですね (^^;

T.kojima さんからのコメント
( Monday, March 16, 1998 02:30:14 )

初心者以前の問題でした。
早速まず何とか一回手を抜かずに読みます。

有り難うございました。

重松修 さんからのコメント
( Thursday, March 19, 1998 17:29:24 )

私もMacPerl島に上陸しました。(^-^)v
というか、UNIXで使えるようなCGIを書けるようにもなりたいと思いまして。

そこで、ものすごーく初歩的な質問をさせていただきます。m(__)m

(1) 32Kを越えるデータの授受について
これは、どうなるのでしょうか?勝手にSend Partial対応してくれるんで
しょうか?

(2) サーバプッシュ
これもUNIXと同じで動くんでしょうか?というのは、Send Partialで対応し
ないと、MacではPUSHできなかったと思いましたので。

(3) HTTPヘッダの出力について

#! perl -w
print "HTTP 1.0 200 OK\nContent-Type: text/html\n\nHello World!";

以上のをCGIとして保存するとラクダが玉乗りしているアイコンのものが
作成されるのですが、実行すると、

HTTP 1.0 200 OK Content-Type: text/html Hello World!

と、ヘッダが出力されます。どうしてでしょう?

また、上記のacgiはMacPerlを持っていない人でも単独で使えますか?

よしもと さんからのコメント
( Thursday, March 19, 1998 18:07:42 )

Welcome to MacPerl Island :-)

(1)MacPerlを使っても基本的にserverとのやり取りはAppleEvent経由
ですので、その制限は引きずるはずです。それから、勝手にSend Patial
はやってくれないと思います。(これは試したことはないですが)
(2)これは僕が書いたドキュメントを参照して下さい。
(3)上記のドキュメントにも書いていますが、「HTTP/1.0 200 OK」は不要
です。これを外すとうまく動くはずです。

typo "HTTP 1.0" -> "HTTP/1.0"

それから、上記のacgiはMacPerlがないと動きません。


→  MacPerl Diffrence in CGI Programming

重松修 さんからのコメント
( Friday, March 20, 1998 10:18:31 )

すみません。HTTP/1.0ですね。/が抜けてました。
それはそれでわかったんですが、不要であっても陽に(ラクダ本の表現)
書きたいときはどうなるのですか?
たとえば、リダイレクトとか認証が必要な場合です。

また、MacPerlがないと動かないのを動くようにはできないんでしょうか。
アプリケーション?として書き出すと容量1.6Mでメモリを6Mも食う
Hello, Worldなアプリになりましたが。(^^;;

よしもと さんからのコメント
( Friday, March 20, 1998 10:25:26 )

あらわに書きたいときは、書いてもらっていいですよ。
ちゃんと、オーバーライトしてくれます。

あと、MacPerlなしで済ますとしたら、Perl-Pluginになるのかなぁ。
でも、まだ、完成品ではないんで、作者自ら言うのもなんですが (^^;
それほどお勧めではないですよん。

重松修 さんからのコメント
( Friday, March 20, 1998 11:42:38 )

そういう目的があったのですね。>Perl Plug-in

それはそうと、以下のようにしたんですけど、リダイレクトしてくれません。

#! perl -w
print "HTTP/1.0 302 Found\nMIME-Version 1.0\nLocaltion: /found.html\n\n";

なにが悪いんでしょうか?もしかしたらすごいあほなミスなのかもしれませんが。

よしもと さんからのコメント
( Friday, March 20, 1998 12:08:23 )

いえ、目的は別にあるんですけど、まあ、結果的にそうなったわけです (^^;

で、リダイレクトの件ですが、

typo 「Localtion」 -> 「Location」

じゃない?それから「MIME-Version 1.0」はいらない(ない方が良い)よ。

重松修 さんからのコメント
( Friday, March 20, 1998 12:57:49 )

赤っ恥、青っ恥、りんご7色恥。
AppleScriptのをカット&ペースとしたんですが、いつの間に。。。

ところで、MIME-Version 1.0はいらない、というよりないようがない方が
いいのは、どうしてですか?

W3Cのドキュメントには、以下のようにあります。

MIME-Versionを書いてはいけないよ、とは書いてないんですが。
# 書けとも書いてないですけど。

  10.3.3 302 Found

  The requested resource resides temporarily under a different URI. Since
  the redirection may be altered on occasion, the client SHOULD continue
  to use the Request-URI for future requests.  This response is only
  cachable if indicated by a Cache-Control or Expires header field.

  If the new URI is a location, its URL SHOULD be given by the Location
  field in the response. Unless the request method was HEAD, the entity of
  the response SHOULD contain a short hypertext note with a hyperlink to
  the new URI(s).

  If the 302 status code is received in response to a request other than
  GET or HEAD, the user agent MUST NOT automatically redirect the request
  unless it can be confirmed by the user, since this might change the
  conditions under which the request was issued.

    Note: When automatically redirecting a POST request after receiving
    a 302 status code, some existing HTTP/1.0 user agents will
    erroneously change it into a GET request.

    Note: RFC 1945 and RFC 2068 specify that the client should not
    change the method on the redirected request. However, most existing
    user agent implementations treat 302 as if it were a 303 response,
    performing a GET on the Location field-value regardless of the
    original request method. The status codes 303 and 307 have been
    added for servers that wish to make unambiguously clear which kind
    of reaction is expected of the client.

田中求之 さんからのコメント
( Friday, March 20, 1998 15:16:31 )

MIME バージョンについてですが、本来は、body のコンテントが、どの MIME の
バージョンに基づいて記述されているかを示すためのヘッダです。ですから、
Body がない、ヘッダのみのリプライの場合、あるいは body が text や html
などの、MIME によらない形式になっている場合は不要です。ただし、RFC1945
の Appendix に以下のような記述があるように、

D.2.7 MIME-Version

   HTTP messages may include a single MIME-Version general-header field
   to indicate what version of the MIME protocol was used to construct
   the message. Use of the MIME-Version header field, as defined by RFC
   1521 [5], should indicate that the message is MIME-conformant.
   Unfortunately, some older HTTP/1.0 servers send it indiscriminately,
   and thus this field should be ignored.

現在、事実上無視されるという扱いを受けていますので、あってもなくても影響がない
ヘッダである、と言えます。

よしもと さんからのコメント
( Friday, March 20, 1998 16:38:16 )

MIMEバージョンに関しては、田中さんの説明の通りです。

#実はこの点に関して、一度二人で議論したことがあるんです (^^;

重松修 さんからのコメント
( Friday, March 20, 1998 17:03:22 )

いわれてみたら、もっともです。>MIME-Version
確かにボディがないのだから、それについて説明しても仕方ないですね。(^^;
ちょっとずつですけど、トラフィックの節約もできるということもあるし。