eventmachine 0.12.6-x86-mswin32-60 → 0.12.8-x86-mswin32-60

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. data/{docs/README → README} +21 -13
  2. data/Rakefile +14 -4
  3. data/docs/DEFERRABLES +0 -5
  4. data/docs/INSTALL +2 -4
  5. data/docs/LEGAL +1 -1
  6. data/docs/LIGHTWEIGHT_CONCURRENCY +0 -2
  7. data/docs/PURE_RUBY +0 -2
  8. data/docs/RELEASE_NOTES +0 -2
  9. data/docs/SMTP +0 -7
  10. data/docs/SPAWNED_PROCESSES +0 -4
  11. data/docs/TODO +0 -2
  12. data/eventmachine.gemspec +41 -32
  13. data/examples/ex_channel.rb +43 -0
  14. data/examples/ex_queue.rb +2 -0
  15. data/examples/helper.rb +2 -0
  16. data/ext/cmain.cpp +685 -586
  17. data/ext/cplusplus.cpp +15 -6
  18. data/ext/ed.cpp +1732 -1522
  19. data/ext/ed.h +407 -380
  20. data/ext/em.cpp +2263 -1937
  21. data/ext/em.h +223 -186
  22. data/ext/eventmachine.h +111 -98
  23. data/ext/eventmachine_cpp.h +1 -0
  24. data/ext/extconf.rb +4 -0
  25. data/ext/kb.cpp +81 -82
  26. data/ext/pipe.cpp +349 -351
  27. data/ext/project.h +21 -0
  28. data/ext/rubymain.cpp +1047 -847
  29. data/ext/ssl.cpp +38 -1
  30. data/ext/ssl.h +5 -1
  31. data/java/src/com/rubyeventmachine/Application.java +7 -3
  32. data/java/src/com/rubyeventmachine/EmReactor.java +16 -1
  33. data/java/src/com/rubyeventmachine/tests/ConnectTest.java +25 -3
  34. data/lib/{protocols → em}/buftok.rb +16 -5
  35. data/lib/em/callback.rb +26 -0
  36. data/lib/em/channel.rb +57 -0
  37. data/lib/em/connection.rb +505 -0
  38. data/lib/em/deferrable.rb +144 -165
  39. data/lib/em/file_watch.rb +54 -0
  40. data/lib/em/future.rb +24 -25
  41. data/lib/em/messages.rb +1 -1
  42. data/lib/em/process_watch.rb +44 -0
  43. data/lib/em/processes.rb +119 -113
  44. data/lib/em/protocols.rb +35 -0
  45. data/lib/em/protocols/header_and_content.rb +138 -0
  46. data/lib/em/protocols/httpclient.rb +263 -0
  47. data/lib/em/protocols/httpclient2.rb +582 -0
  48. data/lib/{protocols → em/protocols}/line_and_text.rb +2 -2
  49. data/lib/em/protocols/linetext2.rb +160 -0
  50. data/lib/{protocols → em/protocols}/memcache.rb +37 -7
  51. data/lib/em/protocols/object_protocol.rb +39 -0
  52. data/lib/em/protocols/postgres3.rb +247 -0
  53. data/lib/em/protocols/saslauth.rb +175 -0
  54. data/lib/em/protocols/smtpclient.rb +331 -0
  55. data/lib/em/protocols/smtpserver.rb +547 -0
  56. data/lib/em/protocols/stomp.rb +200 -0
  57. data/lib/{protocols → em/protocols}/tcptest.rb +21 -25
  58. data/lib/em/queue.rb +61 -0
  59. data/lib/em/spawnable.rb +53 -56
  60. data/lib/em/streamer.rb +92 -74
  61. data/lib/em/timers.rb +55 -0
  62. data/lib/em/version.rb +3 -0
  63. data/lib/eventmachine.rb +1636 -1926
  64. data/lib/evma.rb +1 -1
  65. data/lib/jeventmachine.rb +106 -101
  66. data/lib/pr_eventmachine.rb +47 -36
  67. data/tasks/project.rake +2 -1
  68. data/tests/client.crt +31 -0
  69. data/tests/client.key +51 -0
  70. data/tests/test_attach.rb +18 -0
  71. data/tests/test_basic.rb +285 -231
  72. data/tests/test_channel.rb +63 -0
  73. data/tests/test_connection_count.rb +2 -2
  74. data/tests/test_epoll.rb +162 -163
  75. data/tests/test_errors.rb +36 -36
  76. data/tests/test_exc.rb +22 -25
  77. data/tests/test_file_watch.rb +49 -0
  78. data/tests/test_futures.rb +77 -93
  79. data/tests/test_hc.rb +2 -2
  80. data/tests/test_httpclient.rb +55 -52
  81. data/tests/test_httpclient2.rb +153 -155
  82. data/tests/test_inactivity_timeout.rb +30 -0
  83. data/tests/test_kb.rb +8 -9
  84. data/tests/test_ltp2.rb +274 -277
  85. data/tests/test_next_tick.rb +135 -109
  86. data/tests/test_object_protocol.rb +37 -0
  87. data/tests/test_process_watch.rb +48 -0
  88. data/tests/test_processes.rb +128 -95
  89. data/tests/test_proxy_connection.rb +92 -0
  90. data/tests/test_pure.rb +1 -5
  91. data/tests/test_queue.rb +44 -0
  92. data/tests/test_running.rb +9 -14
  93. data/tests/test_sasl.rb +32 -34
  94. data/tests/test_send_file.rb +175 -176
  95. data/tests/test_servers.rb +37 -41
  96. data/tests/test_smtpserver.rb +47 -55
  97. data/tests/test_spawn.rb +284 -291
  98. data/tests/test_ssl_args.rb +1 -1
  99. data/tests/test_ssl_methods.rb +1 -1
  100. data/tests/test_ssl_verify.rb +82 -0
  101. data/tests/test_timers.rb +81 -88
  102. data/tests/test_ud.rb +0 -7
  103. data/tests/testem.rb +1 -1
  104. metadata +52 -36
  105. data/lib/em/eventable.rb +0 -39
  106. data/lib/eventmachine_version.rb +0 -31
  107. data/lib/protocols/header_and_content.rb +0 -129
  108. data/lib/protocols/httpcli2.rb +0 -803
  109. data/lib/protocols/httpclient.rb +0 -270
  110. data/lib/protocols/linetext2.rb +0 -161
  111. data/lib/protocols/postgres.rb +0 -261
  112. data/lib/protocols/saslauth.rb +0 -179
  113. data/lib/protocols/smtpclient.rb +0 -308
  114. data/lib/protocols/smtpserver.rb +0 -556
  115. data/lib/protocols/stomp.rb +0 -153
  116. data/tests/test_eventables.rb +0 -77
data/lib/evma.rb CHANGED
@@ -1,4 +1,4 @@
1
- # $Id$
1
+ #--
2
2
  #
3
3
  # Author:: Francis Cianfrocca (gmail: blackhedd)
4
4
  # Homepage:: http://rubyeventmachine.com
data/lib/jeventmachine.rb CHANGED
@@ -1,4 +1,4 @@
1
- # $Id$
1
+ #--
2
2
  #
3
3
  # Author:: Francis Cianfrocca (gmail: blackhedd)
4
4
  # Homepage:: http://rubyeventmachine.com
@@ -23,7 +23,6 @@
23
23
  #
24
24
  #
25
25
 
26
-
27
26
  # This module provides "glue" for the Java version of the EventMachine reactor core.
28
27
  # For C++ EventMachines, the analogous functionality is found in ext/rubymain.cpp,
29
28
  # which is a garden-variety Ruby-extension glue module.
@@ -32,106 +31,112 @@ require 'java'
32
31
  require 'em_reactor'
33
32
 
34
33
  module EventMachine
35
- # TODO: These event numbers are defined in way too many places.
36
- # DRY them up.
37
- TimerFired = 100
38
- ConnectionData = 101
39
- ConnectionUnbound = 102
40
- ConnectionAccepted = 103
41
- ConnectionCompleted = 104
42
- LoopbreakSignalled = 105
34
+ # TODO: These event numbers are defined in way too many places.
35
+ # DRY them up.
36
+ TimerFired = 100
37
+ ConnectionData = 101
38
+ ConnectionUnbound = 102
39
+ ConnectionAccepted = 103
40
+ ConnectionCompleted = 104
41
+ LoopbreakSignalled = 105
43
42
 
44
- # This thunk class used to be called EM, but that caused conflicts with
45
- # the alias "EM" for module EventMachine. (FC, 20Jun08)
46
- class JEM < com.rubyeventmachine.EmReactor
47
- def eventCallback a1, a2, a3
48
- s = String.from_java_bytes(a3.array[a3.position...a3.limit])
49
- EventMachine::event_callback a1, a2, s
50
- end
51
- end
52
- class Connection < com.rubyeventmachine.Connection
53
- def associate_callback_target sig
54
- # No-op for the time being.
55
- end
56
- end
57
- def self.initialize_event_machine
58
- @em = JEM.new
59
- end
60
- def self.release_machine
61
- @em = nil
62
- end
63
- def self.add_oneshot_timer interval
64
- @em.installOneshotTimer interval
65
- end
66
- def self.run_machine
67
- @em.run
68
- end
69
- def self.stop
70
- @em.stop
71
- end
72
- def self.start_tcp_server server, port
73
- @em.startTcpServer server, port
74
- end
75
- def self.stop_tcp_server sig
76
- @em.stopTcpServer sig
77
- end
78
- def self.start_unix_server filename
79
- # TEMPORARILY unsupported until someone figures out how to do it.
80
- raise "unsupported on this platform"
81
- end
82
- def self.send_data sig, data, length
83
- @em.sendData sig, data.to_java_bytes
84
- end
85
- def self.send_datagram sig, data, length, address, port
86
- @em.sendDatagram sig, data, length, address, port
87
- end
88
- def self.connect_server server, port
89
- @em.connectTcpServer server, port
90
- end
91
- def self.close_connection sig, after_writing
92
- @em.closeConnection sig, after_writing
93
- end
94
- def self.set_comm_inactivity_timeout sig, interval
95
- @em.setCommInactivityTimeout sig, interval
96
- end
97
- def self.start_tls sig
98
- @em.startTls sig
99
- end
100
- def self.signal_loopbreak
101
- @em.signalLoopbreak
102
- end
103
- def self.set_timer_quantum q
104
- @em.setTimerQuantum q
105
- end
106
- def self.epoll
107
- # Epoll is a no-op for Java.
108
- # The latest Java versions run epoll when possible in NIO.
109
- end
110
- def self.set_rlimit_nofile n_descriptors
111
- # Currently a no-op for Java.
112
- end
113
- def self.open_udp_socket server, port
114
- @em.openUdpSocket server, port
115
- end
116
- def self.invoke_popen cmd
117
- # TEMPORARILY unsupported until someone figures out how to do it.
118
- raise "unsupported on this platform"
119
- end
120
- def self.read_keyboard
121
- # TEMPORARILY unsupported until someone figures out how to do it.
122
- raise "temporarily unsupported on this platform"
123
- end
124
- def self.set_max_timer_count num
125
- # harmless no-op in Java. There's no built-in timer limit.
126
- end
127
- def self.library_type
128
- :java
129
- end
43
+ # This thunk class used to be called EM, but that caused conflicts with
44
+ # the alias "EM" for module EventMachine. (FC, 20Jun08)
45
+ class JEM < com.rubyeventmachine.EmReactor
46
+ def eventCallback a1, a2, a3
47
+ s = String.from_java_bytes(a3.array[a3.position...a3.limit])
48
+ EventMachine::event_callback a1, a2, s
49
+ end
50
+ end
51
+ class Connection < com.rubyeventmachine.Connection
52
+ def associate_callback_target sig
53
+ # No-op for the time being.
54
+ end
55
+ end
56
+ def self.initialize_event_machine
57
+ @em = JEM.new
58
+ end
59
+ def self.release_machine
60
+ @em = nil
61
+ end
62
+ def self.add_oneshot_timer interval
63
+ @em.installOneshotTimer interval
64
+ end
65
+ def self.run_machine
66
+ @em.run
67
+ end
68
+ def self.stop
69
+ @em.stop
70
+ end
71
+ def self.start_tcp_server server, port
72
+ @em.startTcpServer server, port
73
+ end
74
+ def self.stop_tcp_server sig
75
+ @em.stopTcpServer sig
76
+ end
77
+ def self.start_unix_server filename
78
+ # TEMPORARILY unsupported until someone figures out how to do it.
79
+ raise "unsupported on this platform"
80
+ end
81
+ def self.send_data sig, data, length
82
+ @em.sendData sig, data.to_java_bytes
83
+ end
84
+ def self.send_datagram sig, data, length, address, port
85
+ @em.sendDatagram sig, data, length, address, port
86
+ end
87
+ def self.connect_server server, port
88
+ bind_connect_server nil, nil, server, port
89
+ end
90
+ def self.bind_connect_server bind_addr, bind_port, server, port
91
+ @em.connectTcpServer bind_addr, bind_port, server, port
92
+ end
93
+ def self.close_connection sig, after_writing
94
+ @em.closeConnection sig, after_writing
95
+ end
96
+ def self.set_comm_inactivity_timeout sig, interval
97
+ @em.setCommInactivityTimeout sig, interval
98
+ end
99
+ def self.start_tls sig
100
+ @em.startTls sig
101
+ end
102
+ def self.ssl?
103
+ false
104
+ end
105
+ def self.signal_loopbreak
106
+ @em.signalLoopbreak
107
+ end
108
+ def self.set_timer_quantum q
109
+ @em.setTimerQuantum q
110
+ end
111
+ def self.epoll
112
+ # Epoll is a no-op for Java.
113
+ # The latest Java versions run epoll when possible in NIO.
114
+ end
115
+ def self.set_rlimit_nofile n_descriptors
116
+ # Currently a no-op for Java.
117
+ end
118
+ def self.open_udp_socket server, port
119
+ @em.openUdpSocket server, port
120
+ end
121
+ def self.invoke_popen cmd
122
+ # TEMPORARILY unsupported until someone figures out how to do it.
123
+ raise "unsupported on this platform"
124
+ end
125
+ def self.read_keyboard
126
+ # TEMPORARILY unsupported until someone figures out how to do it.
127
+ raise "temporarily unsupported on this platform"
128
+ end
129
+ def self.set_max_timer_count num
130
+ # harmless no-op in Java. There's no built-in timer limit.
131
+ end
132
+ def self.library_type
133
+ :java
134
+ end
130
135
 
131
- class Connection
132
- def associate_callback_target sig
133
- # No-op for the time being
134
- end
135
- end
136
+ class Connection
137
+ def associate_callback_target sig
138
+ # No-op for the time being
139
+ end
140
+ end
136
141
  end
137
142
 
@@ -1,4 +1,4 @@
1
- # $Id$
1
+ #--
2
2
  #
3
3
  # Author:: Francis Cianfrocca (gmail: blackhedd)
4
4
  # Homepage:: http://rubyeventmachine.com
@@ -76,7 +76,11 @@ module EventMachine
76
76
  # #connect_server. Return a connection descriptor to the caller.
77
77
  # TODO, what do we return here if we can't connect?
78
78
  def connect_server host, port
79
- EvmaTCPClient.connect(host, port).uuid
79
+ bind_connect_server nil, nil, host, port
80
+ end
81
+
82
+ def bind_connect_server bind_addr, bind_port, host, port
83
+ EvmaTCPClient.connect(bind_addr, bind_port, host, port).uuid
80
84
  end
81
85
 
82
86
  # #send_data
@@ -152,6 +156,11 @@ module EventMachine
152
156
  def epoll
153
157
  end
154
158
 
159
+ # #ssl? is not implemented for pure-Ruby implementation
160
+ def ssl?
161
+ false
162
+ end
163
+
155
164
  # #set_rlimit_nofile is a no-op in the pure-Ruby implementation. We simply return Ruby's built-in
156
165
  # per-process file-descriptor limit.
157
166
  def set_rlimit_nofile n
@@ -307,7 +316,7 @@ class Reactor
307
316
  open_loopbreaker
308
317
 
309
318
  loop {
310
- @current_loop_time = Time.now
319
+ @current_loop_time = Time.now
311
320
 
312
321
  break if @stop_scheduled
313
322
  run_timers
@@ -330,7 +339,7 @@ class Reactor
330
339
  @timers.each {|t|
331
340
  if t.first <= @current_loop_time
332
341
  @timers.delete t
333
- EventMachine::event_callback "", TimerFired, t.last
342
+ EventMachine::event_callback "", TimerFired, t.last
334
343
  else
335
344
  break
336
345
  end
@@ -374,24 +383,24 @@ class Reactor
374
383
  end
375
384
 
376
385
  def open_loopbreaker
377
- # Can't use an IO.pipe because they can't be set nonselectable in Windows.
378
- # Pick a random localhost UDP port.
386
+ # Can't use an IO.pipe because they can't be set nonselectable in Windows.
387
+ # Pick a random localhost UDP port.
379
388
  #@loopbreak_writer.close if @loopbreak_writer
380
389
  #rd,@loopbreak_writer = IO.pipe
381
- @loopbreak_reader = UDPSocket.new
382
- @loopbreak_writer = UDPSocket.new
383
- bound = false
384
- 100.times {
385
- @loopbreak_port = rand(10000) + 40000
386
- begin
387
- @loopbreak_reader.bind "localhost", @loopbreak_port
388
- bound = true
389
- break
390
- rescue
391
- end
392
- }
393
- raise "Unable to bind Loopbreaker" unless bound
394
- LoopbreakReader.new(@loopbreak_reader)
390
+ @loopbreak_reader = UDPSocket.new
391
+ @loopbreak_writer = UDPSocket.new
392
+ bound = false
393
+ 100.times {
394
+ @loopbreak_port = rand(10000) + 40000
395
+ begin
396
+ @loopbreak_reader.bind "localhost", @loopbreak_port
397
+ bound = true
398
+ break
399
+ rescue
400
+ end
401
+ }
402
+ raise "Unable to bind Loopbreaker" unless bound
403
+ LoopbreakReader.new(@loopbreak_reader)
395
404
  end
396
405
 
397
406
  def close_loopbreaker
@@ -401,7 +410,7 @@ class Reactor
401
410
 
402
411
  def signal_loopbreak
403
412
  #@loopbreak_writer.write '+' if @loopbreak_writer
404
- @loopbreak_writer.send('+',0,"localhost",@loopbreak_port) if @loopbreak_writer
413
+ @loopbreak_writer.send('+',0,"localhost",@loopbreak_port) if @loopbreak_writer
405
414
  end
406
415
 
407
416
  def set_timer_quantum interval_in_seconds
@@ -445,17 +454,17 @@ module EventMachine
445
454
  @last_activity = Reactor.instance.current_loop_time
446
455
 
447
456
  if defined?(Fcntl::F_GETFL)
448
- m = @io.fcntl(Fcntl::F_GETFL, 0)
449
- @io.fcntl(Fcntl::F_SETFL, Fcntl::O_NONBLOCK | m)
457
+ m = @io.fcntl(Fcntl::F_GETFL, 0)
458
+ @io.fcntl(Fcntl::F_SETFL, Fcntl::O_NONBLOCK | m)
450
459
  else
451
- # Windows doesn't define F_GETFL.
452
- # It's not very reliable about setting descriptors nonblocking either.
453
- begin
454
- s = Socket.for_fd(@io.fileno)
455
- s.fcntl( Fcntl::F_SETFL, Fcntl::O_NONBLOCK )
456
- rescue Errno::EINVAL, Errno::EBADF
457
- STDERR.puts "Serious error: unable to set descriptor non-blocking"
458
- end
460
+ # Windows doesn't define F_GETFL.
461
+ # It's not very reliable about setting descriptors nonblocking either.
462
+ begin
463
+ s = Socket.for_fd(@io.fileno)
464
+ s.fcntl( Fcntl::F_SETFL, Fcntl::O_NONBLOCK )
465
+ rescue Errno::EINVAL, Errno::EBADF
466
+ STDERR.puts "Serious error: unable to set descriptor non-blocking"
467
+ end
459
468
  end
460
469
  # TODO, should set CLOEXEC on Unix?
461
470
 
@@ -640,8 +649,10 @@ end
640
649
  module EventMachine
641
650
  class EvmaTCPClient < StreamObject
642
651
 
643
- def self.connect host, port
652
+ def self.connect bind_addr, bind_port, host, port
644
653
  sd = Socket.new( Socket::AF_INET, Socket::SOCK_STREAM, 0 )
654
+ sd.bind( Socket.pack_sockaddr_in( bind_port, bind_addr )) if bind_addr
655
+
645
656
  begin
646
657
  # TODO, this assumes a current Ruby snapshot.
647
658
  # We need to degrade to a nonblocking connect otherwise.
@@ -669,9 +680,9 @@ module EventMachine
669
680
  def eventable_write
670
681
  if @pending
671
682
  @pending = false
672
- if 0 == io.getsockopt(Socket::SOL_SOCKET, Socket::SO_ERROR).unpack("i").first
683
+ if 0 == io.getsockopt(Socket::SOL_SOCKET, Socket::SO_ERROR).unpack("i").first
673
684
  EventMachine::event_callback uuid, ConnectionCompleted, ""
674
- end
685
+ end
675
686
  else
676
687
  super
677
688
  end
@@ -748,9 +759,9 @@ module EventMachine
748
759
  def eventable_write
749
760
  if @pending
750
761
  @pending = false
751
- if 0 == io.getsockopt(Socket::SOL_SOCKET, Socket::SO_ERROR).unpack("i").first
762
+ if 0 == io.getsockopt(Socket::SOL_SOCKET, Socket::SO_ERROR).unpack("i").first
752
763
  EventMachine::event_callback uuid, ConnectionCompleted, ""
753
- end
764
+ end
754
765
  else
755
766
  super
756
767
  end
data/tasks/project.rake CHANGED
@@ -37,8 +37,9 @@ if Spec.has_rdoc
37
37
  Rake::RDocTask.new do |rd|
38
38
  rd.title = Spec.name
39
39
  rd.rdoc_dir = 'rdoc'
40
- rd.main = "docs/README" if test ?e, "docs/README"
40
+ rd.main = "README"
41
41
  rd.rdoc_files.include("lib/**/*.rb", *Spec.extra_rdoc_files)
42
+ rd.rdoc_files.exclude(*%w(lib/em/version lib/emva lib/evma/ lib/pr_eventmachine lib/jeventmachine))
42
43
  end
43
44
  Rake::Task[:clean].enhance [:clobber_rdoc]
44
45
 
data/tests/client.crt ADDED
@@ -0,0 +1,31 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIFRDCCAywCAQEwDQYJKoZIhvcNAQEFBQAwaDELMAkGA1UEBhMCRU0xFTATBgNV
3
+ BAgTDEV2ZW50TWFjaGluZTEVMBMGA1UEChMMRXZlbnRNYWNoaW5lMRQwEgYDVQQL
4
+ EwtEZXZlbG9wbWVudDEVMBMGA1UEAxMMRXZlbnRNYWNoaW5lMB4XDTA5MDMyOTAy
5
+ MzE0NloXDTEwMDMyOTAyMzE0NlowaDELMAkGA1UEBhMCRU0xFTATBgNVBAgTDEV2
6
+ ZW50TWFjaGluZTEVMBMGA1UEChMMRXZlbnRNYWNoaW5lMRQwEgYDVQQLEwtEZXZl
7
+ bG9wbWVudDEVMBMGA1UEAxMMRXZlbnRNYWNoaW5lMIICIjANBgkqhkiG9w0BAQEF
8
+ AAOCAg8AMIICCgKCAgEAv1FSOIX1z7CQtVBFlrB0A3/V29T+22STKKmiRWYkKL5b
9
+ +hkrp9IZ5J4phZHgUVM2VDPOO2Oc2PU6dlGGZISg+UPERunTogxQKezCV0vcE9cK
10
+ OwzxCFDRvv5rK8aKMscfBLbNKocAXywuRRQmdxPiVRzbyPrl+qCr/EDLXAX3D77l
11
+ S8n2AwDg19VyI+IgFUE+Dy5e1eLoY6nV+Mq+vNXdn3ttF3t+ngac5pj5Q9h+pD5p
12
+ 67baDHSnf/7cy2fa/LKrLolVHQR9G2K6cEfeM99NtcsMbkoPs4iI3FA05OVTQHXg
13
+ C8C8cRxrb9APl95I/ep65OIaCJgcdYxJ3QD3qOtQo6/NQsGnjbyiUxaEpjfqyT1N
14
+ uzWD81Q8uXGNS8yD6dDynt/lseBjyp2nfC3uQ5fY18VdIcu0MJ9pezBUKrNuhlsy
15
+ XXEZ2DXj4sY8QOvIcBqSB/zmS1nGEK55xrtkaiaNrY8fe8wRVpcPLxy+P225NFw+
16
+ B69FJRA0Lj6Jt9BM4hV/3MSIEWwTVhuw4E02ywDYTzz1wq3ITf0tsbIPn0hXQMxD
17
+ ohhAoKioM6u+yHtqsxD0eYaAWmHTVn5oDvOSGpvCpBfWHyA7FP5UQak0fKABEAgK
18
+ iQYEnb294AXwXymJttfGTIV/Ne4tLN5dIpNma8UO8rlThlcr6xnTQDbR3gkTDRsC
19
+ AwEAATANBgkqhkiG9w0BAQUFAAOCAgEAj7J8fy1LUWoVWnrXDAC9jwJ1nI/YjoSU
20
+ 6ywke3o04+nZC5S+dPnuVy+HAwsU940CoNvP6RStI/bH6JL+NIqEFmwM3M8xIEWV
21
+ MYVPkfvQUxxGvDnaY7vv93u+6Q77HV3qlhAQBHChyuXyO7TG3+WzsiT9AnBNtAP0
22
+ 4jClt5kCAQXLO/p0SFEZQ8Ru9SM8d1i73Z0VDVzs8jYWlBhiherSgbw1xK4wBOpJ
23
+ 43XmjZsBSrDpiAXd07Ak3UL2GjfT7eStgebL3UIe39ThE/s/+l43bh0M6WbOBvyQ
24
+ i/rZ50kd1GvN0xnZhtv07hIJWO85FGWi7Oet8AzdUZJ17v1Md/f2vdhPVTFN9q+w
25
+ mQ6LxjackqCvaJaQfBEbqsn2Tklxk4tZuDioiQbOElT2e6vljQVJWIfNx38Ny2LM
26
+ aiXQPQu+4CI7meAh5gXM5nyJGbZvRPsxj89CqYzyHCYs5HBP3AsviBvn26ziOF+c
27
+ 544VmHd9HkIv8UTC29hh+R64RlgMQQQdaXFaUrFPTs/do0k8n/c2bPc0iTdfi5Q2
28
+ gq6Vi8q6Ay5wGgTtRRbn/mWKuCFjEh94z6pF9Xr06NX0PuEOdf+Ls9vI5vz6G0w6
29
+ 0Li7devEN7EKBY+7Mcjg918yq9i5tEiMkUgT68788t3fTC+4iUQ5fDtdrHsaOlIR
30
+ 8bs/XQVNE/s=
31
+ -----END CERTIFICATE-----
data/tests/client.key ADDED
@@ -0,0 +1,51 @@
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ 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
51
+ -----END RSA PRIVATE KEY-----