stomper 1.0.0 → 2.0.0

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 (152) hide show
  1. data/.gitignore +5 -0
  2. data/{spec/spec.opts → .rspec} +0 -2
  3. data/Gemfile +4 -0
  4. data/LICENSE +201 -201
  5. data/README.md +130 -0
  6. data/Rakefile +5 -0
  7. data/examples/basic.rb +38 -0
  8. data/examples/events.rb +54 -0
  9. data/features/acking_messages.feature +147 -0
  10. data/features/disconnecting.feature +12 -0
  11. data/features/establish_connection.feature +44 -0
  12. data/features/protocol_version_negotiation.feature +61 -0
  13. data/features/receipts.feature +72 -0
  14. data/features/scopes.feature +32 -0
  15. data/features/secure_connections.feature +38 -0
  16. data/features/send_and_message.feature +28 -0
  17. data/features/steps/acking_messages_steps.rb +39 -0
  18. data/features/steps/disconnecting_steps.rb +8 -0
  19. data/features/steps/establish_connection_steps.rb +74 -0
  20. data/features/steps/frame_transmission_steps.rb +35 -0
  21. data/features/steps/protocol_version_negotiation_steps.rb +15 -0
  22. data/features/steps/receipts_steps.rb +79 -0
  23. data/features/steps/scopes_steps.rb +52 -0
  24. data/features/steps/secure_connections_steps.rb +41 -0
  25. data/features/steps/send_and_message_steps.rb +35 -0
  26. data/features/steps/subscribing_steps.rb +36 -0
  27. data/features/steps/threaded_receiver_steps.rb +8 -0
  28. data/features/steps/transactions_steps.rb +0 -0
  29. data/features/subscribing.feature +151 -0
  30. data/features/support/env.rb +11 -0
  31. data/features/support/header_helpers.rb +12 -0
  32. data/features/support/ssl/README +6 -0
  33. data/features/support/ssl/broker_cert.csr +17 -0
  34. data/features/support/ssl/broker_cert.pem +72 -0
  35. data/features/support/ssl/broker_key.pem +27 -0
  36. data/features/support/ssl/client_cert.csr +17 -0
  37. data/features/support/ssl/client_cert.pem +72 -0
  38. data/features/support/ssl/client_key.pem +27 -0
  39. data/features/support/ssl/demoCA/cacert.pem +17 -0
  40. data/features/support/ssl/demoCA/index.txt +2 -0
  41. data/features/support/ssl/demoCA/index.txt.attr +1 -0
  42. data/features/support/ssl/demoCA/index.txt.attr.old +1 -0
  43. data/features/support/ssl/demoCA/index.txt.old +1 -0
  44. data/features/support/ssl/demoCA/newcerts/01.pem +72 -0
  45. data/features/support/ssl/demoCA/newcerts/02.pem +72 -0
  46. data/features/support/ssl/demoCA/private/cakey.pem +17 -0
  47. data/features/support/ssl/demoCA/serial +1 -0
  48. data/features/support/ssl/demoCA/serial.old +1 -0
  49. data/features/support/test_stomp_server.rb +150 -0
  50. data/features/threaded_receiver.feature +11 -0
  51. data/features/transactions.feature +66 -0
  52. data/lib/stomper.rb +30 -20
  53. data/lib/stomper/connection.rb +442 -102
  54. data/lib/stomper/errors.rb +59 -0
  55. data/lib/stomper/extensions.rb +10 -0
  56. data/lib/stomper/extensions/common.rb +258 -0
  57. data/lib/stomper/extensions/events.rb +213 -0
  58. data/lib/stomper/extensions/heartbeat.rb +101 -0
  59. data/lib/stomper/extensions/scoping.rb +56 -0
  60. data/lib/stomper/frame.rb +54 -0
  61. data/lib/stomper/frame_serializer.rb +217 -0
  62. data/lib/stomper/headers.rb +15 -0
  63. data/lib/stomper/receipt_manager.rb +36 -0
  64. data/lib/stomper/receivers.rb +7 -0
  65. data/lib/stomper/receivers/threaded.rb +71 -0
  66. data/lib/stomper/scopes.rb +9 -0
  67. data/lib/stomper/scopes/header_scope.rb +49 -0
  68. data/lib/stomper/scopes/receipt_scope.rb +44 -0
  69. data/lib/stomper/scopes/transaction_scope.rb +109 -0
  70. data/lib/stomper/sockets.rb +66 -28
  71. data/lib/stomper/subscription_manager.rb +79 -0
  72. data/lib/stomper/support.rb +68 -0
  73. data/lib/stomper/support/1.8/frame_serializer.rb +53 -0
  74. data/lib/stomper/support/1.8/headers.rb +183 -0
  75. data/lib/stomper/support/1.9/frame_serializer.rb +64 -0
  76. data/lib/stomper/support/1.9/headers.rb +172 -0
  77. data/lib/stomper/support/ruby.rb +13 -0
  78. data/lib/stomper/uris.rb +49 -0
  79. data/lib/stomper/version.rb +7 -0
  80. data/spec/spec_helper.rb +13 -9
  81. data/spec/stomper/connection_spec.rb +712 -0
  82. data/spec/stomper/extensions/common_spec.rb +187 -0
  83. data/spec/stomper/extensions/events_spec.rb +78 -0
  84. data/spec/stomper/extensions/heartbeat_spec.rb +103 -0
  85. data/spec/stomper/extensions/scoping_spec.rb +21 -0
  86. data/spec/stomper/frame_serializer_1.8_spec.rb +318 -0
  87. data/spec/stomper/frame_serializer_spec.rb +316 -0
  88. data/spec/stomper/frame_spec.rb +36 -0
  89. data/spec/stomper/headers_spec.rb +224 -0
  90. data/spec/stomper/receipt_manager_spec.rb +91 -0
  91. data/spec/stomper/receivers/threaded_spec.rb +116 -0
  92. data/spec/stomper/scopes/header_scope_spec.rb +42 -0
  93. data/spec/stomper/scopes/receipt_scope_spec.rb +51 -0
  94. data/spec/stomper/scopes/transaction_scope_spec.rb +183 -0
  95. data/spec/stomper/sockets_spec.rb +113 -0
  96. data/spec/stomper/subscription_manager_spec.rb +107 -0
  97. data/spec/stomper/support_spec.rb +69 -0
  98. data/spec/stomper/uris_spec.rb +54 -0
  99. data/spec/stomper_spec.rb +9 -0
  100. data/spec/support/custom_argument_matchers.rb +57 -0
  101. data/spec/support/existential_frame_matchers.rb +19 -0
  102. data/spec/support/frame_header_matchers.rb +10 -0
  103. data/stomper.gemspec +30 -0
  104. metadata +272 -97
  105. data/AUTHORS +0 -21
  106. data/CHANGELOG +0 -20
  107. data/README.rdoc +0 -120
  108. data/lib/stomper/client.rb +0 -34
  109. data/lib/stomper/frame_reader.rb +0 -73
  110. data/lib/stomper/frame_writer.rb +0 -21
  111. data/lib/stomper/frames.rb +0 -39
  112. data/lib/stomper/frames/abort.rb +0 -10
  113. data/lib/stomper/frames/ack.rb +0 -25
  114. data/lib/stomper/frames/begin.rb +0 -11
  115. data/lib/stomper/frames/client_frame.rb +0 -89
  116. data/lib/stomper/frames/commit.rb +0 -10
  117. data/lib/stomper/frames/connect.rb +0 -10
  118. data/lib/stomper/frames/connected.rb +0 -30
  119. data/lib/stomper/frames/disconnect.rb +0 -10
  120. data/lib/stomper/frames/error.rb +0 -21
  121. data/lib/stomper/frames/message.rb +0 -48
  122. data/lib/stomper/frames/receipt.rb +0 -19
  123. data/lib/stomper/frames/send.rb +0 -10
  124. data/lib/stomper/frames/server_frame.rb +0 -38
  125. data/lib/stomper/frames/subscribe.rb +0 -42
  126. data/lib/stomper/frames/unsubscribe.rb +0 -19
  127. data/lib/stomper/open_uri_interface.rb +0 -41
  128. data/lib/stomper/receipt_handlers.rb +0 -23
  129. data/lib/stomper/receiptor.rb +0 -38
  130. data/lib/stomper/subscriber.rb +0 -76
  131. data/lib/stomper/subscription.rb +0 -128
  132. data/lib/stomper/subscriptions.rb +0 -95
  133. data/lib/stomper/threaded_receiver.rb +0 -59
  134. data/lib/stomper/transaction.rb +0 -185
  135. data/lib/stomper/transactor.rb +0 -50
  136. data/lib/stomper/uri.rb +0 -55
  137. data/spec/client_spec.rb +0 -29
  138. data/spec/connection_spec.rb +0 -22
  139. data/spec/frame_reader_spec.rb +0 -37
  140. data/spec/frame_writer_spec.rb +0 -27
  141. data/spec/frames/client_frame_spec.rb +0 -66
  142. data/spec/frames/indirect_frame_spec.rb +0 -45
  143. data/spec/frames/server_frame_spec.rb +0 -85
  144. data/spec/open_uri_interface_spec.rb +0 -132
  145. data/spec/receiptor_spec.rb +0 -35
  146. data/spec/shared_connection_examples.rb +0 -79
  147. data/spec/subscriber_spec.rb +0 -77
  148. data/spec/subscription_spec.rb +0 -157
  149. data/spec/subscriptions_spec.rb +0 -145
  150. data/spec/threaded_receiver_spec.rb +0 -33
  151. data/spec/transaction_spec.rb +0 -139
  152. data/spec/transactor_spec.rb +0 -46
@@ -0,0 +1,27 @@
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ MIIEogIBAAKCAQEAr2Kt6gsrPaYO40qytboypatf8vBagyJM/wWdviW7aGH1Vi4i
3
+ nCv5O6KXN6o3F0DNEpd2cxkkxVl4RUVdK5zf6dJW11y5ylNzoWJw31Kv+31rt2h6
4
+ CGjoSqta6eakzTidLlVREUg8K1eoVTdCEQzpLOd500zILp6SStyLZnm/YuB1Sdc3
5
+ Yk46R3rAL3WMKHBQiCSueusvpndgZHcN4sJO5WIF+icgXFNygBbmr/U1WqlqX2AF
6
+ Ktj+qaQtqsSBNfxRinyfDEDqQGGH7ApgOUQusPZ3eQG2vxXSZc1q5CEFWVPZauc3
7
+ 6s6jsc/DcPwsQD0Sv/mEMsqDxuU9qij/eJ0DFwIDAQABAoIBAGSLes541rJB97kA
8
+ AtHBy/VD+P6qIgmZaXCuBI+UzAp8Vgyw6DCF2R0CChTkZS7UfHxTDpnPaVAmCZgU
9
+ uuQczBUc+6H9S5mdG+YCLFkq6y6O6Wi84XDey4S7FaSQEByCf0GnsZDpy2zBlQQ9
10
+ aIej0i1nCmVDWGO5jn6STuxRkZGZz0+BPEe0kdZIGDl1NvBVy55Vpy4x2ccYa80D
11
+ yZycWtkO65x0RKAZhnaVdDD1vbdvEGPlEmCsoGXn2ahx4AcuZPOIxSz9izksL9zy
12
+ kraOBz5p5UX8MIOyx8xpKk3hYQRLaRTrpWtwJNJsLiNWozbCLcFvVuukyxYE6zRG
13
+ NEc8/+kCgYEA1MmdocWY4nrUC1l4dv9rPwh5Z2/zt7N2CeafaJ4YSh69SUKzeBHC
14
+ J79xvHA0b8cmEQyJ4BUJgLMm85ofi3f6pws8pPA6fLlwg+SeqLo9bjDNqIwEHvf/
15
+ EVSmvJLQ11lUFauKziMyGPF1gYIbFUO/yXWGjEnRkEHQ/BRbZO/SmWMCgYEA0wCb
16
+ L693uqzMHErXeYswAk9YDrbnsCSKOiSxoJdc8C6TUQ56YA5YsWovlNc8s+gs9Vhw
17
+ 6u5yhkdhaMA9AYJbHcCdw33w2p/PFTuau+ydKs5VMf+ruNo7yliWPON4e9s3KHIm
18
+ NRabQJ7c5qAIKbiwk6prm2uL7s5Ved2VWG5Ut70CgYAGytjJTTFwKVOTeSurQMP/
19
+ oxmc/6nb91KRRldYU5Oa6hhIumRYNNjpw+axiTNjTgwdBzVvfbxr60wXAph3L0FF
20
+ C8rHyRNU3+aDj0yxPiCv38bw1mdbRbdSqk0YP+eCuEtC1dL8eYsj2LFTjP+oUh1R
21
+ JPtChyi1XiR5p3yzYCRs2QKBgFYtxjRIt18AGnFnw+/5gEdBPtbrr19K3UX4HLBZ
22
+ gfT7IOIXRrYaxfDYTMy+yCU2q74dPClH8HCVkNxmv8PxCOPy+ryQoKG6aarjaERe
23
+ 1KZaFYPRR8K9J3RykBIYWepEU5fqX16JeCmBePmc3RilPUFidobI+yMzFMgsT0YJ
24
+ 8gIFAoGAJFIE2FM3VyO4NGwcz4HDYRs/v+vFIw3uzm41YEU4NgTch5YM9dPveXrg
25
+ q+pvPHaFQNpA3y/MgKKsvjO02NiiDvpZsH0s7y+Im5rnpa4kxEilgT5mkkZl0YOO
26
+ nqjkRbifWeSOYh5MnGGdMGlcmqjoJHidFJ1LD6867FqpEvgSGek=
27
+ -----END RSA PRIVATE KEY-----
@@ -0,0 +1,17 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIICujCCAiOgAwIBAgIJAPxr+ytdcmk7MA0GCSqGSIb3DQEBBQUAMHYxCzAJBgNV
3
+ BAYTAlVTMREwDwYDVQQIDAhOb3doZXJlczEQMA4GA1UEBwwHU3RvbXBlcjEYMBYG
4
+ A1UECgwPU3RvbXBlciBUZXN0aW5nMRMwEQYDVQQLDApDQSBUZXN0aW5nMRMwEQYD
5
+ VQQDDApTdG9tcGVyIENBMB4XDTExMDIyMTE2NDk0OVoXDTIxMDIxODE2NDk0OVow
6
+ djELMAkGA1UEBhMCVVMxETAPBgNVBAgMCE5vd2hlcmVzMRAwDgYDVQQHDAdTdG9t
7
+ cGVyMRgwFgYDVQQKDA9TdG9tcGVyIFRlc3RpbmcxEzARBgNVBAsMCkNBIFRlc3Rp
8
+ bmcxEzARBgNVBAMMClN0b21wZXIgQ0EwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJ
9
+ AoGBAKU9pySr+X6uFFTV3SMP4BV31u9PiU17UATEIIEj7jRmDWR9i9oxf7+k1+L0
10
+ OzORjug10Bt27teD2JcWKTCSpO5uHJ3/uRpcqViECzdJtWXcG+s253Jj2xJRcBi4
11
+ TBXP/VFsKYbHGYmA57GQzcaaXqptvQq7fuqsfgxqr82w83K7AgMBAAGjUDBOMB0G
12
+ A1UdDgQWBBR8T1C/xleXa9kc8ZLvtWZHlHkVdDAfBgNVHSMEGDAWgBR8T1C/xleX
13
+ a9kc8ZLvtWZHlHkVdDAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4GBAArO
14
+ OvHvpbafdbxqVv6R9vch06hbPdtVh5pcM2AsNGfn3MhD9VmIAkrPgbVHHN8d9lFS
15
+ MVZbnyGtkiJoZTlJV9tPD4Nq/aGSePu+U4gtFNRmD+wvh5VREcrOloqN4lX8/h2N
16
+ aFMdwQa7qRZ40L/4RLslb5ZsiiFihbk9pY+AOD+d
17
+ -----END CERTIFICATE-----
@@ -0,0 +1,2 @@
1
+ V 210218165001Z 01 unknown /C=US/ST=Nowheres/O=Stomper Testing/OU=SSL Testing/CN=My Broker
2
+ V 210218165725Z 02 unknown /C=US/ST=Nowheres/O=Stomper Testing/OU=SSL Testing/CN=My Client
@@ -0,0 +1 @@
1
+ unique_subject = yes
@@ -0,0 +1 @@
1
+ unique_subject = yes
@@ -0,0 +1 @@
1
+ V 210218165001Z 01 unknown /C=US/ST=Nowheres/O=Stomper Testing/OU=SSL Testing/CN=My Broker
@@ -0,0 +1,72 @@
1
+ Certificate:
2
+ Data:
3
+ Version: 3 (0x2)
4
+ Serial Number: 1 (0x1)
5
+ Signature Algorithm: sha1WithRSAEncryption
6
+ Issuer: C=US, ST=Nowheres, L=Stomper, O=Stomper Testing, OU=CA Testing, CN=Stomper CA
7
+ Validity
8
+ Not Before: Feb 21 16:50:01 2011 GMT
9
+ Not After : Feb 18 16:50:01 2021 GMT
10
+ Subject: C=US, ST=Nowheres, O=Stomper Testing, OU=SSL Testing, CN=My Broker
11
+ Subject Public Key Info:
12
+ Public Key Algorithm: rsaEncryption
13
+ Public-Key: (2048 bit)
14
+ Modulus:
15
+ 00:eb:dd:be:2d:87:54:13:ce:4c:e1:bd:c9:c8:e0:
16
+ 18:b0:50:f1:30:c8:6e:22:7a:bc:c6:ea:3f:e2:c4:
17
+ 24:d9:8c:41:94:54:d4:e0:7b:5c:6c:dd:bd:41:8f:
18
+ bd:aa:98:c2:f0:e9:13:7e:36:5a:97:57:e4:6a:04:
19
+ 08:aa:12:2b:68:4b:9d:5a:40:92:41:57:5b:2e:d2:
20
+ e1:f4:f8:c4:31:dd:6c:2d:4c:12:ab:80:72:71:39:
21
+ 4e:aa:14:b8:f6:35:e8:07:9f:a2:a3:b8:a6:08:8d:
22
+ 60:d5:53:01:38:8c:aa:17:e9:b0:b3:8c:e3:d9:4d:
23
+ 14:02:da:9a:ff:6f:5b:65:ba:c3:56:80:b0:de:8e:
24
+ c8:25:3f:1b:a0:ac:80:1c:38:e0:77:4e:c6:5d:92:
25
+ 44:97:c3:f8:ba:9a:02:83:a8:1b:57:3b:38:d6:7d:
26
+ 7f:95:86:f4:c2:de:51:d0:ee:a1:30:b4:39:9a:f6:
27
+ 58:03:62:93:94:a5:72:72:a2:5c:7e:cf:54:7f:57:
28
+ 92:46:f8:f7:b1:79:56:20:bd:95:25:d5:11:5d:c0:
29
+ 5c:c7:cd:cf:44:8f:88:68:e1:6f:c0:ca:2e:db:fc:
30
+ d0:19:82:36:b1:3f:20:82:df:ce:a6:55:44:02:51:
31
+ 8b:6c:4f:a1:26:b3:41:e8:0b:a8:0c:8f:67:65:92:
32
+ ee:df
33
+ Exponent: 65537 (0x10001)
34
+ X509v3 extensions:
35
+ X509v3 Basic Constraints:
36
+ CA:FALSE
37
+ Netscape Comment:
38
+ OpenSSL Generated Certificate
39
+ X509v3 Subject Key Identifier:
40
+ 5C:28:4D:B8:A3:D7:CB:43:2C:1C:DB:0F:7B:75:99:85:44:4E:D8:A1
41
+ X509v3 Authority Key Identifier:
42
+ keyid:7C:4F:50:BF:C6:57:97:6B:D9:1C:F1:92:EF:B5:66:47:94:79:15:74
43
+
44
+ Signature Algorithm: sha1WithRSAEncryption
45
+ 51:2f:da:d1:a4:9f:97:77:00:69:bb:04:85:34:75:bd:2e:ad:
46
+ 45:83:a7:95:f1:83:5d:52:1e:65:79:ee:5b:a0:f5:7b:82:53:
47
+ 88:c3:fc:89:c8:4f:68:4e:80:8a:cb:53:4f:44:a8:6d:8c:be:
48
+ be:74:19:ff:75:52:14:3b:70:42:87:cf:fc:90:58:7e:c9:cd:
49
+ d4:a2:b8:15:74:e8:51:ce:9c:73:ca:a5:29:76:4a:f3:a4:26:
50
+ f3:70:c5:8e:5f:cf:fe:7d:81:de:43:9e:36:c0:87:7b:66:02:
51
+ 7f:02:2d:64:48:19:be:74:4a:27:cd:c5:56:c5:ff:96:1a:02:
52
+ 3a:2f
53
+ -----BEGIN CERTIFICATE-----
54
+ MIIDTzCCArigAwIBAgIBATANBgkqhkiG9w0BAQUFADB2MQswCQYDVQQGEwJVUzER
55
+ MA8GA1UECAwITm93aGVyZXMxEDAOBgNVBAcMB1N0b21wZXIxGDAWBgNVBAoMD1N0
56
+ b21wZXIgVGVzdGluZzETMBEGA1UECwwKQ0EgVGVzdGluZzETMBEGA1UEAwwKU3Rv
57
+ bXBlciBDQTAeFw0xMTAyMjExNjUwMDFaFw0yMTAyMTgxNjUwMDFaMGQxCzAJBgNV
58
+ BAYTAlVTMREwDwYDVQQIDAhOb3doZXJlczEYMBYGA1UECgwPU3RvbXBlciBUZXN0
59
+ aW5nMRQwEgYDVQQLDAtTU0wgVGVzdGluZzESMBAGA1UEAwwJTXkgQnJva2VyMIIB
60
+ IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA692+LYdUE85M4b3JyOAYsFDx
61
+ MMhuInq8xuo/4sQk2YxBlFTU4HtcbN29QY+9qpjC8OkTfjZal1fkagQIqhIraEud
62
+ WkCSQVdbLtLh9PjEMd1sLUwSq4BycTlOqhS49jXoB5+io7imCI1g1VMBOIyqF+mw
63
+ s4zj2U0UAtqa/29bZbrDVoCw3o7IJT8boKyAHDjgd07GXZJEl8P4upoCg6gbVzs4
64
+ 1n1/lYb0wt5R0O6hMLQ5mvZYA2KTlKVycqJcfs9Uf1eSRvj3sXlWIL2VJdURXcBc
65
+ x83PRI+IaOFvwMou2/zQGYI2sT8ggt/OplVEAlGLbE+hJrNB6AuoDI9nZZLu3wID
66
+ AQABo3sweTAJBgNVHRMEAjAAMCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVy
67
+ YXRlZCBDZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUXChNuKPXy0MsHNsPe3WZhURO2KEw
68
+ HwYDVR0jBBgwFoAUfE9Qv8ZXl2vZHPGS77VmR5R5FXQwDQYJKoZIhvcNAQEFBQAD
69
+ gYEAUS/a0aSfl3cAabsEhTR1vS6tRYOnlfGDXVIeZXnuW6D1e4JTiMP8ichPaE6A
70
+ istTT0SobYy+vnQZ/3VSFDtwQofP/JBYfsnN1KK4FXToUc6cc8qlKXZK86Qm83DF
71
+ jl/P/n2B3kOeNsCHe2YCfwItZEgZvnRKJ83FVsX/lhoCOi8=
72
+ -----END CERTIFICATE-----
@@ -0,0 +1,72 @@
1
+ Certificate:
2
+ Data:
3
+ Version: 3 (0x2)
4
+ Serial Number: 2 (0x2)
5
+ Signature Algorithm: sha1WithRSAEncryption
6
+ Issuer: C=US, ST=Nowheres, L=Stomper, O=Stomper Testing, OU=CA Testing, CN=Stomper CA
7
+ Validity
8
+ Not Before: Feb 21 16:57:25 2011 GMT
9
+ Not After : Feb 18 16:57:25 2021 GMT
10
+ Subject: C=US, ST=Nowheres, O=Stomper Testing, OU=SSL Testing, CN=My Client
11
+ Subject Public Key Info:
12
+ Public Key Algorithm: rsaEncryption
13
+ Public-Key: (2048 bit)
14
+ Modulus:
15
+ 00:af:62:ad:ea:0b:2b:3d:a6:0e:e3:4a:b2:b5:ba:
16
+ 32:a5:ab:5f:f2:f0:5a:83:22:4c:ff:05:9d:be:25:
17
+ bb:68:61:f5:56:2e:22:9c:2b:f9:3b:a2:97:37:aa:
18
+ 37:17:40:cd:12:97:76:73:19:24:c5:59:78:45:45:
19
+ 5d:2b:9c:df:e9:d2:56:d7:5c:b9:ca:53:73:a1:62:
20
+ 70:df:52:af:fb:7d:6b:b7:68:7a:08:68:e8:4a:ab:
21
+ 5a:e9:e6:a4:cd:38:9d:2e:55:51:11:48:3c:2b:57:
22
+ a8:55:37:42:11:0c:e9:2c:e7:79:d3:4c:c8:2e:9e:
23
+ 92:4a:dc:8b:66:79:bf:62:e0:75:49:d7:37:62:4e:
24
+ 3a:47:7a:c0:2f:75:8c:28:70:50:88:24:ae:7a:eb:
25
+ 2f:a6:77:60:64:77:0d:e2:c2:4e:e5:62:05:fa:27:
26
+ 20:5c:53:72:80:16:e6:af:f5:35:5a:a9:6a:5f:60:
27
+ 05:2a:d8:fe:a9:a4:2d:aa:c4:81:35:fc:51:8a:7c:
28
+ 9f:0c:40:ea:40:61:87:ec:0a:60:39:44:2e:b0:f6:
29
+ 77:79:01:b6:bf:15:d2:65:cd:6a:e4:21:05:59:53:
30
+ d9:6a:e7:37:ea:ce:a3:b1:cf:c3:70:fc:2c:40:3d:
31
+ 12:bf:f9:84:32:ca:83:c6:e5:3d:aa:28:ff:78:9d:
32
+ 03:17
33
+ Exponent: 65537 (0x10001)
34
+ X509v3 extensions:
35
+ X509v3 Basic Constraints:
36
+ CA:FALSE
37
+ Netscape Comment:
38
+ OpenSSL Generated Certificate
39
+ X509v3 Subject Key Identifier:
40
+ 7A:FC:5D:4F:48:8F:41:43:EA:E5:A6:14:2D:30:19:E5:63:70:43:5C
41
+ X509v3 Authority Key Identifier:
42
+ keyid:7C:4F:50:BF:C6:57:97:6B:D9:1C:F1:92:EF:B5:66:47:94:79:15:74
43
+
44
+ Signature Algorithm: sha1WithRSAEncryption
45
+ 75:80:be:12:d8:7d:64:78:1f:62:97:a9:cd:0a:84:89:15:43:
46
+ ca:5b:a3:72:77:73:f1:aa:06:59:15:75:0b:1b:7d:79:c3:9f:
47
+ d5:3d:e5:70:df:64:ec:a4:27:d9:a3:49:02:b0:75:89:bd:dc:
48
+ 9b:c4:79:33:14:38:93:2b:d8:3c:01:e6:d0:2a:56:06:6a:ba:
49
+ 49:56:5a:f7:6c:49:dd:b0:5c:49:be:68:09:7d:75:2e:9f:49:
50
+ ed:e1:1e:49:6b:f1:cc:1c:1c:be:1e:ac:a9:ee:44:7b:15:32:
51
+ e0:b1:a6:9c:48:a4:1c:5a:55:66:0f:86:95:c0:02:e8:b7:a8:
52
+ b9:9d
53
+ -----BEGIN CERTIFICATE-----
54
+ MIIDTzCCArigAwIBAgIBAjANBgkqhkiG9w0BAQUFADB2MQswCQYDVQQGEwJVUzER
55
+ MA8GA1UECAwITm93aGVyZXMxEDAOBgNVBAcMB1N0b21wZXIxGDAWBgNVBAoMD1N0
56
+ b21wZXIgVGVzdGluZzETMBEGA1UECwwKQ0EgVGVzdGluZzETMBEGA1UEAwwKU3Rv
57
+ bXBlciBDQTAeFw0xMTAyMjExNjU3MjVaFw0yMTAyMTgxNjU3MjVaMGQxCzAJBgNV
58
+ BAYTAlVTMREwDwYDVQQIDAhOb3doZXJlczEYMBYGA1UECgwPU3RvbXBlciBUZXN0
59
+ aW5nMRQwEgYDVQQLDAtTU0wgVGVzdGluZzESMBAGA1UEAwwJTXkgQ2xpZW50MIIB
60
+ IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr2Kt6gsrPaYO40qytboypatf
61
+ 8vBagyJM/wWdviW7aGH1Vi4inCv5O6KXN6o3F0DNEpd2cxkkxVl4RUVdK5zf6dJW
62
+ 11y5ylNzoWJw31Kv+31rt2h6CGjoSqta6eakzTidLlVREUg8K1eoVTdCEQzpLOd5
63
+ 00zILp6SStyLZnm/YuB1Sdc3Yk46R3rAL3WMKHBQiCSueusvpndgZHcN4sJO5WIF
64
+ +icgXFNygBbmr/U1WqlqX2AFKtj+qaQtqsSBNfxRinyfDEDqQGGH7ApgOUQusPZ3
65
+ eQG2vxXSZc1q5CEFWVPZauc36s6jsc/DcPwsQD0Sv/mEMsqDxuU9qij/eJ0DFwID
66
+ AQABo3sweTAJBgNVHRMEAjAAMCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVy
67
+ YXRlZCBDZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUevxdT0iPQUPq5aYULTAZ5WNwQ1ww
68
+ HwYDVR0jBBgwFoAUfE9Qv8ZXl2vZHPGS77VmR5R5FXQwDQYJKoZIhvcNAQEFBQAD
69
+ gYEAdYC+Eth9ZHgfYpepzQqEiRVDylujcndz8aoGWRV1Cxt9ecOf1T3lcN9k7KQn
70
+ 2aNJArB1ib3cm8R5MxQ4kyvYPAHm0CpWBmq6SVZa92xJ3bBcSb5oCX11Lp9J7eEe
71
+ SWvxzBwcvh6sqe5EexUy4LGmnEikHFpVZg+GlcAC6LeouZ0=
72
+ -----END CERTIFICATE-----
@@ -0,0 +1,17 @@
1
+ -----BEGIN ENCRYPTED PRIVATE KEY-----
2
+ MIICxjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQIfpo+T6ZjqGYCAggA
3
+ MBQGCCqGSIb3DQMHBAgAjGO3xvusBASCAoBsphz6kWs5lU85No2RFHrsOmPE6Hbz
4
+ JwUoc24za/Fxf+/ZkBS/E4ENSuCEBrhbUD2OkTRljG6XsyxFm2Do+SjrAAqy79yk
5
+ teuuhwDr32hLlfLBU9QW1Y4tlyZq9APBjAjuklKC5Tbjyjgf3pwN0SGfGyzCZ4jY
6
+ 0dBseBq1E4p4Q14oFAsHWzw3HBBB8p5yhtjSGrchr6+fvjc+DcO69iXPoLH4erJc
7
+ t49UFARdyTXJYVfuGDAUf05YewymlSFPiH9GvQeWiSTk3AESfOD3D+3UPW+30OT7
8
+ XYrBLLrd+JPcLWFfwB2Y3a3dl9RBEGdxd7epSPb6TKsCz5RZZT1mf/EWt8JGOTWx
9
+ SZ0i3QtKW0aiNXBEQHjCoxmyKNz0Hw0YtpsjabWloIKCq9Xbz3wUuIhYqDtKxm9c
10
+ sHx6+kDl/fFubYwhw6VkfGL4ytTscoQ7m5bddE2+s04ZLZmZLFyQcAyPE9Ftlvez
11
+ L2/LjloZQ3kgbgrO+bypmk9D6nx2vA4q6GbzXojKBYrUmfJ7zsF1MSSiF6HDzcY8
12
+ rNYWghYo5ToDDdapPQYXCwh5q4J2f+n/86ynyykMyPcuQIs7bXiNfcCzn0DuG6/1
13
+ XzAY8c27pGo1bpPWtIoFamdMWgpubUHWYydIgx+SP+CGqE2zuCEoUT5m8dC4RMKT
14
+ r4mOqtrAIaYHU09nMIQ2oKqvO3sbv2K6rIesR5HwczoIMgcEzaS0IUpzE8x1BXZn
15
+ cANiYnWlqTatOAJOuFCnSsMPd4XgP4rBEFqdvBho0pkSgrQ2eSEfCM5HBHt5JpAB
16
+ JFgv/dEE+/ufP0jWSovRlfEeohQALlR8MNCPy+IN3NVBhF045y6kowE0
17
+ -----END ENCRYPTED PRIVATE KEY-----
@@ -0,0 +1 @@
1
+ 03
@@ -0,0 +1 @@
1
+ 02
@@ -0,0 +1,150 @@
1
+ class TestStompServer
2
+ attr_accessor :session_class
3
+ attr_reader :session
4
+
5
+ def initialize(version=nil)
6
+ @port = 61613
7
+ @socket = TCPServer.new(@port)
8
+ @session = nil
9
+ @version = version
10
+ @session_class = StompSession
11
+ end
12
+
13
+ def start
14
+ @listener = Thread.new do
15
+ begin
16
+ @session = @session_class.new(@socket.accept, @version)
17
+ rescue Exception => ex
18
+ stop
19
+ end
20
+ end
21
+ end
22
+
23
+ def stop
24
+ @session.stop if @session
25
+ @socket.close rescue nil
26
+ @listener.kill rescue nil
27
+ @listener.join rescue nil
28
+ end
29
+
30
+ def force_stop
31
+ @session.force_stop if @session
32
+ @socket.close rescue nil
33
+ @listener.kill rescue nil
34
+ @listener.join rescue nil
35
+ end
36
+
37
+ def handle_client(client)
38
+
39
+ end
40
+
41
+ class StompSession
42
+ attr_reader :received_frames, :sent_frames, :running
43
+ alias :running? :running
44
+
45
+ def initialize(client, version)
46
+ @client_socket = client
47
+ @received_frames = []
48
+ @sent_frames = []
49
+ @serializer = Stomper::FrameSerializer.new(@client_socket)
50
+ @running = true
51
+ @subscribed = {}
52
+ headers = {}
53
+ version && headers[:version] = version
54
+ connect_to_client(headers)
55
+ @serializer.extend_for_protocol('1.1') if version == '1.1'
56
+ @receive_thread = Thread.new do
57
+ while @running
58
+ begin
59
+ read_frame
60
+ rescue Exception => ex
61
+ end
62
+ end
63
+ end
64
+ end
65
+
66
+ def connect_to_client(headers)
67
+ read_frame
68
+ send_frame 'CONNECTED', headers
69
+ end
70
+
71
+ def force_stop
72
+ @running = false
73
+ @client_socket.close rescue nil
74
+ @receive_thread.join rescue nil
75
+ end
76
+
77
+ def stop
78
+ Thread.pass while @running
79
+ @receive_thread.join
80
+ end
81
+
82
+ def read_frame
83
+ @serializer.read_frame.tap do |f|
84
+ @received_frames << f
85
+ unless f[:receipt].nil? || f[:receipt].empty?
86
+ send_frame 'RECEIPT', { :'receipt-id' => f[:receipt] }
87
+ end
88
+ case f.command
89
+ when 'DISCONNECT'
90
+ @running = false
91
+ @client_socket.close
92
+ when 'SEND'
93
+ if @subscribed[f[:destination]]
94
+ @subscribed[f[:destination]].each_with_index do |sub_id, idx|
95
+ msg = f.dup
96
+ msg[:subscription] = sub_id
97
+ msg[:'message-id'] = "m-#{(Time.now.to_f * 1000).to_i}-#{idx}"
98
+ msg.command = 'MESSAGE'
99
+ send_frame msg
100
+ end
101
+ end
102
+ when 'SUBSCRIBE'
103
+ @subscribed[f[:destination]] ||= []
104
+ @subscribed[f[:destination]] << f[:id]
105
+ when 'UNSUBSCRIBE'
106
+ if @subscribed[f[:destination]]
107
+ @subscribed[f[:destination]].delete f[:id]
108
+ end
109
+ end
110
+ end
111
+ end
112
+
113
+ def send_frame cmd, headers={}, body=nil
114
+ frame = cmd.is_a?(Stomper::Frame) ? cmd : Stomper::Frame.new(cmd, headers, body)
115
+ @serializer.write_frame(frame).tap do |f|
116
+ @sent_frames << f
117
+ end
118
+ end
119
+ end
120
+
121
+ class StompErrorOnConnectSession < StompSession
122
+ def connect_to_client(headers)
123
+ send_frame 'ERROR'
124
+ end
125
+ end
126
+ end
127
+
128
+ class TestSSLStompServer < TestStompServer
129
+ SSL_CERT_FILES = {
130
+ :default => {
131
+ :c => File.expand_path('../ssl/broker_cert.pem', __FILE__),
132
+ :k => File.expand_path('../ssl/broker_key.pem', __FILE__)
133
+ }
134
+ }
135
+
136
+ def initialize(version=nil, certs=:default)
137
+ @port = 61612
138
+ @tcp_socket = TCPServer.new(@port)
139
+ @ssl_context = OpenSSL::SSL::SSLContext.new
140
+ @ssl_context.verify_mode = OpenSSL::SSL::VERIFY_NONE
141
+ cert_files = SSL_CERT_FILES[certs]
142
+ @ssl_context.key = OpenSSL::PKey::RSA.new(File.read(cert_files[:k]))
143
+ @ssl_context.cert = OpenSSL::X509::Certificate.new(File.read(cert_files[:c]))
144
+ @socket = OpenSSL::SSL::SSLServer.new(@tcp_socket, @ssl_context)
145
+ @socket.start_immediately = true
146
+ @session = nil
147
+ @version = version
148
+ @session_class = StompSession
149
+ end
150
+ end
@@ -0,0 +1,11 @@
1
+ Feature: Threaded receiver
2
+ In order receive frames asynchronously
3
+ As a client
4
+ I want a threaded receiver
5
+
6
+ Scenario: receiver is no longer running when an exception is raised by receive
7
+ Given a 1.1 connection between client and broker
8
+ When the broker closes the connection unexpectedly
9
+ Then after 0.2 seconds, the receiver should no longer be running
10
+ And the connection should not be connected
11
+
@@ -0,0 +1,66 @@
1
+ Feature: Transactions
2
+ In order to atomically transmit frames
3
+ As a client
4
+ I want transactions
5
+
6
+ Scenario: Applying a transaction to a series of frames
7
+ Given a 1.1 connection between client and broker
8
+ And a transaction scope named "t-0001"
9
+ When the client begins the transaction scope
10
+ And the client acks a message by ID "m-1234" and subscription "s-5678" within the scope
11
+ And the client nacks a message by ID "m-9012" and subscription "s-5678" within the scope
12
+ And the client aborts the transaction scope
13
+ Then the broker should have received a "BEGIN" frame with headers
14
+ | header-name | header-value |
15
+ | transaction | t-0001 |
16
+ Then the broker should have received an "ACK" frame with headers
17
+ | header-name | header-value |
18
+ | transaction | t-0001 |
19
+ | message-id | m-1234 |
20
+ | subscription | s-5678 |
21
+ And the broker should have received a "NACK" frame with headers
22
+ | header-name | header-value |
23
+ | transaction | t-0001 |
24
+ | message-id | m-9012 |
25
+ | subscription | s-5678 |
26
+ And the broker should have received an "ABORT" frame with headers
27
+ | header-name | header-value |
28
+ | transaction | t-0001 |
29
+
30
+ Scenario: Applying a transaction to a successful block
31
+ Given a 1.1 connection between client and broker
32
+ When the client executes a successful transaction block named "t-0002"
33
+ Then the broker should have received a "BEGIN" frame with headers
34
+ | header-name | header-value |
35
+ | transaction | t-0002 |
36
+ And the broker should have received an "ACK" frame with headers
37
+ | header-name | header-value |
38
+ | transaction | t-0002 |
39
+ And the broker should have received a "SEND" frame with headers
40
+ | header-name | header-value |
41
+ | transaction | t-0002 |
42
+ And the broker should have received a "NACK" frame with headers
43
+ | header-name | header-value |
44
+ | transaction | t-0002 |
45
+ And the broker should have received a "COMMIT" frame with headers
46
+ | header-name | header-value |
47
+ | transaction | t-0002 |
48
+
49
+ Scenario: Applying a transaction to an unsuccessful block
50
+ Given a 1.1 connection between client and broker
51
+ When the client executes an unsuccessful transaction block named "t-0002"
52
+ Then the broker should have received a "BEGIN" frame with headers
53
+ | header-name | header-value |
54
+ | transaction | t-0002 |
55
+ And the broker should have received an "ACK" frame with headers
56
+ | header-name | header-value |
57
+ | transaction | t-0002 |
58
+ And the broker should have received a "SEND" frame with headers
59
+ | header-name | header-value |
60
+ | transaction | t-0002 |
61
+ And the broker should have received a "NACK" frame with headers
62
+ | header-name | header-value |
63
+ | transaction | t-0002 |
64
+ And the broker should have received a "ABORT" frame with headers
65
+ | header-name | header-value |
66
+ | transaction | t-0002 |