udat 1.4.0 → 1.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. data/lib/udat.rb +48 -15
  2. metadata +2 -2
@@ -439,16 +439,16 @@ module Udat
439
439
  port = port.to_int if port
440
440
  socket_args = nil
441
441
  result = nil
442
- Resolv::DNS.open do |dns|
443
- if port.nil?
442
+ if port.nil?
443
+ Resolv::DNS.open do |dns|
444
444
  srv_rr = dns.getresource(
445
445
  "_udat-rpc._tcp.#{domain}",
446
446
  Resolv::DNS::Resource::IN::SRV
447
447
  )
448
448
  socket_args = [srv_rr.target.to_s, srv_rr.port.to_i]
449
- else
450
- socket_args = [domain, port]
451
449
  end
450
+ else
451
+ socket_args = [domain, port]
452
452
  end
453
453
  socket = nil
454
454
  begin
@@ -1089,16 +1089,45 @@ module Udat
1089
1089
 
1090
1090
  end
1091
1091
 
1092
- # Waits in an endless loop for incoming TCP connections on the given port
1093
- # and runs a new thread for each incoming connection, reads and parses
1094
- # UDAT objects, passes them each to a given block (by calling yield) and
1095
- # writes the result of the called block in form of an encoded UDAT object
1096
- # back to the TCP socket. A timeout can be specified, to determine how
1097
- # long it may take to read an object.
1098
- def run_rpc_server(port, timeout = 180)
1099
- server = nil
1092
+ # Waits in an endless loop for incoming connections and runs a new thread
1093
+ # for each incoming connection, reads and parses UDAT objects, passes
1094
+ # them each to a given block (by calling yield) and writes the result of
1095
+ # the called block in form of an encoded UDAT object back to the socket.
1096
+ # If the argument "listen_on" is an Integer, it is used as a TCP port
1097
+ # number, if the argument is a String, the port being listened on will
1098
+ # be determined by a DNS look-up of an _udat-rpc._tcp SRV record. In both
1099
+ # cases the TCP socket is bound to all interfaces. Alternatively
1100
+ # "listen_on" may be a non Integer object, supplying an "accept" method
1101
+ # like TCPServer or UNIXServer, which returns a socket for each incoming
1102
+ # connection.
1103
+ def run_rpc_server(listen_on, timeout = 180)
1104
+ unless block_given?
1105
+ raise ArgumentError, "No block given for Udat::run_rpc_server call."
1106
+ end
1107
+ if listen_on.kind_of? String
1108
+ Resolv::DNS.open do |dns|
1109
+ srv_rr = dns.getresource(
1110
+ "_udat-rpc._tcp.#{listen_on}",
1111
+ Resolv::DNS::Resource::IN::SRV
1112
+ )
1113
+ listen_on = srv_rr.port.to_i
1114
+ end
1115
+ end
1116
+ new_server = nil
1100
1117
  begin
1101
- server = TCPServer.new(port)
1118
+ if listen_on.kind_of? Integer
1119
+ new_server = TCPServer.new(listen_on)
1120
+ server = new_server
1121
+ elsif listen_on.respond_to? :accept
1122
+ server = listen_on
1123
+ elsif listen_on.respond_to? :to_int
1124
+ new_server = TCPServer.new(listen_on.to_int)
1125
+ server = new_server
1126
+ else
1127
+ raise ArgumentError,
1128
+ "Argument \"listen_on\" passed to Udat::run_rpc_server " <<
1129
+ "is not an integer and has no \"accept\" or \"to_int\" method."
1130
+ end
1102
1131
  while true
1103
1132
  Thread.new(server.accept) do |socket|
1104
1133
  begin
@@ -1106,7 +1135,11 @@ module Udat
1106
1135
  query = nil
1107
1136
  begin
1108
1137
  Timeout.timeout(timeout) do
1109
- query = socket.read_udat
1138
+ begin
1139
+ query = socket.read_udat
1140
+ rescue EOFError, ParseError
1141
+ break
1142
+ end
1110
1143
  end
1111
1144
  rescue Timeout::Error
1112
1145
  end
@@ -1119,7 +1152,7 @@ module Udat
1119
1152
  end
1120
1153
  end
1121
1154
  ensure
1122
- server.close if server
1155
+ new_server.close if server
1123
1156
  end
1124
1157
  end
1125
1158
 
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.0
3
3
  specification_version: 1
4
4
  name: udat
5
5
  version: !ruby/object:Gem::Version
6
- version: 1.4.0
7
- date: 2007-05-30 00:00:00 +00:00
6
+ version: 1.4.1
7
+ date: 2007-06-01 00:00:00 +00:00
8
8
  summary: Parser and generator for UDAT documents, a generic data format similar to XML or YAML.
9
9
  require_paths:
10
10
  - lib/