if __FILE__ == $0

  SSL_KEY = "spec/fixtures/certificates/key.pem"
  SSL_CERT = "spec/fixtures/certificates/client_cert.pem"
  SSL_CA_CERT = "spec/fixtures/certificates/ca_cert.pem"

  trap(:INT) do
    @server.shutdown
    exit
  end

  def webrick_opts port
    certificate = OpenSSL::X509::Certificate.new(File.read(SSL_CERT))
    cert_name = certificate.subject.to_a.collect{|a| a[0..1] }
    logger_stream = ENV["DEBUG"] ? $stderr : StringIO.new
    {
      Port: port,
      Host: "0.0.0.0",
      AccessLog: [],
      Logger: WEBrick::Log.new(logger_stream,WEBrick::Log::INFO),
      SSLVerifyClient: OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT | OpenSSL::SSL::VERIFY_PEER,
      SSLCACertificateFile: SSL_CA_CERT,
      SSLCertificate: certificate,
      SSLPrivateKey: OpenSSL::PKey::RSA.new(File.read(SSL_KEY)),
      SSLEnable: true,
      SSLCertName: cert_name,
    }
  end

  app = ->(_env) { puts "hello"; [200, {}, ["Hello world" + "\n"]] }

  require "webrick"
  require "webrick/https"
  require "rack"
  require "rackup/handler/webrick"

  opts = webrick_opts(4444)

  Rackup::Handler::WEBrick.run(app, **opts) do |server|
    @server = server
  end
end
