Ssl xml rpc

I need to make remote procedure calls to a server that has a
non-standard RPC protocol. It's basically RPC but with extra types, no
required message length declaration and it's all done over ssl. I have a
working version in perl but I'd prefer a solution in ruby. Below is what
I have so far with most of the XML removed for brevity.

require 'rubygems'
require 'http-access2'
client = HTTPAccess2::Client.new()
client.ssl_config.verify_mode = nil

body = <<ENDXML
<?xml version=“1.0”?>
<transaction>
  <methodCall>
  ...blah blah...
  </methodCall>
</transaction>
ENDXML
resp = client.post(“https://api.ultradns.net:8755”,body)

Whenever I try to talk to the server it always replies that I have a
malformed POST. I'm using http-access2; someone packaged it as a gem but
its not in the official repository. I'd like to know:

1) Is there a better way of doing all of this? (something other than
http-access2)
2) Is there something obviously wrong with the above code? Keep in mind
the XML part is verified in a working perl script.

Thanks!

···

--
Posted via http://www.ruby-forum.com/.

In situations like this I often find a network protocol analyzer like Wireshark
very helpful. I would start a packet capture filtering on port 8755 and run
both versions of the script (either in one capture session or two, probably
two). Then, for both captured streams in Wireshark: Analyze -> Follow TCP
Stream. That should present a nice view of the POST request sent by each
script.

···

On 1/24/07, David Weldon <dweldon@gmail.com> wrote:

I need to make remote procedure calls to a server that has a
non-standard RPC protocol. ...

Whenever I try to talk to the server it always replies that I have a
malformed POST. I'm using http-access2; someone packaged it as a gem but
its not in the official repository. I'd like to know:

1) Is there a better way of doing all of this? (something other than
http-access2)
2) Is there something obviously wrong with the above code? Keep in mind
the XML part is verified in a working perl script.

Ok I think I discovered the problem. I need to send my XML directly
without any headers. Right now I'm sending something like:

POST /RPC2 HTTP/1.0
User-Agent: Frontier/5.1.2 (WinNT)
Host: betty.userland.com
Content-Type: text/xml
Content-length: 181

and the response I'm getting is that "POST /RPC2 HTTP/1.0" isn't valid
XML. :slight_smile: So my new question is:

Does anyone know a way to write raw xml data to a given server&port with
ssl? In other words do you know how to send a POST over ssl without the
headers?

···

--
Posted via http://www.ruby-forum.com/.

David Weldon wrote:

Ok I think I discovered the problem. I need to send my XML directly without any headers. Right now I'm sending something like:

POST /RPC2 HTTP/1.0
User-Agent: Frontier/5.1.2 (WinNT)
Host: betty.userland.com
Content-Type: text/xml
Content-length: 181

and the response I'm getting is that "POST /RPC2 HTTP/1.0" isn't valid XML. :slight_smile: So my new question is:

Does anyone know a way to write raw xml data to a given server&port with ssl? In other words do you know how to send a POST over ssl without the headers?

I think that, by definition, a POST has POST headers.

What's running on the server, and why isn't it looking at the post data, instead of the HTTP headers?

···

--
James Britt

http://www.ruby-doc.org - Ruby Help & Documentation
http://beginningruby.com - Beginning Ruby: The Online Book
http://www.rubystuff.com - The Ruby Store for Ruby Stuff
http://www.jamesbritt.com - Playing with Better Toys

I think that, by definition, a POST has POST headers.

Haha, yeah I agree.

What's running on the server, and why isn't it looking at the post data,
instead of the HTTP headers?

Man I have no idea; it isn't my server but I have to talk to it. I have
a solution that involves hacking up the http-access2 code so it doesn't
dump the header. If anyone has done anything like writing raw data to an
ssl connection let me know.

···

--
Posted via http://www.ruby-forum.com/\.

I've not done it in Ruby, but some C examples:
    An Introduction to OpenSSL Programming, Part I of II | Linux Journal
        request_len=strlen(request);
        r=SSL_write(ssl,request,request_len);
        switch(SSL_get_error(ssl,r)){
        }

    http://www-128.ibm.com/developerworks/linux/library/l-openssl.html
        if(BIO_write(bio, buf, len) <= 0)
        {
        }

···

On 1/25/07, David Weldon <dweldon@gmail.com> wrote:

> What's running on the server, and why isn't it looking at the post data,
> instead of the HTTP headers?

Man I have no idea; it isn't my server but I have to talk to it. I have
a solution that involves hacking up the http-access2 code so it doesn't
dump the header. If anyone has done anything like writing raw data to an
ssl connection let me know.

http://www.koders.com/ruby/fid5E43597C85CD23E775CC0AD7C6507389969DF8E6.aspx?s=socket
    s = TCPSocket.new(...)
    ssl = OpenSSL::SSL::SSLSocket.new(...)

    ssl.connect
    ssl.write(...)
    ssl.gets

    ssl.close
    s.close

···

On 1/25/07, brabuhr@gmail.com <brabuhr@gmail.com> wrote:

On 1/25/07, David Weldon <dweldon@gmail.com> wrote:
> > What's running on the server, and why isn't it looking at the post data,
> > instead of the HTTP headers?
>
> Man I have no idea; it isn't my server but I have to talk to it. I have
> a solution that involves hacking up the http-access2 code so it doesn't
> dump the header. If anyone has done anything like writing raw data to an
> ssl connection let me know.

I've not done it in Ruby, but some C examples:

http://www.koders.com/ruby/fid5E43597C85CD23E775CC0AD7C6507389969DF8E6.aspx?s=socket

    s = TCPSocket.new(...)
    ssl = OpenSSL::SSL::SSLSocket.new(...)

    ssl.connect
    ssl.write(...)
    ssl.gets

    ssl.close
    s.close

Fantastic! That worked just great. Thanks for the replies everyone!

-Dave

···

--
Posted via http://www.ruby-forum.com/\.