Bugs item #22531, was opened at 2008-10-23 07:06
You can respond by visiting: 
http://rubyforge.org/tracker/?func=detail&atid=1971&aid=22531&group_id=494

Category: None
Group: None
Status: Open
Resolution: None
Priority: 3
Submitted By: Han Holl (hanholl)
Assigned to: Nobody (None)
Summary: XML::Reader does not work with sockets

Initial Comment:
I tried with the two following programs:
A server:
#!/usr/bin/ruby -w

require 'rubygems'
require 'xml'
require 'socket'


server = TCPServer.new(22222)
while session = server.accept
  reader = XML::Reader.io(session)
  loop do
    rsl = reader.read
    puts rsl
    break if rsl != 1
    puts reader.expand
  end
  session.puts 'ok'
  sleep 1
  session.close
end
# end-of-server
and a client:
#!/usr/bin/ruby

require 'socket'

t = TCPSocket.new('localhost', 22222)

t.puts '<doc><a>k</a></doc>'
puts t.gets
# end-of-client

Output from server:
Entity: line 1:
parser
error :
Extra content at the end of the document

^
-1

I tried different platforms (RH9, CentOS 5.1 and Fedora8).
libxml-ruby-0.8.3
Various libxml2 versions

----------------------------------------------------------------------

>Comment By: Charlie Savage (cfis)
Date: 2008-11-23 18:39

Message:
Yes, I would assume this would block as you read more data from the socket.  
But I would hope you could incrementally process data.

One thing I missed was that the read method should take a length.  Libxml will 
tell you how much data it wants, you can't return more.  That makes the 
interface a bit harder to deal with, unless you can read x bytes off the socket.

So does setting the length help?

----------------------------------------------------------------------

Comment By: Han Holl (hanholl)
Date: 2008-11-22 06:52

Message:
Hello Charlie,

Thanks a lot for this effort. Unfortunately it doesn't yet
work for me. I read the libxml2 C docs and had the
impression that XML::Reader.read should return as soon as it
had read a complete XML node.
If you have a look at the example I opened this discussion
with, here's a strace of the server.
 
read(4, "<doc><a>k</a></doc>", 4096)    = 19
sigprocmask(SIG_BLOCK, NULL, [])        = 0
sigprocmask(SIG_BLOCK, NULL, [])        = 0
read(4, "\n", 4096)                     = 1
read(4,

And there it hangs hungry for more.
Maybe I've got the documention wrong?

Cheers,

Han Holl



----------------------------------------------------------------------

Comment By: Charlie Savage (cfis)
Date: 2008-11-22 02:46

Message:
Hi Han,

Ok, upgrade to the latest libxml.  Then use:

reader = Reader.io(io_object)

That io object has to respond to read.  So:

def SocketIO
  def new(server)
    @server = server
  end

  def read
    server.accept
  end
end

And that should do the trick.

----------------------------------------------------------------------

Comment By: Han Holl (hanholl)
Date: 2008-11-17 05:16

Message:
I wouldn't know where to begin. Before I tried I had a look
at the code, ruby_xml_reader_new_io(int argc, VALUE *argv,
VALUE self), and had the strong impression that it _was_
implemented.
I have no idea what is missing.
C and ruby extensions are by no means my strong suit, I
prefer ruby <g>.
My C is read-only, with the exception of the occasional
small patch

----------------------------------------------------------------------

Comment By: Charlie Savage (cfis)
Date: 2008-11-15 16:45

Message:
Yes, that is not going to work.  Libxml does provide its own socket 
implementation, but that is not exposed via the ruby bindings.  Want to put 
together a patch?

----------------------------------------------------------------------

You can respond by visiting: 
http://rubyforge.org/tracker/?func=detail&atid=1971&aid=22531&group_id=494
_______________________________________________
libxml-devel mailing list
libxml-devel@rubyforge.org
http://rubyforge.org/mailman/listinfo/libxml-devel

Reply via email to