Net::HTTP working on Windows, but not Unix

Discussion in 'Ruby' started by James Edward Gray II, Mar 2, 2006.

  1. We have an odd problem at work today.

    Running the following code on Windows XP gives us a CVV2 error, which
    is what we expect (we didn't give one). However, running the same
    code on Linux or OS X gets a complaint that we didn't provide the
    key, which is obviously not true (see last line).

    Does anyone see anything inherently non-portable in the following code?

    require 'net/http'
    require 'net/https'

    uri = URI.parse 'https://www.usaepay.com/gate.php'
    p (http = Net::HTTP.new(uri.host, uri.port))
    p http.use_ssl = true
    p http.verify_mode = OpenSSL::SSL::VERIFY_NONE
    p http.post(uri.path, "UMkey=OUR_KEY_CODE_HERE").body

    Thanks in advance for any hints.

    James Edward Gray II
    James Edward Gray II, Mar 2, 2006
    #1
    1. Advertising

  2. On Mar 2, 2006, at 2:03 PM, James Edward Gray II wrote:

    > We have an odd problem at work today.
    >
    > Running the following code on Windows XP gives us a CVV2 error,
    > which is what we expect (we didn't give one). However, running the
    > same code on Linux or OS X gets a complaint that we didn't provide
    > the key, which is obviously not true (see last line).
    >
    > Does anyone see anything inherently non-portable in the following
    > code?
    >
    > require 'net/http'
    > require 'net/https'
    >
    > uri = URI.parse 'https://www.usaepay.com/gate.php'
    > p (http = Net::HTTP.new(uri.host, uri.port))
    > p http.use_ssl = true
    > p http.verify_mode = OpenSSL::SSL::VERIFY_NONE
    > p http.post(uri.path, "UMkey=OUR_KEY_CODE_HERE").body
    >


    Switching the code to the following seems to work everywhere, as long
    as 1.8.4 is used:

    require 'net/https'

    uri = URI.parse 'https://www.usaepay.com/gate.php'
    req = Net::HTTP::post.new(uri.path)
    req.set_form_data "UMkey" => "OUR_KEY_CODE_HERE"
    p (http = Net::HTTP.new(uri.host, uri.port))
    p http.use_ssl = true
    p http.verify_mode = OpenSSL::SSL::VERIFY_NONE
    p http.start { http.request(req) }.body

    I still don't understand why the first version didn't work though...

    James Edward Gray II
    James Edward Gray II, Mar 2, 2006
    #2
    1. Advertising

  3. On Mar 2, 2006, at 4:00 PM, James Edward Gray II wrote:

    > On Mar 2, 2006, at 2:03 PM, James Edward Gray II wrote:
    >
    >> We have an odd problem at work today.
    >>
    >> Running the following code on Windows XP gives us a CVV2 error,
    >> which is what we expect (we didn't give one). However, running
    >> the same code on Linux or OS X gets a complaint that we didn't
    >> provide the key, which is obviously not true (see last line).
    >>
    >> Does anyone see anything inherently non-portable in the following
    >> code?
    >>
    >> require 'net/http'
    >> require 'net/https'
    >>
    >> uri = URI.parse 'https://www.usaepay.com/gate.php'
    >> p (http = Net::HTTP.new(uri.host, uri.port))
    >> p http.use_ssl = true
    >> p http.verify_mode = OpenSSL::SSL::VERIFY_NONE
    >> p http.post(uri.path, "UMkey=OUR_KEY_CODE_HERE").body
    >>

    >
    > Switching the code to the following seems to work everywhere, as
    > long as 1.8.4 is used:
    >
    > require 'net/https'
    >
    > uri = URI.parse 'https://www.usaepay.com/gate.php'
    > req = Net::HTTP::post.new(uri.path)
    > req.set_form_data "UMkey" => "OUR_KEY_CODE_HERE"
    > p (http = Net::HTTP.new(uri.host, uri.port))
    > p http.use_ssl = true
    > p http.verify_mode = OpenSSL::SSL::VERIFY_NONE
    > p http.start { http.request(req) }.body
    >
    > I still don't understand why the first version didn't work though...


    Sorry to keep responding to myself but we have now realized that that
    the Windows machine, where the top example originally worked, was
    running 1.8.2 while both failing machines were running 1.8.4.

    The bottom "fix" did not work on the Windows box right off the bat,
    because set_form_data() seems to have been added after 1.8.2.
    Upgrading fixes the issue.

    That raises the question of what caused the original failure though.
    Was the handling of the second parameter to post() changed between
    1.8.2 and 1.8.4? If so, I suspect there could be some more broken
    code out there...

    James Edward Gray II
    James Edward Gray II, Mar 3, 2006
    #3
  4. James Edward Gray II

    Park Heesob Guest

    Hi,

    >From: James Edward Gray II <>
    >Reply-To:
    >To: (ruby-talk ML)
    >Subject: Re: Net::HTTP working on Windows, but not Unix
    >Date: Fri, 3 Mar 2006 09:35:13 +0900
    >
    >On Mar 2, 2006, at 4:00 PM, James Edward Gray II wrote:
    >
    >>On Mar 2, 2006, at 2:03 PM, James Edward Gray II wrote:
    >>
    >>>We have an odd problem at work today.
    >>>
    >>>Running the following code on Windows XP gives us a CVV2 error, which is
    >>>what we expect (we didn't give one). However, running the same code on
    >>>Linux or OS X gets a complaint that we didn't provide the key, which is
    >>>obviously not true (see last line).
    >>>
    >>>Does anyone see anything inherently non-portable in the following code?
    >>>
    >>> require 'net/http'
    >>> require 'net/https'
    >>>
    >>> uri = URI.parse 'https://www.usaepay.com/gate.php'
    >>> p (http = Net::HTTP.new(uri.host, uri.port))
    >>> p http.use_ssl = true
    >>> p http.verify_mode = OpenSSL::SSL::VERIFY_NONE
    >>> p http.post(uri.path, "UMkey=OUR_KEY_CODE_HERE").body

    This will work :

    p http.post(uri.path, "UMkey=OUR_KEY_CODE_HERE",{'Content-Type' =>
    'application/x-www-form-urlencoded'}).body

    >>>

    >>
    >>Switching the code to the following seems to work everywhere, as long as
    >>1.8.4 is used:

    ...
    >>
    >>I still don't understand why the first version didn't work though...

    >
    >Sorry to keep responding to myself but we have now realized that that the
    >Windows machine, where the top example originally worked, was running
    >1.8.2 while both failing machines were running 1.8.4.
    >
    >The bottom "fix" did not work on the Windows box right off the bat,
    >because set_form_data() seems to have been added after 1.8.2. Upgrading
    >fixes the issue.
    >
    >That raises the question of what caused the original failure though. Was
    >the handling of the second parameter to post() changed between 1.8.2 and
    >1.8.4? If so, I suspect there could be some more broken code out there...
    >

    There must be a bug in 1.8.4 Net::HTTP post.
    I suspect lib/net/http.rb line #1507

    unless content_type()
    warn 'net/http: warning: Content-Type did not set; using
    application/x-www-form-urlencoded' if $VERBOSE
    set_content_type 'application/x-www-form-urlencoded'
    end

    Regards,

    Park Heesob
    Park Heesob, Mar 3, 2006
    #4
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Martin Heuckeroth
    Replies:
    5
    Views:
    677
    JiangZemin
    Apr 1, 2005
  2. Alan Silver
    Replies:
    1
    Views:
    3,771
    Alan Silver
    Aug 2, 2005
  3. Replies:
    12
    Views:
    539
    Richard Bos
    Dec 28, 2005
  4. JeffQ888
    Replies:
    0
    Views:
    184
    JeffQ888
    May 23, 2006
  5. Replies:
    1
    Views:
    144
    Van den Driessche Willy
    Sep 20, 2006
Loading...

Share This Page