rhodes 3.2.0.beta.4 → 3.2.0.beta.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (667) hide show
  1. data/CHANGELOG +2 -0
  2. data/Manifest.txt +517 -23
  3. data/Rakefile +52 -7
  4. data/doc/build.txt +7 -1
  5. data/doc/device-caps.txt +1 -1
  6. data/doc/install.txt +12 -0
  7. data/doc/jqt-jqm-transition.txt +121 -0
  8. data/doc/release.txt +6 -1
  9. data/doc/ui.txt +4 -2
  10. data/installer/icon.ico +0 -0
  11. data/lib/extensions/barcode/ext/barcode/shared/src/zbar.c +7 -0
  12. data/lib/extensions/barcode/ext/barcode/shared/zbar/rho_bridge.c +3 -3
  13. data/lib/extensions/barcode/ext/barcode/shared/zbar/zbar/README.TXT +74 -3
  14. data/lib/extensions/fcntl/ext/Rakefile +57 -38
  15. data/lib/extensions/fcntl/ext/build.bat +1 -0
  16. data/lib/extensions/fcntl/ext/fcntl.vcproj +323 -0
  17. data/lib/extensions/fileutils/fileutils.rb +57 -33
  18. data/lib/extensions/net-http/net/ftp.rb +40 -36
  19. data/lib/extensions/net-http/net/http.rb +98 -38
  20. data/lib/extensions/net-http/net/https.rb +3 -13
  21. data/lib/extensions/net-http/net/protocol.rb +20 -4
  22. data/lib/extensions/rexml/rexml/document.rb +11 -9
  23. data/lib/extensions/rexml/rexml/element.rb +1 -1
  24. data/lib/extensions/rexml/rexml/entity.rb +1 -1
  25. data/lib/extensions/rexml/rexml/formatters/default.rb +3 -1
  26. data/lib/extensions/rexml/rexml/formatters/pretty.rb +1 -1
  27. data/lib/extensions/rexml/rexml/light/node.rb +1 -2
  28. data/lib/extensions/rexml/rexml/parent.rb +1 -0
  29. data/lib/extensions/rexml/rexml/parsers/xpathparser.rb +2 -1
  30. data/lib/extensions/rexml/rexml/quickpath.rb +4 -1
  31. data/lib/extensions/rexml/rexml/rexml.rb +1 -1
  32. data/lib/extensions/rexml/rexml/source.rb +25 -14
  33. data/lib/extensions/rexml/rexml/text.rb +20 -21
  34. data/lib/extensions/rexml/rexml/xmldecl.rb +2 -2
  35. data/lib/extensions/rexml/rexml/xmltokens.rb +2 -2
  36. data/lib/extensions/rexml/rexml/xpath_parser.rb +2 -1
  37. data/lib/extensions/set/set.rb +100 -25
  38. data/lib/extensions/uri/uri/common.rb +134 -4
  39. data/lib/extensions/uri/uri/ftp.rb +14 -3
  40. data/lib/extensions/uri/uri/generic.rb +53 -44
  41. data/lib/extensions/uri/uri/http.rb +1 -1
  42. data/lib/extensions/uri/uri/https.rb +1 -1
  43. data/lib/extensions/uri/uri/ldap.rb +1 -1
  44. data/lib/extensions/uri/uri/mailto.rb +9 -9
  45. data/lib/framework/rho/rhoviewhelpers.rb +3 -2
  46. data/lib/framework/rholang/localization_simplified.rb +5 -3
  47. data/platform/android/Rhodes/src/com/rhomobile/rhodes/Logger.java +14 -1
  48. data/platform/android/Rhodes/src/com/rhomobile/rhodes/camera/ImageCapture.java +1 -1
  49. data/platform/android/Rhodes/src/com/rhomobile/rhodes/camera/ImageCaptureCallback.java +0 -1
  50. data/platform/android/Rhodes/src/com/rhomobile/rhodes/file/RhoFileApi.java +12 -5
  51. data/platform/android/build/android.rake +7 -7
  52. data/platform/iphone/Classes/AppManager/AppManager.m +19 -7
  53. data/platform/iphone/rbuild/iphone.rake +1 -1
  54. data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/Frameworks/QtCore.framework/Versions/4/QtCore +0 -0
  55. data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/Frameworks/QtGui.framework/Versions/4/QtGui +0 -0
  56. data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/Frameworks/QtNetwork.framework/Versions/4/QtNetwork +0 -0
  57. data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/Frameworks/QtWebKit.framework/Versions/4/QtWebKit +0 -0
  58. data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/Frameworks/phonon.framework/Versions/4/phonon +0 -0
  59. data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/Info.plist +1 -1
  60. data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/MacOS/RhoSimulator +0 -0
  61. data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/PlugIns/accessible/libqtaccessiblewidgets.dylib +0 -0
  62. data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/PlugIns/bearer/libqgenericbearer.dylib +0 -0
  63. data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/PlugIns/codecs/libqcncodecs.dylib +0 -0
  64. data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/PlugIns/codecs/libqjpcodecs.dylib +0 -0
  65. data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/PlugIns/codecs/libqkrcodecs.dylib +0 -0
  66. data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/PlugIns/codecs/libqtwcodecs.dylib +0 -0
  67. data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/PlugIns/graphicssystems/libqtracegraphicssystem.dylib +0 -0
  68. data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/PlugIns/imageformats/libqgif.dylib +0 -0
  69. data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/PlugIns/imageformats/libqico.dylib +0 -0
  70. data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/PlugIns/imageformats/libqjpeg.dylib +0 -0
  71. data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/PlugIns/imageformats/libqmng.dylib +0 -0
  72. data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/PlugIns/imageformats/libqtiff.dylib +0 -0
  73. data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/PlugIns/phonon_backend/libphonon_qt7.dylib +0 -0
  74. data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/PlugIns/qmltooling/libqmldbg_tcp.dylib +0 -0
  75. data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/Resources/rho.icns +0 -0
  76. data/platform/osx/build/osx.rake +25 -3
  77. data/platform/shared/common/AutoPointer.h +1 -1
  78. data/platform/shared/common/RhoStd.h +10 -10
  79. data/platform/shared/common/RhodesAppBase.cpp +3 -0
  80. data/platform/shared/logging/RhoLogConf.cpp +1 -1
  81. data/platform/shared/qt/rhodes/QtMainWindow.cpp +7 -0
  82. data/platform/shared/qt/rhodes/RhoSimulator.h +3 -1
  83. data/platform/shared/qt/rhodes/main.cpp +3 -0
  84. data/platform/shared/qt/rhodes/resources/rho.icns +0 -0
  85. data/platform/shared/qt/rhodes/resources/rho.ico +0 -0
  86. data/platform/shared/qt/rhodes/resources/rho.png +0 -0
  87. data/platform/shared/qt/rhodes/resources/simulator.qrc +5 -0
  88. data/platform/shared/qt/rhodes/rhodes.pro +2 -0
  89. data/platform/shared/ruby/ext/rho/rhosupport.c +21 -2
  90. data/platform/shared/ruby/ext/socket_192/addrinfo.h +191 -0
  91. data/platform/shared/ruby/ext/socket_192/ancdata.c +1800 -0
  92. data/platform/shared/ruby/ext/socket_192/basicsocket.c +771 -0
  93. data/platform/shared/ruby/ext/socket_192/constants.c +145 -0
  94. data/platform/shared/ruby/ext/socket_192/depend +25 -0
  95. data/platform/shared/ruby/ext/socket_192/extconf.rb +365 -0
  96. data/platform/shared/ruby/ext/socket_192/getaddrinfo.c +674 -0
  97. data/platform/shared/ruby/ext/socket_192/getnameinfo.c +260 -0
  98. data/platform/shared/ruby/ext/socket_192/init.c +575 -0
  99. data/platform/shared/ruby/ext/socket_192/ipsocket.c +308 -0
  100. data/platform/shared/ruby/ext/socket_192/lib/socket.rb +755 -0
  101. data/platform/shared/ruby/ext/socket_192/mkconstants.rb +696 -0
  102. data/platform/shared/ruby/ext/socket_192/option.c +692 -0
  103. data/platform/shared/ruby/ext/socket_192/raddrinfo.c +2211 -0
  104. data/platform/shared/ruby/ext/socket_192/rubysocket.h +306 -0
  105. data/platform/shared/ruby/ext/socket_192/socket.c +1870 -0
  106. data/platform/shared/ruby/ext/socket_192/sockport.h +84 -0
  107. data/platform/shared/ruby/ext/socket_192/sockssocket.c +58 -0
  108. data/platform/shared/ruby/ext/socket_192/tcpserver.c +145 -0
  109. data/platform/shared/ruby/ext/socket_192/tcpsocket.c +69 -0
  110. data/platform/shared/ruby/ext/socket_192/udpsocket.c +264 -0
  111. data/platform/shared/ruby/ext/socket_192/unixserver.c +154 -0
  112. data/platform/shared/ruby/ext/socket_192/unixsocket.c +514 -0
  113. data/platform/shared/ruby/ext/stringio/stringio.c +158 -61
  114. data/platform/shared/ruby/ext/strscan/strscan.c +18 -31
  115. data/platform/shared/ruby/iphone/ruby/config.h +2 -1
  116. data/platform/shared/ruby/linux/ruby/config.h +2 -1
  117. data/platform/shared/ruby/symbian/ruby/config.h +2 -1
  118. data/platform/shared/ruby/win32/ruby/config.h +1 -0
  119. data/platform/shared/ruby/win32/ruby/constdefs.c +5866 -0
  120. data/platform/shared/ruby/win32/ruby/constdefs.h +1788 -0
  121. data/platform/shared/ruby/wince/ruby/config.h +1 -0
  122. data/platform/shared/ruby/wince/ruby/constdefs.c +5866 -0
  123. data/platform/shared/ruby/wince/ruby/constdefs.h +1788 -0
  124. data/platform/symbian/build/symbian.rake +8 -0
  125. data/platform/symbian/rhodes/rhodes.pro +3 -3
  126. data/platform/win32/RhoSimulator/RhoSimulator.exe +0 -0
  127. data/platform/wm/build/wm.rake +1 -1
  128. data/platform/wm/rhodes/Rhodes.cpp +3 -0
  129. data/platform/wm/rhodes/rhodes.vcproj +612 -6
  130. data/platform/wm/rhodes/rhosim.rc +394 -0
  131. data/platform/wm/rhodes/simulator/MainWindowQt.cpp +2 -2
  132. data/platform/wp7/RhoRubyLib/common/RhodesApp.cs +8 -2
  133. data/platform/wp7/RhoRubyLib/net/NetRequest.cs +5 -1
  134. data/platform/wp7/build/wp.rake +1 -1
  135. data/rakefile.rb +52 -7
  136. data/res/generators/templates/application/app/layout.erb +4 -4
  137. data/res/generators/templates/application/public/jqmobile/{jquery.mobile-1.0b3.css → jquery.mobile-1.0rc1.css} +507 -457
  138. data/res/generators/templates/application/public/jqmobile/{jquery.mobile-1.0b3.js → jquery.mobile-1.0rc1.js} +565 -458
  139. data/res/generators/templates/application/public/jqmobile/jquery.mobile-1.0rc1.min.css +12 -0
  140. data/res/generators/templates/application/public/jqmobile/jquery.mobile-1.0rc1.min.js +170 -0
  141. data/res/generators/templates/application/public/jquery/{jquery-1.6.3.js → jquery-1.6.4.js} +10 -8
  142. data/res/generators/templates/application/public/jquery/jquery-1.6.4.min.js +4 -0
  143. data/res/generators/templates/application/public/js/jqmobile-patch.js +47 -1
  144. data/res/icons/rho.icns +0 -0
  145. data/res/icons/rho.ico +0 -0
  146. data/res/icons/rho.png +0 -0
  147. data/res/icons/rho.psd +0 -0
  148. data/res/icons/rhodes.icns +0 -0
  149. data/res/icons/rhodes.ico +0 -0
  150. data/res/icons/rhodes.png +0 -0
  151. data/res/icons/rhodes.psd +0 -0
  152. data/res/icons/rhosim.icns +0 -0
  153. data/res/icons/rhosim.ico +0 -0
  154. data/res/icons/rhosim.png +0 -0
  155. data/res/icons/rhosim.psd +0 -0
  156. data/rhodes.gemspec +1 -1
  157. data/spec/framework_spec/app/spec/core/file/expand_path_spec.rb +4 -4
  158. data/spec/framework_spec/app/spec/library/net/FTPError_spec.rb +8 -0
  159. data/spec/framework_spec/app/spec/library/net/FTPPermError_spec.rb +12 -0
  160. data/spec/framework_spec/app/spec/library/net/FTPProtoError_spec.rb +12 -0
  161. data/spec/framework_spec/app/spec/library/net/FTPReplyError_spec.rb +12 -0
  162. data/spec/framework_spec/app/spec/library/net/FTPTempError_spec.rb +12 -0
  163. data/spec/framework_spec/app/spec/library/net/ftp/abort_spec.rb +62 -0
  164. data/spec/framework_spec/app/spec/library/net/ftp/acct_spec.rb +58 -0
  165. data/spec/framework_spec/app/spec/library/net/ftp/binary_spec.rb +24 -0
  166. data/spec/framework_spec/app/spec/library/net/ftp/chdir_spec.rb +101 -0
  167. data/spec/framework_spec/app/spec/library/net/ftp/close_spec.rb +28 -0
  168. data/spec/framework_spec/app/spec/library/net/ftp/closed_spec.rb +21 -0
  169. data/spec/framework_spec/app/spec/library/net/ftp/connect_spec.rb +49 -0
  170. data/spec/framework_spec/app/spec/library/net/ftp/debug_mode_spec.rb +23 -0
  171. data/spec/framework_spec/app/spec/library/net/ftp/delete_spec.rb +59 -0
  172. data/spec/framework_spec/app/spec/library/net/ftp/dir_spec.rb +8 -0
  173. data/spec/framework_spec/app/spec/library/net/ftp/fixtures/putbinaryfile +3 -0
  174. data/spec/framework_spec/app/spec/library/net/ftp/fixtures/puttextfile +3 -0
  175. data/spec/framework_spec/app/spec/library/net/ftp/fixtures/server.rb +258 -0
  176. data/spec/framework_spec/app/spec/library/net/ftp/get_spec.rb +21 -0
  177. data/spec/framework_spec/app/spec/library/net/ftp/getbinaryfile_spec.rb +8 -0
  178. data/spec/framework_spec/app/spec/library/net/ftp/getdir_spec.rb +7 -0
  179. data/spec/framework_spec/app/spec/library/net/ftp/gettextfile_spec.rb +8 -0
  180. data/spec/framework_spec/app/spec/library/net/ftp/help_spec.rb +66 -0
  181. data/spec/framework_spec/app/spec/library/net/ftp/initialize_spec.rb +87 -0
  182. data/spec/framework_spec/app/spec/library/net/ftp/last_response_code_spec.rb +8 -0
  183. data/spec/framework_spec/app/spec/library/net/ftp/last_response_spec.rb +25 -0
  184. data/spec/framework_spec/app/spec/library/net/ftp/lastresp_spec.rb +8 -0
  185. data/spec/framework_spec/app/spec/library/net/ftp/list_spec.rb +8 -0
  186. data/spec/framework_spec/app/spec/library/net/ftp/login_spec.rb +216 -0
  187. data/spec/framework_spec/app/spec/library/net/ftp/ls_spec.rb +8 -0
  188. data/spec/framework_spec/app/spec/library/net/ftp/mdtm_spec.rb +38 -0
  189. data/spec/framework_spec/app/spec/library/net/ftp/mkdir_spec.rb +61 -0
  190. data/spec/framework_spec/app/spec/library/net/ftp/mtime_spec.rb +50 -0
  191. data/spec/framework_spec/app/spec/library/net/ftp/nlst_spec.rb +122 -0
  192. data/spec/framework_spec/app/spec/library/net/ftp/noop_spec.rb +38 -0
  193. data/spec/framework_spec/app/spec/library/net/ftp/open_spec.rb +55 -0
  194. data/spec/framework_spec/app/spec/library/net/ftp/passive_spec.rb +24 -0
  195. data/spec/framework_spec/app/spec/library/net/ftp/put_spec.rb +21 -0
  196. data/spec/framework_spec/app/spec/library/net/ftp/putbinaryfile_spec.rb +8 -0
  197. data/spec/framework_spec/app/spec/library/net/ftp/puttextfile_spec.rb +8 -0
  198. data/spec/framework_spec/app/spec/library/net/ftp/pwd_spec.rb +53 -0
  199. data/spec/framework_spec/app/spec/library/net/ftp/quit_spec.rb +33 -0
  200. data/spec/framework_spec/app/spec/library/net/ftp/rename_spec.rb +94 -0
  201. data/spec/framework_spec/app/spec/library/net/ftp/resume_spec.rb +23 -0
  202. data/spec/framework_spec/app/spec/library/net/ftp/retrbinary_spec.rb +31 -0
  203. data/spec/framework_spec/app/spec/library/net/ftp/retrlines_spec.rb +35 -0
  204. data/spec/framework_spec/app/spec/library/net/ftp/return_code_spec.rb +24 -0
  205. data/spec/framework_spec/app/spec/library/net/ftp/rmdir_spec.rb +58 -0
  206. data/spec/framework_spec/app/spec/library/net/ftp/sendcmd_spec.rb +54 -0
  207. data/spec/framework_spec/app/spec/library/net/ftp/set_socket_spec.rb +8 -0
  208. data/spec/framework_spec/app/spec/library/net/ftp/shared/getbinaryfile.rb +180 -0
  209. data/spec/framework_spec/app/spec/library/net/ftp/shared/gettextfile.rb +130 -0
  210. data/spec/framework_spec/app/spec/library/net/ftp/shared/last_response_code.rb +25 -0
  211. data/spec/framework_spec/app/spec/library/net/ftp/shared/list.rb +134 -0
  212. data/spec/framework_spec/app/spec/library/net/ftp/shared/putbinaryfile.rb +233 -0
  213. data/spec/framework_spec/app/spec/library/net/ftp/shared/puttextfile.rb +150 -0
  214. data/spec/framework_spec/app/spec/library/net/ftp/shared/pwd.rb +3 -0
  215. data/spec/framework_spec/app/spec/library/net/ftp/site_spec.rb +53 -0
  216. data/spec/framework_spec/app/spec/library/net/ftp/size_spec.rb +48 -0
  217. data/spec/framework_spec/app/spec/library/net/ftp/status_spec.rb +63 -0
  218. data/spec/framework_spec/app/spec/library/net/ftp/storbinary_spec.rb +49 -0
  219. data/spec/framework_spec/app/spec/library/net/ftp/storlines_spec.rb +44 -0
  220. data/spec/framework_spec/app/spec/library/net/ftp/system_spec.rb +48 -0
  221. data/spec/framework_spec/app/spec/library/net/ftp/voidcmd_spec.rb +54 -0
  222. data/spec/framework_spec/app/spec/library/net/ftp/welcome_spec.rb +25 -0
  223. data/spec/framework_spec/app/spec/library/net/http/HTTPBadResponse_spec.rb +8 -0
  224. data/spec/framework_spec/app/spec/library/net/http/HTTPError_spec.rb +12 -0
  225. data/spec/framework_spec/app/spec/library/net/http/HTTPFatalError_spec.rb +12 -0
  226. data/spec/framework_spec/app/spec/library/net/http/HTTPHeaderSyntaxError_spec.rb +8 -0
  227. data/spec/framework_spec/app/spec/library/net/http/HTTPRetriableError_spec.rb +12 -0
  228. data/spec/framework_spec/app/spec/library/net/http/HTTPServerException_spec.rb +12 -0
  229. data/spec/framework_spec/app/spec/library/net/http/http/Proxy_spec.rb +35 -0
  230. data/spec/framework_spec/app/spec/library/net/http/http/active_spec.rb +8 -0
  231. data/spec/framework_spec/app/spec/library/net/http/http/address_spec.rb +9 -0
  232. data/spec/framework_spec/app/spec/library/net/http/http/close_on_empty_response_spec.rb +10 -0
  233. data/spec/framework_spec/app/spec/library/net/http/http/copy_spec.rb +23 -0
  234. data/spec/framework_spec/app/spec/library/net/http/http/default_port_spec.rb +8 -0
  235. data/spec/framework_spec/app/spec/library/net/http/http/delete_spec.rb +23 -0
  236. data/spec/framework_spec/app/spec/library/net/http/http/finish_spec.rb +31 -0
  237. data/spec/framework_spec/app/spec/library/net/http/http/fixtures/http_server.rb +97 -0
  238. data/spec/framework_spec/app/spec/library/net/http/http/get2_spec.rb +8 -0
  239. data/spec/framework_spec/app/spec/library/net/http/http/get_print_spec.rb +29 -0
  240. data/spec/framework_spec/app/spec/library/net/http/http/get_response_spec.rb +29 -0
  241. data/spec/framework_spec/app/spec/library/net/http/http/get_spec.rb +52 -0
  242. data/spec/framework_spec/app/spec/library/net/http/http/head2_spec.rb +9 -0
  243. data/spec/framework_spec/app/spec/library/net/http/http/head_spec.rb +27 -0
  244. data/spec/framework_spec/app/spec/library/net/http/http/http_default_port_spec.rb +8 -0
  245. data/spec/framework_spec/app/spec/library/net/http/http/https_default_port_spec.rb +8 -0
  246. data/spec/framework_spec/app/spec/library/net/http/http/initialize_spec.rb +46 -0
  247. data/spec/framework_spec/app/spec/library/net/http/http/inspect_spec.rb +26 -0
  248. data/spec/framework_spec/app/spec/library/net/http/http/is_version_1_1_spec.rb +7 -0
  249. data/spec/framework_spec/app/spec/library/net/http/http/is_version_1_2_spec.rb +7 -0
  250. data/spec/framework_spec/app/spec/library/net/http/http/lock_spec.rb +23 -0
  251. data/spec/framework_spec/app/spec/library/net/http/http/mkcol_spec.rb +23 -0
  252. data/spec/framework_spec/app/spec/library/net/http/http/move_spec.rb +27 -0
  253. data/spec/framework_spec/app/spec/library/net/http/http/new_spec.rb +86 -0
  254. data/spec/framework_spec/app/spec/library/net/http/http/newobj_spec.rb +48 -0
  255. data/spec/framework_spec/app/spec/library/net/http/http/open_timeout_spec.rb +24 -0
  256. data/spec/framework_spec/app/spec/library/net/http/http/options_spec.rb +27 -0
  257. data/spec/framework_spec/app/spec/library/net/http/http/port_spec.rb +9 -0
  258. data/spec/framework_spec/app/spec/library/net/http/http/post2_spec.rb +8 -0
  259. data/spec/framework_spec/app/spec/library/net/http/http/post_form_spec.rb +21 -0
  260. data/spec/framework_spec/app/spec/library/net/http/http/post_spec.rb +40 -0
  261. data/spec/framework_spec/app/spec/library/net/http/http/propfind_spec.rb +26 -0
  262. data/spec/framework_spec/app/spec/library/net/http/http/proppatch_spec.rb +26 -0
  263. data/spec/framework_spec/app/spec/library/net/http/http/proxy_address_spec.rb +31 -0
  264. data/spec/framework_spec/app/spec/library/net/http/http/proxy_class_spec.rb +9 -0
  265. data/spec/framework_spec/app/spec/library/net/http/http/proxy_pass_spec.rb +39 -0
  266. data/spec/framework_spec/app/spec/library/net/http/http/proxy_port_spec.rb +39 -0
  267. data/spec/framework_spec/app/spec/library/net/http/http/proxy_user_spec.rb +39 -0
  268. data/spec/framework_spec/app/spec/library/net/http/http/put2_spec.rb +8 -0
  269. data/spec/framework_spec/app/spec/library/net/http/http/put_spec.rb +26 -0
  270. data/spec/framework_spec/app/spec/library/net/http/http/read_timeout_spec.rb +24 -0
  271. data/spec/framework_spec/app/spec/library/net/http/http/request_get_spec.rb +8 -0
  272. data/spec/framework_spec/app/spec/library/net/http/http/request_head_spec.rb +8 -0
  273. data/spec/framework_spec/app/spec/library/net/http/http/request_post_spec.rb +8 -0
  274. data/spec/framework_spec/app/spec/library/net/http/http/request_put_spec.rb +8 -0
  275. data/spec/framework_spec/app/spec/library/net/http/http/request_spec.rb +111 -0
  276. data/spec/framework_spec/app/spec/library/net/http/http/request_types_spec.rb +254 -0
  277. data/spec/framework_spec/app/spec/library/net/http/http/send_request_spec.rb +120 -0
  278. data/spec/framework_spec/app/spec/library/net/http/http/set_debug_output_spec.rb +35 -0
  279. data/spec/framework_spec/app/spec/library/net/http/http/shared/request_get.rb +45 -0
  280. data/spec/framework_spec/app/spec/library/net/http/http/shared/request_head.rb +45 -0
  281. data/spec/framework_spec/app/spec/library/net/http/http/shared/request_post.rb +45 -0
  282. data/spec/framework_spec/app/spec/library/net/http/http/shared/request_put.rb +45 -0
  283. data/spec/framework_spec/app/spec/library/net/http/http/shared/started.rb +28 -0
  284. data/spec/framework_spec/app/spec/library/net/http/http/shared/version_1_1.rb +19 -0
  285. data/spec/framework_spec/app/spec/library/net/http/http/shared/version_1_2.rb +6 -0
  286. data/spec/framework_spec/app/spec/library/net/http/http/socket_type_spec.rb +8 -0
  287. data/spec/framework_spec/app/spec/library/net/http/http/start_spec.rb +103 -0
  288. data/spec/framework_spec/app/spec/library/net/http/http/started_spec.rb +8 -0
  289. data/spec/framework_spec/app/spec/library/net/http/http/trace_spec.rb +26 -0
  290. data/spec/framework_spec/app/spec/library/net/http/http/unlock_spec.rb +26 -0
  291. data/spec/framework_spec/app/spec/library/net/http/http/use_ssl_spec.rb +9 -0
  292. data/spec/framework_spec/app/spec/library/net/http/http/version_1_1_spec.rb +22 -0
  293. data/spec/framework_spec/app/spec/library/net/http/http/version_1_2_spec.rb +20 -0
  294. data/spec/framework_spec/app/spec/library/net/http/httpexceptions/fixtures/classes.rb +5 -0
  295. data/spec/framework_spec/app/spec/library/net/http/httpexceptions/initialize_spec.rb +17 -0
  296. data/spec/framework_spec/app/spec/library/net/http/httpexceptions/response_spec.rb +10 -0
  297. data/spec/framework_spec/app/spec/library/net/http/httpgenericrequest/body_exist_spec.rb +27 -0
  298. data/spec/framework_spec/app/spec/library/net/http/httpgenericrequest/body_spec.rb +30 -0
  299. data/spec/framework_spec/app/spec/library/net/http/httpgenericrequest/body_stream_spec.rb +32 -0
  300. data/spec/framework_spec/app/spec/library/net/http/httpgenericrequest/exec_spec.rb +122 -0
  301. data/spec/framework_spec/app/spec/library/net/http/httpgenericrequest/inspect_spec.rb +25 -0
  302. data/spec/framework_spec/app/spec/library/net/http/httpgenericrequest/method_spec.rb +15 -0
  303. data/spec/framework_spec/app/spec/library/net/http/httpgenericrequest/path_spec.rb +12 -0
  304. data/spec/framework_spec/app/spec/library/net/http/httpgenericrequest/request_body_permitted_spec.rb +12 -0
  305. data/spec/framework_spec/app/spec/library/net/http/httpgenericrequest/response_body_permitted_spec.rb +12 -0
  306. data/spec/framework_spec/app/spec/library/net/http/httpgenericrequest/set_body_internal_spec.rb +21 -0
  307. data/spec/framework_spec/app/spec/library/net/http/httpheader/add_field_spec.rb +31 -0
  308. data/spec/framework_spec/app/spec/library/net/http/httpheader/basic_auth_spec.rb +14 -0
  309. data/spec/framework_spec/app/spec/library/net/http/httpheader/canonical_each_spec.rb +8 -0
  310. data/spec/framework_spec/app/spec/library/net/http/httpheader/chunked_spec.rb +22 -0
  311. data/spec/framework_spec/app/spec/library/net/http/httpheader/content_length_spec.rb +54 -0
  312. data/spec/framework_spec/app/spec/library/net/http/httpheader/content_range_spec.rb +34 -0
  313. data/spec/framework_spec/app/spec/library/net/http/httpheader/content_type_spec.rb +26 -0
  314. data/spec/framework_spec/app/spec/library/net/http/httpheader/delete_spec.rb +30 -0
  315. data/spec/framework_spec/app/spec/library/net/http/httpheader/each_capitalized_name_spec.rb +45 -0
  316. data/spec/framework_spec/app/spec/library/net/http/httpheader/each_capitalized_spec.rb +9 -0
  317. data/spec/framework_spec/app/spec/library/net/http/httpheader/each_header_spec.rb +8 -0
  318. data/spec/framework_spec/app/spec/library/net/http/httpheader/each_key_spec.rb +8 -0
  319. data/spec/framework_spec/app/spec/library/net/http/httpheader/each_name_spec.rb +8 -0
  320. data/spec/framework_spec/app/spec/library/net/http/httpheader/each_spec.rb +8 -0
  321. data/spec/framework_spec/app/spec/library/net/http/httpheader/each_value_spec.rb +46 -0
  322. data/spec/framework_spec/app/spec/library/net/http/httpheader/element_reference_spec.rb +39 -0
  323. data/spec/framework_spec/app/spec/library/net/http/httpheader/element_set_spec.rb +41 -0
  324. data/spec/framework_spec/app/spec/library/net/http/httpheader/fetch_spec.rb +69 -0
  325. data/spec/framework_spec/app/spec/library/net/http/httpheader/fixtures/classes.rb +11 -0
  326. data/spec/framework_spec/app/spec/library/net/http/httpheader/form_data_spec.rb +8 -0
  327. data/spec/framework_spec/app/spec/library/net/http/httpheader/get_fields_spec.rb +39 -0
  328. data/spec/framework_spec/app/spec/library/net/http/httpheader/initialize_http_header_spec.rb +29 -0
  329. data/spec/framework_spec/app/spec/library/net/http/httpheader/key_spec.rb +21 -0
  330. data/spec/framework_spec/app/spec/library/net/http/httpheader/length_spec.rb +8 -0
  331. data/spec/framework_spec/app/spec/library/net/http/httpheader/main_type_spec.rb +24 -0
  332. data/spec/framework_spec/app/spec/library/net/http/httpheader/proxy_basic_auth_spec.rb +14 -0
  333. data/spec/framework_spec/app/spec/library/net/http/httpheader/range_length_spec.rb +32 -0
  334. data/spec/framework_spec/app/spec/library/net/http/httpheader/range_spec.rb +48 -0
  335. data/spec/framework_spec/app/spec/library/net/http/httpheader/set_content_type_spec.rb +8 -0
  336. data/spec/framework_spec/app/spec/library/net/http/httpheader/set_form_data_spec.rb +8 -0
  337. data/spec/framework_spec/app/spec/library/net/http/httpheader/set_range_spec.rb +8 -0
  338. data/spec/framework_spec/app/spec/library/net/http/httpheader/shared/each_capitalized.rb +42 -0
  339. data/spec/framework_spec/app/spec/library/net/http/httpheader/shared/each_header.rb +42 -0
  340. data/spec/framework_spec/app/spec/library/net/http/httpheader/shared/each_name.rb +39 -0
  341. data/spec/framework_spec/app/spec/library/net/http/httpheader/shared/set_content_type.rb +18 -0
  342. data/spec/framework_spec/app/spec/library/net/http/httpheader/shared/set_form_data.rb +27 -0
  343. data/spec/framework_spec/app/spec/library/net/http/httpheader/shared/set_range.rb +89 -0
  344. data/spec/framework_spec/app/spec/library/net/http/httpheader/shared/size.rb +18 -0
  345. data/spec/framework_spec/app/spec/library/net/http/httpheader/size_spec.rb +8 -0
  346. data/spec/framework_spec/app/spec/library/net/http/httpheader/sub_type_spec.rb +32 -0
  347. data/spec/framework_spec/app/spec/library/net/http/httpheader/to_hash_spec.rb +25 -0
  348. data/spec/framework_spec/app/spec/library/net/http/httpheader/type_params_spec.rb +24 -0
  349. data/spec/framework_spec/app/spec/library/net/http/httprequest/initialize_spec.rb +45 -0
  350. data/spec/framework_spec/app/spec/library/net/http/httpresponse/body_permitted_spec.rb +13 -0
  351. data/spec/framework_spec/app/spec/library/net/http/httpresponse/body_spec.rb +7 -0
  352. data/spec/framework_spec/app/spec/library/net/http/httpresponse/code_spec.rb +24 -0
  353. data/spec/framework_spec/app/spec/library/net/http/httpresponse/code_type_spec.rb +24 -0
  354. data/spec/framework_spec/app/spec/library/net/http/httpresponse/entity_spec.rb +7 -0
  355. data/spec/framework_spec/app/spec/library/net/http/httpresponse/error_spec.rb +24 -0
  356. data/spec/framework_spec/app/spec/library/net/http/httpresponse/error_type_spec.rb +24 -0
  357. data/spec/framework_spec/app/spec/library/net/http/httpresponse/exception_type_spec.rb +13 -0
  358. data/spec/framework_spec/app/spec/library/net/http/httpresponse/header_spec.rb +9 -0
  359. data/spec/framework_spec/app/spec/library/net/http/httpresponse/http_version_spec.rb +12 -0
  360. data/spec/framework_spec/app/spec/library/net/http/httpresponse/initialize_spec.rb +11 -0
  361. data/spec/framework_spec/app/spec/library/net/http/httpresponse/inspect_spec.rb +15 -0
  362. data/spec/framework_spec/app/spec/library/net/http/httpresponse/message_spec.rb +9 -0
  363. data/spec/framework_spec/app/spec/library/net/http/httpresponse/msg_spec.rb +9 -0
  364. data/spec/framework_spec/app/spec/library/net/http/httpresponse/read_body_spec.rb +86 -0
  365. data/spec/framework_spec/app/spec/library/net/http/httpresponse/read_header_spec.rb +9 -0
  366. data/spec/framework_spec/app/spec/library/net/http/httpresponse/read_new_spec.rb +22 -0
  367. data/spec/framework_spec/app/spec/library/net/http/httpresponse/reading_body_spec.rb +58 -0
  368. data/spec/framework_spec/app/spec/library/net/http/httpresponse/response_spec.rb +9 -0
  369. data/spec/framework_spec/app/spec/library/net/http/httpresponse/shared/body.rb +18 -0
  370. data/spec/framework_spec/app/spec/library/net/http/httpresponse/to_ary_spec.rb +26 -0
  371. data/spec/framework_spec/app/spec/library/net/http/httpresponse/value_spec.rb +24 -0
  372. data/spec/framework_spec/app/spec/library/rexml/attribute/clone_spec.rb +11 -0
  373. data/spec/framework_spec/app/spec/library/rexml/attribute/element_spec.rb +23 -0
  374. data/spec/framework_spec/app/spec/library/rexml/attribute/equal_value_spec.rb +18 -0
  375. data/spec/framework_spec/app/spec/library/rexml/attribute/hash_spec.rb +13 -0
  376. data/spec/framework_spec/app/spec/library/rexml/attribute/initialize_spec.rb +29 -0
  377. data/spec/framework_spec/app/spec/library/rexml/attribute/inspect_spec.rb +20 -0
  378. data/spec/framework_spec/app/spec/library/rexml/attribute/namespace_spec.rb +24 -0
  379. data/spec/framework_spec/app/spec/library/rexml/attribute/node_type_spec.rb +10 -0
  380. data/spec/framework_spec/app/spec/library/rexml/attribute/prefix_spec.rb +18 -0
  381. data/spec/framework_spec/app/spec/library/rexml/attribute/remove_spec.rb +20 -0
  382. data/spec/framework_spec/app/spec/library/rexml/attribute/to_s_spec.rb +14 -0
  383. data/spec/framework_spec/app/spec/library/rexml/attribute/to_string_spec.rb +15 -0
  384. data/spec/framework_spec/app/spec/library/rexml/attribute/value_spec.rb +15 -0
  385. data/spec/framework_spec/app/spec/library/rexml/attribute/write_spec.rb +23 -0
  386. data/spec/framework_spec/app/spec/library/rexml/attribute/xpath_spec.rb +20 -0
  387. data/spec/framework_spec/app/spec/library/rexml/attributes/add_spec.rb +7 -0
  388. data/spec/framework_spec/app/spec/library/rexml/attributes/append_spec.rb +7 -0
  389. data/spec/framework_spec/app/spec/library/rexml/attributes/delete_all_spec.rb +31 -0
  390. data/spec/framework_spec/app/spec/library/rexml/attributes/delete_spec.rb +27 -0
  391. data/spec/framework_spec/app/spec/library/rexml/attributes/each_attribute_spec.rb +24 -0
  392. data/spec/framework_spec/app/spec/library/rexml/attributes/each_spec.rb +24 -0
  393. data/spec/framework_spec/app/spec/library/rexml/attributes/element_reference_spec.rb +19 -0
  394. data/spec/framework_spec/app/spec/library/rexml/attributes/element_set_spec.rb +26 -0
  395. data/spec/framework_spec/app/spec/library/rexml/attributes/get_attribute_ns_spec.rb +14 -0
  396. data/spec/framework_spec/app/spec/library/rexml/attributes/get_attribute_spec.rb +29 -0
  397. data/spec/framework_spec/app/spec/library/rexml/attributes/initialize_spec.rb +19 -0
  398. data/spec/framework_spec/app/spec/library/rexml/attributes/length_spec.rb +7 -0
  399. data/spec/framework_spec/app/spec/library/rexml/attributes/namespaces_spec.rb +6 -0
  400. data/spec/framework_spec/app/spec/library/rexml/attributes/prefixes_spec.rb +24 -0
  401. data/spec/framework_spec/app/spec/library/rexml/attributes/shared/add.rb +17 -0
  402. data/spec/framework_spec/app/spec/library/rexml/attributes/shared/length.rb +13 -0
  403. data/spec/framework_spec/app/spec/library/rexml/attributes/size_spec.rb +7 -0
  404. data/spec/framework_spec/app/spec/library/rexml/attributes/to_a_spec.rb +20 -0
  405. data/spec/framework_spec/app/spec/library/rexml/cdata/clone_spec.rb +10 -0
  406. data/spec/framework_spec/app/spec/library/rexml/cdata/initialize_spec.rb +25 -0
  407. data/spec/framework_spec/app/spec/library/rexml/cdata/shared/to_s.rb +11 -0
  408. data/spec/framework_spec/app/spec/library/rexml/cdata/to_s_spec.rb +7 -0
  409. data/spec/framework_spec/app/spec/library/rexml/cdata/value_spec.rb +7 -0
  410. data/spec/framework_spec/app/spec/library/rexml/document/add_element_spec.rb +31 -0
  411. data/spec/framework_spec/app/spec/library/rexml/document/add_spec.rb +61 -0
  412. data/spec/framework_spec/app/spec/library/rexml/document/clone_spec.rb +20 -0
  413. data/spec/framework_spec/app/spec/library/rexml/document/doctype_spec.rb +15 -0
  414. data/spec/framework_spec/app/spec/library/rexml/document/encoding_spec.rb +22 -0
  415. data/spec/framework_spec/app/spec/library/rexml/document/expanded_name_spec.rb +16 -0
  416. data/spec/framework_spec/app/spec/library/rexml/document/new_spec.rb +38 -0
  417. data/spec/framework_spec/app/spec/library/rexml/document/node_type_spec.rb +8 -0
  418. data/spec/framework_spec/app/spec/library/rexml/document/root_spec.rb +12 -0
  419. data/spec/framework_spec/app/spec/library/rexml/document/stand_alone_spec.rb +19 -0
  420. data/spec/framework_spec/app/spec/library/rexml/document/version_spec.rb +14 -0
  421. data/spec/framework_spec/app/spec/library/rexml/document/write_spec.rb +39 -0
  422. data/spec/framework_spec/app/spec/library/rexml/document/xml_decl_spec.rb +15 -0
  423. data/spec/framework_spec/app/spec/library/rexml/element/add_attribute_spec.rb +41 -0
  424. data/spec/framework_spec/app/spec/library/rexml/element/add_attributes_spec.rb +22 -0
  425. data/spec/framework_spec/app/spec/library/rexml/element/add_element_spec.rb +39 -0
  426. data/spec/framework_spec/app/spec/library/rexml/element/add_namespace_spec.rb +24 -0
  427. data/spec/framework_spec/app/spec/library/rexml/element/add_text_spec.rb +24 -0
  428. data/spec/framework_spec/app/spec/library/rexml/element/attribute_spec.rb +17 -0
  429. data/spec/framework_spec/app/spec/library/rexml/element/attributes_spec.rb +19 -0
  430. data/spec/framework_spec/app/spec/library/rexml/element/cdatas_spec.rb +24 -0
  431. data/spec/framework_spec/app/spec/library/rexml/element/clone_spec.rb +29 -0
  432. data/spec/framework_spec/app/spec/library/rexml/element/comments_spec.rb +21 -0
  433. data/spec/framework_spec/app/spec/library/rexml/element/delete_attribute_spec.rb +39 -0
  434. data/spec/framework_spec/app/spec/library/rexml/element/delete_element_spec.rb +51 -0
  435. data/spec/framework_spec/app/spec/library/rexml/element/delete_namespace_spec.rb +25 -0
  436. data/spec/framework_spec/app/spec/library/rexml/element/document_spec.rb +18 -0
  437. data/spec/framework_spec/app/spec/library/rexml/element/each_element_with_attribute_spec.rb +35 -0
  438. data/spec/framework_spec/app/spec/library/rexml/element/each_element_with_text_spec.rb +31 -0
  439. data/spec/framework_spec/app/spec/library/rexml/element/get_text_spec.rb +18 -0
  440. data/spec/framework_spec/app/spec/library/rexml/element/has_attributes_spec.rb +17 -0
  441. data/spec/framework_spec/app/spec/library/rexml/element/has_elements_spec.rb +18 -0
  442. data/spec/framework_spec/app/spec/library/rexml/element/has_text_spec.rb +16 -0
  443. data/spec/framework_spec/app/spec/library/rexml/element/inspect_spec.rb +27 -0
  444. data/spec/framework_spec/app/spec/library/rexml/element/instructions_spec.rb +21 -0
  445. data/spec/framework_spec/app/spec/library/rexml/element/namespace_spec.rb +27 -0
  446. data/spec/framework_spec/app/spec/library/rexml/element/namespaces_spec.rb +32 -0
  447. data/spec/framework_spec/app/spec/library/rexml/element/new_spec.rb +35 -0
  448. data/spec/framework_spec/app/spec/library/rexml/element/next_element_spec.rb +19 -0
  449. data/spec/framework_spec/app/spec/library/rexml/element/node_type_spec.rb +8 -0
  450. data/spec/framework_spec/app/spec/library/rexml/element/prefixes_spec.rb +23 -0
  451. data/spec/framework_spec/app/spec/library/rexml/element/previous_element_spec.rb +20 -0
  452. data/spec/framework_spec/app/spec/library/rexml/element/raw_spec.rb +24 -0
  453. data/spec/framework_spec/app/spec/library/rexml/element/root_spec.rb +28 -0
  454. data/spec/framework_spec/app/spec/library/rexml/element/text_spec.rb +46 -0
  455. data/spec/framework_spec/app/spec/library/rexml/element/texts_spec.rb +16 -0
  456. data/spec/framework_spec/app/spec/library/rexml/element/whitespace_spec.rb +23 -0
  457. data/spec/framework_spec/app/spec/library/rexml/node/each_recursive_spec.rb +21 -0
  458. data/spec/framework_spec/app/spec/library/rexml/node/find_first_recursive_spec.rb +25 -0
  459. data/spec/framework_spec/app/spec/library/rexml/node/index_in_parent_spec.rb +15 -0
  460. data/spec/framework_spec/app/spec/library/rexml/node/next_sibling_node_spec.rb +21 -0
  461. data/spec/framework_spec/app/spec/library/rexml/node/parent_spec.rb +21 -0
  462. data/spec/framework_spec/app/spec/library/rexml/node/previous_sibling_node_spec.rb +21 -0
  463. data/spec/framework_spec/app/spec/library/rexml/shared/each_element.rb +36 -0
  464. data/spec/framework_spec/app/spec/library/rexml/shared/elements_to_a.rb +36 -0
  465. data/spec/framework_spec/app/spec/library/rexml/text/append_spec.rb +10 -0
  466. data/spec/framework_spec/app/spec/library/rexml/text/clone_spec.rb +10 -0
  467. data/spec/framework_spec/app/spec/library/rexml/text/comparison_spec.rb +25 -0
  468. data/spec/framework_spec/app/spec/library/rexml/text/empty_spec.rb +12 -0
  469. data/spec/framework_spec/app/spec/library/rexml/text/indent_text_spec.rb +24 -0
  470. data/spec/framework_spec/app/spec/library/rexml/text/inspect_spec.rb +8 -0
  471. data/spec/framework_spec/app/spec/library/rexml/text/new_spec.rb +49 -0
  472. data/spec/framework_spec/app/spec/library/rexml/text/node_type_spec.rb +8 -0
  473. data/spec/framework_spec/app/spec/library/rexml/text/normalize_spec.rb +8 -0
  474. data/spec/framework_spec/app/spec/library/rexml/text/read_with_substitution_spec.rb +13 -0
  475. data/spec/framework_spec/app/spec/library/rexml/text/to_s_spec.rb +18 -0
  476. data/spec/framework_spec/app/spec/library/rexml/text/unnormalize_spec.rb +8 -0
  477. data/spec/framework_spec/app/spec/library/rexml/text/value_spec.rb +37 -0
  478. data/spec/framework_spec/app/spec/library/rexml/text/wrap_spec.rb +21 -0
  479. data/spec/framework_spec/app/spec/library/rexml/text/write_with_substitution_spec.rb +33 -0
  480. data/spec/framework_spec/app/spec/library/set/exclusion_spec.rb +2 -2
  481. data/spec/framework_spec/app/spec/library/set/merge_spec.rb +2 -2
  482. data/spec/framework_spec/app/spec/library/set/shared/difference.rb +2 -2
  483. data/spec/framework_spec/app/spec/library/set/shared/intersection.rb +2 -2
  484. data/spec/framework_spec/app/spec/library/set/shared/union.rb +2 -2
  485. data/spec/framework_spec/app/spec/library/set/sortedset/exclusion_spec.rb +2 -2
  486. data/spec/framework_spec/app/spec/library/set/sortedset/merge_spec.rb +2 -2
  487. data/spec/framework_spec/app/spec/library/set/sortedset/shared/difference.rb +2 -2
  488. data/spec/framework_spec/app/spec/library/set/sortedset/shared/intersection.rb +2 -2
  489. data/spec/framework_spec/app/spec/library/set/sortedset/shared/union.rb +2 -2
  490. data/spec/framework_spec/app/spec/library/timeout/timeout_spec.rb +37 -0
  491. data/spec/framework_spec/app/spec/library/uri/eql_spec.rb +12 -0
  492. data/spec/framework_spec/app/spec/library/uri/equality_spec.rb +48 -0
  493. data/spec/framework_spec/app/spec/library/uri/escape/decode_spec.rb +6 -0
  494. data/spec/framework_spec/app/spec/library/uri/escape/encode_spec.rb +6 -0
  495. data/spec/framework_spec/app/spec/library/uri/escape/escape_spec.rb +6 -0
  496. data/spec/framework_spec/app/spec/library/uri/escape/unescape_spec.rb +6 -0
  497. data/spec/framework_spec/app/spec/library/uri/extract_spec.rb +86 -0
  498. data/spec/framework_spec/app/spec/library/uri/fixtures/classes.rb +11 -0
  499. data/spec/framework_spec/app/spec/library/uri/fixtures/normalization.rb +54 -0
  500. data/spec/framework_spec/app/spec/library/uri/ftp/build_spec.rb +6 -0
  501. data/spec/framework_spec/app/spec/library/uri/ftp/merge_spec.rb +6 -0
  502. data/spec/framework_spec/app/spec/library/uri/ftp/new2_spec.rb +6 -0
  503. data/spec/framework_spec/app/spec/library/uri/ftp/path_spec.rb +56 -0
  504. data/spec/framework_spec/app/spec/library/uri/ftp/set_typecode_spec.rb +6 -0
  505. data/spec/framework_spec/app/spec/library/uri/ftp/to_s_spec.rb +25 -0
  506. data/spec/framework_spec/app/spec/library/uri/ftp/typecode_spec.rb +10 -0
  507. data/spec/framework_spec/app/spec/library/uri/generic/absolute_spec.rb +10 -0
  508. data/spec/framework_spec/app/spec/library/uri/generic/build2_spec.rb +6 -0
  509. data/spec/framework_spec/app/spec/library/uri/generic/build_spec.rb +6 -0
  510. data/spec/framework_spec/app/spec/library/uri/generic/coerce_spec.rb +6 -0
  511. data/spec/framework_spec/app/spec/library/uri/generic/component_ary_spec.rb +6 -0
  512. data/spec/framework_spec/app/spec/library/uri/generic/component_spec.rb +10 -0
  513. data/spec/framework_spec/app/spec/library/uri/generic/default_port_spec.rb +10 -0
  514. data/spec/framework_spec/app/spec/library/uri/generic/eql_spec.rb +6 -0
  515. data/spec/framework_spec/app/spec/library/uri/generic/equal_value_spec.rb +6 -0
  516. data/spec/framework_spec/app/spec/library/uri/generic/fragment_spec.rb +10 -0
  517. data/spec/framework_spec/app/spec/library/uri/generic/hash_spec.rb +6 -0
  518. data/spec/framework_spec/app/spec/library/uri/generic/hierarchical_spec.rb +6 -0
  519. data/spec/framework_spec/app/spec/library/uri/generic/host_spec.rb +10 -0
  520. data/spec/framework_spec/app/spec/library/uri/generic/inspect_spec.rb +6 -0
  521. data/spec/framework_spec/app/spec/library/uri/generic/merge_spec.rb +10 -0
  522. data/spec/framework_spec/app/spec/library/uri/generic/minus_spec.rb +6 -0
  523. data/spec/framework_spec/app/spec/library/uri/generic/normalize_spec.rb +10 -0
  524. data/spec/framework_spec/app/spec/library/uri/generic/opaque_spec.rb +10 -0
  525. data/spec/framework_spec/app/spec/library/uri/generic/password_spec.rb +10 -0
  526. data/spec/framework_spec/app/spec/library/uri/generic/path_spec.rb +10 -0
  527. data/spec/framework_spec/app/spec/library/uri/generic/plus_spec.rb +6 -0
  528. data/spec/framework_spec/app/spec/library/uri/generic/port_spec.rb +10 -0
  529. data/spec/framework_spec/app/spec/library/uri/generic/query_spec.rb +10 -0
  530. data/spec/framework_spec/app/spec/library/uri/generic/registry_spec.rb +10 -0
  531. data/spec/framework_spec/app/spec/library/uri/generic/relative_spec.rb +6 -0
  532. data/spec/framework_spec/app/spec/library/uri/generic/route_from_spec.rb +6 -0
  533. data/spec/framework_spec/app/spec/library/uri/generic/route_to_spec.rb +6 -0
  534. data/spec/framework_spec/app/spec/library/uri/generic/scheme_spec.rb +10 -0
  535. data/spec/framework_spec/app/spec/library/uri/generic/select_spec.rb +6 -0
  536. data/spec/framework_spec/app/spec/library/uri/generic/set_fragment_spec.rb +6 -0
  537. data/spec/framework_spec/app/spec/library/uri/generic/set_host_spec.rb +6 -0
  538. data/spec/framework_spec/app/spec/library/uri/generic/set_opaque_spec.rb +6 -0
  539. data/spec/framework_spec/app/spec/library/uri/generic/set_password_spec.rb +6 -0
  540. data/spec/framework_spec/app/spec/library/uri/generic/set_path_spec.rb +6 -0
  541. data/spec/framework_spec/app/spec/library/uri/generic/set_port_spec.rb +6 -0
  542. data/spec/framework_spec/app/spec/library/uri/generic/set_query_spec.rb +6 -0
  543. data/spec/framework_spec/app/spec/library/uri/generic/set_registry_spec.rb +6 -0
  544. data/spec/framework_spec/app/spec/library/uri/generic/set_scheme_spec.rb +6 -0
  545. data/spec/framework_spec/app/spec/library/uri/generic/set_user_spec.rb +6 -0
  546. data/spec/framework_spec/app/spec/library/uri/generic/set_userinfo_spec.rb +6 -0
  547. data/spec/framework_spec/app/spec/library/uri/generic/to_s_spec.rb +6 -0
  548. data/spec/framework_spec/app/spec/library/uri/generic/use_registry_spec.rb +6 -0
  549. data/spec/framework_spec/app/spec/library/uri/generic/user_spec.rb +10 -0
  550. data/spec/framework_spec/app/spec/library/uri/generic/userinfo_spec.rb +10 -0
  551. data/spec/framework_spec/app/spec/library/uri/http/build_spec.rb +6 -0
  552. data/spec/framework_spec/app/spec/library/uri/http/request_uri_spec.rb +16 -0
  553. data/spec/framework_spec/app/spec/library/uri/join_spec.rb +61 -0
  554. data/spec/framework_spec/app/spec/library/uri/ldap/attributes_spec.rb +10 -0
  555. data/spec/framework_spec/app/spec/library/uri/ldap/build_spec.rb +6 -0
  556. data/spec/framework_spec/app/spec/library/uri/ldap/dn_spec.rb +10 -0
  557. data/spec/framework_spec/app/spec/library/uri/ldap/extensions_spec.rb +10 -0
  558. data/spec/framework_spec/app/spec/library/uri/ldap/filter_spec.rb +10 -0
  559. data/spec/framework_spec/app/spec/library/uri/ldap/hierarchical_spec.rb +6 -0
  560. data/spec/framework_spec/app/spec/library/uri/ldap/scope_spec.rb +10 -0
  561. data/spec/framework_spec/app/spec/library/uri/ldap/set_attributes_spec.rb +6 -0
  562. data/spec/framework_spec/app/spec/library/uri/ldap/set_dn_spec.rb +6 -0
  563. data/spec/framework_spec/app/spec/library/uri/ldap/set_extensions_spec.rb +6 -0
  564. data/spec/framework_spec/app/spec/library/uri/ldap/set_filter_spec.rb +6 -0
  565. data/spec/framework_spec/app/spec/library/uri/ldap/set_scope_spec.rb +6 -0
  566. data/spec/framework_spec/app/spec/library/uri/mailto/build_spec.rb +99 -0
  567. data/spec/framework_spec/app/spec/library/uri/mailto/headers_spec.rb +10 -0
  568. data/spec/framework_spec/app/spec/library/uri/mailto/set_headers_spec.rb +6 -0
  569. data/spec/framework_spec/app/spec/library/uri/mailto/set_to_spec.rb +6 -0
  570. data/spec/framework_spec/app/spec/library/uri/mailto/to_mailtext_spec.rb +6 -0
  571. data/spec/framework_spec/app/spec/library/uri/mailto/to_rfc822text_spec.rb +6 -0
  572. data/spec/framework_spec/app/spec/library/uri/mailto/to_s_spec.rb +6 -0
  573. data/spec/framework_spec/app/spec/library/uri/mailto/to_spec.rb +10 -0
  574. data/spec/framework_spec/app/spec/library/uri/merge_spec.rb +22 -0
  575. data/spec/framework_spec/app/spec/library/uri/normalize_spec.rb +35 -0
  576. data/spec/framework_spec/app/spec/library/uri/parse_spec.rb +249 -0
  577. data/spec/framework_spec/app/spec/library/uri/plus_spec.rb +489 -0
  578. data/spec/framework_spec/app/spec/library/uri/regexp_spec.rb +18 -0
  579. data/spec/framework_spec/app/spec/library/uri/route_from_spec.rb +25 -0
  580. data/spec/framework_spec/app/spec/library/uri/route_to_spec.rb +28 -0
  581. data/spec/framework_spec/app/spec/library/uri/select_spec.rb +31 -0
  582. data/spec/framework_spec/app/spec/library/uri/set_component_spec.rb +47 -0
  583. data/spec/framework_spec/app/spec/library/uri/shared/eql.rb +17 -0
  584. data/spec/framework_spec/app/spec/library/uri/split_spec.rb +6 -0
  585. data/spec/framework_spec/app/spec/library/uri/uri_spec.rb +31 -0
  586. data/spec/framework_spec/app/spec/library/uri/util/make_components_hash_spec.rb +6 -0
  587. data/spec/framework_spec/build.yml +2 -2
  588. data/spec/framework_spec/extensions/test-libs/test/unit.rb +328 -0
  589. data/spec/framework_spec/extensions/test-libs/test/unit/assertionfailederror.rb +25 -0
  590. data/spec/framework_spec/extensions/test-libs/test/unit/assertions.rb +1878 -0
  591. data/spec/framework_spec/extensions/test-libs/test/unit/attribute.rb +129 -0
  592. data/spec/framework_spec/extensions/test-libs/test/unit/autorunner.rb +422 -0
  593. data/spec/framework_spec/extensions/test-libs/test/unit/collector.rb +38 -0
  594. data/spec/framework_spec/extensions/test-libs/test/unit/collector/descendant.rb +23 -0
  595. data/spec/framework_spec/extensions/test-libs/test/unit/collector/dir.rb +108 -0
  596. data/spec/framework_spec/extensions/test-libs/test/unit/collector/load.rb +187 -0
  597. data/spec/framework_spec/extensions/test-libs/test/unit/collector/objectspace.rb +34 -0
  598. data/spec/framework_spec/extensions/test-libs/test/unit/collector/xml.rb +250 -0
  599. data/spec/framework_spec/extensions/test-libs/test/unit/color-scheme.rb +153 -0
  600. data/spec/framework_spec/extensions/test-libs/test/unit/color.rb +123 -0
  601. data/spec/framework_spec/extensions/test-libs/test/unit/data.rb +80 -0
  602. data/spec/framework_spec/extensions/test-libs/test/unit/diff.rb +740 -0
  603. data/spec/framework_spec/extensions/test-libs/test/unit/error.rb +151 -0
  604. data/spec/framework_spec/extensions/test-libs/test/unit/exceptionhandler.rb +39 -0
  605. data/spec/framework_spec/extensions/test-libs/test/unit/failure.rb +136 -0
  606. data/spec/framework_spec/extensions/test-libs/test/unit/fixture.rb +214 -0
  607. data/spec/framework_spec/extensions/test-libs/test/unit/notification.rb +133 -0
  608. data/spec/framework_spec/extensions/test-libs/test/unit/omission.rb +191 -0
  609. data/spec/framework_spec/extensions/test-libs/test/unit/pending.rb +150 -0
  610. data/spec/framework_spec/extensions/test-libs/test/unit/priority.rb +182 -0
  611. data/spec/framework_spec/extensions/test-libs/test/unit/runner/console.rb +59 -0
  612. data/spec/framework_spec/extensions/test-libs/test/unit/runner/emacs.rb +8 -0
  613. data/spec/framework_spec/extensions/test-libs/test/unit/runner/tap.rb +8 -0
  614. data/spec/framework_spec/extensions/test-libs/test/unit/runner/xml.rb +15 -0
  615. data/spec/framework_spec/extensions/test-libs/test/unit/testcase.rb +601 -0
  616. data/spec/framework_spec/extensions/test-libs/test/unit/testresult.rb +125 -0
  617. data/spec/framework_spec/extensions/test-libs/test/unit/testsuite.rb +134 -0
  618. data/spec/framework_spec/extensions/test-libs/test/unit/testsuitecreator.rb +79 -0
  619. data/spec/framework_spec/extensions/test-libs/test/unit/ui/console/outputlevel.rb +15 -0
  620. data/spec/framework_spec/extensions/test-libs/test/unit/ui/console/testrunner.rb +561 -0
  621. data/spec/framework_spec/extensions/test-libs/test/unit/ui/emacs/testrunner.rb +63 -0
  622. data/spec/framework_spec/extensions/test-libs/test/unit/ui/tap/testrunner.rb +82 -0
  623. data/spec/framework_spec/extensions/test-libs/test/unit/ui/testrunner.rb +53 -0
  624. data/spec/framework_spec/extensions/test-libs/test/unit/ui/testrunnermediator.rb +86 -0
  625. data/spec/framework_spec/extensions/test-libs/test/unit/ui/testrunnerutilities.rb +41 -0
  626. data/spec/framework_spec/extensions/test-libs/test/unit/ui/xml/testrunner.rb +224 -0
  627. data/spec/framework_spec/extensions/test-libs/test/unit/util/backtracefilter.rb +42 -0
  628. data/spec/framework_spec/extensions/test-libs/test/unit/util/method-owner-finder.rb +28 -0
  629. data/spec/framework_spec/extensions/test-libs/test/unit/util/observable.rb +90 -0
  630. data/spec/framework_spec/extensions/test-libs/test/unit/util/output.rb +31 -0
  631. data/spec/framework_spec/extensions/test-libs/test/unit/util/procwrapper.rb +48 -0
  632. data/spec/framework_spec/extensions/test-libs/test/unit/version.rb +5 -0
  633. data/spec/framework_spec/extensions/test-libs/webrick/accesslog.rb +10 -2
  634. data/spec/framework_spec/extensions/test-libs/webrick/cgi.rb +1 -1
  635. data/spec/framework_spec/extensions/test-libs/webrick/config.rb +1 -1
  636. data/spec/framework_spec/extensions/test-libs/webrick/httpauth/digestauth.rb +1 -1
  637. data/spec/framework_spec/extensions/test-libs/webrick/httpresponse.rb +1 -1
  638. data/spec/framework_spec/extensions/test-libs/webrick/https.rb +2 -2
  639. data/spec/framework_spec/extensions/test-libs/webrick/httpservlet/abstract.rb +1 -2
  640. data/spec/framework_spec/extensions/test-libs/webrick/httpservlet/cgihandler.rb +2 -2
  641. data/spec/framework_spec/extensions/test-libs/webrick/httpservlet/filehandler.rb +9 -5
  642. data/spec/framework_spec/extensions/test-libs/webrick/httpstatus.rb +32 -321
  643. data/spec/framework_spec/extensions/test-libs/webrick/httputils.rb +3 -3
  644. data/spec/framework_spec/extensions/test-libs/webrick/ssl.rb +3 -2
  645. data/spec/phone_spec/build.yml +1 -1
  646. data/version +1 -0
  647. metadata +521 -27
  648. data/lib/extensions/net-http/monitor.rb +0 -265
  649. data/lib/extensions/net-http/thread.rb +0 -367
  650. data/lib/extensions/net-http/timeout.rb +0 -114
  651. data/lib/extensions/net-http/uri.rb +0 -29
  652. data/lib/extensions/net-http/uri/common.rb +0 -727
  653. data/lib/extensions/net-http/uri/ftp.rb +0 -198
  654. data/lib/extensions/net-http/uri/generic.rb +0 -1128
  655. data/lib/extensions/net-http/uri/http.rb +0 -100
  656. data/lib/extensions/net-http/uri/https.rb +0 -20
  657. data/lib/extensions/net-http/uri/ldap.rb +0 -190
  658. data/lib/extensions/net-http/uri/ldaps.rb +0 -12
  659. data/lib/extensions/net-http/uri/mailto.rb +0 -266
  660. data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/Frameworks/QtDBus.framework/Versions/4/QtDBus +0 -0
  661. data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/Frameworks/QtXml.framework/Versions/4/QtXml +0 -0
  662. data/platform/osx/bin/RhoSimulator/RhoSimulator.app/Contents/PlugIns/qmltooling/libtcpserver.dylib +0 -0
  663. data/res/generators/templates/application/public/jqmobile/images/icon-search-black.png +0 -0
  664. data/res/generators/templates/application/public/jqmobile/jquery.mobile-1.0b3.min.css +0 -8
  665. data/res/generators/templates/application/public/jqmobile/jquery.mobile-1.0b3.min.js +0 -169
  666. data/res/generators/templates/application/public/jquery/jquery-1.6.3.min.js +0 -4
  667. data/spec/framework_spec/extensions/test-libs/thread.rb +0 -391
@@ -0,0 +1,308 @@
1
+ /************************************************
2
+
3
+ ipsocket.c -
4
+
5
+ created at: Thu Mar 31 12:21:29 JST 1994
6
+
7
+ Copyright (C) 1993-2007 Yukihiro Matsumoto
8
+
9
+ ************************************************/
10
+
11
+ #include "rubysocket.h"
12
+
13
+ struct inetsock_arg
14
+ {
15
+ VALUE sock;
16
+ struct {
17
+ VALUE host, serv;
18
+ struct addrinfo *res;
19
+ } remote, local;
20
+ int type;
21
+ int fd;
22
+ };
23
+
24
+ static VALUE
25
+ inetsock_cleanup(struct inetsock_arg *arg)
26
+ {
27
+ if (arg->remote.res) {
28
+ freeaddrinfo(arg->remote.res);
29
+ arg->remote.res = 0;
30
+ }
31
+ if (arg->local.res) {
32
+ freeaddrinfo(arg->local.res);
33
+ arg->local.res = 0;
34
+ }
35
+ if (arg->fd >= 0) {
36
+ close(arg->fd);
37
+ }
38
+ return Qnil;
39
+ }
40
+
41
+ static VALUE
42
+ init_inetsock_internal(struct inetsock_arg *arg)
43
+ {
44
+ int type = arg->type;
45
+ struct addrinfo *res;
46
+ int fd, status = 0;
47
+ const char *syscall = 0;
48
+
49
+ arg->remote.res = rsock_addrinfo(arg->remote.host, arg->remote.serv, SOCK_STREAM,
50
+ (type == INET_SERVER) ? AI_PASSIVE : 0);
51
+ /*
52
+ * Maybe also accept a local address
53
+ */
54
+
55
+ if (type != INET_SERVER && (!NIL_P(arg->local.host) || !NIL_P(arg->local.serv))) {
56
+ arg->local.res = rsock_addrinfo(arg->local.host, arg->local.serv, SOCK_STREAM, 0);
57
+ }
58
+
59
+ arg->fd = fd = -1;
60
+ for (res = arg->remote.res; res; res = res->ai_next) {
61
+ #if !defined(INET6) && defined(AF_INET6)
62
+ if (res->ai_family == AF_INET6)
63
+ continue;
64
+ #endif
65
+ status = rsock_socket(res->ai_family,res->ai_socktype,res->ai_protocol);
66
+ syscall = "socket(2)";
67
+ fd = status;
68
+ if (fd < 0) {
69
+ continue;
70
+ }
71
+ arg->fd = fd;
72
+ if (type == INET_SERVER) {
73
+ #if !defined(_WIN32) && !defined(__CYGWIN__)
74
+ status = 1;
75
+ setsockopt(fd, SOL_SOCKET, SO_REUSEADDR,
76
+ (char*)&status, (socklen_t)sizeof(status));
77
+ #endif
78
+ status = bind(fd, res->ai_addr, res->ai_addrlen);
79
+ syscall = "bind(2)";
80
+ }
81
+ else {
82
+ if (arg->local.res) {
83
+ status = bind(fd, arg->local.res->ai_addr, arg->local.res->ai_addrlen);
84
+ syscall = "bind(2)";
85
+ }
86
+
87
+ if (status >= 0) {
88
+ status = rsock_connect(fd, res->ai_addr, res->ai_addrlen,
89
+ (type == INET_SOCKS));
90
+ syscall = "connect(2)";
91
+ }
92
+ }
93
+
94
+ if (status < 0) {
95
+ close(fd);
96
+ arg->fd = fd = -1;
97
+ continue;
98
+ } else
99
+ break;
100
+ }
101
+ if (status < 0) {
102
+ rb_sys_fail(syscall);
103
+ }
104
+
105
+ arg->fd = -1;
106
+
107
+ if (type == INET_SERVER) {
108
+ status = listen(fd, 5);
109
+ if (status < 0) {
110
+ close(fd);
111
+ syscall = "listen(2)";
112
+ }
113
+ }
114
+
115
+ /* create new instance */
116
+ return rsock_init_sock(arg->sock, fd);
117
+ }
118
+
119
+ VALUE
120
+ rsock_init_inetsock(VALUE sock, VALUE remote_host, VALUE remote_serv,
121
+ VALUE local_host, VALUE local_serv, int type)
122
+ {
123
+ struct inetsock_arg arg;
124
+ arg.sock = sock;
125
+ arg.remote.host = remote_host;
126
+ arg.remote.serv = remote_serv;
127
+ arg.remote.res = 0;
128
+ arg.local.host = local_host;
129
+ arg.local.serv = local_serv;
130
+ arg.local.res = 0;
131
+ arg.type = type;
132
+ arg.fd = -1;
133
+ return rb_ensure(init_inetsock_internal, (VALUE)&arg,
134
+ inetsock_cleanup, (VALUE)&arg);
135
+ }
136
+
137
+ static ID id_numeric, id_hostname;
138
+
139
+ int
140
+ rsock_revlookup_flag(VALUE revlookup, int *norevlookup)
141
+ {
142
+ #define return_norevlookup(x) {*norevlookup = x; return 1;}
143
+ ID id;
144
+
145
+ switch (revlookup) {
146
+ case Qtrue: return_norevlookup(0);
147
+ case Qfalse: return_norevlookup(1);
148
+ case Qnil: break;
149
+ default:
150
+ Check_Type(revlookup, T_SYMBOL);
151
+ id = SYM2ID(revlookup);
152
+ if (id == id_numeric) return_norevlookup(1);
153
+ if (id == id_hostname) return_norevlookup(0);
154
+ rb_raise(rb_eArgError, "invalid reverse_lookup flag: :%s", rb_id2name(id));
155
+ }
156
+ return 0;
157
+ #undef return_norevlookup
158
+ }
159
+
160
+ /*
161
+ * call-seq:
162
+ * ipsocket.addr([reverse_lookup]) => [address_family, port, hostname, numeric_address]
163
+ *
164
+ * Returns the local address as an array which contains
165
+ * address_family, port, hostname and numeric_address.
166
+ *
167
+ * If +reverse_lookup+ is +true+ or +:hostname+,
168
+ * hostname is obtained from numeric_address using reverse lookup.
169
+ * Or if it is +false+, or +:numeric+,
170
+ * hostname is same as numeric_address.
171
+ * Or if it is +nil+ or ommitted, obeys to +ipsocket.do_not_reverse_lookup+.
172
+ * See +Socket.getaddrinfo+ also.
173
+ *
174
+ * TCPSocket.open("www.ruby-lang.org", 80) {|sock|
175
+ * p sock.addr #=> ["AF_INET", 49429, "hal", "192.168.0.128"]
176
+ * p sock.addr(true) #=> ["AF_INET", 49429, "hal", "192.168.0.128"]
177
+ * p sock.addr(false) #=> ["AF_INET", 49429, "192.168.0.128", "192.168.0.128"]
178
+ * p sock.addr(:hostname) #=> ["AF_INET", 49429, "hal", "192.168.0.128"]
179
+ * p sock.addr(:numeric) #=> ["AF_INET", 49429, "192.168.0.128", "192.168.0.128"]
180
+ * }
181
+ *
182
+ */
183
+ static VALUE
184
+ ip_addr(int argc, VALUE *argv, VALUE sock)
185
+ {
186
+ rb_io_t *fptr;
187
+ struct sockaddr_storage addr;
188
+ socklen_t len = (socklen_t)sizeof addr;
189
+ int norevlookup;
190
+
191
+ GetOpenFile(sock, fptr);
192
+
193
+ if (argc < 1 || !rsock_revlookup_flag(argv[0], &norevlookup))
194
+ norevlookup = fptr->mode & FMODE_NOREVLOOKUP;
195
+ if (getsockname(fptr->fd, (struct sockaddr*)&addr, &len) < 0)
196
+ rb_sys_fail("getsockname(2)");
197
+ return rsock_ipaddr((struct sockaddr*)&addr, norevlookup);
198
+ }
199
+
200
+ /*
201
+ * call-seq:
202
+ * ipsocket.peeraddr([reverse_lookup]) => [address_family, port, hostname, numeric_address]
203
+ *
204
+ * Returns the remote address as an array which contains
205
+ * address_family, port, hostname and numeric_address.
206
+ * It is defined for connection oriented socket such as TCPSocket.
207
+ *
208
+ * If +reverse_lookup+ is +true+ or +:hostname+,
209
+ * hostname is obtained from numeric_address using reverse lookup.
210
+ * Or if it is +false+, or +:numeric+,
211
+ * hostname is same as numeric_address.
212
+ * Or if it is +nil+ or ommitted, obeys to +ipsocket.do_not_reverse_lookup+.
213
+ * See +Socket.getaddrinfo+ also.
214
+ *
215
+ * TCPSocket.open("www.ruby-lang.org", 80) {|sock|
216
+ * p sock.peeraddr #=> ["AF_INET", 80, "carbon.ruby-lang.org", "221.186.184.68"]
217
+ * p sock.peeraddr(true) #=> ["AF_INET", 80, "221.186.184.68", "221.186.184.68"]
218
+ * p sock.peeraddr(false) #=> ["AF_INET", 80, "221.186.184.68", "221.186.184.68"]
219
+ * p sock.peeraddr(:hostname) #=> ["AF_INET", 80, "carbon.ruby-lang.org", "221.186.184.68"]
220
+ * p sock.peeraddr(:numeric) #=> ["AF_INET", 80, "221.186.184.68", "221.186.184.68"]
221
+ * }
222
+ *
223
+ */
224
+ static VALUE
225
+ ip_peeraddr(int argc, VALUE *argv, VALUE sock)
226
+ {
227
+ rb_io_t *fptr;
228
+ struct sockaddr_storage addr;
229
+ socklen_t len = (socklen_t)sizeof addr;
230
+ int norevlookup;
231
+
232
+ GetOpenFile(sock, fptr);
233
+
234
+ if (argc < 1 || !rsock_revlookup_flag(argv[0], &norevlookup))
235
+ norevlookup = fptr->mode & FMODE_NOREVLOOKUP;
236
+ if (getpeername(fptr->fd, (struct sockaddr*)&addr, &len) < 0)
237
+ rb_sys_fail("getpeername(2)");
238
+ return rsock_ipaddr((struct sockaddr*)&addr, norevlookup);
239
+ }
240
+
241
+ /*
242
+ * call-seq:
243
+ * ipsocket.recvfrom(maxlen) => [mesg, ipaddr]
244
+ * ipsocket.recvfrom(maxlen, flags) => [mesg, ipaddr]
245
+ *
246
+ * Receives a message and return the message as a string and
247
+ * an address which the message come from.
248
+ *
249
+ * _maxlen_ is the maximum number of bytes to receive.
250
+ *
251
+ * _flags_ should be a bitwise OR of Socket::MSG_* constants.
252
+ *
253
+ * ipaddr is same as IPSocket#{peeraddr,addr}.
254
+ *
255
+ * u1 = UDPSocket.new
256
+ * u1.bind("127.0.0.1", 4913)
257
+ * u2 = UDPSocket.new
258
+ * u2.send "uuuu", 0, "127.0.0.1", 4913
259
+ * p u1.recvfrom(10) #=> ["uuuu", ["AF_INET", 33230, "localhost", "127.0.0.1"]]
260
+ *
261
+ */
262
+ static VALUE
263
+ ip_recvfrom(int argc, VALUE *argv, VALUE sock)
264
+ {
265
+ return rsock_s_recvfrom(sock, argc, argv, RECV_IP);
266
+ }
267
+
268
+ /*
269
+ * call-seq:
270
+ * IPSocket.getaddress(host) => ipaddress
271
+ *
272
+ * Lookups the IP address of _host_.
273
+ *
274
+ * IPSocket.getaddress("localhost") #=> "127.0.0.1"
275
+ * IPSocket.getaddress("ip6-localhost") #=> "::1"
276
+ *
277
+ */
278
+ static VALUE
279
+ ip_s_getaddress(VALUE obj, VALUE host)
280
+ {
281
+ struct sockaddr_storage addr;
282
+ struct addrinfo *res = rsock_addrinfo(host, Qnil, SOCK_STREAM, 0);
283
+
284
+ /* just take the first one */
285
+ memcpy(&addr, res->ai_addr, res->ai_addrlen);
286
+ freeaddrinfo(res);
287
+
288
+ return rsock_make_ipaddr((struct sockaddr*)&addr);
289
+ }
290
+
291
+ /*
292
+ * Document-class: ::IPSocket < BasicSocket
293
+ *
294
+ * IPSocket is the super class of TCPSocket and UDPSocket.
295
+ */
296
+ void
297
+ rsock_init_ipsocket(void)
298
+ {
299
+ rb_cIPSocket = rb_define_class("IPSocket", rb_cBasicSocket);
300
+ rb_define_method(rb_cIPSocket, "addr", ip_addr, -1);
301
+ rb_define_method(rb_cIPSocket, "peeraddr", ip_peeraddr, -1);
302
+ rb_define_method(rb_cIPSocket, "recvfrom", ip_recvfrom, -1);
303
+ rb_define_singleton_method(rb_cIPSocket, "getaddress", ip_s_getaddress, 1);
304
+ rb_undef_method(rb_cIPSocket, "getpeereid");
305
+
306
+ id_numeric = rb_intern_const("numeric");
307
+ id_hostname = rb_intern_const("hostname");
308
+ }
@@ -0,0 +1,755 @@
1
+ require 'socket.so'
2
+
3
+ class Addrinfo
4
+ # creates an Addrinfo object from the arguments.
5
+ #
6
+ # The arguments are interpreted as similar to self.
7
+ #
8
+ # Addrinfo.tcp("0.0.0.0", 4649).family_addrinfo("www.ruby-lang.org", 80)
9
+ # #=> #<Addrinfo: 221.186.184.68:80 TCP (www.ruby-lang.org:80)>
10
+ #
11
+ # Addrinfo.unix("/tmp/sock").family_addrinfo("/tmp/sock2")
12
+ # #=> #<Addrinfo: /tmp/sock2 SOCK_STREAM>
13
+ #
14
+ def family_addrinfo(*args)
15
+ if args.empty?
16
+ raise ArgumentError, "no address specified"
17
+ elsif Addrinfo === args.first
18
+ raise ArgumentError, "too many arguments" if args.length != 1
19
+ elsif self.ip?
20
+ raise ArgumentError, "IP address needs host and port but #{args.length} arguments given" if args.length != 2
21
+ host, port = args
22
+ Addrinfo.getaddrinfo(host, port, self.pfamily, self.socktype, self.protocol)[0]
23
+ elsif self.unix?
24
+ raise ArgumentError, "UNIX socket needs single path argument but #{args.length} arguments given" if args.length != 1
25
+ path, = args
26
+ Addrinfo.unix(path)
27
+ else
28
+ raise ArgumentError, "unexpected family"
29
+ end
30
+ end
31
+
32
+ def connect_internal(local_addrinfo)
33
+ sock = Socket.new(self.pfamily, self.socktype, self.protocol)
34
+ begin
35
+ sock.ipv6only! if self.ipv6?
36
+ sock.bind local_addrinfo if local_addrinfo
37
+ sock.connect(self)
38
+ if block_given?
39
+ yield sock
40
+ else
41
+ sock
42
+ end
43
+ ensure
44
+ sock.close if !sock.closed? && (block_given? || $!)
45
+ end
46
+ end
47
+ private :connect_internal
48
+
49
+ # creates a socket connected to the address of self.
50
+ #
51
+ # If one or more arguments given as _local_addr_args_,
52
+ # it is used as the local address of the socket.
53
+ # _local_addr_args_ is given for family_addrinfo to obtain actual address.
54
+ #
55
+ # If no arguments given, the local address of the socket is not bound.
56
+ #
57
+ # If a block is given, it is called with the socket and the value of the block is returned.
58
+ # The socket is returned otherwise.
59
+ #
60
+ # Addrinfo.tcp("www.ruby-lang.org", 80).connect_from("0.0.0.0", 4649) {|s|
61
+ # s.print "GET / HTTP/1.0\r\nHost: www.ruby-lang.org\r\n\r\n"
62
+ # puts s.read
63
+ # }
64
+ #
65
+ # # Addrinfo object can be taken for the argument.
66
+ # Addrinfo.tcp("www.ruby-lang.org", 80).connect_from(Addrinfo.tcp("0.0.0.0", 4649)) {|s|
67
+ # s.print "GET / HTTP/1.0\r\nHost: www.ruby-lang.org\r\n\r\n"
68
+ # puts s.read
69
+ # }
70
+ #
71
+ def connect_from(*local_addr_args, &block)
72
+ connect_internal(family_addrinfo(*local_addr_args), &block)
73
+ end
74
+
75
+ # creates a socket connected to the address of self.
76
+ #
77
+ # If a block is given, it is called with the socket and the value of the block is returned.
78
+ # The socket is returned otherwise.
79
+ #
80
+ # Addrinfo.tcp("www.ruby-lang.org", 80).connect {|s|
81
+ # s.print "GET / HTTP/1.0\r\nHost: www.ruby-lang.org\r\n\r\n"
82
+ # puts s.read
83
+ # }
84
+ #
85
+ def connect(&block)
86
+ connect_internal(nil, &block)
87
+ end
88
+
89
+ # creates a socket connected to _remote_addr_args_ and bound to self.
90
+ #
91
+ # If a block is given, it is called with the socket and the value of the block is returned.
92
+ # The socket is returned otherwise.
93
+ #
94
+ # Addrinfo.tcp("0.0.0.0", 4649).connect_to("www.ruby-lang.org", 80) {|s|
95
+ # s.print "GET / HTTP/1.0\r\nHost: www.ruby-lang.org\r\n\r\n"
96
+ # puts s.read
97
+ # }
98
+ #
99
+ def connect_to(*remote_addr_args, &block)
100
+ remote_addrinfo = family_addrinfo(*remote_addr_args)
101
+ remote_addrinfo.send(:connect_internal, self, &block)
102
+ end
103
+
104
+ # creates a socket bound to self.
105
+ #
106
+ # If a block is given, it is called with the socket and the value of the block is returned.
107
+ # The socket is returned otherwise.
108
+ #
109
+ # Addrinfo.udp("0.0.0.0", 9981).bind {|s|
110
+ # s.local_address.connect {|s| s.send "hello", 0 }
111
+ # p s.recv(10) #=> "hello"
112
+ # }
113
+ #
114
+ def bind
115
+ sock = Socket.new(self.pfamily, self.socktype, self.protocol)
116
+ begin
117
+ sock.ipv6only! if self.ipv6?
118
+ sock.setsockopt(:SOCKET, :REUSEADDR, 1)
119
+ sock.bind(self)
120
+ if block_given?
121
+ yield sock
122
+ else
123
+ sock
124
+ end
125
+ ensure
126
+ sock.close if !sock.closed? && (block_given? || $!)
127
+ end
128
+ end
129
+
130
+ # creates a listening socket bound to self.
131
+ def listen(backlog=5)
132
+ sock = Socket.new(self.pfamily, self.socktype, self.protocol)
133
+ begin
134
+ sock.ipv6only! if self.ipv6?
135
+ sock.setsockopt(:SOCKET, :REUSEADDR, 1)
136
+ sock.bind(self)
137
+ sock.listen(backlog)
138
+ if block_given?
139
+ yield sock
140
+ else
141
+ sock
142
+ end
143
+ ensure
144
+ sock.close if !sock.closed? && (block_given? || $!)
145
+ end
146
+ end
147
+
148
+ # iterates over the list of Addrinfo objects obtained by Addrinfo.getaddrinfo.
149
+ #
150
+ # Addrinfo.foreach(nil, 80) {|x| p x }
151
+ # #=> #<Addrinfo: 127.0.0.1:80 TCP (:80)>
152
+ # # #<Addrinfo: 127.0.0.1:80 UDP (:80)>
153
+ # # #<Addrinfo: [::1]:80 TCP (:80)>
154
+ # # #<Addrinfo: [::1]:80 UDP (:80)>
155
+ #
156
+ def self.foreach(nodename, service, family=nil, socktype=nil, protocol=nil, flags=nil, &block)
157
+ Addrinfo.getaddrinfo(nodename, service, family, socktype, protocol, flags).each(&block)
158
+ end
159
+ end
160
+
161
+ class BasicSocket < IO
162
+ # Returns an address of the socket suitable for connect in the local machine.
163
+ #
164
+ # This method returns _self_.local_address, except following condition.
165
+ #
166
+ # - IPv4 unspecified address (0.0.0.0) is replaced by IPv4 loopback address (127.0.0.1).
167
+ # - IPv6 unspecified address (::) is replaced by IPv6 loopback address (::1).
168
+ #
169
+ # If the local address is not suitable for connect, SocketError is raised.
170
+ # IPv4 and IPv6 address which port is 0 is not suitable for connect.
171
+ # Unix domain socket which has no path is not suitable for connect.
172
+ #
173
+ # Addrinfo.tcp("0.0.0.0", 0).listen {|serv|
174
+ # p serv.connect_address #=> #<Addrinfo: 127.0.0.1:53660 TCP>
175
+ # serv.connect_address.connect {|c|
176
+ # s, _ = serv.accept
177
+ # p [c, s] #=> [#<Socket:fd 4>, #<Socket:fd 6>]
178
+ # }
179
+ # }
180
+ #
181
+ def connect_address
182
+ addr = local_address
183
+ afamily = addr.afamily
184
+ if afamily == Socket::AF_INET
185
+ raise SocketError, "unbound IPv4 socket" if addr.ip_port == 0
186
+ if addr.ip_address == "0.0.0.0"
187
+ addr = Addrinfo.new(["AF_INET", addr.ip_port, nil, "127.0.0.1"], addr.pfamily, addr.socktype, addr.protocol)
188
+ end
189
+ elsif defined?(Socket::AF_INET6) && afamily == Socket::AF_INET6
190
+ raise SocketError, "unbound IPv6 socket" if addr.ip_port == 0
191
+ if addr.ip_address == "::"
192
+ addr = Addrinfo.new(["AF_INET6", addr.ip_port, nil, "::1"], addr.pfamily, addr.socktype, addr.protocol)
193
+ elsif addr.ip_address == "0.0.0.0" # MacOS X 10.4 returns "a.b.c.d" for IPv4-mapped IPv6 address.
194
+ addr = Addrinfo.new(["AF_INET6", addr.ip_port, nil, "::1"], addr.pfamily, addr.socktype, addr.protocol)
195
+ elsif addr.ip_address == "::ffff:0.0.0.0" # MacOS X 10.6 returns "::ffff:a.b.c.d" for IPv4-mapped IPv6 address.
196
+ addr = Addrinfo.new(["AF_INET6", addr.ip_port, nil, "::1"], addr.pfamily, addr.socktype, addr.protocol)
197
+ end
198
+ elsif defined?(Socket::AF_UNIX) && afamily == Socket::AF_UNIX
199
+ raise SocketError, "unbound Unix socket" if addr.unix_path == ""
200
+ end
201
+ addr
202
+ end
203
+ end
204
+
205
+ class Socket < BasicSocket
206
+ # enable the socket option IPV6_V6ONLY if IPV6_V6ONLY is available.
207
+ def ipv6only!
208
+ if defined? Socket::IPV6_V6ONLY
209
+ self.setsockopt(:IPV6, :V6ONLY, 1)
210
+ end
211
+ end
212
+
213
+ # creates a new socket object connected to host:port using TCP/IP.
214
+ #
215
+ # If local_host:local_port is given,
216
+ # the socket is bound to it.
217
+ #
218
+ # If a block is given, the block is called with the socket.
219
+ # The value of the block is returned.
220
+ # The socket is closed when this method returns.
221
+ #
222
+ # If no block is given, the socket is returned.
223
+ #
224
+ # Socket.tcp("www.ruby-lang.org", 80) {|sock|
225
+ # sock.print "GET / HTTP/1.0\r\nHost: www.ruby-lang.org\r\n\r\n"
226
+ # sock.close_write
227
+ # puts sock.read
228
+ # }
229
+ #
230
+ def self.tcp(host, port, local_host=nil, local_port=nil) # :yield: socket
231
+ last_error = nil
232
+ ret = nil
233
+
234
+ local_addr_list = nil
235
+ if local_host != nil || local_port != nil
236
+ local_addr_list = Addrinfo.getaddrinfo(local_host, local_port, nil, :STREAM, nil)
237
+ end
238
+
239
+ Addrinfo.foreach(host, port, nil, :STREAM) {|ai|
240
+ if local_addr_list
241
+ local_addr = local_addr_list.find {|local_ai| local_ai.afamily == ai.afamily }
242
+ next if !local_addr
243
+ else
244
+ local_addr = nil
245
+ end
246
+ begin
247
+ sock = local_addr ? ai.connect_from(local_addr) : ai.connect
248
+ rescue SystemCallError
249
+ last_error = $!
250
+ next
251
+ end
252
+ ret = sock
253
+ break
254
+ }
255
+ if !ret
256
+ if last_error
257
+ raise last_error
258
+ else
259
+ raise SocketError, "no appropriate local address"
260
+ end
261
+ end
262
+ if block_given?
263
+ begin
264
+ yield ret
265
+ ensure
266
+ ret.close if !ret.closed?
267
+ end
268
+ else
269
+ ret
270
+ end
271
+ end
272
+
273
+ # :stopdoc:
274
+ def self.ip_sockets_port0(ai_list, reuseaddr)
275
+ begin
276
+ sockets = []
277
+ port = nil
278
+ ai_list.each {|ai|
279
+ begin
280
+ s = Socket.new(ai.pfamily, ai.socktype, ai.protocol)
281
+ rescue SystemCallError
282
+ next
283
+ end
284
+ sockets << s
285
+ s.ipv6only! if ai.ipv6?
286
+ if reuseaddr
287
+ s.setsockopt(:SOCKET, :REUSEADDR, 1)
288
+ end
289
+ if !port
290
+ s.bind(ai)
291
+ port = s.local_address.ip_port
292
+ else
293
+ s.bind(ai.family_addrinfo(ai.ip_address, port))
294
+ end
295
+ }
296
+ rescue Errno::EADDRINUSE
297
+ sockets.each {|s|
298
+ s.close
299
+ }
300
+ retry
301
+ end
302
+ sockets
303
+ ensure
304
+ sockets.each {|s| s.close if !s.closed? } if $!
305
+ end
306
+ class << self
307
+ private :ip_sockets_port0
308
+ end
309
+
310
+ def self.tcp_server_sockets_port0(host)
311
+ ai_list = Addrinfo.getaddrinfo(host, 0, nil, :STREAM, nil, Socket::AI_PASSIVE)
312
+ sockets = ip_sockets_port0(ai_list, true)
313
+ sockets.each {|s|
314
+ s.listen(5)
315
+ }
316
+ sockets
317
+ ensure
318
+ sockets.each {|s| s.close if !s.closed? } if $! && sockets
319
+ end
320
+ class << self
321
+ private :tcp_server_sockets_port0
322
+ end
323
+ # :startdoc:
324
+
325
+ # creates TCP/IP server sockets for _host_ and _port_.
326
+ # _host_ is optional.
327
+ #
328
+ # If no block given,
329
+ # it returns an array of listening sockets.
330
+ #
331
+ # If a block is given, the block is called with the sockets.
332
+ # The value of the block is returned.
333
+ # The socket is closed when this method returns.
334
+ #
335
+ # If _port_ is 0, actual port number is choosen dynamically.
336
+ # However all sockets in the result has same port number.
337
+ #
338
+ # # tcp_server_sockets returns two sockets.
339
+ # sockets = Socket.tcp_server_sockets(1296)
340
+ # p sockets #=> [#<Socket:fd 3>, #<Socket:fd 4>]
341
+ #
342
+ # # The sockets contains IPv6 and IPv4 sockets.
343
+ # sockets.each {|s| p s.local_address }
344
+ # #=> #<Addrinfo: [::]:1296 TCP>
345
+ # # #<Addrinfo: 0.0.0.0:1296 TCP>
346
+ #
347
+ # # IPv6 and IPv4 socket has same port number, 53114, even if it is choosen dynamically.
348
+ # sockets = Socket.tcp_server_sockets(0)
349
+ # sockets.each {|s| p s.local_address }
350
+ # #=> #<Addrinfo: [::]:53114 TCP>
351
+ # # #<Addrinfo: 0.0.0.0:53114 TCP>
352
+ #
353
+ # # The block is called with the sockets.
354
+ # Socket.tcp_server_sockets(0) {|sockets|
355
+ # p sockets #=> [#<Socket:fd 3>, #<Socket:fd 4>]
356
+ # }
357
+ #
358
+ def self.tcp_server_sockets(host=nil, port)
359
+ if port == 0
360
+ sockets = tcp_server_sockets_port0(host)
361
+ else
362
+ begin
363
+ last_error = nil
364
+ sockets = []
365
+ Addrinfo.foreach(host, port, nil, :STREAM, nil, Socket::AI_PASSIVE) {|ai|
366
+ begin
367
+ s = ai.listen
368
+ rescue SystemCallError
369
+ last_error = $!
370
+ next
371
+ end
372
+ sockets << s
373
+ }
374
+ if sockets.empty?
375
+ raise last_error
376
+ end
377
+ ensure
378
+ sockets.each {|s| s.close if !s.closed? } if $!
379
+ end
380
+ end
381
+ if block_given?
382
+ begin
383
+ yield sockets
384
+ ensure
385
+ sockets.each {|s| s.close if !s.closed? }
386
+ end
387
+ else
388
+ sockets
389
+ end
390
+ end
391
+
392
+ # yield socket and client address for each a connection accepted via given sockets.
393
+ #
394
+ # The arguments are a list of sockets.
395
+ # The individual argument should be a socket or an array of sockets.
396
+ #
397
+ # This method yields the block sequentially.
398
+ # It means that the next connection is not accepted until the block returns.
399
+ # So concurrent mechanism, thread for example, should be used to service multiple clients at a time.
400
+ #
401
+ def self.accept_loop(*sockets) # :yield: socket, client_addrinfo
402
+ sockets.flatten!(1)
403
+ if sockets.empty?
404
+ raise ArgumentError, "no sockets"
405
+ end
406
+ loop {
407
+ readable, _, _ = IO.select(sockets)
408
+ readable.each {|r|
409
+ begin
410
+ sock, addr = r.accept_nonblock
411
+ rescue IO::WaitReadable
412
+ next
413
+ end
414
+ yield sock, addr
415
+ }
416
+ }
417
+ end
418
+
419
+ # creates a TCP/IP server on _port_ and calls the block for each connection accepted.
420
+ # The block is called with a socket and a client_address as an Addrinfo object.
421
+ #
422
+ # If _host_ is specified, it is used with _port_ to determine the server addresses.
423
+ #
424
+ # The socket is *not* closed when the block returns.
425
+ # So application should close it explicitly.
426
+ #
427
+ # This method calls the block sequentially.
428
+ # It means that the next connection is not accepted until the block returns.
429
+ # So concurrent mechanism, thread for example, should be used to service multiple clients at a time.
430
+ #
431
+ # Note that Addrinfo.getaddrinfo is used to determine the server socket addresses.
432
+ # When Addrinfo.getaddrinfo returns two or more addresses,
433
+ # IPv4 and IPv6 address for example,
434
+ # all of them are used.
435
+ # Socket.tcp_server_loop succeeds if one socket can be used at least.
436
+ #
437
+ # # Sequential echo server.
438
+ # # It services only one client at a time.
439
+ # Socket.tcp_server_loop(16807) {|sock, client_addrinfo|
440
+ # begin
441
+ # IO.copy_stream(sock, sock)
442
+ # ensure
443
+ # sock.close
444
+ # end
445
+ # }
446
+ #
447
+ # # Threaded echo server
448
+ # # It services multiple clients at a time.
449
+ # # Note that it may accept connections too much.
450
+ # Socket.tcp_server_loop(16807) {|sock, client_addrinfo|
451
+ # Thread.new {
452
+ # begin
453
+ # IO.copy_stream(sock, sock)
454
+ # ensure
455
+ # sock.close
456
+ # end
457
+ # }
458
+ # }
459
+ #
460
+ def self.tcp_server_loop(host=nil, port, &b) # :yield: socket, client_addrinfo
461
+ tcp_server_sockets(host, port) {|sockets|
462
+ accept_loop(sockets, &b)
463
+ }
464
+ end
465
+
466
+ # :call-seq:
467
+ # Socket.udp_server_sockets([host, ] port)
468
+ #
469
+ # Creates UDP/IP sockets for a UDP server.
470
+ #
471
+ # If no block given, it returns an array of sockets.
472
+ #
473
+ # If a block is given, the block is called with the sockets.
474
+ # The value of the block is returned.
475
+ # The sockets are closed when this method returns.
476
+ #
477
+ # If _port_ is zero, some port is choosen.
478
+ # But the choosen port is used for the all sockets.
479
+ #
480
+ # # UDP/IP echo server
481
+ # Socket.udp_server_sockets(0) {|sockets|
482
+ # p sockets.first.local_address.ip_port #=> 32963
483
+ # Socket.udp_server_loop_on(sockets) {|msg, msg_src|
484
+ # msg_src.reply msg
485
+ # }
486
+ # }
487
+ #
488
+ def self.udp_server_sockets(host=nil, port)
489
+ last_error = nil
490
+ sockets = []
491
+
492
+ ipv6_recvpktinfo = nil
493
+ if defined? Socket::AncillaryData
494
+ if defined? Socket::IPV6_RECVPKTINFO # RFC 3542
495
+ ipv6_recvpktinfo = Socket::IPV6_RECVPKTINFO
496
+ elsif defined? Socket::IPV6_PKTINFO # RFC 2292
497
+ ipv6_recvpktinfo = Socket::IPV6_PKTINFO
498
+ end
499
+ end
500
+
501
+ local_addrs = Socket.ip_address_list
502
+
503
+ ip_list = []
504
+ Addrinfo.foreach(host, port, nil, :DGRAM, nil, Socket::AI_PASSIVE) {|ai|
505
+ if ai.ipv4? && ai.ip_address == "0.0.0.0"
506
+ local_addrs.each {|a|
507
+ next if !a.ipv4?
508
+ ip_list << Addrinfo.new(a.to_sockaddr, :INET, :DGRAM, 0);
509
+ }
510
+ elsif ai.ipv6? && ai.ip_address == "::" && !ipv6_recvpktinfo
511
+ local_addrs.each {|a|
512
+ next if !a.ipv6?
513
+ ip_list << Addrinfo.new(a.to_sockaddr, :INET6, :DGRAM, 0);
514
+ }
515
+ else
516
+ ip_list << ai
517
+ end
518
+ }
519
+
520
+ if port == 0
521
+ sockets = ip_sockets_port0(ip_list, false)
522
+ else
523
+ ip_list.each {|ip|
524
+ ai = Addrinfo.udp(ip.ip_address, port)
525
+ begin
526
+ s = ai.bind
527
+ rescue SystemCallError
528
+ last_error = $!
529
+ next
530
+ end
531
+ sockets << s
532
+ }
533
+ if sockets.empty?
534
+ raise last_error
535
+ end
536
+ end
537
+
538
+ pktinfo_sockets = {}
539
+ sockets.each {|s|
540
+ ai = s.local_address
541
+ if ipv6_recvpktinfo && ai.ipv6? && ai.ip_address == "::"
542
+ s.setsockopt(:IPV6, ipv6_recvpktinfo, 1)
543
+ pktinfo_sockets[s] = true
544
+ end
545
+ }
546
+
547
+ if block_given?
548
+ begin
549
+ yield sockets
550
+ ensure
551
+ sockets.each {|s| s.close if !s.closed? } if sockets
552
+ end
553
+ else
554
+ sockets
555
+ end
556
+ end
557
+
558
+ # :call-seq:
559
+ # Socket.udp_server_recv(sockets) {|msg, msg_src| ... }
560
+ #
561
+ # Receive UDP/IP packets from the given _sockets_.
562
+ # For each packet received, the block is called.
563
+ #
564
+ # The block receives _msg_ and _msg_src_.
565
+ # _msg_ is a string which is the payload of the received packet.
566
+ # _msg_src_ is a Socket::UDPSource object which is used for reply.
567
+ #
568
+ # Socket.udp_server_loop can be implemented using this method as follows.
569
+ #
570
+ # udp_server_sockets(host, port) {|sockets|
571
+ # loop {
572
+ # readable, _, _ = IO.select(sockets)
573
+ # udp_server_recv(readable) {|msg, msg_src| ... }
574
+ # }
575
+ # }
576
+ #
577
+ def self.udp_server_recv(sockets)
578
+ sockets.each {|r|
579
+ begin
580
+ msg, sender_addrinfo, rflags, *controls = r.recvmsg_nonblock
581
+ rescue IO::WaitReadable
582
+ next
583
+ end
584
+ ai = r.local_address
585
+ if ai.ipv6? and pktinfo = controls.find {|c| c.cmsg_is?(:IPV6, :PKTINFO) }
586
+ ai = Addrinfo.udp(pktinfo.ipv6_pktinfo_addr.ip_address, ai.ip_port)
587
+ yield msg, UDPSource.new(sender_addrinfo, ai) {|reply_msg|
588
+ r.sendmsg reply_msg, 0, sender_addrinfo, pktinfo
589
+ }
590
+ else
591
+ yield msg, UDPSource.new(sender_addrinfo, ai) {|reply_msg|
592
+ r.send reply_msg, 0, sender_addrinfo
593
+ }
594
+ end
595
+ }
596
+ end
597
+
598
+ # :call-seq:
599
+ # Socket.udp_server_loop_on(sockets) {|msg, msg_src| ... }
600
+ #
601
+ # Run UDP/IP server loop on the given sockets.
602
+ #
603
+ # The return value of Socket.udp_server_sockets is appropriate for the argument.
604
+ #
605
+ # It calls the block for each message received.
606
+ #
607
+ def self.udp_server_loop_on(sockets, &b) # :yield: msg, msg_src
608
+ loop {
609
+ readable, _, _ = IO.select(sockets)
610
+ udp_server_recv(readable, &b)
611
+ }
612
+ end
613
+
614
+ # :call-seq:
615
+ # Socket.udp_server_loop(port) {|msg, msg_src| ... }
616
+ # Socket.udp_server_loop(host, port) {|msg, msg_src| ... }
617
+ #
618
+ # creates a UDP/IP server on _port_ and calls the block for each message arrived.
619
+ # The block is called with the message and its source information.
620
+ #
621
+ # This method allocates sockets internally using _port_.
622
+ # If _host_ is specified, it is used conjunction with _port_ to determine the server addresses.
623
+ #
624
+ # The _msg_ is a string.
625
+ #
626
+ # The _msg_src_ is a Socket::UDPSource object.
627
+ # It is used for reply.
628
+ #
629
+ # # UDP/IP echo server.
630
+ # Socket.udp_server_loop(9261) {|msg, msg_src|
631
+ # msg_src.reply msg
632
+ # }
633
+ #
634
+ def self.udp_server_loop(host=nil, port, &b) # :yield: message, message_source
635
+ udp_server_sockets(host, port) {|sockets|
636
+ udp_server_loop_on(sockets, &b)
637
+ }
638
+ end
639
+
640
+ # UDP/IP address information used by Socket.udp_server_loop.
641
+ class UDPSource
642
+ def initialize(remote_address, local_address, &reply_proc)
643
+ @remote_address = remote_address
644
+ @local_address = local_address
645
+ @reply_proc = reply_proc
646
+ end
647
+ attr_reader :remote_address, :local_address
648
+
649
+ def inspect
650
+ "\#<#{self.class}: #{@remote_address.inspect_sockaddr} to #{@local_address.inspect_sockaddr}>"
651
+ end
652
+
653
+ def reply(msg)
654
+ @reply_proc.call msg
655
+ end
656
+ end
657
+
658
+ # creates a new socket connected to path using UNIX socket socket.
659
+ #
660
+ # If a block is given, the block is called with the socket.
661
+ # The value of the block is returned.
662
+ # The socket is closed when this method returns.
663
+ #
664
+ # If no block is given, the socket is returned.
665
+ #
666
+ # # talk to /tmp/sock socket.
667
+ # Socket.unix("/tmp/sock") {|sock|
668
+ # t = Thread.new { IO.copy_stream(sock, STDOUT) }
669
+ # IO.copy_stream(STDIN, sock)
670
+ # t.join
671
+ # }
672
+ #
673
+ def self.unix(path) # :yield: socket
674
+ addr = Addrinfo.unix(path)
675
+ sock = addr.connect
676
+ if block_given?
677
+ begin
678
+ yield sock
679
+ ensure
680
+ sock.close if !sock.closed?
681
+ end
682
+ else
683
+ sock
684
+ end
685
+ end
686
+
687
+ # creates a UNIX server socket on _path_
688
+ #
689
+ # If no block given, it returns a listening socket.
690
+ #
691
+ # If a block is given, it is called with the socket and the block value is returned.
692
+ # When the block exits, the socket is closed and the socket file is removed.
693
+ #
694
+ # socket = Socket.unix_server_socket("/tmp/s")
695
+ # p socket #=> #<Socket:fd 3>
696
+ # p socket.local_address #=> #<Addrinfo: /tmp/s SOCK_STREAM>
697
+ #
698
+ # Socket.unix_server_socket("/tmp/sock") {|s|
699
+ # p s #=> #<Socket:fd 3>
700
+ # p s.local_address #=> # #<Addrinfo: /tmp/sock SOCK_STREAM>
701
+ # }
702
+ #
703
+ def self.unix_server_socket(path)
704
+ begin
705
+ st = File.lstat(path)
706
+ rescue Errno::ENOENT
707
+ end
708
+ if st && st.socket? && st.owned?
709
+ File.unlink path
710
+ end
711
+ s = Addrinfo.unix(path).listen
712
+ if block_given?
713
+ begin
714
+ yield s
715
+ ensure
716
+ s.close if !s.closed?
717
+ File.unlink path
718
+ end
719
+ else
720
+ s
721
+ end
722
+ end
723
+
724
+ # creates a UNIX socket server on _path_.
725
+ # It calls the block for each socket accepted.
726
+ #
727
+ # If _host_ is specified, it is used with _port_ to determine the server ports.
728
+ #
729
+ # The socket is *not* closed when the block returns.
730
+ # So application should close it.
731
+ #
732
+ # This method deletes the socket file pointed by _path_ at first if
733
+ # the file is a socket file and it is owned by the user of the application.
734
+ # This is safe only if the directory of _path_ is not changed by a malicious user.
735
+ # So don't use /tmp/malicious-users-directory/socket.
736
+ # Note that /tmp/socket and /tmp/your-private-directory/socket is safe assuming that /tmp has sticky bit.
737
+ #
738
+ # # Sequential echo server.
739
+ # # It services only one client at a time.
740
+ # Socket.unix_server_loop("/tmp/sock") {|sock, client_addrinfo|
741
+ # begin
742
+ # IO.copy_stream(sock, sock)
743
+ # ensure
744
+ # sock.close
745
+ # end
746
+ # }
747
+ #
748
+ def self.unix_server_loop(path, &b) # :yield: socket, client_addrinfo
749
+ unix_server_socket(path) {|serv|
750
+ accept_loop(serv, &b)
751
+ }
752
+ end
753
+
754
+ end
755
+