Bugs item #22531, was opened at 2008-10-23 15: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: Han Holl (hanholl) Date: 2008-11-24 11:32 Message: I don't quite understand. I hoped, reading the libxml2 docs, that I could read a node from a stream. IOW that the reader would return as soon as it saw that it had received a complete node. I don't know the length of the next node, the producer knows Isn't this the relevant libxml2 function? int xmlTextReaderRead (xmlTextReaderPtr reader) Moves the position of the current instance to the next node in the stream, exposing its properties. reader: the xmlTextReaderPtr used Returns: 1 if the node was read successfully, 0 if there is no more nodes to read, or -1 in case of error ---------------------------------------------------------------------- Comment By: Charlie Savage (cfis) Date: 2008-11-24 02: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 14: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 10: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 13: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-16 00: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