summaryrefslogtreecommitdiff
path: root/test/openssl/ssl_server.rb
diff options
context:
space:
mode:
authorgotoyuzo <gotoyuzo@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-05-26 18:14:27 +0000
committergotoyuzo <gotoyuzo@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-05-26 18:14:27 +0000
commit61949eefde17da5497fe28cbbe311e459073296f (patch)
tree5512c3a0f9f43631d4f71597f2557fde09a6f9bf /test/openssl/ssl_server.rb
parentfde5c3ff928fb42d30595f7e2a75bf7e123e5973 (diff)
* add test for OpenSSL::SSL.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@6412 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'test/openssl/ssl_server.rb')
-rw-r--r--test/openssl/ssl_server.rb78
1 files changed, 78 insertions, 0 deletions
diff --git a/test/openssl/ssl_server.rb b/test/openssl/ssl_server.rb
new file mode 100644
index 00000000000..53e520379bb
--- /dev/null
+++ b/test/openssl/ssl_server.rb
@@ -0,0 +1,78 @@
+require "socket"
+require "thread"
+require "openssl"
+require File.join(File.dirname(__FILE__), "utils.rb")
+
+def get_pem(io=$stdin)
+ buf = ""
+ while line = io.gets
+ if /^-----BEGIN / =~ line
+ buf << line
+ break
+ end
+ end
+ while line = io.gets
+ buf << line
+ if /^-----END / =~ line
+ break
+ end
+ end
+ return buf
+end
+
+def make_key(pem)
+ begin
+ return OpenSSL::PKey::RSA.new(pem)
+ rescue
+ return OpenSSL::PKey::DSA.new(pem)
+ end
+end
+
+ca_cert = OpenSSL::X509::Certificate.new(get_pem)
+ssl_cert = OpenSSL::X509::Certificate.new(get_pem)
+ssl_key = make_key(get_pem)
+port = Integer(ARGV.shift)
+verify_mode = Integer(ARGV.shift)
+start_immediately = (/yes/ =~ ARGV.shift)
+
+store = OpenSSL::X509::Store.new
+store.add_cert(ca_cert)
+store.purpose = OpenSSL::X509::PURPOSE_SSL_CLIENT
+ctx = OpenSSL::SSL::SSLContext.new
+ctx.cert_store = store
+#ctx.extra_chain_cert = [ ca_cert ]
+ctx.cert = ssl_cert
+ctx.key = ssl_key
+ctx.verify_mode = verify_mode
+
+Socket.do_not_reverse_lookup = true
+tcps = TCPServer.new("0.0.0.0", port)
+ssls = OpenSSL::SSL::SSLServer.new(tcps, ctx)
+ssls.start_immediately = start_immediately
+ssock = nil
+
+Thread.start{
+ while line = $stdin.gets
+ if /STARTTLS/ =~ line
+ ssock && ssock.accept
+ end
+ end
+ exit
+}
+
+$stdout.sync = true
+$stdout.puts Process.pid
+
+loop do
+ s = ssls.accept
+ ssock = s
+ Thread.start{
+ q = Queue.new
+ th = Thread.start{ s.write(q.shift) while true }
+ while line = s.gets
+ q.push(line)
+ end
+ th.kill
+ s.close unless s.closed?
+ }
+end