Content-type

ここからは、CGIについて扱っていく。
HTTPヘッダの"Content-Type"を付けるには、CGIプログラムにもそれを書かないといけない。
(大文字小文字を区別しないので、"Content-Type"でも"Content-type"でもいいけど、"Content-type"と書く人が多いなあ・・・。)

CGIの仕様 - とほほのWWW入門

まず、CGIを書いてみる。
あえてのC言語で。

/* ヘッダファイルのインクルード */
#include <stdio.h> /* 標準入出力 */

/* main関数の定義 */
int main(void){

  /* CGIとして文字列の出力. */
  printf("ABCDE"); /* printfで"ABCDE"(改行無し)の出力. */

  /* プログラムの終了 */
  return 0; /* 0を返して正常終了. */

}

"ABCDE"という文字列をCGIのページに出したい場合には、標準出力に出力するだけ。

$ vi content_type.c
$ gcc content_type.c -o content_type.cgi

コンパイルして拡張子は".cgi"にする。

$ sudo cp content_type.cgi /var/www/cgi-bin/
$ cd /var/www/cgi-bin/
$ ls -al content_type.cgi
-rwxr-xr-x 1 root root 8520 xxx xx xx:xx content_type.cgi
$

/var/www/cgi-binに置いて、実行権限があればいい。

あらら、Internal Server Error
あらら、Internal Server Error

あらら、Internal Server Error
こういう時のエラーの原因を特定するのがCGIはめんどい・・・。
エラーログを見ると、

[xxx xxx xx xx:xx:xx.638888 2021] [cgi:error] [pid 21033] [client xxx.xxx.xx.xx:61571] End of script output before headers: content_type.cgi

ヘッダの前にスクリプト出力が終わったよと・・・。
ちょっとなにいってんのかわからない・・・。
本来HTTPとしては、ヘッダ行を出力して、1行空けて、ボディ行("ABCDE"の事)を書いていくのだけど、何のヘッダも出力してないということはあり得ないと思うので、

/* ヘッダファイルのインクルード */
#include <stdio.h> /* 標準入出力 */

/* main関数の定義 */
int main(void){

  /* CGIとして文字列の出力. */
  printf("\n"); /* printfで改行を出力. */
  printf("ABCDE"); /* printfで"ABCDE"(改行無し)の出力. */

  /* プログラムの終了 */
  return 0; /* 0を返して正常終了. */

}

改行を前に置いただけにしてみた。

そしたらうまくいっちゃった
そしたらうまくいっちゃった

そしたらうまくいっちゃった。
とはいえ、

Content-typeは付いてない
Content-typeは付いてない

Content-typeは付いてない。
たぶんtext/plainとして判断されてる。

"Content-type: text/plain"をちゃんと指定。

今度はちゃんとついてる
今度はちゃんとついてる

今度はちゃんとついてる。

Sample/cgi/Content-type/Content-type/src/Content-type at master · bg1bgst333/Sample · GitHub