Fork me on GitHub

2009/07/30

Recent entries from same category

  1. シャア専用memcpy その後 Hatena
  2. テーブルにINSERTされたらGrowl Hatena
  3. 8年前のソースコードを晒してみるの巻 Hatena
  4. 僕は死にません! Hatena
  5. コマンドプロンプトをgyazoするGyazoCmd作った。 Hatena

はてな
書いたといっても結構前からあったのですが、いらん所を削ぎ落として軽量Webサーバとして仕立て上げました。
軽量とは言えど、CGIを使って結構色々動きます。
例えば、ソースアーカイブを解凍したらCGIがあって、apacheから見える場所にコピーして...とか面倒くさかったりしますよね。

おれは今すぐWebサーバを起動したいんだ!そして今いるディレクトリのファイルをWebサーバからサーブしたいんだー!

って事ないですか?blogソフトウェアをダウンロードして今すぐ試したいけど、apacheインストールされてなかった...とか悲しすぎます。
今回紹介する"tinytinyhttpd"(tthttpd)はそんな、小さい様で大きな問題を解決出来るかもしれないソフトウェアです。
mattn's tinytinyhttpd at master - GitHub

tiny tiny httpd

http://github.com/mattn/tinytinyhttpd/tree/master
リンク先に、動いてる様子のキャプチャがあります。
ソースはC++で書いてます。WindowsとUNIX(Linuxでだけ動作確認)で動作します。

機能としては、マルチスレッドサーバ、カスタマイズ、ディレクトリスティング、CGI起動が可能です。
小ささをウリにしているのでインストールとか、レジストリとか、面倒くさいものは要りません。exeファイルだけあれば起動します。
一応、設定ファイルの記述も可能で
[global]
port=8080
root=c:/temp/mtos
indexpages=index.html,index.php
charset=cp932

[mime/types]
cgi=@c:/strawberry/perl/bin/perl.exe
php=@c:/progra~1/php/php-cgi.exe
という設定ファイルを"-c"オプションで指定する事も出来ます。デフォルトではポート8080番でカレントディレクトリをドキュメントルートとし、phpとperlが適当なパスでCGI起動される様になっています(パスが違う場合は設定ファイルから変更出来ますし、拡張子rbに対してrubyを追加する事も出来ます)。
私が試した限りですが、以下のソフトウェアの動作が確認出来ています。
  • MTOS(Movable Type Open Source) (perl)
  • WordPress (php)
  • blogn Plus (php)
  • tDiary (ruby)
  • PukiWiki (php)
  • NucreusCMS (php)
  • blosxom (perl)
などなど。CGIで動くならば大体動きます。

ライセンスはBSDライセンスとします。使ってみて下さい。
コードはgithubにあるので、patchウェルカムです。
今後は、コードのブラッシュアップと、拡張なんかを考えて行きたいなーと思ってます。
Posted at 00:06 in ソフトウェア::lang::c | WriteBacks (23) | Edit
Tagged as: c++, httpd
Bookmarks: add to hatena add to hatena | add to delicious.com | add to livedoor.clip add to livedoor.clip | add to buzzurl add to buzzurl | add to fc2bookmark add to fc2bookmark | add to Yahoo Bookmark add to Yahoo Bookmark | add to Pookmark add to Pookmark

blog comments powered by Disqus
WriteBacks

動かしてみました。

こんにちは。
Ubuntu 9.04 64bit でコンパイルして動かしてみました。
コンパイル時に以下のようなエラーがでました。
utils.cxx: In function ‘std::string tthttpd::convert_string(std::string, std::string, std::string)’:
utils.cxx:522: error: ‘MB_LEN_MAX’ was not declared in this scope
make: *** [utils.o] エラー 1

utils.cxxに
#include
を書き加えて対応しました。

perlがcgiとして軽快に動くのを確認しました。
ところでCで書いたcgiを動かしてみましたが、画面がまったく表示されません。エラーも出ず、画面が真っ白になります。my_httpd.confは以下のようにしてます。
-----
port=8080
root=/var/www
indexpages=index.html,index.php
charset=utf-8

[mime/types]
cgi=@
pl=@/usr/bin/perl
php=@/usr/bin/php
-----
どうすればCのcgiが教えていただけませんか?

Posted by oyaji at 2009/08/01 (Sat) 01:36:23

すいません。
先のコメントでinclude部分が消えてしまいました。
正しくは
#include <limits.h>
です。

Posted by oyaji at 2009/08/01 (Sat) 01:41:24

Re: 動かしてみました。

limits.h の件ありがとうございました。
Cで書かれたCGIの件ですが、現状拡張子に対するインタプリタの起動しかサポートしておりませんでしたので、新しくオプション"spawnexec"を追加し、execビットの立っているファイルをCGIとして実行する要修正しました。

ありがとうございました。

Posted by mattn at 2009/08/01 (Sat) 19:18:52

早速のご返事・対応ありがとうございます。また、先の質問で日本語がおかしな箇所がありました。お詫びいたします。
新たにソースをダウンロードし直してコンパイルし、実行してみました。
今度はindexpagesで指定してあるindex.htmlを読み込んだまま処理が戻って来なくなってしまいました。URLを直接を打ち込んでも読み込みに行ったまま返って来ません。念のため前回の版で試したところ、正常に表示されます。今回の修正で別の不具合が発生している可能性がないでしょうか?

Posted by oyaji at 2009/08/02 (Sun) 03:13:39

[c++][starbug1] Re: C++で軽量Webサーバ書いた。

すばらしい。 書いたといっても結構前からあったのですが、いらん所を削ぎ落として軽量Webサーバとして仕立て上げました。 軽量とは言えど、CGIを使って結構色々動きます。 Big Sky :: C++で軽量Webサーバ書いた。 mattnさんがC++で書いた軽量Webサーバを公開されていました

Posted by 週記くらい(BTS開発記) at 2009/08/02 (Sun) 17:35:50

Re:

すみません。ご指摘のとおり、バグ混入しました。確認して修正させて頂きました。

Posted by mattn at 2009/08/02 (Sun) 21:35:49

ありがとうございます。動きました。

素早い対応ありがとうございます。
新しいソースをダウンロード、コンパイルして動かしてみました。
Cで書いたcgiが綺麗に動作しました。
ありがとうございました。

疑問点あります。HTMLに以下のように書かれている場合正常に動作しますが、

<html>
…省略…
<form action="/cgi-bin/a.cgi" method="POST">
<input type="submit" value="CGI表示">
</form>
…省略…

以下のようにJavascript経由だとアクセスに行ったまま返って来ません。

<html>
…省略…
<script type="text/javascript">
…省略…
function go_aview() {
 var f0 = document.sendf;
f0.method = "POST";
f0.action = "/cgi-bin/a.cgi";
f0.submit();
}
…省略…
</script>
…省略…
<form name="sendf">
<input type="button" value="CGI表示" onClick="go_aview()">
</form>
…省略…

ブラウザは内部で同じ処理を実行している筈ですが、どういう訳かJavascript経由では正常に表示しません。ちなみにブラウザはFirefox3.0.12(Ubuntu物64bit)です。
これはtthttpdの処理がJavascript経由だけ対応していないということなのでしょうか?できたらJavascript経由でも動いて欲しいのですが…。

Posted by oyaji at 2009/08/03 (Mon) 02:54:02

Re:

Windowsですが、↑のサンプルが動作しています。
お手数ですが再現するファイルを頂いてもよろしいでしょうか?

Posted by mattn at 2009/08/03 (Mon) 09:26:13

失礼しました

失礼しました。先に上げた例は正常に動作します。見誤っておりました。
動作しないパターンは以下の通りになります。
よろしくお願い致します。

<html lang="ja">
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<script type="text/javascript">
<!--
function go_aview() {
var f0 = document.sendf;
f0.method = "POST";
f0.action = "/cgi-bin/a.cgi";
f0.submit();
}
function go_aview2(no) {
var f0 = document.sendf;
f0.method = "POST"; /*GETにしても症状は同じ*/
f0.action = "/cgi-bin/a.cgi&no=" + no;
f0.submit();
}
//-->
</script>
<body>
<form name="sendf">
<input type="button" value="CGI成功" onClick="go_aview()">
<input type="button" value="CGI失敗" onClick="go_aview2('9')">
</form>
</body>
</html>

Posted by oyaji at 2009/08/03 (Mon) 16:48:40

ごめんなさい。また間違えました。

HTMLの一部に書き違いがありました。たびたび申し訳ありません。正しくは以下です。

<html lang="ja">
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<script type="text/javascript">
<!--
function go_aview() {
var f0 = document.sendf;
f0.method = "POST";
f0.action = "/cgi-bin/a.cgi";
f0.submit();
}
function go_aview2(no) {
var f0 = document.sendf;
f0.method = "POST"; /*GETにしても症状は同じ*/
f0.action = "/cgi-bin/a.cgi?no=" + no;
f0.submit();
}
//-->
</script>
<body>
<form name="sendf">
<input type="button" value="CGI成功" onClick="go_aview()">
<input type="button" value="CGI失敗" onClick="go_aview2('9')">
</form>
</body>
</html>

Posted by oyaji at 2009/08/03 (Mon) 16:56:00

Re:

ありがとうございます。
こうではないかな...と思う部分を修正しました。おそらくcgiの起動フォルダを間違って設定してしまっていたようです。

Posted by mattn at 2009/08/03 (Mon) 17:11:10

0.0.3を動かしてみました。

素早い対応をありがとうございます。
0.0.3のソースをダウンロード・コンパイルして動作させてみました。
しかし、今度は「CGI成功」の処理まで返って来なくなりました。
mattnさん(この上のコメントはmattnさん以外の第三者なのかも知れませんが…)のところでは正常に動作しているのでしょうか?その場合、私の環境に問題がある筈なので再度検証してみたいと思います。
貼り付け忘れましたが上記HTMLで動作検証に利用している a.cgi は以下の通りです。

#!/usr/bin/perl
print "Content-type: text/html\n";
print "\n";
read(STDIN, $data, $ENV{'CONTENT_LENGTH'});
print "Hi!";
print "REQUEST_METHOD : $ENV{'REQUEST_METHOD'}\n";
print "QUERY_STRING : $ENV{'QUERY_STRING'}\n";
print "CONTENT_LENGTH : $ENV{'CONTENT_LENGTH'}\n";
print "DATA : $data\n";

そして現在のテスト用index.htmlは以下のように hidden の値も加えました。

<html lang="ja">
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<script type="text/javascript">
<!--
function go_aview() {
var f0 = document.sendf;
f0.method = "POST";
f0.action = "/cgi-bin/a.cgi";
f0.submit();
}
function go_aview2(no) {
var f0 = document.sendf;
f0.method = "POST";
f0.action = "/cgi-bin/a.cgi?no=" + no;
f0.submit();
}
//-->
</script>
<body>
<form name="sendf">
<input type="hidden" name="namae" value="oyaji"><!--1行追加 -->
<input type="button" value="CGI成功" onClick="go_aview()">
<input type="button" value="CGI失敗" onClick="go_aview2('9')">
</form>
</body>
</html>

Posted by oyaji at 2009/08/03 (Mon) 22:51:57

追加で。

上記検証用環境の「CGI失敗」をApache 2.2で動作させると以下のような結果が表示されます。

Hi!
REQUEST_METHOD : POST
QUERY_STRING : no=9
CONTENT_LENGTH : 11
DATA : namae=oyaji

Posted by oyaji at 2009/08/03 (Mon) 23:42:07

[c++][starbug1] tthttpd でStarbug1を動かした

昨日の続き mattnさんが公開したtthttpdでStarbug1を動かそうとしています。問題を報告した日に、早速修正してもらいました。mattnさん、ありがとうございます。 それで動かしてみたんですが、なんか動かない。昨日の問題は解決していたんですが、CのCGIを動かすには、まだ

Posted by 週記くらい(BTS開発記) at 2009/08/03 (Mon) 23:59:58

デートクラブ・デリヘル・オナクラ・交際クラブ【素人自画撮りエロ写メ画像投稿掲示板】

デートクラブ・デリヘル・オナクラ・交際クラブ【素人自画撮りエロ写メ画像投稿掲示板】

Posted by デートクラブ・デリヘル・オナクラ・交際クラブ【素人自画撮りエロ写メ画像投稿掲示板】 at 2009/08/04 (Tue) 11:24:00

Re:

oyajiさん
不具合と思われる箇所を修正させて頂きました。ご確認下さい。

Posted by mattn at 2009/08/04 (Tue) 11:57:09

mattnさん対応ありがとうございます。
ソース0.0.4を落として試してみました。
先の検証用環境で実行したところ「CGI成功」は綺麗に動きました。
「CGI失敗」はボタンクリック後、ブラウザが以下のようなURLを指し示しました。

http://localhost:8080/cgi-bin/w/cgi-bin/a.cgi
(そのままではpostできないので/は/に変更してます)

上記のようなパスは存在しないので「ファイルが見つかりませんでした」とブラウザに表示されて終了します。

mattnさんの環境では正しく動くのでしょうか?

Posted by oyaji at 2009/08/04 (Tue) 14:52:03

Re:

すみません。原因が分かりました。
0.0.4a で確認してください。

Posted by mattn at 2009/08/04 (Tue) 15:29:41

完動で画面が見えません。

0.0.4bが最新のようなのでbを落として試してみました。
まず、コンパイルが通りませんでした。

$make
g++ -Wall -c -DHAVE_SETRESUID main.cxx
g++ -Wall -c -DHAVE_SETRESUID httpd.cxx
httpd.cxx:92: error: expected ‘,’ or ‘...’ before ‘*’ token
httpd.cxx:92: error: ISO C++ forbids declaration of ‘FILETIME’ with no type
httpd.cxx: In function ‘bool tthttpd::filetime2unixtime(int)’:
httpd.cxx:93: error: expected `;' before ‘lt’
httpd.cxx:93: 警告: statement has no effect
httpd.cxx:94: error: ‘SYSTEMTIME’ was not declared in this scope
httpd.cxx:94: error: expected `;' before ‘st’
httpd.cxx:96: error: ‘ft’ was not declared in this scope
httpd.cxx:96: error: ‘lt’ was not declared in this scope
httpd.cxx:96: error: ‘FileTimeToLocalFileTime’ was not declared in this scope
httpd.cxx:97: error: ‘lt’ was not declared in this scope
httpd.cxx:97: error: ‘st’ was not declared in this scope
httpd.cxx:97: error: ‘FileTimeToSystemTime’ was not declared in this scope
httpd.cxx:98: error: expected primary-expression before ‘,’ token
httpd.cxx:99: error: expected unqualified-id before ‘->’ token
httpd.cxx:100: error: expected unqualified-id before ‘->’ token
httpd.cxx:101: error: expected unqualified-id before ‘->’ token
httpd.cxx:102: error: expected unqualified-id before ‘->’ token
httpd.cxx:103: error: expected unqualified-id before ‘->’ token
httpd.cxx:104: error: expected unqualified-id before ‘->’ token
httpd.cxx: In function ‘void* tthttpd::response_thread(void*)’:
httpd.cxx:1233: 警告: format ‘%u’ expects type ‘unsigned int’, but argument 3 has type ‘size_t’
httpd.cxx: At global scope:
httpd.cxx:92: 警告: ‘bool tthttpd::filetime2unixtime(int)’ defined but not used
make: *** [httpd.o] エラー 1

調べたところ、ソースのエラー部分に使われている、FILETIME,SYSTEMTIME,FileTimeToSystemTime,FileTimeToLocalFileTime
はWindows専用の関数および型のようです。Linuxでは存在しません。
そこで対象のfiletime2unixtime(...)関数を #ifdef _WIN32...#endif のコメントで囲い、無効にしました。するとコンパイルは通りました。

そして動作させると、感動的なくらい綺麗に動きました。
もちろんCのcgiもなんの遜色もなく素直に動きました。
mattnさんありがとうございました!!

軽量で手間が少なくcgiが完動するアプリを随分探していたので、ガシガシ使わせて頂きます。
今後益々のご発展をお祈りしております。
本当にありがとうございました。

Posted by oyaji at 2009/08/04 (Tue) 18:30:09

Re:

いえ、こちらこそ。お付き合い頂いてありがとうございました。
windowsでしかコンパイル出来ない件は修正しておきます。

Posted by mattn at 2009/08/04 (Tue) 18:42:10

池袋 出会い喫茶 横浜 ナビ

池袋 出会い喫茶 横浜 ナビ

Posted by 池袋 出会い喫茶 横浜 ナビ at 2009/08/05 (Wed) 11:41:57

デートクラブ・デリヘル・オナクラ・交際クラブ【素人自画撮りエロ写メ画像投稿掲示板】  

デートクラブ・デリヘル・オナクラ・交際クラブ【素人自画撮りエロ写メ画像投稿掲示板】  

Posted by デートクラブ・デリヘル・オナクラ・交際クラブ【素人自画撮りエロ写メ画像投稿掲示板】   at 2009/08/08 (Sat) 20:58:33

レジストリ 復元

レジストリ 復元についての情報です。

Posted by レジストリ 復元 at 2010/07/15 (Thu) 10:51:32

TrackBack ping me at
Post a comment

writeback message: Ready to post a comment.