log

lighttpd モジュール開発 ブラウザに時間を返すサンプル

本家の開発サイトと参考に作っても、

Lighttpd - HowToWriteALighttpdPlugin? - lighty labs http://redmine.lighttpd.net/wiki/lighttpd/HowToWriteALighttpdPlugin

いろいろはまった。

サンプルコードではstatus=403でプログラムが正常に終了するのに、

status=200とやると、問題が出てしまう。

みんな苦戦してないのかな。ドキュメントが少なすぎる。。。

まぁ、慣れれば自作CGIみたいなパワフルなことができるので、我慢して習得しています。

ブラウザでアクセスすると時間を表示するサンプルを載せておく

コード

	URIHANDLER_FUNC(mod_counter_uri_handler) {
		plugin_data *p = p_d;
		int s_len;
		size_t k, i;
	
		//plugin.hにsrvとconが定義されている
		//handler_t (* handle_uri_clean)       (server *srv, connection *con, void *p_d);    /* after uri is set */
		//srvとconは構造体でbase.hで定義されている
	
		UNUSED(srv);
	
		//typedef enum { DIRECT, EXTERNAL } connection_type;
		if (con->mode != DIRECT) return HANDLER_GO_ON;
	
		//uri.path
		/* path including leading slash ("/" or "/index.html") - urldecoded, and sanitized  ( buffer_path_simplify() && buffer_urldecode_path() ) */
		if (con->uri.path->used == 0) return HANDLER_GO_ON;
	
		//patch_connectionを呼ぶ
		mod_counter_patch_connection(srv, con, p);
	
		s_len = con->uri.path->used - 1;
	
		for (k = 0; k < p->conf.match->used; k++) {
			//data_stringは自分で定義した構造体
			data_string *ds = (data_string *)p->conf.match->data[k];
			int ct_len = ds->value->used - 1;
	
			if (ct_len > s_len) continue;
			if (ds->value->used == 0) continue;
	
			//
			if (0 == strncmp(con->uri.path->ptr + s_len - ct_len, ds->value->ptr, ct_len)) {
				//con->http_status = 403;
				
				//ここからがテストコード
			            system("ls > /tmp/test.txt"); //なんかプログラム実行してみる
			            con->http_status = 200; //HTTPのステータスセット
			            buffer *b;
				b = chunkqueue_get_append_buffer(con->write_queue);
				
				//bufferに文字列書き込み
				buffer_copy_string_len(b, CONST_STR_LEN("aaaaaaaaaaaaaa"));
				
				//時間を表示
				time_t now;
				time(&now);
				buffer_append_string(b, ctime(&now));
				
				//buffer_free(b);
				
				//サンプルではstatus=403で必要なかったが、file_finishedを設定しないとブラウザがいつまでもデータ取得状態になって、
				//サーバーから送られてくるデータを表示しない。
				//return HANDLER_FINISHEDだけで済むと思ってた。。。
				con->file_finished = 1;
				//テストコード終了
	
				return HANDLER_FINISHED;
			}
		}
	
		/* not found */
		return HANDLER_GO_ON;
	}

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2011-07-12 (火) 19:02:54 (2842d)