HELP! New to Ruby and need to debug for work! Chomp! Error

Discussion in 'Ruby' started by Doug Blackman, Jan 27, 2011.

  1. Hi,

    I programmed years before with .Net, Java, etc. and haven't had any
    exposure to Ruby yet. Since I have a background in CS, I can kinda
    follow what's going on but I'm stuck with this.

    I have taken over support for a website within our company that allows
    users to submit requests. When they submit a request, they are sent an
    email through our Exchange server with the request details. I'm getting
    an error in the Ruby code that sends the emails. Any help would be
    appreciated.

    I've attached a copy of the error and the ruby code where the error is
    happening.

    Thanks

    Attachments:
    http://www.ruby-forum.com/attachment/5800/GPID_Error_doc_1-25.doc
    http://www.ruby-forum.com/attachment/5801/Copy_of_gpid_mail_utils.rb


    --
    Posted via http://www.ruby-forum.com/.
     
    Doug Blackman, Jan 27, 2011
    #1
    1. Advertising

  2. Doug Blackman

    Sam Duncan Guest

    So the gets called on your socket in readline is returning nil instead
    of a string object, and getting #chomp! called on it?

    def readline(f)
    (l = f.gets).chomp!
    puts "srv> " + l if $debug
    l
    end

    What do you see if you change it to;

    def readline(f)
    l = f.gets
    puts "srv> %s" % l if $debug
    l.chomp!
    l
    end

    ?

    Sam


    On 28/01/11 10:11, Doug Blackman wrote:
    > Hi,
    >
    > I programmed years before with .Net, Java, etc. and haven't had any
    > exposure to Ruby yet. Since I have a background in CS, I can kinda
    > follow what's going on but I'm stuck with this.
    >
    > I have taken over support for a website within our company that allows
    > users to submit requests. When they submit a request, they are sent an
    > email through our Exchange server with the request details. I'm getting
    > an error in the Ruby code that sends the emails. Any help would be
    > appreciated.
    >
    > I've attached a copy of the error and the ruby code where the error is
    > happening.
    >
    > Thanks
    >
    > Attachments:
    > http://www.ruby-forum.com/attachment/5800/GPID_Error_doc_1-25.doc
    > http://www.ruby-forum.com/attachment/5801/Copy_of_gpid_mail_utils.rb
    >
    >
    >
     
    Sam Duncan, Jan 27, 2011
    #2
    1. Advertising

  3. Doug Blackman, Jan 27, 2011
    #3
  4. Doug Blackman

    Sam Duncan Guest

    Have you got the debug flag turned on, and does it output anything to
    the console? I would expect it to say something like;

    srv> nil

    ... in which case the socket gets method is returning nil for whatever
    reason. If you just wanted to ignore it, you could have it return an
    empty string or something if l == nil and see what breaks further down
    the line. Maybe the socket connection is going away, or there is nothing
    more to read off the socket? I'm not familiar enough with Ruby's socket
    libraries or the Classes/ Methods therein sorry.

    def readline(f)
    l = f.gets
    puts "srv> %s" % l if $debug
    if l.kind_of?(String)
    l.chomp!
    end
    l
    end

    Sam


    On 28/01/11 11:26, Doug Blackman wrote:
    > Thanks for replying Sam. I just tried it and got the same error
    > message.
    >
    >
     
    Sam Duncan, Jan 27, 2011
    #4
  5. Doug Blackman

    Chuck Remes Guest

    On Jan 27, 2011, at 3:11 PM, Doug Blackman wrote:

    > Hi,
    >
    > I programmed years before with .Net, Java, etc. and haven't had any
    > exposure to Ruby yet. Since I have a background in CS, I can kinda
    > follow what's going on but I'm stuck with this.
    >
    > I have taken over support for a website within our company that allows
    > users to submit requests. When they submit a request, they are sent an
    > email through our Exchange server with the request details. I'm getting
    > an error in the Ruby code that sends the emails. Any help would be
    > appreciated.
    >
    > I've attached a copy of the error and the ruby code where the error is
    > happening.


    Take a look at the docs here:

    http://ruby-doc.org/core/classes/IO.html#M000920

    The call to "f.gets" is trying to read the next string from the IO object (in this case it's a TCPSocket). The docs say you'll get nil when you hit EOF. You can't call #chomp (or most other methods) on NilClass without it throwing up its hands and exiting.

    I'm assuming you are getting EOF here because the socket connection has been interrupted or dropped. Perhaps a router or firewall change is related? Alternately, perhaps the peer (the guy on the other end of this socket) is sending malformed messages. This is hard to debug without knowing all of the pieces.

    cr
     
    Chuck Remes, Jan 27, 2011
    #5
  6. Doug Blackman

    Josh Cheek Guest

    [Note: parts of this message were removed to make it a legal post.]

    On Thu, Jan 27, 2011 at 4:56 PM, Sam Duncan <> wrote:

    > Have you got the debug flag turned on, and does it output anything to the
    > console? I would expect it to say something like;
    >
    > srv> nil
    >
    >

    nil.to_s returns an empty string, you probably want %p in your format string
    (or just use inspect)
     
    Josh Cheek, Jan 28, 2011
    #6
  7. Doug Blackman

    botp Guest

    botp, Jan 28, 2011
    #7
  8. On Fri, Jan 28, 2011 at 5:03 AM, botp <> wrote:
    > On Fri, Jan 28, 2011 at 5:11 AM, Doug Blackman <> wrote:
    >
    >> http://www.ruby-forum.com/attachment/5800/GPID_Error_doc_1-25.doc
    >> http://www.ruby-forum.com/attachment/5801/Copy_of_gpid_mail_utils.rb

    >
    > refine your code.
    >
    > 1 you assume that gets always return something other than nil
    > 2 if you accept nils, then convert it first to string before chomping
    > it or whatever..


    Even better: drop method readline completely and use a loop with block:

    def send_mail(to, subj, msg, filename="<EMPTY>")

    # establish socket
    s = TCPSocket.new($host, $port)

    ntlm = false

    # handle host greeting
    readline s
    writeline s, "EHLO #{$host}"
    s.each |line|
    line.chomp!
    ntlm ||= /^250-AUTH.+NTLM.*/ =~ line
    break if /^250 / =~ line
    end

    Note also that you then must declare variable "ntlm" outside the loop body.

    You also need to change the way you work with the socket because it
    will only be properly closed if all goes well. Your current code will
    leak open sockets in case of errors and may eventually run out of file
    descriptors if this is running longer. You either need to do

    # establish socket
    s = TCPSocket.new($host, $port)
    begin
    ...
    ensure
    s.close
    end


    or simply use TCPSocket.open with block:

    TCPSocket.open($host, $port) do |s|
    ...
    end

    Kind regards

    robert

    --
    remember.guy do |as, often| as.you_can - without end
    http://blog.rubybestpractices.com/
     
    Robert Klemme, Jan 28, 2011
    #8
    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. Emmanuel Touzery

    why won't ruby chomp for me?

    Emmanuel Touzery, Jan 29, 2004, in forum: Ruby
    Replies:
    7
    Views:
    217
    Ara.T.Howard
    Jan 30, 2004
  2. Replies:
    6
    Views:
    123
    Guillaume Benny
    Mar 29, 2006
  3. Alexandre Hudelot
    Replies:
    4
    Views:
    152
    Alexandre Hudelot
    Jul 16, 2006
  4. David A. Black
    Replies:
    5
    Views:
    141
    Simon Krahnke
    Oct 22, 2009
  5. martin
    Replies:
    3
    Views:
    189
    Joe Smith
    Apr 15, 2006
Loading...

Share This Page