大原です。

xmlrpc4r を mod_ruby で使っていて、
いくつか気になった点がありましたので報告します。

1.
xmlrpc/util.rb で、

  instance_eval &p

の箇所で、 "warning: `&' interpreted as argument prefix" と
warning が出てしまいます。

2.
Apache::Request の obsolete なメソッドを使っている箇所があるようです。
warning のとおり、headers_in, headers_out を使う方がいいと思います。

3.
XMLRPC::ModRubyServer::new ですが、
二回目以降は実際の処理が行われないようになっているようなのですが、
このせいで、二回目以降の処理では initialize の処理が行なわれず、
既に破棄された @ap (Apache::request) を参照してしまうことになってしまい、
以後の全てが "destroyed request" としてエラーとなってしまいます。
# XMLRPC::CGIServer::new もそうなのですが、
# 私にはちょっとこのココロが良くわかりませんでした。


以上 3点について、修正案として patch を付けておきます。


diff -urN xmlrpc.orig/server.rb xmlrpc/server.rb
--- xmlrpc.orig/server.rb	Thu Aug 14 14:46:57 2003
+++ xmlrpc/server.rb	Thu Aug 14 14:36:47 2003
@@ -508,22 +508,22 @@
 =end 
 
 class ModRubyServer < BasicServer
-  @@obj = nil
+#  @@obj = nil
 
-  def ModRubyServer.new(*a)
-    @@obj = super(*a) if @@obj.nil?
-    @@obj
-  end
+#  def ModRubyServer.new(*a)
+#    @@obj = super(*a) if @@obj.nil?
+#    @@obj
+#  end
 
   def initialize(*a)
     @ap = Apache::request
     super(*a)
   end
-  
+
   def serve
     catch(:exit_serve) {
       header = {}
-      @ap.each_header {|key, value| header[key.capitalize] = value}
+      @ap.headers_in.each {|key, value| header[key.capitalize] = value}
 
       length = header['Content-length'].to_i
 
@@ -568,7 +568,7 @@
     h['Status']         ||= "200 OK"
     h['Content-length'] ||= body.size.to_s 
 
-    h.each {|key, value| @ap[key] = value }
+    h.each {|key, value| @ap.headers_out[key] = value }
     @ap.content_type = h["Content-type"] 
     @ap.status = status.to_i 
     @ap.send_http_header 
diff -urN xmlrpc.orig/utils.rb xmlrpc/utils.rb
--- xmlrpc.orig/utils.rb	Thu Aug 14 14:46:57 2003
+++ xmlrpc/utils.rb	Thu Aug 14 14:55:21 2003
@@ -113,7 +113,7 @@
     def initialize(prefix, &p)
       raise "No interface specified" if p.nil?
       super(prefix)
-      instance_eval &p
+      instance_eval(&p)
     end
 
     def get_methods(obj, delim=".") 


----
OHARA Shigeki (大原 重樹) <os / iij.ad.jp>