C++を知りたい(5) cgi
2009/07/19
C++のOOPを覚えるために小さいアプリを書いた方がいいと思ったのはいいけど、何を作ればいいかが思い浮かばない。適切な問題をでっちあげる能力の不足を感じつつ、wikiを作ってみることにしました。wikiならテキストファイルの読み書きができればいいから適度な問題なのではないかと。
CGIライブラリ
Webアプリだとセキュリティ的に問題が発生しやすいので、ライブラリは使うべきだ。ということでRude::CGIというライブラリを使ってみることにした。(実は、cgicc, cgi++という他のライブラリを使おうとしたけど、コンパイルに失敗したのでスムーズにインストールできたRude::CGIを使うことにした)
Rude::CGIのインストール
$ cd ~/src $ wget http://rudeserver.com/cgiparser/download/rudecgi-5.0.0.zip $ unzip rudecgi-5.0.0.zip $ cd rudecgi-5.0.0 $ ./configure --prefix=/usr/local $ make $ su # make install
/usr/localにインストールしたけど、ld.so.configで/usr/local/libが入ってない場合は、デフォルトの方がいいかもしれない。
Wiki
クラスの定義なども調べながら、実装中。index.cgi?id=data というアクセスを行なうと、data.txtの内容が表示されるようになった。しかし、この時点であまりC++のOOPの練習にはなっていない。Wikiシンタックスの解析の部分では、OOPらしく継承ツリーとかを構築してみようかと思う。(あんまり複雑なものは必要ないだろうけど) もちろん、考慮が必要なところが沢山ある(エラーとかエスケープとか)。
#include <rude/cgi.h> #include <vector> #include <iostream> #include <fstream> #include <sstream> using namespace std; class Wiki { private: string id; vector<string> lines; public: Wiki(string id); ~Wiki(); void display(); }; Wiki::Wiki(string arg_id) { id = arg_id; ostringstream filename_stream; filename_stream << id << ".txt"; ifstream ifs(filename_stream.str().c_str()); string buf; while(ifs && getline(ifs, buf)) { lines.push_back(buf); } } Wiki::~Wiki() { } void Wiki::display() { cout << "Content-Type: text/html\n\n"; cout << "<html><body>\n"; for (int i = 0; i < lines.size(); i++) { cout << lines[i] << "<br>"; } cout << "</body></html>\n"; } int main() { rude::CGI cgi; string id(cgi["id"]); Wiki wiki(id); wiki.display(); return 0; } /* vim: set ts=4 sw=4 sts=4 expandtab fenc=utf-8: */
Makefile
default: g++ -o index.cgi index.cc -lrudecgi
data.txt
*wiki test string. zzz zzz