<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>tmty.jp &#187; Plugin</title>
	<atom:link href="http://tmty.jp/tag/plugin/feed/" rel="self" type="application/rss+xml" />
	<link>http://tmty.jp</link>
	<description>tmtysk が前よりも更新しなくなってしまっているブログ</description>
	<lastBuildDate>Thu, 15 Dec 2011 16:17:13 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.2</generator>
<link rel="http://api.friendfeed.com/2008/03#sup" xmlns="http://www.w3.org/2005/Atom" type="application/json" href="http://friendfeed.com/api/public-sup.json#fdff53faaa"/>		<item>
		<title>検索ボックスの文字列を自動クリアするfirefox拡張を作ってみた</title>
		<link>http://tmty.jp/2007/10/31/%e6%a4%9c%e7%b4%a2%e3%83%9c%e3%83%83%e3%82%af%e3%82%b9%e3%81%ae%e6%96%87%e5%ad%97%e5%88%97%e3%82%92%e8%87%aa%e5%8b%95%e3%82%af%e3%83%aa%e3%82%a2%e3%81%99%e3%82%8bfirefox%e6%8b%a1%e5%bc%b5%e3%82%92/</link>
		<comments>http://tmty.jp/2007/10/31/%e6%a4%9c%e7%b4%a2%e3%83%9c%e3%83%83%e3%82%af%e3%82%b9%e3%81%ae%e6%96%87%e5%ad%97%e5%88%97%e3%82%92%e8%87%aa%e5%8b%95%e3%82%af%e3%83%aa%e3%82%a2%e3%81%99%e3%82%8bfirefox%e6%8b%a1%e5%bc%b5%e3%82%92/#comments</comments>
		<pubDate>Tue, 30 Oct 2007 16:08:06 +0000</pubDate>
		<dc:creator>tmtysk</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[ClearSB]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://wp.tmty.jp/2007/10/31/%e6%a4%9c%e7%b4%a2%e3%83%9c%e3%83%83%e3%82%af%e3%82%b9%e3%81%ae%e6%96%87%e5%ad%97%e5%88%97%e3%82%92%e8%87%aa%e5%8b%95%e3%82%af%e3%83%aa%e3%82%a2%e3%81%99%e3%82%8bfirefox%e6%8b%a1%e5%bc%b5%e3%82%92/</guid>
		<description><![CDATA[(2009-01-03追記) ここで紹介している clearSB のソースコード一式は、GitHub へ移管されました。 clearSB &#8211; GitHub ==== firefox の右上にある検索ボックスは [...]]]></description>
			<content:encoded><![CDATA[<span class="read_later"><script type="text/javascript"><!--
			instapaper_embed( "http://tmty.jp/2007/10/31/%e6%a4%9c%e7%b4%a2%e3%83%9c%e3%83%83%e3%82%af%e3%82%b9%e3%81%ae%e6%96%87%e5%ad%97%e5%88%97%e3%82%92%e8%87%aa%e5%8b%95%e3%82%af%e3%83%aa%e3%82%a2%e3%81%99%e3%82%8bfirefox%e6%8b%a1%e5%bc%b5%e3%82%92/", "検索ボックスの文字列を自動クリアするfirefox拡張を作ってみた", "" );
		//--></script></span><p>(2009-01-03追記) ここで紹介している clearSB のソースコード一式は、GitHub へ移管されました。<br/><br/><br />
<a href="http://github.com/tmtysk/clearsb/tree/master">clearSB &#8211; GitHub</a><br/><br/><br />
====<br/><br />
<br/><br />
<img src="http://image.blog.livedoor.jp/tmtysk/imgs/f/5/f5d16ba5.png" width="100" height="100" border="0" alt="clearsb" hspace="5" class="pict" align="left" /><br />
firefox の右上にある検索ボックスは、検索後にフォームに検索文字列が残るようになっている。で、後ろから忍び寄ってきた人や、ちょっと席を離れたとき(大体ロックしてるけど)にスクリーンを覗いてきた人に何を検索したか見られることがあったりする。</p>
<p>今のところ、特に恥ずかしい思いを過去にしたわけでもないのだが、勝手に消えてくれた方がなんとなく嬉しい。というわけで、そんな機能を firefox の拡張(addon)で作ってみようと思い立った。SearchBox を Clear するので、名付けて clearsb (クリアエスビー) です。</p>
<p>参考にしたサイトは、次の通り。とくにまとめサイトの方がわかりやすかった。</p>
<ul>
<li><a href="http://firefox.geckodev.org/index.php?%E6%8B%A1%E5%BC%B5%E3%81%AE%E4%BD%9C%E6%88%90">拡張の作成 &#8211; Mozilla Firefox まとめサイト</a></li>
<li><a href="http://developer.mozilla.org/ja/docs/Building_an_Extension">Building an Extension &#8211; MDC</a></li>
</ul>
<p><a href="http://tmty.jp/trac/wiki/clearSB">できあがった拡張(xpi)はこちらの trac に置いておいたので、ご興味の方、どうぞお持ちください</a>。win 環境 Firefox 2.0.0.3 と linux 環境 Firefox 2.0.0.6 で動作確認済です。初めて作ったものなので、何かと行き届かない部分はご容赦を。あ、あと、最低限のコードしかしてないので、環境によっては変な動きをするかもしれません。ご利用は自己責任でお願いします。</p>
<p>以下、作業メモ。xpi の実体は zip 圧縮されたファイルなので、伸張すれば、簡単に解読できますです。</p>
<p>まず、ディレクトリ構成は、こんな感じ。</p>
<pre class="prettyprint">
<拡張を作るディレクトリのルート>$ ls -R
.:
chrome  chrome.manifest install.rdf
./chrome:
content  skin
./chrome/content:
about.xul  clearsb.js  clearsb.xul
./chrome/skin:
clearsb.png  clearsbb.png
</pre>
<p>上記の通り、ごく少量のファイルで拡張が作れてしまうわけだが、自作のアイコンや about 用のダイアログが不要であれば、用意するファイルは、次の 4 つだけで良い。</p>
<ul>
<li>インストール方法を記述した /install.rdf</li>
<li>配布ファイルの構成を記述した /chrome.manifest</li>
<li>拡張の UI への割当て方法を記述した /chrome/content/clearsb.xul</li>
<li>拡張の実処理を記述した /chrome/content/clearsb.js</li>
</ul>
<p>これだけだから、中身も全部貼っておく。</p>
<h4>/install.rdf</h4>
<p><textarea rows="30" cols="80"><br />
<?xml version="1.0"?><br />
<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"<br />
xmlns:em="http://www.mozilla.org/2004/em-rdf#"><br />
<Description about="urn:mozilla:install-manifest"><br />
<em:id>{786ac958-0f07-46cf-b072-529a4160e8fe}</em:id><br />
<em:name>clearsb</em:name><br />
<em:version>0.1</em:version><br />
<em:description>検索アクション後に検索ボックスに入力した文字列をクリアする</em:description><br />
<em:creator>tmtysk</em:creator><br />
<em:homepageURL>http://blog.tmty.jp/</em:homepageURL><br />
<em:iconURL>chrome://clearsb/skin/clearsb.png</em:iconURL><br />
<em:aboutURL>chrome://clearsb/content/about.xul</em:aboutURL><br />
<em:type>2</em:type><br />
<!-- Target Application this extension can install into,<br />
with minimum and maximum supported versions. --><br />
<em:targetApplication><br />
<Description><br />
<em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id><br />
<em:minVersion>2.0.0.0</em:minVersion><br />
<em:maxVersion>2.0.*</em:maxVersion><br />
</Description><br />
</em:targetApplication><br />
</Description><br />
</RDF><br />
</textarea></p>
<p>なお、em:id(GUID) は<a href="http://extensions.roachfiend.com/cgi-bin/guid.pl">オンラインサービス</a>で取得してきた。</p>
<h4>/chrome.manifest</h4>
<pre class="prettyprint">
overlay chrome://browser/content/browser.xul chrome://clearsb/content/clearsb.xul
content clearsb jar:chrome/clearsb.jar!/content/
skin clearsb default jar:chrome/clearsb.jar!/skin/
</pre>
<p>拡張の実体とスキンがどこにあるかを規定するファイル。chrome:// で始まる URI を適宜書き換えれば、ディレクトリ構成はわりと自由にいけるぽい。</p>
<h4>/chrome/content/clearsb.xul</h4>
<p><textarea rows="8" cols="80"><br />
<?xml version="1.0"?><br />
<overlay id="clearsbOverlay"<br />
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"><br />
// JavaScript をインポートする<br />
<script type="application/x-javascript" src="chrome://clearsb/content/clearsb.js">
</script><br />
</overlay><br />
</textarea></p>
<p>ここで処理の実体である clearsb.js を指定している。</p>
<h4>/chrome/content/clearsb.<del>xul</del>js</h4>
<pre class="prettyprint">
var ClearSB = {
// 初期化処理 .. サーチアクションにリスナをバインドする
init: function() {
sb = document.getElementById("searchbar");
eval("sb.handleSearchCommand = " + sb.handleSearchCommand.toString().replace(
"{", "{ ClearSB.onSearch();"));
},
// サーチアクション時に呼ばれる
// 検索エンジンに文字列が渡るよう、1msec 後にフォームをクリアする
onSearch: function() {
setTimeout(function() {
sb = document.getElementById("searchbar");
sb._textbox.textValue = "";
}, 1);
}
};
// 起動時に上記のオブジェクトをロードする
window.addEventListener("load", ClearSB.init, false);
</pre>
<p>実は、肝心のこれだけのコードの書き方がなかなかわからなかった。まず、検索ボックスの検索アクションに function を bind させる方法がわからず(上記 init で eval してるところ)、次に、検索時に検索ボックスを空にすると検索エンジンに検索文字列が渡らないという現象に悩まされた(上記 onSearch で setTimeout してるところ)。<br />
結局、いろいろ探しているうちに、userchrome.js の上で同じ事をやってる人を、<a href="http://hyperreality.wordpress.com/2007/02/15/how-to-automatically-clear-a-query-from-firefoxs-search-bar/">こちらのブログのコメント欄で発見</a>し、これを頼りに上記のように書いてみたら、ようやくうまくいった感じ。この辺のプロパティ名とかがオフィシャルにまとめてあるところが見付からないんだな.. どなたかご存知でしたら教えてください。</p>
<p>最後に、上述のまとめサイトのチュートリアルに掲載されているパッケージング用のスクリプトを用意して、こいつを PATH の通ったところに突っ込む。(今回の構成用に、微妙にファイル名をカスタマイズしてあります。)</p>
<pre class="prettyprint">
#!/bin/sh -f
x=$(pwd)
x=${x##*/}
rm $x.xpi
# archive chrome (non-compressed)
mkdir -p build/chrome
cd chrome
find . ! -name '.*' -exec zip -0 ../build/chrome/$x.jar {} ;
cd ..
cp -f chrome.manifest install.rdf build
# archive whole (compressed)
cd build
find . ! -name . -exec zip -9 ../$x.xpi {} ;
cd ..
rm -rf build
</pre>
<p>これを、冒頭に書いたルートのディレクトリから実行してやると、xpi ができあがり。簡単な事をやりたかった割には時間がかかってしまった。でも JavaScript でブラウザを拡張していくという感覚は面白いな。乗り遅れたな..</p>
<p>あ、最後に、アイコン作ってくれた嫁さんと、動作確認に協力してくれた(「小倉智昭」を検索しっぱなしで恥ずかしい思いをしたばかりの) 弟に感謝。</p>
<p>(2007/10/31 18:59 追記) clearsb.js のファイル名表記が間違ってたので直しました。<br />
<br/><br/><strong>関連していそうなエントリ:</strong>
<ul class="similar-posts">
<li><a href="http://tmty.jp/2007/03/20/google-blog-bar-wizard-%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6%e3%81%bf%e3%81%9f/" rel="bookmark" title="2007 年 3 月 20 日">Google Blog Bar Wizard を使ってみた</a></li>
<li><a href="http://tmty.jp/2007/04/02/%e6%8b%be%e3%81%a3%e3%81%9fjavascript%e3%83%a9%e3%82%a4%e3%83%96%e3%83%a9%e3%83%aa%e3%82%92%e3%81%99%e3%81%90%e8%a9%a6%e3%81%97%e3%81%a6%e3%81%bf%e3%82%8b%e6%96%b9%e6%b3%95/" rel="bookmark" title="2007 年 4 月 2 日">拾ったJavaScriptライブラリをすぐ試してみる方法</a></li>
<li><a href="http://tmty.jp/2007/05/22/jsasflash%e9%96%a2%e9%80%a3%e3%81%ae%e5%8b%89%e5%bc%b7%e4%bc%9a%e3%81%ab%e8%a1%8c%e3%81%a3%e3%81%a6%e3%81%8d%e3%81%9f/" rel="bookmark" title="2007 年 5 月 22 日">JS/AS/Flash関連の勉強会に行ってきた</a></li>
</ul>
<p><!-- Similar Posts took 23.080 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://tmty.jp/2007/10/31/%e6%a4%9c%e7%b4%a2%e3%83%9c%e3%83%83%e3%82%af%e3%82%b9%e3%81%ae%e6%96%87%e5%ad%97%e5%88%97%e3%82%92%e8%87%aa%e5%8b%95%e3%82%af%e3%83%aa%e3%82%a2%e3%81%99%e3%82%8bfirefox%e6%8b%a1%e5%bc%b5%e3%82%92/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>lighttpdで指定のリクエストヘッダ項目を参照するプラグインを書いた</title>
		<link>http://tmty.jp/2007/08/20/lighttpd%e3%81%a7%e6%8c%87%e5%ae%9a%e3%81%ae%e3%83%aa%e3%82%af%e3%82%a8%e3%82%b9%e3%83%88%e3%83%98%e3%83%83%e3%83%80%e9%a0%85%e7%9b%ae%e3%82%92%e5%8f%82%e7%85%a7%e3%81%99%e3%82%8b%e3%83%97%e3%83%a9/</link>
		<comments>http://tmty.jp/2007/08/20/lighttpd%e3%81%a7%e6%8c%87%e5%ae%9a%e3%81%ae%e3%83%aa%e3%82%af%e3%82%a8%e3%82%b9%e3%83%88%e3%83%98%e3%83%83%e3%83%80%e9%a0%85%e7%9b%ae%e3%82%92%e5%8f%82%e7%85%a7%e3%81%99%e3%82%8b%e3%83%97%e3%83%a9/#comments</comments>
		<pubDate>Sun, 19 Aug 2007 16:25:04 +0000</pubDate>
		<dc:creator>tmtysk</dc:creator>
				<category><![CDATA[C]]></category>
		<category><![CDATA[Lighttpd]]></category>
		<category><![CDATA[Plugin]]></category>

		<guid isPermaLink="false">http://wp.tmty.jp/2007/08/20/lighttpd%e3%81%a7%e6%8c%87%e5%ae%9a%e3%81%ae%e3%83%aa%e3%82%af%e3%82%a8%e3%82%b9%e3%83%88%e3%83%98%e3%83%83%e3%83%80%e9%a0%85%e7%9b%ae%e3%82%92%e5%8f%82%e7%85%a7%e3%81%99%e3%82%8b%e3%83%97%e3%83%a9/</guid>
		<description><![CDATA[lighttpd-1.4.15 + FastCGI な環境で、HTTP リクエストヘッダ中の任意のレコードを参照して、その内容によって環境変数を設定しておきたい、という状況。apache であれば SetEnvIf ディ [...]]]></description>
			<content:encoded><![CDATA[<span class="read_later"><script type="text/javascript"><!--
			instapaper_embed( "http://tmty.jp/2007/08/20/lighttpd%e3%81%a7%e6%8c%87%e5%ae%9a%e3%81%ae%e3%83%aa%e3%82%af%e3%82%a8%e3%82%b9%e3%83%88%e3%83%98%e3%83%83%e3%83%80%e9%a0%85%e7%9b%ae%e3%82%92%e5%8f%82%e7%85%a7%e3%81%99%e3%82%8b%e3%83%97%e3%83%a9/", "lighttpdで指定のリクエストヘッダ項目を参照するプラグインを書いた", "" );
		//--></script></span><p>lighttpd-1.4.15 + FastCGI な環境で、HTTP リクエストヘッダ中の任意のレコードを参照して、その内容によって環境変数を設定しておきたい、という状況。apache であれば SetEnvIf ディレクティブを使うことで、</p>
<pre class="prettyprint">
SetEnvIf X-Hoge &quot;.*&quot; bar=yes
</pre>
<p>とかで設定できるが、lighttpdではこういう事ができないらしい。lighttpdの設定でSetEnvIfのような条件分岐処理を書こうとすると、<a href="http://trac.lighttpd.net/trac/wiki/Docs%3AConfiguration#conditional-configuration">マニュアルのConditional Configuration</a>によれば、</p>
<blockquote><p>
&lt;field&gt; &lt;operator&gt; &lt;value&gt; {<br />
&#8230;<br />
}
</p></blockquote>
<p>てな記述ができるのだが、&lt;field&gt; に指定できるのは $HTTP や $SERVER で参照できる、固定の変数だけのようだ。$HTTP[&quot;X-Hoge&quot;] とか試しに指定してみたけど、syntax error で無視されてしまう。</p>
<p>デフォルト提供されている mod_xx や設定方法のマニュアルを当たってみたり、あと、騙し騙し使えそうな設定方法を試行してみたが、どれもダメだった。mod_setenv を使えば環境変数の設定まではできるんだが、その手前の条件記法を拡張する事ができないみたいだ。</p>
<p>ということで、lighttpd の拡張プラグインを書いてみようと思い立った。条件記法の拡張まではできなさそう（うまくやればできるかも??）だが、デフォルト指定できない特定のHTTPリクエストヘッダを参照し、環境変数を設定する、というだけであれば、プラグインで書けそうだ。ということで、プラグイン作成の作業メモ。</p>
<p><a href="http://trac.lighttpd.net/trac/wiki/HowToWriteALighttpdPlugin">Writing Plugins のページ</a>に簡単なチュートリアルがあるので、これに従ってプラグインを書いてみた。プラグインの作成ステップは、大きく以下のような感じ。</p>
<ol>
<li>mod_skeleton.c からスケルトンコードのコピー</li>
<li>スケルトンコードを書き換える形でプラグインを記述</li>
<li>プラグインの Makefile.am の修正</li>
<li>プラグインの make .. Makefile.in の生成と作成したプラグインのプリコンパイル</li>
<li>lighttpd の configure .. &#8211;enable-maintainer-mode で Makefile を書き換える</li>
<li>lighttpd の make &#038;&#038; make install</li>
</ol>
<p>本家のチュートリアルには上記 (4) のステップが抜けているので注意（(6) も抜けてるけど）。あと、プラグインの作成には <a href="http://trac.lighttpd.net/trac/wiki/Docs%3AInternalHTTPStates">lighttpd の動作モデル</a>と、<a href="http://trac.lighttpd.net/trac/wiki/Docs%3AInternalPlugins">プラグインがフックできるインタフェース（エントリポイント）</a>の概要くらいは見ておく必要があると思う。</p>
<p>プラグインソースコードの構成（レイアウト）は、<a href="http://trac.lighttpd.net/trac/wiki/HowToWriteALighttpdPlugin">上記のチュートリアル</a>を参照。意訳すると、</p>
<ol>
<li>プラグイン処理中で使用する構造体の定義</li>
<li>構造体の初期化処理</li>
<li>configuration file の parse 処理 .. set_defaults</li>
<li>プラグインが条件分岐中で適用された場合の処理 .. patch-function</li>
<li>プラグインのメイン処理</li>
<li>プラグインの初期化処理(プラグイン中で定義した関数と、プラグインインタフェースとの対応はここで定義する) .. plugin_init</li>
</ol>
<p>こんなかんじの構成になっている。</p>
<p>あとは、既存のプラグインソースなどを参考に、プラグインを書いていく。今回書いたプラグイン mod_addenv.c は、こんなかんじ。</p>
<pre class="prettyprint">
#include <stdlib.h>
#include <string.h>
#include "base.h"
#include "log.h"
#include "buffer.h"
#include "plugin.h"
/* plugin config for all request/connections */
typedef struct {
int handled;
} handler_ctx;
typedef struct {
array *match;
} plugin_config;
typedef struct {
PLUGIN_DATA;
plugin_config **config_storage;
plugin_config conf;
} plugin_data;
static handler_ctx * handler_ctx_init() {
handler_ctx * hctx;
hctx = calloc(1, sizeof(*hctx));
hctx->handled = 0;
return hctx;
}
static void handler_ctx_free(handler_ctx *hctx) {
free(hctx);
}
/* init the plugin data */
INIT_FUNC(mod_addenv_init) {
plugin_data *p;
p = calloc(1, sizeof(*p));
return p;
}
/* detroy the plugin data */
FREE_FUNC(mod_addenv_free) {
plugin_data *p = p_d;
UNUSED(srv);
if (!p) return HANDLER_GO_ON;
if (p->config_storage) {
size_t i;
for (i = 0; i < srv->config_context->used; i++) {
plugin_config *s = p->config_storage[i];
array_free(s->match);
free(s);
}
free(p->config_storage);
}
free(p);
return HANDLER_GO_ON;
}
/* handle plugin config and check values */
SETDEFAULTS_FUNC(mod_addenv_set_defaults) {
plugin_data *p = p_d;
size_t i = 0;
config_values_t cv[] = {
{ "addenv.env", NULL, T_CONFIG_ARRAY, T_CONFIG_SCOPE_CONNECTION },       /* 0 */
{ NULL, NULL, T_CONFIG_UNSET, T_CONFIG_SCOPE_UNSET }
};
if (!p) return HANDLER_ERROR;
p->config_storage = calloc(1, srv->config_context->used * sizeof(specific_config *));
for (i = 0; i < srv->config_context->used; i++) {
plugin_config *s;
s = calloc(1, sizeof(plugin_config));
s->match    = array_init();
cv[0].destination = s->match;
p->config_storage[i] = s;
if (0 != config_insert_values_global(srv, ((data_config *)srv->config_context->data[i])->value, cv)) {
return HANDLER_ERROR;
}
}
return HANDLER_GO_ON;
}
#define PATCH(x)
p->conf.x = s->x;
static int mod_addenv_patch_connection(server *srv, connection *con, plugin_data *p) {
size_t i, j;
plugin_config *s = p->config_storage[0];
PATCH(match);
/* skip the first, the global context */
for (i = 1; i < srv->config_context->used; i++) {
data_config *dc = (data_config *)srv->config_context->data[i];
s = p->config_storage[i];
/* condition didn't match */
if (!config_check_cond(srv, con, dc)) continue;
/* merge config */
for (j = 0; j < dc->value->used; j++) {
data_unset *du = dc->value->data[j];
if (buffer_is_equal_string(du->key, CONST_STR_LEN("addenv.env"))) {
PATCH(match);
}
}
}
return 0;
}
#undef PATCH
URIHANDLER_FUNC(mod_addenv_uri_handler) {
plugin_data *p = p_d;
size_t i, j;
handler_ctx *hctx;
if (con->plugin_ctx[p->id]) {
hctx = con->plugin_ctx[p->id];
} else {
hctx = handler_ctx_init();
con->plugin_ctx[p->id] = hctx;
}
if (hctx->handled) {
return HANDLER_GO_ON;
}
hctx->handled = 1;
mod_addenv_patch_connection(srv, con, p);
for (i = 0; i < con->request.headers->used; i++) {
data_string *dsh;
dsh = (data_string *)con->request.headers->data[i];
if(dsh->key->used &#038;&#038; dsh->value->used &#038;&#038; (0 == strcasecmp(dsh->key->ptr, "X-HOGE"))) {
for (j = 0; j < p->conf.match->used; j++) {
data_string *ds = (data_string *)p->conf.match->data[j];
data_string *ds_dst;
if (NULL == (ds_dst = (data_string *)array_get_unused_element(con->environment, TYPE_STRING))) {
ds_dst = data_string_init();
}
buffer_copy_string_buffer(ds_dst->key, ds->key);
buffer_copy_string_buffer(ds_dst->value, ds->value);
array_insert_unique(con->environment, (data_unset *)ds_dst);
}
}
}
/* not found */
return HANDLER_GO_ON;
}
REQUESTDONE_FUNC(mod_addenv_reset) {
plugin_data *p = p_d;
UNUSED(srv);
if (con->plugin_ctx[p->id]) {
handler_ctx_free(con->plugin_ctx[p->id]);
con->plugin_ctx[p->id] = NULL;
}
return HANDLER_GO_ON;
}
/* this function is called at dlopen() time and inits the callbacks */
int mod_addenv_plugin_init(plugin *p) {
p->version     = LIGHTTPD_VERSION_ID;
p->name        = buffer_init_string("addenv");
p->init        = mod_addenv_init;
p->handle_uri_clean  = mod_addenv_uri_handler;
p->set_defaults  = mod_addenv_set_defaults;
p->cleanup     = mod_addenv_free;
p->handle_request_done = mod_addenv_reset;
p->data        = NULL;
return 0;
}
</pre>
<p>このソースを mod_addenv.c として保存し、lighttpd-1.4.15/src 以下で make したあと、./configure &#8211;enable-maintainer-mode &#038;&#038; make &#038;&#038; make install する。既存の環境がある場合は、テスト用に &#8211;prefix 指定して違うところに入れた方がいいかも。あとは lighttpd.conf で、</p>
<pre class="prettyprint">
server.modules = ( &quot;mod_addenv&quot; )
addenv.env = (
&nbsp;&quot;bar&quot; => &quot;yes&quot;
)
</pre>
<p>とか設定しておけば、lighttpd でも上述の SetEnvIf のような効果が得られる。X-HOGE をソース中に書いているのがダサいな。なんとかしたい。</p>
<p>ところで、プラグインの記述方法は、ちょっと癖があるようにも思えたが、こういうモノなのだろうか。まあ、一度やってみておいて損は無いかな、とはおもった。他にもいろいろ使い道ありそうだし。<br />
<br/><br/><strong>関連していそうなエントリ:</strong>
<ul class="similar-posts">
<li><a href="http://tmty.jp/2007/09/25/ubuntu-ivtv-102-gv-mvprx2-%e3%81%a7%e3%83%86%e3%83%ac%e3%83%93%e8%a6%96%e8%81%b4%e3%81%a7%e3%81%8d%e3%81%9f/" rel="bookmark" title="2007 年 9 月 25 日">ubuntu + ivtv-1.0.2 + GV-MVP/RX2 でテレビ視聴できた</a></li>
</ul>
<p><!-- Similar Posts took 17.248 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://tmty.jp/2007/08/20/lighttpd%e3%81%a7%e6%8c%87%e5%ae%9a%e3%81%ae%e3%83%aa%e3%82%af%e3%82%a8%e3%82%b9%e3%83%88%e3%83%98%e3%83%83%e3%83%80%e9%a0%85%e7%9b%ae%e3%82%92%e5%8f%82%e7%85%a7%e3%81%99%e3%82%8b%e3%83%97%e3%83%a9/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic Page Served (once) in 0.814 seconds -->

