jruby-openssl 0.7.5.dev → 0.7.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (93) hide show
  1. data/History.txt +44 -14
  2. data/Manifest.txt +135 -80
  3. data/Rakefile +14 -6
  4. data/lib/{openssl.rb → 1.8/openssl.rb} +2 -11
  5. data/lib/{openssl → 1.8/openssl}/bn.rb +2 -2
  6. data/lib/{openssl → 1.8/openssl}/buffering.rb +3 -1
  7. data/lib/{openssl → 1.8/openssl}/cipher.rb +0 -0
  8. data/lib/{openssl → 1.8/openssl}/config.rb +1 -1
  9. data/lib/{openssl → 1.8/openssl}/digest.rb +2 -2
  10. data/lib/{openssl → 1.8/openssl}/pkcs7.rb +0 -0
  11. data/lib/{openssl/ssl.rb → 1.8/openssl/ssl-internal.rb} +2 -2
  12. data/lib/1.8/openssl/ssl.rb +1 -0
  13. data/lib/{openssl/x509.rb → 1.8/openssl/x509-internal.rb} +8 -9
  14. data/lib/1.8/openssl/x509.rb +1 -0
  15. data/lib/1.9/openssl.rb +22 -0
  16. data/lib/1.9/openssl/bn.rb +35 -0
  17. data/lib/1.9/openssl/buffering.rb +448 -0
  18. data/lib/1.9/openssl/cipher.rb +65 -0
  19. data/lib/1.9/openssl/config.rb +313 -0
  20. data/lib/1.9/openssl/digest.rb +72 -0
  21. data/lib/1.9/openssl/ssl-internal.rb +177 -0
  22. data/lib/1.9/openssl/ssl.rb +2 -0
  23. data/lib/1.9/openssl/x509-internal.rb +158 -0
  24. data/lib/1.9/openssl/x509.rb +2 -0
  25. data/lib/{jopenssl.jar → shared/jopenssl.jar} +0 -0
  26. data/lib/{jopenssl → shared/jopenssl}/version.rb +1 -1
  27. data/lib/shared/openssl.rb +18 -0
  28. data/lib/{openssl → shared/openssl}/dummy.rb +0 -0
  29. data/lib/{openssl → shared/openssl}/dummyssl.rb +0 -0
  30. data/lib/shared/openssl/ssl.rb +1 -0
  31. data/lib/shared/openssl/x509.rb +1 -0
  32. data/test/{openssl → 1.8}/ssl_server.rb +0 -0
  33. data/test/{openssl → 1.8}/test_asn1.rb +15 -0
  34. data/test/{openssl → 1.8}/test_cipher.rb +0 -0
  35. data/test/{openssl → 1.8}/test_config.rb +0 -0
  36. data/test/{openssl → 1.8}/test_digest.rb +0 -0
  37. data/test/{openssl → 1.8}/test_ec.rb +0 -0
  38. data/test/{openssl → 1.8}/test_hmac.rb +0 -0
  39. data/test/{openssl → 1.8}/test_ns_spki.rb +0 -0
  40. data/test/{openssl → 1.8}/test_pair.rb +10 -2
  41. data/test/{openssl → 1.8}/test_pkcs7.rb +0 -0
  42. data/test/{openssl → 1.8}/test_pkey_rsa.rb +0 -0
  43. data/test/{openssl → 1.8}/test_ssl.rb +17 -20
  44. data/test/{openssl → 1.8}/test_x509cert.rb +0 -0
  45. data/test/{openssl → 1.8}/test_x509crl.rb +0 -0
  46. data/test/{openssl → 1.8}/test_x509ext.rb +0 -0
  47. data/test/{openssl → 1.8}/test_x509name.rb +0 -0
  48. data/test/{openssl → 1.8}/test_x509req.rb +0 -0
  49. data/test/{openssl → 1.8}/test_x509store.rb +0 -0
  50. data/test/{openssl → 1.8}/utils.rb +0 -0
  51. data/test/1.9/ssl_server.rb +81 -0
  52. data/test/1.9/test_asn1.rb +589 -0
  53. data/test/1.9/test_bn.rb +23 -0
  54. data/test/1.9/test_buffering.rb +88 -0
  55. data/test/1.9/test_cipher.rb +107 -0
  56. data/test/1.9/test_config.rb +288 -0
  57. data/test/1.9/test_digest.rb +118 -0
  58. data/test/1.9/test_engine.rb +15 -0
  59. data/test/1.9/test_hmac.rb +32 -0
  60. data/test/1.9/test_ns_spki.rb +50 -0
  61. data/test/1.9/test_ocsp.rb +47 -0
  62. data/test/1.9/test_pair.rb +257 -0
  63. data/test/1.9/test_pkcs12.rb +209 -0
  64. data/test/1.9/test_pkcs7.rb +151 -0
  65. data/test/1.9/test_pkey_dh.rb +72 -0
  66. data/test/1.9/test_pkey_dsa.rb +224 -0
  67. data/test/1.9/test_pkey_ec.rb +182 -0
  68. data/test/1.9/test_pkey_rsa.rb +244 -0
  69. data/test/1.9/test_ssl.rb +455 -0
  70. data/test/1.9/test_ssl_session.rb +327 -0
  71. data/test/1.9/test_x509cert.rb +217 -0
  72. data/test/1.9/test_x509crl.rb +221 -0
  73. data/test/1.9/test_x509ext.rb +69 -0
  74. data/test/1.9/test_x509name.rb +296 -0
  75. data/test/1.9/test_x509req.rb +150 -0
  76. data/test/1.9/test_x509store.rb +229 -0
  77. data/test/1.9/utils.rb +304 -0
  78. data/test/fixture/purpose/ca/ca_config.rb +1 -1
  79. data/test/fixture/purpose/ca/gen_cert.rb +128 -0
  80. data/test/fixture/purpose/ca/newcerts/4_cert.pem +19 -0
  81. data/test/fixture/purpose/ca/serial +1 -1
  82. data/test/fixture/purpose/sslserver_no_dsig_in_keyUsage.pem +19 -0
  83. data/test/ruby/envutil.rb +208 -0
  84. data/test/ruby/ut_eof.rb +128 -0
  85. data/test/test_java.rb +1 -1
  86. data/test/test_openssl.rb +1 -1
  87. data/test/test_pkcs7.rb +16 -0
  88. data/test/test_pkey_dsa.rb +180 -0
  89. data/test/test_pkey_rsa.rb +298 -0
  90. data/test/test_ssl.rb +1 -1
  91. data/test/test_x509store.rb +8 -0
  92. metadata +121 -75
  93. data/test/test_pkey.rb +0 -204
@@ -11,9 +11,10 @@
11
11
  (See the file 'LICENCE'.)
12
12
 
13
13
  = Version
14
- $Id: buffering.rb 13706 2007-10-15 08:29:08Z usa $
14
+ $Id: buffering.rb 28004 2010-05-24 23:58:49Z shyouhei $
15
15
  =end
16
16
 
17
+ module OpenSSL
17
18
  module Buffering
18
19
  include Enumerable
19
20
  attr_accessor :sync
@@ -237,3 +238,4 @@ module Buffering
237
238
  sysclose
238
239
  end
239
240
  end
241
+ end
File without changes
@@ -284,7 +284,7 @@ module OpenSSL
284
284
  def each
285
285
  @data.each do |section, hash|
286
286
  hash.each do |key, value|
287
- yield [section, key, value]
287
+ yield(section, key, value)
288
288
  end
289
289
  end
290
290
  end
@@ -11,7 +11,7 @@
11
11
  (See the file 'LICENCE'.)
12
12
 
13
13
  = Version
14
- $Id: digest.rb 15600 2008-02-25 08:48:57Z technorama $
14
+ $Id: digest.rb 28004 2010-05-24 23:58:49Z shyouhei $
15
15
  =end
16
16
 
17
17
  ##
@@ -40,7 +40,7 @@ module OpenSSL
40
40
  super(name, data.first)
41
41
  }
42
42
  }
43
- singleton = (class <<klass; self; end)
43
+ singleton = (class << klass; self; end)
44
44
  singleton.class_eval{
45
45
  define_method(:digest){|data| Digest.digest(name, data) }
46
46
  define_method(:hexdigest){|data| Digest.hexdigest(name, data) }
File without changes
@@ -11,10 +11,9 @@
11
11
  (See the file 'LICENCE'.)
12
12
 
13
13
  = Version
14
- $Id: ssl.rb 16193 2008-04-25 06:51:21Z knu $
14
+ $Id$
15
15
  =end
16
16
 
17
- require "openssl"
18
17
  require "openssl/buffering"
19
18
  require "fcntl"
20
19
 
@@ -36,6 +35,7 @@ module OpenSSL
36
35
 
37
36
  def set_params(params={})
38
37
  params = DEFAULT_PARAMS.merge(params)
38
+ # ssl_version need to be set at first.
39
39
  self.ssl_version = params.delete(:ssl_version)
40
40
  params.each{|name, value| self.__send__("#{name}=", value) }
41
41
  if self.verify_mode != OpenSSL::SSL::VERIFY_NONE
@@ -0,0 +1 @@
1
+ require 'openssl'
@@ -11,11 +11,9 @@
11
11
  (See the file 'LICENCE'.)
12
12
 
13
13
  = Version
14
- $Id: x509.rb 11708 2007-02-12 23:01:19Z shyouhei $
14
+ $Id$
15
15
  =end
16
16
 
17
- require "openssl"
18
-
19
17
  module OpenSSL
20
18
  module X509
21
19
  class ExtensionFactory
@@ -28,7 +26,7 @@ module OpenSSL
28
26
  end
29
27
 
30
28
  def create_ext_from_array(ary)
31
- raise ExtensionError, "unexpected array form" if ary.size > 3
29
+ raise ExtensionError, "unexpected array form" if ary.size > 3
32
30
  create_ext(ary[0], ary[1], ary[2])
33
31
  end
34
32
 
@@ -38,12 +36,12 @@ module OpenSSL
38
36
  value.strip!
39
37
  create_ext(oid, value)
40
38
  end
41
-
39
+
42
40
  def create_ext_from_hash(hash)
43
41
  create_ext(hash["oid"], hash["value"], hash["critical"])
44
42
  end
45
43
  end
46
-
44
+
47
45
  class Extension
48
46
  def to_s # "oid = critical, value"
49
47
  str = self.oid
@@ -51,7 +49,7 @@ module OpenSSL
51
49
  str << "critical, " if self.critical?
52
50
  str << self.value.gsub(/\n/, ", ")
53
51
  end
54
-
52
+
55
53
  def to_h # {"oid"=>sn|ln, "value"=>value, "critical"=>true|false}
56
54
  {"oid"=>self.oid,"value"=>self.value,"critical"=>self.critical?}
57
55
  end
@@ -82,7 +80,8 @@ module OpenSSL
82
80
 
83
81
  def expand_pair(str)
84
82
  return nil unless str
85
- return str.gsub(Pair){|pair|
83
+ return str.gsub(Pair){
84
+ pair = $&
86
85
  case pair.size
87
86
  when 2 then pair[1,1]
88
87
  when 3 then Integer("0x#{pair[1,2]}").chr
@@ -93,7 +92,7 @@ module OpenSSL
93
92
 
94
93
  def expand_hexstring(str)
95
94
  return nil unless str
96
- der = str.gsub(HexPair){|hex| Integer("0x#{hex}").chr }
95
+ der = str.gsub(HexPair){$&.to_i(16).chr }
97
96
  a1 = OpenSSL::ASN1.decode(der)
98
97
  return a1.value, a1.tag
99
98
  end
@@ -0,0 +1 @@
1
+ require 'openssl'
@@ -0,0 +1,22 @@
1
+ =begin
2
+ = $RCSfile$ -- Loader for all OpenSSL C-space and Ruby-space definitions
3
+
4
+ = Info
5
+ 'OpenSSL for Ruby 2' project
6
+ Copyright (C) 2002 Michal Rokos <m.rokos@sh.cvut.cz>
7
+ All rights reserved.
8
+
9
+ = Licence
10
+ This program is licenced under the same licence as Ruby.
11
+ (See the file 'LICENCE'.)
12
+
13
+ = Version
14
+ $Id$
15
+ =end
16
+
17
+ require 'openssl/bn'
18
+ require 'openssl/cipher'
19
+ require 'openssl/config'
20
+ require 'openssl/digest'
21
+ require 'openssl/ssl-internal'
22
+ require 'openssl/x509-internal'
@@ -0,0 +1,35 @@
1
+ #--
2
+ #
3
+ # $RCSfile$
4
+ #
5
+ # = Ruby-space definitions that completes C-space funcs for BN
6
+ #
7
+ # = Info
8
+ # 'OpenSSL for Ruby 2' project
9
+ # Copyright (C) 2002 Michal Rokos <m.rokos@sh.cvut.cz>
10
+ # All rights reserved.
11
+ #
12
+ # = Licence
13
+ # This program is licenced under the same licence as Ruby.
14
+ # (See the file 'LICENCE'.)
15
+ #
16
+ # = Version
17
+ # $Id: bn.rb 33067 2011-08-25 00:52:10Z drbrain $
18
+ #
19
+ #++
20
+
21
+ module OpenSSL
22
+ class BN
23
+ include Comparable
24
+ end # BN
25
+ end # OpenSSL
26
+
27
+ ##
28
+ # Add double dispatch to Integer
29
+ #
30
+ class Integer
31
+ def to_bn
32
+ OpenSSL::BN::new(self.to_s(16), 16)
33
+ end
34
+ end # Integer
35
+
@@ -0,0 +1,448 @@
1
+ =begin
2
+ = $RCSfile$ -- Buffering mix-in module.
3
+
4
+ = Info
5
+ 'OpenSSL for Ruby 2' project
6
+ Copyright (C) 2001 GOTOU YUUZOU <gotoyuzo@notwork.org>
7
+ All rights reserved.
8
+
9
+ = Licence
10
+ This program is licenced under the same licence as Ruby.
11
+ (See the file 'LICENCE'.)
12
+
13
+ = Version
14
+ $Id: buffering.rb 32012 2011-06-11 14:07:42Z nahi $
15
+ =end
16
+
17
+ ##
18
+ # OpenSSL IO buffering mix-in module.
19
+ #
20
+ # This module allows an OpenSSL::SSL::SSLSocket to behave like an IO.
21
+
22
+ module OpenSSL::Buffering
23
+ include Enumerable
24
+
25
+ ##
26
+ # The "sync mode" of the SSLSocket.
27
+ #
28
+ # See IO#sync for full details.
29
+
30
+ attr_accessor :sync
31
+
32
+ ##
33
+ # Default size to read from or write to the SSLSocket for buffer operations.
34
+
35
+ BLOCK_SIZE = 1024*16
36
+
37
+ def initialize(*args)
38
+ @eof = false
39
+ @rbuffer = ""
40
+ @sync = @io.sync
41
+ end
42
+
43
+ #
44
+ # for reading.
45
+ #
46
+ private
47
+
48
+ ##
49
+ # Fills the buffer from the underlying SSLSocket
50
+
51
+ def fill_rbuff
52
+ begin
53
+ @rbuffer << self.sysread(BLOCK_SIZE)
54
+ rescue Errno::EAGAIN
55
+ retry
56
+ rescue EOFError
57
+ @eof = true
58
+ end
59
+ end
60
+
61
+ ##
62
+ # Consumes +size+ bytes from the buffer
63
+
64
+ def consume_rbuff(size=nil)
65
+ if @rbuffer.empty?
66
+ nil
67
+ else
68
+ size = @rbuffer.size unless size
69
+ ret = @rbuffer[0, size]
70
+ @rbuffer[0, size] = ""
71
+ ret
72
+ end
73
+ end
74
+
75
+ public
76
+
77
+ ##
78
+ # Reads +size+ bytes from the stream. If +buf+ is provided it must
79
+ # reference a string which will receive the data.
80
+ #
81
+ # See IO#read for full details.
82
+
83
+ def read(size=nil, buf=nil)
84
+ if size == 0
85
+ if buf
86
+ buf.clear
87
+ return buf
88
+ else
89
+ return ""
90
+ end
91
+ end
92
+ until @eof
93
+ break if size && size <= @rbuffer.size
94
+ fill_rbuff
95
+ end
96
+ ret = consume_rbuff(size) || ""
97
+ if buf
98
+ buf.replace(ret)
99
+ ret = buf
100
+ end
101
+ (size && ret.empty?) ? nil : ret
102
+ end
103
+
104
+ ##
105
+ # Reads at most +maxlen+ bytes from the stream. If +buf+ is provided it
106
+ # must reference a string which will receive the data.
107
+ #
108
+ # See IO#readpartial for full details.
109
+
110
+ def readpartial(maxlen, buf=nil)
111
+ if maxlen == 0
112
+ if buf
113
+ buf.clear
114
+ return buf
115
+ else
116
+ return ""
117
+ end
118
+ end
119
+ if @rbuffer.empty?
120
+ begin
121
+ return sysread(maxlen, buf)
122
+ rescue Errno::EAGAIN
123
+ retry
124
+ end
125
+ end
126
+ ret = consume_rbuff(maxlen)
127
+ if buf
128
+ buf.replace(ret)
129
+ ret = buf
130
+ end
131
+ raise EOFError if ret.empty?
132
+ ret
133
+ end
134
+
135
+ ##
136
+ # Reads at most +maxlen+ bytes in the non-blocking manner.
137
+ #
138
+ # When no data can be read without blocking it raises
139
+ # OpenSSL::SSL::SSLError extended by IO::WaitReadable or IO::WaitWritable.
140
+ #
141
+ # IO::WaitReadable means SSL needs to read internally so read_nonblock
142
+ # should be called again when the underlying IO is readable.
143
+ #
144
+ # IO::WaitWritable means SSL needs to write internally so read_nonblock
145
+ # should be called again after the underlying IO is writable.
146
+ #
147
+ # OpenSSL::Buffering#read_nonblock needs two rescue clause as follows:
148
+ #
149
+ # # emulates blocking read (readpartial).
150
+ # begin
151
+ # result = ssl.read_nonblock(maxlen)
152
+ # rescue IO::WaitReadable
153
+ # IO.select([io])
154
+ # retry
155
+ # rescue IO::WaitWritable
156
+ # IO.select(nil, [io])
157
+ # retry
158
+ # end
159
+ #
160
+ # Note that one reason that read_nonblock writes to the underlying IO is
161
+ # when the peer requests a new TLS/SSL handshake. See openssl the FAQ for
162
+ # more details. http://www.openssl.org/support/faq.html
163
+
164
+ def read_nonblock(maxlen, buf=nil)
165
+ if maxlen == 0
166
+ if buf
167
+ buf.clear
168
+ return buf
169
+ else
170
+ return ""
171
+ end
172
+ end
173
+ if @rbuffer.empty?
174
+ return sysread_nonblock(maxlen, buf)
175
+ end
176
+ ret = consume_rbuff(maxlen)
177
+ if buf
178
+ buf.replace(ret)
179
+ ret = buf
180
+ end
181
+ raise EOFError if ret.empty?
182
+ ret
183
+ end
184
+
185
+ ##
186
+ # Reads the next "line+ from the stream. Lines are separated by +eol+. If
187
+ # +limit+ is provided the result will not be longer than the given number of
188
+ # bytes.
189
+ #
190
+ # +eol+ may be a String or Regexp.
191
+ #
192
+ # Unlike IO#gets the line read will not be assigned to +$_+.
193
+ #
194
+ # Unlike IO#gets the separator must be provided if a limit is provided.
195
+
196
+ def gets(eol=$/, limit=nil)
197
+ idx = @rbuffer.index(eol)
198
+ until @eof
199
+ break if idx
200
+ fill_rbuff
201
+ idx = @rbuffer.index(eol)
202
+ end
203
+ if eol.is_a?(Regexp)
204
+ size = idx ? idx+$&.size : nil
205
+ else
206
+ size = idx ? idx+eol.size : nil
207
+ end
208
+ if limit and limit >= 0
209
+ size = [size, limit].min
210
+ end
211
+ consume_rbuff(size)
212
+ end
213
+
214
+ ##
215
+ # Executes the block for every line in the stream where lines are separated
216
+ # by +eol+.
217
+ #
218
+ # See also #gets
219
+
220
+ def each(eol=$/)
221
+ while line = self.gets(eol)
222
+ yield line
223
+ end
224
+ end
225
+ alias each_line each
226
+
227
+ ##
228
+ # Reads lines from the stream which are separated by +eol+.
229
+ #
230
+ # See also #gets
231
+
232
+ def readlines(eol=$/)
233
+ ary = []
234
+ while line = self.gets(eol)
235
+ ary << line
236
+ end
237
+ ary
238
+ end
239
+
240
+ ##
241
+ # Reads a line from the stream which is separated by +eol+.
242
+ #
243
+ # Raises EOFError if at end of file.
244
+
245
+ def readline(eol=$/)
246
+ raise EOFError if eof?
247
+ gets(eol)
248
+ end
249
+
250
+ ##
251
+ # Reads one character from the stream. Returns nil if called at end of
252
+ # file.
253
+
254
+ def getc
255
+ read(1)
256
+ end
257
+
258
+ ##
259
+ # Calls the given block once for each byte in the stream.
260
+
261
+ def each_byte # :yields: byte
262
+ while c = getc
263
+ yield(c.ord)
264
+ end
265
+ end
266
+
267
+ ##
268
+ # Reads a one-character string from the stream. Raises an EOFError at end
269
+ # of file.
270
+
271
+ def readchar
272
+ raise EOFError if eof?
273
+ getc
274
+ end
275
+
276
+ ##
277
+ # Pushes character +c+ back onto the stream such that a subsequent buffered
278
+ # character read will return it.
279
+ #
280
+ # Unlike IO#getc multiple bytes may be pushed back onto the stream.
281
+ #
282
+ # Has no effect on unbuffered reads (such as #sysread).
283
+
284
+ def ungetc(c)
285
+ @rbuffer[0,0] = c.chr
286
+ end
287
+
288
+ ##
289
+ # Returns true if the stream is at file which means there is no more data to
290
+ # be read.
291
+
292
+ def eof?
293
+ fill_rbuff if !@eof && @rbuffer.empty?
294
+ @eof && @rbuffer.empty?
295
+ end
296
+ alias eof eof?
297
+
298
+ #
299
+ # for writing.
300
+ #
301
+ private
302
+
303
+ ##
304
+ # Writes +s+ to the buffer. When the buffer is full or #sync is true the
305
+ # buffer is flushed to the underlying socket.
306
+
307
+ def do_write(s)
308
+ @wbuffer = "" unless defined? @wbuffer
309
+ @wbuffer << s
310
+ @sync ||= false
311
+ if @sync or @wbuffer.size > BLOCK_SIZE or idx = @wbuffer.rindex($/)
312
+ remain = idx ? idx + $/.size : @wbuffer.length
313
+ nwritten = 0
314
+ while remain > 0
315
+ str = @wbuffer[nwritten,remain]
316
+ begin
317
+ nwrote = syswrite(str)
318
+ rescue Errno::EAGAIN
319
+ retry
320
+ end
321
+ remain -= nwrote
322
+ nwritten += nwrote
323
+ end
324
+ @wbuffer[0,nwritten] = ""
325
+ end
326
+ end
327
+
328
+ public
329
+
330
+ ##
331
+ # Writes +s+ to the stream. If the argument is not a string it will be
332
+ # converted using String#to_s. Returns the number of bytes written.
333
+
334
+ def write(s)
335
+ do_write(s)
336
+ s.length
337
+ end
338
+
339
+ ##
340
+ # Writes +str+ in the non-blocking manner.
341
+ #
342
+ # If there is buffered data, it is flushed first. This may block.
343
+ #
344
+ # write_nonblock returns number of bytes written to the SSL connection.
345
+ #
346
+ # When no data can be written without blocking it raises
347
+ # OpenSSL::SSL::SSLError extended by IO::WaitReadable or IO::WaitWritable.
348
+ #
349
+ # IO::WaitReadable means SSL needs to read internally so write_nonblock
350
+ # should be called again after the underlying IO is readable.
351
+ #
352
+ # IO::WaitWritable means SSL needs to write internally so write_nonblock
353
+ # should be called again after underlying IO is writable.
354
+ #
355
+ # So OpenSSL::Buffering#write_nonblock needs two rescue clause as follows.
356
+ #
357
+ # # emulates blocking write.
358
+ # begin
359
+ # result = ssl.write_nonblock(str)
360
+ # rescue IO::WaitReadable
361
+ # IO.select([io])
362
+ # retry
363
+ # rescue IO::WaitWritable
364
+ # IO.select(nil, [io])
365
+ # retry
366
+ # end
367
+ #
368
+ # Note that one reason that write_nonblock reads from the underlying IO
369
+ # is when the peer requests a new TLS/SSL handshake. See the openssl FAQ
370
+ # for more details. http://www.openssl.org/support/faq.html
371
+
372
+ def write_nonblock(s)
373
+ flush
374
+ syswrite_nonblock(s)
375
+ end
376
+
377
+ ##
378
+ # Writes +s+ to the stream. +s+ will be converted to a String using
379
+ # String#to_s.
380
+
381
+ def << (s)
382
+ do_write(s)
383
+ self
384
+ end
385
+
386
+ ##
387
+ # Writes +args+ to the stream along with a record separator.
388
+ #
389
+ # See IO#puts for full details.
390
+
391
+ def puts(*args)
392
+ s = ""
393
+ if args.empty?
394
+ s << "\n"
395
+ end
396
+ args.each{|arg|
397
+ s << arg.to_s
398
+ if $/ && /\n\z/ !~ s
399
+ s << "\n"
400
+ end
401
+ }
402
+ do_write(s)
403
+ nil
404
+ end
405
+
406
+ ##
407
+ # Writes +args+ to the stream.
408
+ #
409
+ # See IO#print for full details.
410
+
411
+ def print(*args)
412
+ s = ""
413
+ args.each{ |arg| s << arg.to_s }
414
+ do_write(s)
415
+ nil
416
+ end
417
+
418
+ ##
419
+ # Formats and writes to the stream converting parameters under control of
420
+ # the format string.
421
+ #
422
+ # See Kernel#sprintf for format string details.
423
+
424
+ def printf(s, *args)
425
+ do_write(s % args)
426
+ nil
427
+ end
428
+
429
+ ##
430
+ # Flushes buffered data to the SSLSocket.
431
+
432
+ def flush
433
+ osync = @sync
434
+ @sync = true
435
+ do_write ""
436
+ return self
437
+ ensure
438
+ @sync = osync
439
+ end
440
+
441
+ ##
442
+ # Closes the SSLSocket and flushes any unwritten data.
443
+
444
+ def close
445
+ flush rescue nil
446
+ sysclose
447
+ end
448
+ end