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