SimpleXMLRPCServerはpathが”/”か”/RPC2”じゃないと404を返す

Apacheでできているリバースプロキシをlighttpdに移行する設定を書いていて困った。

Apacheと同じように設定してみると、書き換え後のURLでバックエンドにリクエストしていないように見える。

調べてみると、lighttpdのmod_rewriteは$HTTP[“url”]の内側では無効になるということらしい。

http://trac.lighttpd.net/trac/wiki/Docs%3AModRewrite

NOTE: url rewriting does not work within a $HTTP[“url”] conditional. http://forum.lighttpd.net/topic/1092#3028

でもURLでしか区別のつかないリクエストをどうしてもバックエンドで受けたい。いまさらユーザに見えるURLを変えることができないし。

バックエンド側ではPythonのSimpleXMLRPCServerで作ったもの。ソースを見てもどこにもURLをいじるところはない。そういえば、URLは意識したこと無いなあ。

で、探して探して見つけた。

[ python-Bugs-1473048 ] SimpleXMLRPCServer responds to any path

SimpleXMLRPCRequestHandlerのソースを見ると、

class SimpleXMLRPCRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
	"""Simple XML-RPC request handler class.
	Handles all HTTP POST requests and attempts to decode them as
	XML-RPC requests.
	"""

	# Class attribute listing the accessible path components;
	# paths not on this list will result in a 404 error.
	rpc_paths = ('/', '/RPC2')

	def is_rpc_path_valid(self):
		if self.rpc_paths:
			return self.path in self.rpc_paths
		else:
			# If .rpc_paths is empty, just assume all paths are legal
			return True

	def do_POST(self):
		"""Handles the HTTP POST request.
		  Attempts to interpret all HTTP POST requests as XML-RPC calls,
		  which are forwarded to the server's _dispatch method for handling.
		  """

		# Check that the path is legal
		if not self.is_rpc_path_valid():
			self.report_404()
			return

なるほど。最初からソース見ればよかった。

SimpleXMLRPCRequestHandlerを継承したクラスで、is_rpc_path_validを継承して解決。

なんだか、達成感。