1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
|
require "spec"
require "socket"
require "../../spec_helper"
require "../../../support/ssl"
# TODO: Windows networking in the interpreter requires #12495
{% if flag?(:interpreted) && flag?(:win32) %}
pending OpenSSL::SSL::Server
{% skip_file %}
{% end %}
describe OpenSSL::SSL::Server do
it "sync_close" do
TCPServer.open(0) do |tcp_server|
context = OpenSSL::SSL::Context::Server.new
ssl_server = OpenSSL::SSL::Server.new(tcp_server, context)
ssl_server.close
tcp_server.closed?.should be_true
end
end
it "don't sync_close" do
TCPServer.open(0) do |tcp_server|
context = OpenSSL::SSL::Context::Server.new
ssl_server = OpenSSL::SSL::Server.new(tcp_server, context, sync_close: false)
ssl_server.context.should eq context
ssl_server.close
tcp_server.closed?.should be_false
end
end
it ".new" do
context = OpenSSL::SSL::Context::Server.new
TCPServer.open(0) do |tcp_server|
ssl_server = OpenSSL::SSL::Server.new tcp_server, context, sync_close: false
ssl_server.context.should eq context
ssl_server.wrapped.should eq tcp_server
ssl_server.sync_close?.should be_false
end
end
it ".open" do
context = OpenSSL::SSL::Context::Server.new
TCPServer.open(0) do |tcp_server|
ssl_server = nil
OpenSSL::SSL::Server.open tcp_server, context do |server|
server.wrapped.should eq tcp_server
ssl_server = server
end
ssl_server.try(&.closed?).should be_true
tcp_server.closed?.should be_true
end
end
describe "#accept?" do
it "accepts" do
tcp_server = TCPServer.new("127.0.0.1", 0)
server_context, client_context = ssl_context_pair
OpenSSL::SSL::Server.open tcp_server, server_context do |server|
spawn do
client = server.accept?
client.should be_a(OpenSSL::SSL::Socket::Server)
client = client.not_nil!
client.gets.should eq "Hello, SSL!"
client.puts "Hello back, SSL!"
client.close
end
OpenSSL::SSL::Socket::Client.open(TCPSocket.new(tcp_server.local_address.address, tcp_server.local_address.port), client_context) do |socket|
socket.puts "Hello, SSL!"
socket.flush
socket.gets.should eq "Hello back, SSL!"
end
end
end
end
describe "#accept" do
it "accepts and do handshake" do
tcp_server = TCPServer.new("127.0.0.1", 0)
server_context, client_context = ssl_context_pair
OpenSSL::SSL::Server.open tcp_server, server_context do |server|
spawn do
client = server.accept
client.gets.should eq "Hello, SSL!"
client.puts "Hello back, SSL!"
client.close
end
OpenSSL::SSL::Socket::Client.open(TCPSocket.new(tcp_server.local_address.address, tcp_server.local_address.port), client_context) do |socket|
socket.puts "Hello, SSL!"
socket.flush
socket.gets.should eq "Hello back, SSL!"
end
end
end
it "doesn't to SSL handshake with start_immediately = false" do
tcp_server = TCPServer.new("127.0.0.1", 0)
server_context, client_context = ssl_context_pair
OpenSSL::SSL::Server.open tcp_server, server_context do |server|
server.start_immediately = false
spawn do
client = server.accept
client.accept
client.gets.should eq "Hello, SSL!"
client.puts "Hello back, SSL!"
client.close
end
OpenSSL::SSL::Socket::Client.open(TCPSocket.new(tcp_server.local_address.address, tcp_server.local_address.port), client_context) do |socket|
socket.puts "Hello, SSL!"
socket.flush
socket.gets.should eq "Hello back, SSL!"
end
end
end
end
it "detects SNI hostname" do
tcp_server = TCPServer.new("127.0.0.1", 0)
server_context, client_context = ssl_context_pair
OpenSSL::SSL::Server.open tcp_server, server_context do |server|
spawn do
sleep 1.second
OpenSSL::SSL::Socket::Client.open(TCPSocket.new(tcp_server.local_address.address, tcp_server.local_address.port), client_context, hostname: "example.com") do |socket|
end
end
client = server.accept
client.hostname.should eq("example.com")
client.close
end
end
end
|