LR2/LR2IR用のプロキシサーバのようなものを作っている

きっかけ

ランキング取得クソ重くてむかつきません?

構成

ブラウザから見るLR2IRを好き放題いじる分には適当にプロキシサーバ立ててプロキシ自動構成か何かするのが簡単だろうけど、俺はLR2body.exeの通信をどうにかしたかったのでそれは無し(ちょっと怪しいかもしれない)。

LR2は通信をhttpのPOSTで行っている。URLはプログラム内で固定されているため変更はできない(やろうと思えばできると思うけどバイナリそのものはあんまり触りたくない)。

そこで、パワープレイではあるけど名前解決の部分を上手く使うことにした。

LR2のhttp通信はWinsockを使用して行われているけど、gethostbyname関数でwww.dream-pro.infoを名前解決しているっぽい。 gethostbyname

  1. DNSキャッシュ
  2. hosts
  3. DNSサーバ

の順で問い合わせるらしい(普通そうだろうけど)ので、hostsに

aaa.bbb.ccc.ddd www.dream-pro.info

みたいに書いて、aaa.bbb.ccc.dddでリクエストを処理することを考える。

俺の取った方法としては、apache127.0.0.1:80で立てて

RewriteEngine On
RewriteCond %{REQUEST_URI} !^/cgi-bin/rewrite\.cgi/(.*)$
RewriteRule ^/(.+)$ /cgi-bin/rewrite\.cgi/$1 [PT]

みたいに設定して、ルート以下のアクセスを/cgi-bin/rewrite.cgiに丸投げする。ちなみに[PT]を知らなくてかなり嵌った。

こう書くことでrewrite.cgiURIPATH_INFOとして渡されるので、あとはrewrite.cgi側で自由に書けばいい。

通常通りの処理をしたければ普通にwww.dream-pro.infoにリクエストを飛ばせばいいけど、hostsに書いてある設定が優先されるのでソケット通信で書く必要があった(俺は)。

あれこれあって書き終わって、一昨日辺りようやくまともに動くようになってくれた。

出来そうかつ需要がありそうな事としては

  1. LR2上でライバル内ランキングの実現(当初の目的, 通常のIRと併用不可)
  2. search.cgiブラウジング時の機能追加
  3. 選曲履歴の保存

くらいが簡単に思いつくかなあ。2.については軽くやっていて、

  1. 発狂BMS一覧ページに★25とか通常難易度表とかをちょっと追加 f:id:GNQG:20151205153810j:plain
  2. 特定タグ検索時に関連タグ(事前に指定)を挿入 f:id:GNQG:20151205153829j:plain

みたいなことをやってみた。

もう少しいろいろ試してみようと思う。公開とかはどうなんだろう。