C++を知りたい(5) cgi

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

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


reCaptcha の認証期間が終了しました。ページを再読み込みしてください。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください