2011年5月14日更新
Inferno httpdとマルチバイト
2011年5月14日現在、公式に対応されましたので、 この記事は不要です。
Inferno Wikiのための前準備。 マルチバイトファイル名を参照すると化けていたので、 httpdを2点ほど修正しました。
まずは、parse.b:urlunesc。 終わりのほうにちょっと追加しただけですね。
urlunesc(s : string): string
{
c, n : int;
u := 0;
buf := array[2] of byte;
for(i := 0;i<len s ; i++){
c = int s[i];
if(c == '%'){
n = int s[i+1];
if(n >= '0' && n <= '9')
n = n - '0';
else if(n >= 'A' && n <= 'F')
n = n - 'A' + 10;
else if(n >= 'a' && n <= 'f')
n = n - 'a' + 10;
else
break;
c = n;
n = int s[i+2];
if(n >= '0' && n <= '9')
n = n - '0';
else if(n >= 'A' && n <= 'F')
n = n - 'A' + 10;
else if(n >= 'a' && n <= 'f')
n = n - 'a' + 10;
else
break;
i += 2;
c = c * 16 + n;
}
else if( c == '+' )
c = ' ';
if(u >= len buf){
b := array[len buf*2] of byte;
b[0:] = buf[0:];
buf = b;
}
buf[u++] = byte c;
}
return string array of byte buf[0:u];
}
続けてparse.b:urlconv。
urlesc(c : int): string
{
s, t : string;
s[0] = c;
buf := array of byte s;
for(i:=0;i<len buf ;i++)
t += sys->sprint("%%%2.2x", int buf[i]);
return t;
}
urlconv(p : string): string
{
c : int;
t : string;
for(i:=0;i<len p ;i++){
c = p[i];
if(c == 0)
break;
if(c <= ' ' || c == '%' || c >= Runeself){
t += urlesc(c);
} else {
t[len t] = c;
}
}
return t;
}
あとはふつうに。
% mk && mk install
svc/httpdに-Dオプションを与えると、/services/httpd以下に 詳細なログを書き出します。問題解決にとても役立ちます。