From: Andrew Stewart Date: 2006-10-10T22:16:39+09:00 Subject: Re: Posting over https Hello again, > fortytwo :/var/www/html > ruby post.rb https://fortytwo.merseine.nu/ > form.cgi > --- > key1: > - value1 > key2: > - value2 > keyn: > - valuen Many thanks for the pointers to Mechanize, Hpricot and this fully- fledged code sample. I do appreciate your taking the time to respond, and so quickly. Adapting my code in the light of Ara's code above, with 'self.set_debug_output $stderr' added to the HTTPS initialize method, I compared the client-server conversation with curl's, which I knew worked. This led me to discover that the server expected the content- type header to be set to 'application/x-www-form-urlencoded'. For the record, here's the code which works with the server I am talking to (Protx's payment gateway). Now that I have it working, I'll take Aaron and Richard's advice and look into replacing it with higher-level code using Mechanize. require 'net/https' require 'uri' class HTTPS < Net::HTTP def initialize *a, &b super self.use_ssl = true self.verify_mode = OpenSSL::SSL::VERIFY_NONE #self.set_debug_output $stderr end end url = 'https://some.host.com/foo/bar.asp?service=someservice' uri = URI.parse url data = { 'key1' => 'value1', 'key2' => 'value2', 'keyn' => 'valuen' } e = lambda {|x| URI.escape x} q = lambda {|h| h.map {|k,v| [e[k], e[v]].join '='}.join('&')} form = q[data] HTTPS.start(uri.host, uri.port) do |https| response = https.post("#{uri.path}?#{uri.query}", form, {'content- type' => 'application/x-www-form-urlencoded'}) puts response.body end Regards, Andy Stewart