Sha256: 5924988630ffbfdcb8c33aa630be132a96d62892c3aec8bf416a1b7cca000980

Contents?: true

Size: 1.86 KB

Versions: 22

Compression:

Stored size: 1.86 KB

Contents

require 'openssl'
require 'socket'
require 'thread'

# NOTE: This code is garbage.  It probably has deadlocks, it might leak
# threads, and otherwise cause problems in a real system.  It's really only
# intended for testing HTTParty.
class SSLTestServer
  attr_accessor :ctx    # SSLContext object
  attr_reader :port

  def initialize(options = {})
    @ctx             = OpenSSL::SSL::SSLContext.new
    @ctx.cert        = OpenSSL::X509::Certificate.new(options[:cert])
    @ctx.key         = OpenSSL::PKey::RSA.new(options[:rsa_key])
    @ctx.verify_mode = OpenSSL::SSL::VERIFY_NONE   # Don't verify client certificate
    @port            = options[:port] || 0
    @thread          = nil
    @stopping_mutex  = Mutex.new
    @stopping        = false
  end

  def start
    @raw_server = TCPServer.new(@port)

    if @port == 0
      @port = Socket.getnameinfo(@raw_server.getsockname, Socket::NI_NUMERICHOST | Socket::NI_NUMERICSERV)[1].to_i
    end

    @ssl_server = OpenSSL::SSL::SSLServer.new(@raw_server, @ctx)

    @stopping_mutex.synchronize {
      return if @stopping
      @thread = Thread.new { thread_main }
    }

    nil
  end

  def stop
    @stopping_mutex.synchronize {
      return if @stopping
      @stopping = true
    }
    @thread.join
  end

  private

  def thread_main
    until @stopping_mutex.synchronize { @stopping }
      (rr, _, _) = select([@ssl_server.to_io], nil, nil, 0.1)

      next unless rr && rr.include?(@ssl_server.to_io)

      socket = @ssl_server.accept

      Thread.new {
        header = []

        until (line = socket.readline).rstrip.empty?
          header << line
        end

        response = <<EOF
HTTP/1.1 200 OK
Connection: close
Content-Type: application/json; charset=UTF-8

{"success":true}
EOF

        socket.write(response.gsub(/\r\n/n, "\n").gsub(/\n/n, "\r\n"))
        socket.close
      }
    end

    @ssl_server.close
  end
end

Version data entries

22 entries across 21 versions & 3 rubygems

Version Path
httparty-0.17.0 spec/support/ssl_test_server.rb
httparty-0.16.4 spec/support/ssl_test_server.rb
httparty-0.16.3 spec/support/ssl_test_server.rb
httparty-0.16.2 spec/support/ssl_test_server.rb
httparty-0.16.1 spec/support/ssl_test_server.rb
httparty-0.16.0 spec/support/ssl_test_server.rb
httparty-0.15.7 spec/support/ssl_test_server.rb
httparty-0.15.6 spec/support/ssl_test_server.rb
httparty-0.15.5 spec/support/ssl_test_server.rb
httparty-0.15.4 spec/support/ssl_test_server.rb
httparty-0.15.3 spec/support/ssl_test_server.rb
httparty-0.15.2 spec/support/ssl_test_server.rb
httparty-0.15.1 spec/support/ssl_test_server.rb
httparty-0.15.0 spec/support/ssl_test_server.rb
httparty-0.14.0 spec/support/ssl_test_server.rb
simplenet-client-0.2.0 ./vendor/bundle/ruby/2.0.0/gems/httparty-0.13.7/spec/support/ssl_test_server.rb
simplenet-client-0.2.0 ./vendor/bundle/ruby/1.9.1/gems/httparty-0.13.7/spec/support/ssl_test_server.rb
httparty-0.13.7 spec/support/ssl_test_server.rb
httparty-0.13.6 spec/support/ssl_test_server.rb
httpserious-0.13.5.lstoll1 spec/support/ssl_test_server.rb