Search code examples
ruby-on-railsrubyxml-rpcdokuwiki

Ruby XMLRPC localhost Runtime Error : Wrong Size


I am trying to connect to the XMLRPC API of a dokuwiki website.

I am successfully doing that from my own laptop, with a SSL connection, however, when I try to do it from my production server (which hosts both the wiki and the rails app from which the ruby code is executed), I run into a

Runtime Error

Wrong size. Was 163, should be 113

Here's how I initialize the connection :

    @wiki = ::XMLRPC::Client.new3( 
        host: "wiki.example.com",
        path: "/lib/exe/xmlrpc.php",
        use_ssl: true)
      # Temp Hack because SSL Fails
      @wiki.instance_variable_get(:@http).instance_variable_set(:@verify_mode, OpenSSL::SSL::VERIFY_NONE)
    end
    @authenticated = false
    authenticate!
  end

  def authenticate!
    # Fails at below line :
    @authenticated = @wiki.call("dokuwiki.login", ENV['WIKI_USER'], ENV['WIKI_PASSWORD'])
    Rails.logger.info (@authenticated ? "Authenticated on Wiki !" : "Authentication failed on wiki !")
  end

I've read many posts saying that there is a bug in the XMLRPC lib of Ruby. I was running ruby 2.1.5pxx on my laptop and ruby 1.9.xx at my server so I did a rvm install 2.1.5, yet the problem is still here

(btw, I assumed it was enough to do a rvm use 2.1.5 and then touch restart to restart my rails server, but how can I check which version of ruby it's using ?)

What is wrong ?

EDIT

On my laptop, I am running ruby 2.1.5p273 (2014-11-13 revision 48405) [x64-mingw32]

On my production server, I am running ruby-2.1.5 [ i686 ]

I tried another library, libxml-xmlrpc, and I get the following error when running the same command:

Net::HTTPBadResponse: wrong status line: "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">"

But again, the same code is running fine with the default ruby xmlrpc client on my Windows + rubyx64 2.1.5, so I really don't get it!

Edit2 : I tried adding

@wiki.http_header_extra = { "accept-encoding" => "identity" }

But then I get a

Authorization failed. HTTP-Error: 401 Unauthorized

The first call @wiki.call("dokuwiki.login", "myUsr", "myPwd") worked, but apparently it failed to authenticate me (Of course I am still using the same login information that should work)

EDIT 3

After investigation, a successful login from any other computer than localhost will set a cookie like

@cookie="DokuWiki=[small string] ; [very big string]

Whereas if I do it on localhost : I will write [...] for random strings

@cookie="[small string 2]=deleted; DokuWiki=[small string]; [very big string]"

So I have an extra variable info stored in my cookie, which is "[small string 2]=deleted;

I believe this is what makes my authentication fails. Anyone knows what this is ???


Solution

  • So this localhost connection was messing up with the cookie. Apparently, even the ruby library doesn't know why, and the "Wrong size" comes from this unexpected string [random string]=deleted added at the beginning of the cookie.

    Unless someone can explain WHY such a string is added, I will accept my solution of simply adding

    @wiki.http_header_extra = { "accept-encoding" => "identity" }
    

    which removes the "Wrong size" error, then

    if /deleted/.match(@wiki.cookie)
      @wiki.cookie = @wiki.cookie.gsub(/.*deleted; /, '')
    end
    

    To remove the beginning of the cookie