Contents
はじめに
こんにちは、野村です。
cやc++で作ったCGIって、やっぱ高速なのかな?
でも、手間がかかるはず。実用に見合うのだろか?
そんな疑問がわいたので、とりあえず挑戦してみたのですよ。
クエリからファイル名を取得し、そのファイルの内容を定位置に吐き出す仕組みです。
作ってみると結構めんどくさかった。
速度については確かに速い気がした。でも、この程度のCGIではなんとも言えないな。
ソースファイル
index.cgi
index.cppという名前で以下のファイルを作成し、サーバにアップしてからビルドします。
某無料レンタルサーバで試したところ、無事ビルドできました。
#include <iostream> #include <cstdlib> #include <cstring> #include <string> #include <fstream> using namespace std; string Replace(string str1, string str2, string str3){ string::size_type Pos(str1.find(str2)); while(Pos != string::npos){ str1.replace( Pos, str2.length(), str3); Pos = str1.find(str2, Pos + str3.length() ); } return str1; } int main(void){ const char* head = "./head.txt"; const char* foot = "./foot.txt"; char *s_dt; string txt = "./txt/", buf, ttl; s_dt = getenv("QUERY_STRING"); if(!strcmp(s_dt, "")){ txt = txt + "0000"; }else{ string str(s_dt); txt = txt + Replace(str, "/", ""); } ifstream ift(txt.data()); getline(ift, ttl); ttl = Replace(ttl, "<h2>", ""); ttl = Replace(ttl, "</h2>", ""); cout << "Content-type: text/html; charset=utf-8\n" << endl; ifstream ifs(head); while(ifs && getline(ifs, buf)){ if (-1 < (int)buf.find("<title>")){ printf(buf.data(), ttl.data()); cout << endl; }else{ cout << buf << endl; } } ifstream ifc(txt.data()); while(ifc && getline(ifc, buf)){ cout << buf << endl; } ifstream ife(foot); while(ife && getline(ife, buf)){ cout << buf << endl; } return 0; }
ビルドのコマンド
$ g++ index.cpp -o index.cgi
head.txt
全ページ共通のヘッダ部です。
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width" /> <title>%s - cgitest</title> </head> <body> <center><h1><a href="./">cgitest</a></h1></center> <hr/>
foot.txt
全ページ共通のフッタ部です。
<hr/> <center><small>(c) 2017</small></center> </body> </html>
txt/0000
トップページです。
必ず一行目に<h2>タグでタイトルを記入します。
<h2>index</h2> <ul> <li><a href="./?0001">0001</a></li> <li><a href="./?0002">0002</a></li> </ul>
txt/0001
1ページ目です。
必ず一行目に<h2>タグでタイトルを記入します。
<h2>1ページ目</h2> <p> 1ページ目の記事<br/> </p>
txt/0002
2ページ目です。
必ず一行目に<h2>タグでタイトルを記入します。
<h2>2ページ目</h2> <p> 2ページ目の記事<br/> </p>
最後に
以上、c++で簡易Webサイトを作ってみました。
次にc++のCGIに挑戦するなら、SQLiteを使った掲示板あたりにしようかな?
というわけで、今回はこれにて。