CGI を動かす (GmCapsule・ステータスコード)

動的処理を行う場合は CGI を使用します。

Web では初期の頃(主に 1900 年代)に使用されていて、

PHP が普及する前に主にシェルや Perl を用いて処理されていました。

近いような事が Gemini プロトコルでも可能です。

CGI として動作可能であれば、プログラミング言語は問いません。

このページでは GmCapsule を用いて CGI を動作する環境を構築しています。

GmCapsule は Python で作られていて、

公式ドキュメントなども CGI サンプルが Python になっているのですが、

実際には Python 以外でも動作が可能です。

このページでは多くの環境で動作する sh にしています。

関連資料として、次をリンクします。

Twins | MakerSpace (https:)

gemini cgi guide | tilde.team wiki (https:)

Gemini: background | Zen (attitude) (https:)

About gemini markup and gmnisrv | Remy Noulin's Blog (https:)

上の一部リンクで触れられている gmnisrv は CGI 動作対応 Gemini サーバーの一つで、

C 言語で作られていて、より多くの環境でビルドしやすいと思われますが、

2023 年の更新を最後にメンてナンスしない事が明記されているので、

ここでは触れません。

https://git.sr.ht/~sircmpwn/gmnisrv/

- - - 🎈 - - -

GmCapsule の初期設定

ここではローカルで環境を整える前提で記載をしています。

Python が入っている前提で pip でインストールを行います。

入った事を確認します。

設定ファイルは .ini で制作します。

ここでは localhost.ini とします。

各場所は相対的にもできます。上記の場合、次の記載となります。

# Configuration | GmCapsule User manual

.ini の項目追加でポート番号の指定、サーバーレベルでの rewrite (転送)、

CGI のエントリポイント、Git リポジトリの表示など、

GmCapsule はいろいろ対応しています。

記載の中で host = localhost はネット上に公開する場合

host = example.com sub.example.com という感じに複数のホスト名を記載できます。

この場合各場所にある localhost が各ホスト名で参照される事になります。

GmCapsule では証明書が必要ですので、作成します。.pem 形式である必要があります。

以下では期限を約 1000 年にしてあります。

日数の代わりに期限日時を指定する方法もあります。

9999年12月31日23時59分59秒を期限とする場合は次のとおりです。

Agate だと .der 形式が使われているので .pem 形式への変換が必要です。

.pem 形式はテキストエディタで開くと

-----BEGIN CERTIFICATE----- や -----BEGIN PRIVATE KEY----- ではじまる

テキストファイルになっています。

.der はバイナリーファイルなので文字化けした内容になっています。

それでは、cgi-bin/localhost/hello のテキストファイルを作成します。

GmCapsule で bin_root を用いている場合、

cgi-bin 下を動的ファイルの対象とするため、

拡張子を .cgi にする必要はありません。

ステータスコード 2 桁の後に出力する MIME type を指定します。

正常な場合は 20 です。(http・https でいう 200 に同等)

Gemtext ならば text/gemini です。

http・https 同様に文字コードも入れられますが、

通常は UTF-8 で扱うので、UTF-8 で記載されてあれば通常考慮する必要ありません。

この hello ファイルには実行権限をつけておいて下さい。

それではサーバーを起動してみます。

エラーが出ている場合は場所やファイルを確認してみて下さい。

正常に起動しているなら Lagrange などの Gemini クライアントを起動し、

gemini://localhost/ で localhost/index.gmi の静的ファイル、

gemini://localhost/hello で cgi-bin/localhost/hello で作成した

CGI が動作している事を確認します。(cgi-bin は不要です)

ファイル名を省略した URL で localhost/index.gmi の代わりに CGI を動作させたい場合、

cgi-bin/localhost/index.gmi を作成します。

- - - 🎈 - - -

CGI のサンプル

ここでは多くの環境で動作できるように sh を使用しています。

hello

20 を出力し、gemini 形式(Gemtext)でメッセージを出力します。

input

入力フォームを表示します。入力結果は URL の ? 以下に入ります。

多くの CGI 対応 Gemini サーバーでは QUERY_STRING で内容を取り出せます。

QUERY_STRING は URL エンコードされた状態なので、

日本語などは文字列が変換されています。(例: 風船 → %E9%A2%A8%E8%88%B9 )

そのため通常は URL デコードをする必要があります。

URL に含まれる仕様なので、文字数には制限があり、

日本語は 100 文字前後になります。

この問題を回避する方法として Titan プロトコルが存在します。

env

環境変数の値を一覧表示します。

GmCapsule は動作しているサーバーの環境変数も引き継いでいるため、

けっこう多くの値が入っている事がわかります。

redirect

転送はこのように転送先 URL を入れますが、相対的な場所でも良い事になっています。

上は gemini: にしていますが、もちろん https: は他のプロトコルも有効です。

pass

http の BASIC 認証みたいなもの。パスワードを知ってる人だけが参照できます。

パスワード入力向けのコードがあり、

クライアントは文字を表示しないようにしてくれる事を期待できます。

Gemini プロトコルは SSL で暗号化も行われています。

ssl

認証を SSL 証明書で行います。

env を実行して証明書を適用すると TLS_CLIENT_HASH にハッシュ値を得られます。

これを HASH の値として入れて下さい。この証明書を持つ人だけが参照できます。

titan,titan

GmCapsule は Titan プロトコルにも対応していて、

CGI で受け取ったテキスト・ファイルを処理できます。

Titan プロトコルは ファイル,titan を作成します。

. (ドット・ビリオド) ではなく , (コンマ) なのにご注意下さい。

この CGI の実行は例えば titan://localhost/titan となります。

- - - 🎈 - - -

ステータスコード

HTTP・HTTPS では 3 桁のコードを返しますが、Gemini は 2 桁になっています。

詳しいコードの説明は次を参照して下さい。

gemini://geminiprotocol.net/docs/protocol-specification.gmi

1● 入力を必要

入力を促すフォームの表示はステータスコードで行います。

2● 成功

HTTP は通常 200 なのでわかりやすいです。

3● リダイレクト

HTTP は 30● なので、これもわかりやすいですが、並びに注意して下さい。

4● 一時的な故障

http・https で 50● を返すエラーは Gemini では 4● で返す事が多そうです。

5● 永続的な故障

http・https だと Not Found は 404 ですが、Gemini は 51 になっています。

同様に Gone も http・https は 410 ですが、Gemini は 52 です。

6● クライアント証明書

ステータスコードで定義されていますが、通常はクライアントが返すでしょう。

- - - 🎈 - - -

🎈 fusen.srht.site

- - - 🎈 - - -

😺 Powered by nya.je

Proxied content from gemini://fusen.nya.je/cgi.gmi (external content)

Gemini request details:

Original URL
gemini://fusen.nya.je/cgi.gmi
Status code
Success
Meta
text/gemini
Proxied by
kineto

Be advised that no attempt was made to verify the remote SSL certificate.