New sockets.cs patch submission

Hello list,

Please find attached another patch for Socket.cs with the following
changes:

  1. Added class SocketStream : System.IO.Stream which wraps the socket
    and provides some stream-like functionality which RubyIO can use. I’ve
    tested the following methods and they appear to work well now on
    sockets:
  • readline
  • readlines
  • gets
    puts also works, but I’m not as confident that it’s correct - see
    below under “Issues”. I’ve also included a test file I used to compare
    output between ruby.exe and rbx.exe (I tested against a default
    install of IE7 - which returns a 404 for the address requested and
    both executables appear to produce the same output except for
    line-ending issues)
  1. Fixed up the spacing/tabbing issues in the file as per Seo’s
    comments - everything is now 4 spaces and no tabs, and I also moved
    the opening curly braces up to match the style in the rest of the
    solution.

I know this code isn’t perfect - but I think it is a step in the right
direction. I have some concerns about it which I’ve listed below - any
comments or suggestions will be most welcome.

Issues:

  • Can only peek 1 byte - there is no buffering of data off the socket
  • I don’t know if this will have a performance / efficiency impact?
  • There is no error handling code around the socket calls - is this
    OK? If not, what should be done?
  • The third parameter passed to RubyIO’s constructor - “r+” - what
    should this be? “r+” allows me to read and write to the socket through
    the stream interface so maybe it’s OK?
  • None of the IO mode checking referred to in the TODO comment above
    the SocketStream class has been implemented - I presume this means
    checking whether the socket has been shutdown either for sending or
    receiving before actually trying to do the read/write - instead of
    letting it throw an exception.
  • How should I trigger a flush on write? At the moment it’s done on
    seeing a newline (hard-coded) in the stream, but I don’t think that’s
    clean or correct (certainly ruby.exe seems to send my test request
    (which has 2 newlines at the end) in one go - not in two separate
    pieces - which is the minor difference I referred to above regarding
    “puts”)…
  • Not sure if Flush is efficient - should I somehow use an array
    rather than a list of bytes?

Thanks for your time

Terence

By the way, the latest Rubinius specs have a host of specs for Socket et
al:
http://git.rubini.us/?p=code;a=tree;f=spec/ruby/1.8/library/socket;hb=HEAD
Sadly most of them are empty at this stage. But at least it gives you
something to start testing with.
Pete

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs