はじめに

ブラウザ等のUser-Agentや特殊なWEBサーバの開発および試験では、User-AgentのHTTPリクエストに対し、任意のHTTPレスポンスを返す試験環境が必要です。

ここでは、CGI/perlを利用して任意のHTTPレスポンスを返す方法を説明します。

通常のCGI経由でのperlスクリプトの呼び出し

通常のCGIでは、CGIが呼び出すプログラム/スクリプトによって出力されたデータの前に、HTTPサーバによって作成されたHTTPレスポンスヘッダが付与されます。

たとえば、「test.cgi」というスクリプトが以下のように用意されているとします。

「test.cgi」スクリプト
#!/usr/bin/perl

print "Content-type: text/htmlr\n";
print "\r\n";
print "<html>\r\n";
print "<body>\r\n";
print "test.cgi\r\n";
print "</body>\r\n";
print "</html>\r\n";

exit(0);

このCGIに対し、以下のようにtelnetを利用してHTTPリクエストを上げてみます。

試験用のHTTPリクエスト
$ telnet www.kishiro.com 80

GET /test/nph-script/test.cgi HTTP/1.1
Host: www.kishiro.com

すると、こんな感じでレスポンスが返って来ます。

HTTPレスポンス
HTTP/1.1 200 OK
Date: xxx, xx xxx xxxx xx:xx:xx GMT
Server: Apache/1.3.xx (Unix)
[中略]
Content-type: text/html

<html>
<body>
test.cgi
</body>
</html>
Connection closed by foreign host.

このように、通常のCGI経由でのperlスクリプトでは、perlスクリプト側でHTTPレスポンスを記述しなくても、apache側でHTTPレスポンスを付与してクライアントに返却します。

NPH (Non-Parsed Header) スクリプトの利用

上記動作はこれはこれでよいのですが、Webアプリによっては、CGI経由で返却するHTTPレスポンスにて、206/302等、任意のHTTPレスポンスを返したいケースがあります。
こういう場合には、NPH (Non Parsed Header) と呼ばれる機能を利用することにより、perlスクリプトで任意のHTTPレスポンスを記述してクライアントに返却することが可能です。

NPHというと難しく聞こえますが、利用するのは非常に簡単です。
下記のようなHTTPレスポンスを出力するperlスクリプトを作成し、それを接頭子「nph-」で始まるファイルに保存します。

「nph-test.cgi」スクリプト
#!/usr/bin/perl

print "HTTP/1.0 200 OK\r\n";
print "Content-type: text/htmlr\n";
print "\r\n";
print "<html>\r\n";
print "<body>\r\n";
print "nph-test.cgi\r\n";
print "</body>\r\n";
print "</html>\r\n";

exit(0);

このCGIに対し、以下のようにtelnetを利用してHTTPリクエストを上げてみます。

試験用のHTTPリクエスト
$ telnet www.kishiro.com 80

GET /test/nph-script/nph-test.cgi HTTP/1.1
Host: www.kishiro.com

すると、今度はこんな感じでレスポンスが返って来ます。

HTTPレスポンス
HTTP/1.0 200 OK
Content-type: text/html

<html>
<body>
nph-test.cgi
</body>
</html>

Connection closed by foreign host.

このように、ファイルに接頭子「nph-」をつけると、そのCGIはNPHとして扱われ、apache側ではHTTPレスポンスは補完されず、perlスクリプト側で記載されたHTTPレスポンスがそのまま返却されます。


あなたの探し物は見つかりましたか?
まさにこれだ
参考になった
ちょっと違う
これじゃない

何かメッセージがあればお願いします

このメッセージを非公開にする

ご注意

・頂いたメッセージは管理者のチェックの後、公開されます。
・メッセージの公開を希望されない場合には、「このメッセージを非公開にする」にチェックを入れてください。
・管理者が不適切と判断したメッセージは公開しませんので、予めご了承ください。


まさにこれだ
4 (57%)
これじゃない
3 (43%)

【まさにこれだ】 NPH (Non-Parsed Header) スクリプトという単語をしらないまま、 偶然このページにたどりつくことができました。 知りたいことが判明してスッキリです! ありがとうございます。 (2022/10/05 Wed 21:08:41)