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-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
[email protected]
http://rubyforge.org/mailman/listinfo/libxml-devel