mongo 2.13.0 → 2.15.0.alpha

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 (375) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +1 -4
  3. data.tar.gz.sig +0 -0
  4. data/README.md +4 -1
  5. data/Rakefile +46 -18
  6. data/lib/mongo.rb +32 -0
  7. data/lib/mongo/address.rb +1 -1
  8. data/lib/mongo/address/ipv4.rb +1 -1
  9. data/lib/mongo/address/ipv6.rb +1 -1
  10. data/lib/mongo/auth/aws/conversation.rb +1 -4
  11. data/lib/mongo/auth/base.rb +13 -7
  12. data/lib/mongo/auth/conversation_base.rb +32 -0
  13. data/lib/mongo/auth/cr/conversation.rb +6 -29
  14. data/lib/mongo/auth/gssapi/conversation.rb +4 -15
  15. data/lib/mongo/auth/ldap/conversation.rb +3 -14
  16. data/lib/mongo/auth/sasl_conversation_base.rb +1 -13
  17. data/lib/mongo/auth/scram_conversation_base.rb +7 -34
  18. data/lib/mongo/auth/user/view.rb +16 -9
  19. data/lib/mongo/auth/x509/conversation.rb +4 -25
  20. data/lib/mongo/background_thread.rb +11 -0
  21. data/lib/mongo/bulk_write.rb +38 -18
  22. data/lib/mongo/caching_cursor.rb +74 -0
  23. data/lib/mongo/client.rb +142 -16
  24. data/lib/mongo/cluster.rb +22 -31
  25. data/lib/mongo/cluster/reapers/cursor_reaper.rb +6 -2
  26. data/lib/mongo/cluster/sdam_flow.rb +14 -0
  27. data/lib/mongo/cluster/topology/single.rb +1 -1
  28. data/lib/mongo/collection.rb +58 -18
  29. data/lib/mongo/collection/view.rb +24 -20
  30. data/lib/mongo/collection/view/aggregation.rb +26 -5
  31. data/lib/mongo/collection/view/builder/find_command.rb +38 -18
  32. data/lib/mongo/collection/view/change_stream.rb +1 -1
  33. data/lib/mongo/collection/view/explainable.rb +27 -8
  34. data/lib/mongo/collection/view/iterable.rb +73 -13
  35. data/lib/mongo/collection/view/map_reduce.rb +2 -2
  36. data/lib/mongo/collection/view/readable.rb +57 -21
  37. data/lib/mongo/collection/view/writable.rb +29 -15
  38. data/lib/mongo/crypt/encryption_io.rb +6 -6
  39. data/lib/mongo/cursor.rb +18 -5
  40. data/lib/mongo/database.rb +28 -5
  41. data/lib/mongo/database/view.rb +2 -2
  42. data/lib/mongo/error.rb +11 -1
  43. data/lib/mongo/error/bulk_write_error.rb +17 -3
  44. data/lib/mongo/error/internal_driver_error.rb +22 -0
  45. data/lib/mongo/error/invalid_read_concern.rb +28 -0
  46. data/lib/mongo/error/operation_failure.rb +26 -7
  47. data/lib/mongo/error/parser.rb +65 -12
  48. data/lib/mongo/error/server_api_conflict.rb +23 -0
  49. data/lib/mongo/error/server_api_not_supported.rb +24 -0
  50. data/lib/mongo/error/server_certificate_revoked.rb +22 -0
  51. data/lib/mongo/error/unmet_dependency.rb +21 -0
  52. data/lib/mongo/error/unsupported_option.rb +14 -12
  53. data/lib/mongo/grid/fs_bucket.rb +37 -37
  54. data/lib/mongo/index/view.rb +21 -11
  55. data/lib/mongo/lint.rb +2 -1
  56. data/lib/mongo/logger.rb +3 -3
  57. data/lib/mongo/monitoring.rb +13 -4
  58. data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +27 -16
  59. data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +26 -15
  60. data/lib/mongo/operation.rb +4 -2
  61. data/lib/mongo/operation/aggregate/result.rb +9 -8
  62. data/lib/mongo/operation/collections_info.rb +18 -1
  63. data/lib/mongo/operation/collections_info/command.rb +5 -0
  64. data/lib/mongo/operation/collections_info/result.rb +18 -1
  65. data/lib/mongo/operation/context.rb +99 -0
  66. data/lib/mongo/operation/delete/bulk_result.rb +2 -0
  67. data/lib/mongo/operation/delete/result.rb +3 -0
  68. data/lib/mongo/operation/explain/command.rb +4 -0
  69. data/lib/mongo/operation/explain/legacy.rb +4 -0
  70. data/lib/mongo/operation/explain/op_msg.rb +6 -0
  71. data/lib/mongo/operation/explain/result.rb +3 -0
  72. data/lib/mongo/operation/find/legacy/result.rb +2 -0
  73. data/lib/mongo/operation/find/result.rb +13 -0
  74. data/lib/mongo/operation/get_more/result.rb +3 -0
  75. data/lib/mongo/operation/indexes.rb +15 -1
  76. data/lib/mongo/operation/indexes/result.rb +5 -0
  77. data/lib/mongo/operation/insert/bulk_result.rb +5 -0
  78. data/lib/mongo/operation/insert/command.rb +2 -2
  79. data/lib/mongo/operation/insert/legacy.rb +2 -2
  80. data/lib/mongo/operation/insert/op_msg.rb +2 -2
  81. data/lib/mongo/operation/insert/result.rb +5 -0
  82. data/lib/mongo/operation/list_collections/result.rb +9 -1
  83. data/lib/mongo/operation/map_reduce/result.rb +10 -0
  84. data/lib/mongo/operation/parallel_scan/result.rb +4 -0
  85. data/lib/mongo/operation/result.rb +37 -6
  86. data/lib/mongo/operation/shared/bypass_document_validation.rb +1 -0
  87. data/lib/mongo/operation/shared/causal_consistency_supported.rb +1 -0
  88. data/lib/mongo/operation/shared/executable.rb +25 -14
  89. data/lib/mongo/operation/shared/executable_no_validate.rb +2 -2
  90. data/lib/mongo/operation/shared/idable.rb +2 -1
  91. data/lib/mongo/operation/shared/limited.rb +1 -0
  92. data/lib/mongo/operation/shared/object_id_generator.rb +1 -0
  93. data/lib/mongo/operation/shared/op_msg_or_command.rb +1 -7
  94. data/lib/mongo/operation/shared/op_msg_or_find_command.rb +1 -7
  95. data/lib/mongo/operation/shared/polymorphic_operation.rb +39 -0
  96. data/lib/mongo/operation/shared/response_handling.rb +23 -23
  97. data/lib/mongo/operation/shared/result/aggregatable.rb +1 -0
  98. data/lib/mongo/operation/shared/sessions_supported.rb +14 -2
  99. data/lib/mongo/operation/shared/specifiable.rb +1 -0
  100. data/lib/mongo/operation/shared/write.rb +9 -18
  101. data/lib/mongo/operation/shared/write_concern_supported.rb +1 -0
  102. data/lib/mongo/operation/update/legacy/result.rb +7 -0
  103. data/lib/mongo/operation/update/result.rb +8 -0
  104. data/lib/mongo/operation/users_info/result.rb +3 -0
  105. data/lib/mongo/protocol/compressed.rb +51 -5
  106. data/lib/mongo/protocol/message.rb +31 -4
  107. data/lib/mongo/protocol/msg.rb +37 -12
  108. data/lib/mongo/protocol/query.rb +36 -0
  109. data/lib/mongo/query_cache.rb +272 -0
  110. data/lib/mongo/retryable.rb +9 -2
  111. data/lib/mongo/server.rb +12 -16
  112. data/lib/mongo/server/app_metadata.rb +52 -18
  113. data/lib/mongo/server/connection.rb +5 -0
  114. data/lib/mongo/server/connection_base.rb +16 -15
  115. data/lib/mongo/server/connection_common.rb +2 -2
  116. data/lib/mongo/server/connection_pool.rb +9 -4
  117. data/lib/mongo/server/description.rb +12 -1
  118. data/lib/mongo/server/description/features.rb +9 -8
  119. data/lib/mongo/server/monitor.rb +21 -2
  120. data/lib/mongo/server/monitor/app_metadata.rb +1 -1
  121. data/lib/mongo/server/monitor/connection.rb +12 -13
  122. data/lib/mongo/server/pending_connection.rb +26 -8
  123. data/lib/mongo/server/push_monitor.rb +12 -2
  124. data/lib/mongo/server_selector/base.rb +5 -1
  125. data/lib/mongo/session.rb +7 -3
  126. data/lib/mongo/session/session_pool.rb +4 -2
  127. data/lib/mongo/socket.rb +35 -8
  128. data/lib/mongo/socket/ocsp_cache.rb +97 -0
  129. data/lib/mongo/socket/ocsp_verifier.rb +368 -0
  130. data/lib/mongo/socket/ssl.rb +53 -24
  131. data/lib/mongo/srv/monitor.rb +7 -24
  132. data/lib/mongo/srv/resolver.rb +14 -10
  133. data/lib/mongo/timeout.rb +2 -0
  134. data/lib/mongo/uri.rb +21 -390
  135. data/lib/mongo/uri/options_mapper.rb +620 -0
  136. data/lib/mongo/uri/srv_protocol.rb +3 -2
  137. data/lib/mongo/utils.rb +27 -1
  138. data/lib/mongo/version.rb +1 -1
  139. data/spec/NOTES.aws-auth.md +12 -7
  140. data/spec/README.md +87 -2
  141. data/spec/integration/auth_spec.rb +25 -15
  142. data/spec/integration/bson_symbol_spec.rb +4 -2
  143. data/spec/integration/bulk_write_error_message_spec.rb +41 -0
  144. data/spec/integration/bulk_write_spec.rb +48 -0
  145. data/spec/integration/change_stream_spec.rb +5 -5
  146. data/spec/integration/client_authentication_options_spec.rb +92 -28
  147. data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +6 -2
  148. data/spec/integration/command_monitoring_spec.rb +2 -2
  149. data/spec/integration/connection_pool_populator_spec.rb +4 -2
  150. data/spec/integration/connection_spec.rb +2 -0
  151. data/spec/integration/cursor_reaping_spec.rb +54 -18
  152. data/spec/integration/docs_examples_spec.rb +8 -1
  153. data/spec/integration/fork_reconnect_spec.rb +60 -2
  154. data/spec/integration/ocsp_connectivity_spec.rb +26 -0
  155. data/spec/integration/ocsp_verifier_cache_spec.rb +188 -0
  156. data/spec/integration/ocsp_verifier_spec.rb +340 -0
  157. data/spec/integration/operation_failure_code_spec.rb +1 -1
  158. data/spec/integration/operation_failure_message_spec.rb +90 -0
  159. data/spec/integration/query_cache_spec.rb +1045 -0
  160. data/spec/integration/query_cache_transactions_spec.rb +190 -0
  161. data/spec/integration/reconnect_spec.rb +1 -1
  162. data/spec/integration/retryable_writes/retryable_writes_40_and_newer_spec.rb +1 -0
  163. data/spec/integration/retryable_writes/shared/performs_legacy_retries.rb +2 -0
  164. data/spec/integration/sdam_error_handling_spec.rb +86 -1
  165. data/spec/integration/sdam_events_spec.rb +8 -7
  166. data/spec/integration/server_selection_spec.rb +36 -0
  167. data/spec/integration/size_limit_spec.rb +20 -19
  168. data/spec/integration/snappy_compression_spec.rb +25 -0
  169. data/spec/integration/srv_monitoring_spec.rb +39 -4
  170. data/spec/integration/srv_spec.rb +56 -0
  171. data/spec/integration/transactions_examples_spec.rb +23 -7
  172. data/spec/integration/zlib_compression_spec.rb +1 -1
  173. data/spec/integration/zstd_compression_spec.rb +26 -0
  174. data/spec/lite_spec_helper.rb +15 -5
  175. data/spec/mongo/address_spec.rb +16 -12
  176. data/spec/mongo/auth/ldap/conversation_spec.rb +1 -1
  177. data/spec/mongo/auth/ldap_spec.rb +5 -1
  178. data/spec/mongo/auth/scram_negotiation_spec.rb +1 -1
  179. data/spec/mongo/auth/scram_spec.rb +1 -1
  180. data/spec/mongo/auth/user_spec.rb +1 -1
  181. data/spec/mongo/auth/x509/conversation_spec.rb +3 -3
  182. data/spec/mongo/bulk_write_spec.rb +2 -2
  183. data/spec/mongo/caching_cursor_spec.rb +70 -0
  184. data/spec/mongo/client_construction_spec.rb +273 -35
  185. data/spec/mongo/client_encryption_spec.rb +16 -10
  186. data/spec/mongo/client_spec.rb +64 -0
  187. data/spec/mongo/cluster/topology/replica_set_spec.rb +1 -1
  188. data/spec/mongo/cluster/topology/sharded_spec.rb +1 -1
  189. data/spec/mongo/cluster/topology/single_spec.rb +15 -6
  190. data/spec/mongo/cluster/topology/unknown_spec.rb +1 -1
  191. data/spec/mongo/cluster/topology_spec.rb +1 -1
  192. data/spec/mongo/cluster_spec.rb +6 -18
  193. data/spec/mongo/collection/view/change_stream_resume_spec.rb +1 -1
  194. data/spec/mongo/collection/view/explainable_spec.rb +87 -4
  195. data/spec/mongo/collection/view/map_reduce_spec.rb +2 -0
  196. data/spec/mongo/collection/view/readable_spec.rb +50 -0
  197. data/spec/mongo/collection_crud_spec.rb +4357 -0
  198. data/spec/mongo/collection_ddl_spec.rb +534 -0
  199. data/spec/mongo/collection_spec.rb +5 -4787
  200. data/spec/mongo/crypt/auto_decryption_context_spec.rb +1 -1
  201. data/spec/mongo/crypt/auto_encryption_context_spec.rb +1 -1
  202. data/spec/mongo/crypt/binary_spec.rb +1 -6
  203. data/spec/mongo/crypt/binding/binary_spec.rb +1 -6
  204. data/spec/mongo/crypt/binding/context_spec.rb +2 -7
  205. data/spec/mongo/crypt/binding/helpers_spec.rb +1 -6
  206. data/spec/mongo/crypt/binding/mongocrypt_spec.rb +2 -7
  207. data/spec/mongo/crypt/binding/status_spec.rb +1 -6
  208. data/spec/mongo/crypt/binding/version_spec.rb +1 -6
  209. data/spec/mongo/crypt/data_key_context_spec.rb +1 -1
  210. data/spec/mongo/crypt/explicit_decryption_context_spec.rb +1 -1
  211. data/spec/mongo/crypt/explicit_encryption_context_spec.rb +1 -1
  212. data/spec/mongo/crypt/status_spec.rb +1 -6
  213. data/spec/mongo/database_spec.rb +174 -4
  214. data/spec/mongo/error/bulk_write_error_spec.rb +3 -3
  215. data/spec/mongo/error/no_server_available_spec.rb +1 -1
  216. data/spec/mongo/error/parser_spec.rb +37 -6
  217. data/spec/mongo/index/view_spec.rb +8 -2
  218. data/spec/mongo/logger_spec.rb +13 -11
  219. data/spec/mongo/monitoring/event/server_closed_spec.rb +1 -1
  220. data/spec/mongo/monitoring/event/server_heartbeat_failed_spec.rb +1 -1
  221. data/spec/mongo/monitoring/event/server_heartbeat_succeeded_spec.rb +1 -1
  222. data/spec/mongo/monitoring/event/server_opening_spec.rb +1 -1
  223. data/spec/mongo/monitoring/event/topology_changed_spec.rb +1 -1
  224. data/spec/mongo/monitoring/event/topology_closed_spec.rb +1 -1
  225. data/spec/mongo/monitoring/event/topology_opening_spec.rb +1 -1
  226. data/spec/mongo/operation/aggregate_spec.rb +2 -1
  227. data/spec/mongo/operation/collections_info_spec.rb +4 -1
  228. data/spec/mongo/operation/command_spec.rb +6 -3
  229. data/spec/mongo/operation/create_index_spec.rb +6 -3
  230. data/spec/mongo/operation/create_user_spec.rb +6 -3
  231. data/spec/mongo/operation/delete/bulk_spec.rb +9 -6
  232. data/spec/mongo/operation/delete/op_msg_spec.rb +3 -3
  233. data/spec/mongo/operation/delete_spec.rb +11 -7
  234. data/spec/mongo/operation/drop_index_spec.rb +6 -2
  235. data/spec/mongo/operation/find/legacy_spec.rb +3 -1
  236. data/spec/mongo/operation/get_more_spec.rb +3 -1
  237. data/spec/mongo/operation/indexes_spec.rb +5 -1
  238. data/spec/mongo/operation/insert/bulk_spec.rb +10 -7
  239. data/spec/mongo/operation/insert/command_spec.rb +2 -2
  240. data/spec/mongo/operation/insert/op_msg_spec.rb +3 -3
  241. data/spec/mongo/operation/insert_spec.rb +15 -12
  242. data/spec/mongo/operation/map_reduce_spec.rb +5 -2
  243. data/spec/mongo/operation/read_preference_op_msg_spec.rb +1 -1
  244. data/spec/mongo/operation/remove_user_spec.rb +6 -3
  245. data/spec/mongo/operation/result_spec.rb +1 -1
  246. data/spec/mongo/operation/update/bulk_spec.rb +9 -6
  247. data/spec/mongo/operation/update/command_spec.rb +2 -2
  248. data/spec/mongo/operation/update/op_msg_spec.rb +3 -3
  249. data/spec/mongo/operation/update_spec.rb +10 -7
  250. data/spec/mongo/operation/update_user_spec.rb +4 -1
  251. data/spec/mongo/protocol/compressed_spec.rb +26 -12
  252. data/spec/mongo/query_cache_middleware_spec.rb +55 -0
  253. data/spec/mongo/query_cache_spec.rb +280 -0
  254. data/spec/mongo/retryable_spec.rb +3 -2
  255. data/spec/mongo/server/app_metadata_shared.rb +2 -2
  256. data/spec/mongo/server/app_metadata_spec.rb +2 -0
  257. data/spec/mongo/server/connection_pool/populator_spec.rb +3 -1
  258. data/spec/mongo/server/connection_pool_spec.rb +8 -4
  259. data/spec/mongo/server/connection_spec.rb +39 -25
  260. data/spec/mongo/server/description_spec.rb +18 -0
  261. data/spec/mongo/server/monitor/connection_spec.rb +17 -7
  262. data/spec/mongo/server/monitor_spec.rb +9 -1
  263. data/spec/mongo/server_selector_spec.rb +2 -2
  264. data/spec/mongo/server_spec.rb +15 -2
  265. data/spec/mongo/socket/ssl_spec.rb +44 -4
  266. data/spec/mongo/socket_spec.rb +2 -2
  267. data/spec/mongo/tls_context_hooks_spec.rb +37 -0
  268. data/spec/mongo/uri/srv_protocol_spec.rb +64 -33
  269. data/spec/mongo/uri_option_parsing_spec.rb +11 -11
  270. data/spec/mongo/uri_spec.rb +68 -41
  271. data/spec/mongo/utils_spec.rb +39 -0
  272. data/spec/runners/auth.rb +3 -0
  273. data/spec/runners/change_streams/test.rb +1 -1
  274. data/spec/runners/connection_string.rb +31 -124
  275. data/spec/runners/crud/requirement.rb +40 -3
  276. data/spec/runners/crud/test_base.rb +0 -19
  277. data/spec/runners/crud/verifier.rb +8 -0
  278. data/spec/runners/server_selection.rb +1 -1
  279. data/spec/runners/transactions/operation.rb +13 -2
  280. data/spec/runners/transactions/test.rb +3 -2
  281. data/spec/runners/unified.rb +96 -0
  282. data/spec/runners/unified/assertions.rb +249 -0
  283. data/spec/runners/unified/change_stream_operations.rb +26 -0
  284. data/spec/runners/unified/crud_operations.rb +199 -0
  285. data/spec/runners/unified/ddl_operations.rb +96 -0
  286. data/spec/runners/unified/entity_map.rb +39 -0
  287. data/spec/runners/unified/error.rb +25 -0
  288. data/spec/runners/unified/event_subscriber.rb +91 -0
  289. data/spec/runners/unified/exceptions.rb +21 -0
  290. data/spec/runners/unified/grid_fs_operations.rb +55 -0
  291. data/spec/runners/unified/support_operations.rb +250 -0
  292. data/spec/runners/unified/test.rb +393 -0
  293. data/spec/runners/unified/test_group.rb +28 -0
  294. data/spec/runners/unified/using_hash.rb +31 -0
  295. data/spec/shared/LICENSE +20 -0
  296. data/spec/shared/bin/get-mongodb-download-url +17 -0
  297. data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
  298. data/spec/shared/lib/mrss/cluster_config.rb +218 -0
  299. data/spec/shared/lib/mrss/constraints.rb +346 -0
  300. data/spec/shared/lib/mrss/docker_runner.rb +262 -0
  301. data/spec/shared/lib/mrss/lite_constraints.rb +175 -0
  302. data/spec/shared/lib/mrss/server_version_registry.rb +112 -0
  303. data/spec/shared/lib/mrss/spec_organizer.rb +149 -0
  304. data/spec/shared/lib/mrss/utils.rb +15 -0
  305. data/spec/shared/share/Dockerfile.erb +231 -0
  306. data/spec/shared/shlib/distro.sh +73 -0
  307. data/spec/shared/shlib/server.sh +290 -0
  308. data/spec/shared/shlib/set_env.sh +128 -0
  309. data/spec/solo/clean_exit_spec.rb +21 -0
  310. data/spec/spec_helper.rb +7 -2
  311. data/spec/spec_tests/cmap_spec.rb +7 -3
  312. data/spec/spec_tests/crud_unified_spec.rb +10 -0
  313. data/spec/spec_tests/data/change_streams/change-streams-errors.yml +0 -1
  314. data/spec/spec_tests/data/change_streams/change-streams.yml +0 -2
  315. data/spec/spec_tests/data/cmap/pool-checkout-connection.yml +6 -2
  316. data/spec/spec_tests/data/cmap/pool-create-min-size.yml +3 -0
  317. data/spec/spec_tests/data/connection_string/valid-warnings.yml +24 -0
  318. data/spec/spec_tests/data/crud_unified/estimatedDocumentCount.yml +267 -0
  319. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-4.9.yml +60 -0
  320. data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount.yml → estimatedDocumentCount-pre4.9.yml} +2 -0
  321. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-serverErrors-4.9.yml +146 -0
  322. data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount-serverErrors.yml → estimatedDocumentCount-serverErrors-pre4.9.yml} +2 -0
  323. data/spec/spec_tests/data/retryable_reads/listIndexNames.yml +1 -1
  324. data/spec/spec_tests/data/sdam_monitoring/discovered_standalone.yml +1 -3
  325. data/spec/spec_tests/data/sdam_monitoring/standalone.yml +2 -2
  326. data/spec/spec_tests/data/sdam_monitoring/standalone_repeated.yml +2 -2
  327. data/spec/spec_tests/data/sdam_monitoring/standalone_suppress_equal_description_changes.yml +2 -2
  328. data/spec/spec_tests/data/sdam_monitoring/standalone_to_rs_with_me_mismatch.yml +2 -2
  329. data/spec/spec_tests/data/unified/valid-fail/operation-failure.yml +31 -0
  330. data/spec/spec_tests/data/unified/valid-pass/poc-change-streams.yml +220 -0
  331. data/spec/spec_tests/data/unified/valid-pass/poc-command-monitoring.yml +102 -0
  332. data/spec/spec_tests/data/unified/valid-pass/poc-crud.yml +184 -0
  333. data/spec/spec_tests/data/unified/valid-pass/poc-gridfs.yml +155 -0
  334. data/spec/spec_tests/data/unified/valid-pass/poc-retryable-reads.yml +193 -0
  335. data/spec/spec_tests/data/unified/valid-pass/poc-retryable-writes.yml +210 -0
  336. data/spec/spec_tests/data/unified/valid-pass/poc-sessions.yml +215 -0
  337. data/spec/spec_tests/data/unified/valid-pass/poc-transactions-convenient-api.yml +235 -0
  338. data/spec/spec_tests/data/unified/valid-pass/poc-transactions-mongos-pin-auto.yml +169 -0
  339. data/spec/spec_tests/data/unified/valid-pass/poc-transactions.yml +170 -0
  340. data/spec/spec_tests/data/uri_options/auth-options.yml +25 -0
  341. data/spec/spec_tests/data/uri_options/compression-options.yml +7 -4
  342. data/spec/spec_tests/data/uri_options/read-preference-options.yml +24 -0
  343. data/spec/spec_tests/data/uri_options/ruby-connection-options.yml +1 -0
  344. data/spec/spec_tests/data/uri_options/tls-options.yml +160 -4
  345. data/spec/spec_tests/data/versioned_api/crud-api-version-1-strict.yml +416 -0
  346. data/spec/spec_tests/data/versioned_api/crud-api-version-1.yml +409 -0
  347. data/spec/spec_tests/data/versioned_api/runcommand-helper-no-api-version-declared.yml +67 -0
  348. data/spec/spec_tests/data/versioned_api/test-commands-deprecation-errors.yml +47 -0
  349. data/spec/spec_tests/data/versioned_api/test-commands-strict-mode.yml +44 -0
  350. data/spec/spec_tests/data/versioned_api/transaction-handling.yml +180 -0
  351. data/spec/spec_tests/dns_seedlist_discovery_spec.rb +9 -1
  352. data/spec/spec_tests/unified_spec.rb +15 -0
  353. data/spec/spec_tests/uri_options_spec.rb +47 -33
  354. data/spec/spec_tests/versioned_api_spec.rb +10 -0
  355. data/spec/stress/fork_reconnect_stress_spec.rb +1 -1
  356. data/spec/support/certificates/atlas-ocsp-ca.crt +28 -0
  357. data/spec/support/certificates/atlas-ocsp.crt +41 -0
  358. data/spec/support/client_registry_macros.rb +11 -2
  359. data/spec/support/common_shortcuts.rb +59 -0
  360. data/spec/support/constraints.rb +6 -253
  361. data/spec/support/matchers.rb +16 -0
  362. data/spec/support/ocsp +1 -0
  363. data/spec/support/session_registry.rb +52 -0
  364. data/spec/support/shared/session.rb +2 -2
  365. data/spec/support/spec_config.rb +68 -3
  366. data/spec/support/spec_setup.rb +48 -38
  367. data/spec/support/utils.rb +102 -4
  368. metadata +1087 -936
  369. metadata.gz.sig +0 -0
  370. data/lib/mongo/operation/shared/collections_info_or_list_collections.rb +0 -56
  371. data/lib/mongo/operation/shared/op_msg_or_list_indexes_command.rb +0 -47
  372. data/spec/support/child_process_helper.rb +0 -78
  373. data/spec/support/cluster_config.rb +0 -207
  374. data/spec/support/lite_constraints.rb +0 -141
  375. data/spec/support/spec_organizer.rb +0 -129
@@ -15,15 +15,15 @@
15
15
  module Mongo
16
16
  class Socket
17
17
 
18
- # Wrapper for SSL sockets.
18
+ # Wrapper for TLS sockets.
19
19
  #
20
20
  # @since 2.0.0
21
21
  class SSL < Socket
22
22
  include OpenSSL
23
23
 
24
- # Initializes a new SSL socket.
24
+ # Initializes a new TLS socket.
25
25
  #
26
- # @example Create the SSL socket.
26
+ # @example Create the TLS socket.
27
27
  # SSL.new('::1', 27017, 30)
28
28
  #
29
29
  # @param [ String ] host The hostname or IP address.
@@ -106,6 +106,8 @@ module Mongo
106
106
  begin
107
107
  @tcp_socket.setsockopt(IPPROTO_TCP, TCP_NODELAY, 1)
108
108
  set_socket_options(@tcp_socket)
109
+ run_tls_context_hooks
110
+
109
111
  connect!
110
112
  rescue
111
113
  @tcp_socket.close
@@ -113,7 +115,7 @@ module Mongo
113
115
  end
114
116
  end
115
117
 
116
- # @return [ SSLContext ] context The ssl context.
118
+ # @return [ SSLContext ] context The TLS context.
117
119
  attr_reader :context
118
120
 
119
121
  # @return [ String ] host The host to connect to.
@@ -149,6 +151,7 @@ module Mongo
149
151
  @socket.connect
150
152
  end
151
153
  verify_certificate!(@socket)
154
+ verify_ocsp_endpoint!(@socket)
152
155
  rescue
153
156
  @socket.close
154
157
  @socket = nil
@@ -177,29 +180,36 @@ module Mongo
177
180
  private
178
181
 
179
182
  def verify_certificate?
180
- @verify_certificate ||=
181
- # If ssl_verify_certificate is not present, disable only if ssl_verify is
182
- # explicitly set to false.
183
- if options[:ssl_verify_certificate].nil?
184
- options[:ssl_verify] != false
185
- # If ssl_verify_certificate is present, enable or disable based on its value.
186
- else
187
- !!options[:ssl_verify_certificate]
188
- end
183
+ # If ssl_verify_certificate is not present, disable only if
184
+ # ssl_verify is explicitly set to false.
185
+ if options[:ssl_verify_certificate].nil?
186
+ options[:ssl_verify] != false
187
+ # If ssl_verify_certificate is present, enable or disable based on its value.
188
+ else
189
+ !!options[:ssl_verify_certificate]
190
+ end
189
191
  end
190
192
 
191
193
  def verify_hostname?
192
- @verify_hostname ||=
193
- # If ssl_verify_hostname is not present, disable only if ssl_verify is
194
- # explicitly set to false.
195
- if options[:ssl_verify_hostname].nil?
196
- options[:ssl_verify] != false
197
- # If ssl_verify_hostname is present, enable or disable based on its value.
198
- else
199
- !!options[:ssl_verify_hostname]
200
- end
194
+ # If ssl_verify_hostname is not present, disable only if ssl_verify is
195
+ # explicitly set to false.
196
+ if options[:ssl_verify_hostname].nil?
197
+ options[:ssl_verify] != false
198
+ # If ssl_verify_hostname is present, enable or disable based on its value.
199
+ else
200
+ !!options[:ssl_verify_hostname]
201
+ end
201
202
  end
202
203
 
204
+ def verify_ocsp_endpoint?
205
+ if !options[:ssl_verify_ocsp_endpoint].nil?
206
+ options[:ssl_verify_ocsp_endpoint] != false
207
+ elsif !options[:ssl_verify_certificate].nil?
208
+ options[:ssl_verify_certificate] != false
209
+ else
210
+ options[:ssl_verify] != false
211
+ end
212
+ end
203
213
 
204
214
  def create_context(options)
205
215
  OpenSSL::SSL::SSLContext.new.tap do |context|
@@ -344,13 +354,26 @@ module Mongo
344
354
  def verify_certificate!(socket)
345
355
  if verify_hostname?
346
356
  unless OpenSSL::SSL.verify_certificate_identity(socket.peer_cert, host_name)
347
- raise Error::SocketError, 'SSL handshake failed due to a hostname mismatch.'
357
+ raise Error::SocketError, 'TLS handshake failed due to a hostname mismatch.'
348
358
  end
349
359
  end
350
360
  end
351
361
 
362
+ def verify_ocsp_endpoint!(socket)
363
+ unless verify_ocsp_endpoint?
364
+ return
365
+ end
366
+
367
+ cert = socket.peer_cert
368
+ ca_cert = socket.peer_cert_chain.last
369
+
370
+ verifier = OcspVerifier.new(@host_name, cert, ca_cert, context.cert_store,
371
+ **Utils.shallow_symbolize_keys(options))
372
+ verifier.verify_with_cache
373
+ end
374
+
352
375
  def read_buffer_size
353
- # Buffer size for SSL reads.
376
+ # Buffer size for TLS reads.
354
377
  # Capped at 16k due to https://linux.die.net/man/3/ssl_read
355
378
  16384
356
379
  end
@@ -358,6 +381,12 @@ module Mongo
358
381
  def human_address
359
382
  "#{host}:#{port} (#{host_name}:#{port}, TLS)"
360
383
  end
384
+
385
+ def run_tls_context_hooks
386
+ Mongo.tls_context_hooks.each do |hook|
387
+ hook.call(@context)
388
+ end
389
+ end
361
390
  end
362
391
  end
363
392
  end
@@ -34,24 +34,18 @@ module Mongo
34
34
  # Creates the SRV monitor.
35
35
  #
36
36
  # @param [ Cluster ] cluster The cluster.
37
- # @param [ Hash ] options The cluster options.
38
37
  #
39
- # @option options [ Float ] :timeout The timeout to use for DNS lookups.
40
- # @option options [ URI::SRVProtocol ] :srv_uri The SRV URI to monitor.
41
- # @option options [ Hash ] :resolv_options For internal driver use only.
38
+ # @option opts [ Float ] :timeout The timeout to use for DNS lookups.
39
+ # @option opts [ URI::SRVProtocol ] :srv_uri The SRV URI to monitor.
40
+ # @option opts [ Hash ] :resolv_options For internal driver use only.
42
41
  # Options to pass through to Resolv::DNS constructor for SRV lookups.
43
- def initialize(cluster, options = nil)
44
- options = if options
45
- options.dup
46
- else
47
- {}
48
- end
42
+ def initialize(cluster, **opts)
49
43
  @cluster = cluster
50
- @resolver = Srv::Resolver.new(options)
51
- unless @srv_uri = options.delete(:srv_uri)
44
+ unless @srv_uri = opts.delete(:srv_uri)
52
45
  raise ArgumentError, 'SRV URI is required'
53
46
  end
54
- @options = options.freeze
47
+ @options = opts.freeze
48
+ @resolver = Srv::Resolver.new(**opts)
55
49
  @last_result = @srv_uri.srv_result
56
50
  @stop_semaphore = Semaphore.new
57
51
  end
@@ -65,11 +59,6 @@ module Mongo
65
59
  # records' TTL values.
66
60
  attr_reader :last_result
67
61
 
68
- def start!
69
- super
70
- ObjectSpace.define_finalizer(self, self.class.finalize(@thread))
71
- end
72
-
73
62
  private
74
63
 
75
64
  def do_work
@@ -103,12 +92,6 @@ module Mongo
103
92
  @cluster.set_server_list(last_result.address_strs)
104
93
  end
105
94
 
106
- def self.finalize(thread)
107
- Proc.new do
108
- thread.kill
109
- end
110
- end
111
-
112
95
  def scan_interval
113
96
  if last_result.empty?
114
97
  [cluster.heartbeat_interval, MIN_SCAN_INTERVAL].min
@@ -28,20 +28,24 @@ module Mongo
28
28
 
29
29
  # Creates a new Resolver.
30
30
  #
31
- # @param [ Hash ] options The options for the resolver.
32
- #
33
- # @option options [ Boolean ] :raise_on_invalid Whether or not to raise
31
+ # @option opts [ Float ] :timeout The timeout, in seconds, to use for
32
+ # each DNS record resolution.
33
+ # @option opts [ Boolean ] :raise_on_invalid Whether or not to raise
34
34
  # an exception if either a record with a mismatched domain is found
35
35
  # or if no records are found. Defaults to true.
36
- # @option options [ Hash ] :resolv_options For internal driver use only.
36
+ # @option opts [ Hash ] :resolv_options For internal driver use only.
37
37
  # Options to pass through to Resolv::DNS constructor for SRV lookups.
38
- def initialize(options = nil)
39
- @options = if options
40
- options.dup
41
- else
42
- {}
43
- end.freeze
38
+ def initialize(**opts)
39
+ @options = opts.freeze
44
40
  @resolver = Resolv::DNS.new(@options[:resolv_options])
41
+ @resolver.timeouts = timeout
42
+ end
43
+
44
+ # @return [ Hash ] Resolver options.
45
+ attr_reader :options
46
+
47
+ def timeout
48
+ options[:timeout] || Monitor::DEFAULT_TIMEOUT
45
49
  end
46
50
 
47
51
  # Obtains all of the SRV records for a given hostname.
data/lib/mongo/timeout.rb CHANGED
@@ -13,6 +13,8 @@
13
13
  # limitations under the License.
14
14
 
15
15
  module Mongo
16
+
17
+ # @api private
16
18
  module Timeout
17
19
 
18
20
  # A wrapper around Ruby core's Timeout::timeout method that provides
data/lib/mongo/uri.rb CHANGED
@@ -388,6 +388,12 @@ module Mongo
388
388
  [ creds_hosts, db_opts ].map { |s| s.reverse }
389
389
  end
390
390
 
391
+ def options_mapper
392
+ @options_mapper ||= OptionsMapper.new(
393
+ logger: @options[:logger],
394
+ )
395
+ end
396
+
391
397
  def parse_uri_options!(string)
392
398
  uri_options = {}
393
399
  unless string
@@ -403,7 +409,7 @@ module Mongo
403
409
  end
404
410
  key = decode(key)
405
411
  value = decode(value)
406
- add_uri_option(key, value, uri_options)
412
+ options_mapper.add_uri_option(key, value, uri_options)
407
413
  end
408
414
  uri_options
409
415
  end
@@ -453,393 +459,6 @@ module Mongo
453
459
  CGI.escape(value).gsub('+', '%20')
454
460
  end
455
461
 
456
- # Hash for storing map of URI option parameters to conversion strategies
457
- URI_OPTION_MAP = {}
458
-
459
- # Simple internal dsl to register a MongoDB URI option in the URI_OPTION_MAP.
460
- #
461
- # @param uri_key [String] The MongoDB URI option to register.
462
- # @param name [Symbol] The name of the option in the driver.
463
- # @param extra [Hash] Extra options.
464
- # * :group [Symbol] Nested hash where option will go.
465
- # * :type [Symbol] Name of function to transform value.
466
- def self.uri_option(uri_key, name, extra = {})
467
- URI_OPTION_MAP[uri_key] = { :name => name }.merge(extra)
468
- end
469
-
470
- # Replica Set Options
471
- uri_option 'replicaset', :replica_set
472
-
473
- # Timeout Options
474
- uri_option 'connecttimeoutms', :connect_timeout, :type => :ms
475
- uri_option 'sockettimeoutms', :socket_timeout, :type => :ms
476
- uri_option 'serverselectiontimeoutms', :server_selection_timeout, :type => :ms
477
- uri_option 'localthresholdms', :local_threshold, :type => :ms
478
- uri_option 'heartbeatfrequencyms', :heartbeat_frequency, :type => :ms
479
- uri_option 'maxidletimems', :max_idle_time, :type => :ms
480
-
481
- # Write Options
482
- uri_option 'w', :w, :group => :write_concern, type: :w
483
- uri_option 'journal', :j, :group => :write_concern, :type => :bool
484
- uri_option 'fsync', :fsync, :group => :write_concern, type: :bool
485
- uri_option 'wtimeoutms', :wtimeout, :group => :write_concern, :type => :integer
486
-
487
- # Read Options
488
- uri_option 'readpreference', :mode, :group => :read, :type => :read_mode
489
- uri_option 'readpreferencetags', :tag_sets, :group => :read, :type => :read_tags
490
- uri_option 'maxstalenessseconds', :max_staleness, :group => :read, :type => :max_staleness
491
-
492
- # Pool options
493
- uri_option 'minpoolsize', :min_pool_size, :type => :integer
494
- uri_option 'maxpoolsize', :max_pool_size, :type => :integer
495
- uri_option 'waitqueuetimeoutms', :wait_queue_timeout, :type => :ms
496
-
497
- # Security Options
498
- uri_option 'ssl', :ssl, :type => :repeated_bool
499
- uri_option 'tls', :ssl, :type => :repeated_bool
500
- uri_option 'tlsallowinvalidcertificates', :ssl_verify_certificate,
501
- :type => :inverse_bool
502
- uri_option 'tlsallowinvalidhostnames', :ssl_verify_hostname,
503
- :type => :inverse_bool
504
- uri_option 'tlscafile', :ssl_ca_cert
505
- uri_option 'tlscertificatekeyfile', :ssl_cert
506
- uri_option 'tlscertificatekeyfilepassword', :ssl_key_pass_phrase
507
- uri_option 'tlsinsecure', :ssl_verify, :type => :inverse_bool
508
-
509
- # Topology options
510
- uri_option 'directconnection', :direct_connection, type: :bool
511
- uri_option 'connect', :connect, type: :symbol
512
-
513
- # Auth Options
514
- uri_option 'authsource', :auth_source
515
- uri_option 'authmechanism', :auth_mech, :type => :auth_mech
516
- uri_option 'authmechanismproperties', :auth_mech_properties, :type => :auth_mech_props
517
-
518
- # Client Options
519
- uri_option 'appname', :app_name
520
- uri_option 'compressors', :compressors, :type => :array
521
- uri_option 'readconcernlevel', :level, group: :read_concern, type: :symbol
522
- uri_option 'retryreads', :retry_reads, :type => :bool
523
- uri_option 'retrywrites', :retry_writes, :type => :bool
524
- uri_option 'zlibcompressionlevel', :zlib_compression_level, :type => :zlib_compression_level
525
-
526
- # Applies URI value transformation by either using the default cast
527
- # or a transformation appropriate for the given type.
528
- #
529
- # @param key [String] URI option name.
530
- # @param value [String] The value to be transformed.
531
- # @param type [Symbol] The transform method.
532
- def apply_transform(key, value, type)
533
- if type
534
- if respond_to?("convert_#{type}", true)
535
- send("convert_#{type}", key, value)
536
- else
537
- send(type, value)
538
- end
539
- else
540
- value
541
- end
542
- end
543
-
544
- # Selects the output destination for an option.
545
- #
546
- # @param [Hash] uri_options The base target.
547
- # @param [Symbol] group Group subtarget.
548
- #
549
- # @return [Hash] The target for the option.
550
- def select_target(uri_options, group = nil)
551
- if group
552
- uri_options[group] ||= {}
553
- else
554
- uri_options
555
- end
556
- end
557
-
558
- # Merges a new option into the target.
559
- #
560
- # If the option exists at the target destination the merge will
561
- # be an addition.
562
- #
563
- # Specifically required to append an additional tag set
564
- # to the array of tag sets without overwriting the original.
565
- #
566
- # @param target [Hash] The destination.
567
- # @param value [Object] The value to be merged.
568
- # @param name [Symbol] The name of the option.
569
- def merge_uri_option(target, value, name)
570
- if target.key?(name)
571
- if REPEATABLE_OPTIONS.include?(name)
572
- target[name] += value
573
- else
574
- log_warn("Repeated option key: #{name}.")
575
- end
576
- else
577
- target.merge!(name => value)
578
- end
579
- end
580
-
581
- # Adds an option to the uri options hash via the supplied strategy.
582
- #
583
- # Acquires a target for the option based on group.
584
- # Transforms the value.
585
- # Merges the option into the target.
586
- #
587
- # @param key [String] URI option name.
588
- # @param value [String] The value of the option.
589
- # @param uri_options [Hash] The base option target.
590
- def add_uri_option(key, value, uri_options)
591
- strategy = URI_OPTION_MAP[key.downcase]
592
- if strategy.nil?
593
- log_warn("Unsupported URI option '#{key}' on URI '#{@string}'. It will be ignored.")
594
- return
595
- end
596
-
597
- target = select_target(uri_options, strategy[:group])
598
- value = apply_transform(key, value, strategy[:type])
599
- merge_uri_option(target, value, strategy[:name])
600
- end
601
-
602
- # Authentication mechanism transformation.
603
- #
604
- # @param value [String] The authentication mechanism.
605
- #
606
- # @return [Symbol] The transformed authentication mechanism.
607
- def auth_mech(value)
608
- (AUTH_MECH_MAP[value.upcase] || value).tap do |mech|
609
- log_warn("#{value} is not a valid auth mechanism") unless mech
610
- end
611
- end
612
-
613
- # Read preference mode transformation.
614
- #
615
- # @param value [String] The read mode string value.
616
- #
617
- # @return [Symbol] The read mode symbol.
618
- def read_mode(value)
619
- READ_MODE_MAP[value.downcase] || value
620
- end
621
-
622
- # Read preference tags transformation.
623
- #
624
- # @param value [String] The string representing tag set.
625
- #
626
- # @return [Array<Hash>] Array with tag set.
627
- def read_tags(value)
628
- [read_set(value)]
629
- end
630
-
631
- # Read preference tag set extractor.
632
- #
633
- # @param value [String] The tag set string.
634
- #
635
- # @return [Hash] The tag set hash.
636
- def read_set(value)
637
- hash_extractor('readPreferenceTags', value)
638
- end
639
-
640
- # Auth mechanism properties extractor.
641
- #
642
- # @param value [ String ] The auth mechanism properties string.
643
- #
644
- # @return [ Hash ] The auth mechanism properties hash.
645
- def auth_mech_props(value)
646
- properties = hash_extractor('authMechanismProperties', value)
647
- if properties && properties[:canonicalize_host_name]
648
- properties.merge!(canonicalize_host_name:
649
- properties[:canonicalize_host_name].downcase == 'true')
650
- end
651
- properties
652
- end
653
-
654
- # Parses the zlib compression level.
655
- #
656
- # @param value [ String ] The zlib compression level string.
657
- #
658
- # @return [ Integer | nil ] The compression level value if it is between -1 and 9 (inclusive),
659
- # otherwise nil (and a warning will be logged).
660
- def zlib_compression_level(value)
661
- if /\A-?\d+\z/ =~ value
662
- i = value.to_i
663
-
664
- if i >= -1 && i <= 9
665
- return i
666
- end
667
- end
668
-
669
- log_warn("#{value} is not a valid zlibCompressionLevel")
670
- nil
671
- end
672
-
673
- # Converts the value into a boolean and returns it wrapped in an array.
674
- #
675
- # @param name [ String ] Name of the URI option being processed.
676
- # @param value [ String ] URI option value.
677
- #
678
- # @return [ Array<true | false> ] The boolean value parsed and wraped
679
- # in an array.
680
- def convert_repeated_bool(name, value)
681
- [convert_bool(name, value)]
682
- end
683
-
684
- # Converts +value+ into an integer.
685
- #
686
- # If the value is not a valid integer, warns and returns nil.
687
- #
688
- # @param name [ String ] Name of the URI option being processed.
689
- # @param value [ String ] URI option value.
690
- #
691
- # @return [ nil | Integer ] Converted value.
692
- def convert_integer(name, value)
693
- unless /\A\d+\z/ =~ value
694
- log_warn("#{value} is not a valid integer for #{name}")
695
- return nil
696
- end
697
-
698
- value.to_i
699
- end
700
-
701
- # Converts +value+ into a symbol.
702
- #
703
- # @param name [ String ] Name of the URI option being processed.
704
- # @param value [ String ] URI option value.
705
- #
706
- # @return [ Symbol ] Converted value.
707
- def convert_symbol(name, value)
708
- value.to_sym
709
- end
710
-
711
- # Converts +value+ as a write concern.
712
- #
713
- # If +value+ is the word "majority", returns the symbol :majority.
714
- # If +value+ is a number, returns the number as an integer.
715
- # Otherwise returns the string +value+ unchanged.
716
- #
717
- # @param name [ String ] Name of the URI option being processed.
718
- # @param value [ String ] URI option value.
719
- #
720
- # @return [ Integer | Symbol | String ] Converted value.
721
- def convert_w(name, value)
722
- case value
723
- when 'majority'
724
- :majority
725
- when /\A[0-9]+\z/
726
- value.to_i
727
- else
728
- value
729
- end
730
- end
731
-
732
- # Converts +value+ to a boolean.
733
- #
734
- # Returns true for 'true', false for 'false', otherwise nil.
735
- #
736
- # @param name [ String ] Name of the URI option being processed.
737
- # @param value [ String ] URI option value.
738
- #
739
- # @return [ true | false | nil ] Converted value.
740
- def convert_bool(name, value)
741
- case value
742
- when "true", 'TRUE'
743
- true
744
- when "false", 'FALSE'
745
- false
746
- else
747
- log_warn("invalid boolean option for #{name}: #{value}")
748
- nil
749
- end
750
- end
751
-
752
- # Parses a boolean value and returns its inverse.
753
- #
754
- # @param value [ String ] The URI option value.
755
- #
756
- # @return [ true | false | nil ] The inverse of the boolean value parsed out, otherwise nil
757
- # (and a warning will be logged).
758
- def convert_inverse_bool(name, value)
759
- b = convert_bool(name, value)
760
-
761
- if b.nil?
762
- nil
763
- else
764
- !b
765
- end
766
- end
767
-
768
- # Parses the max staleness value, which must be either "0" or an integer greater or equal to 90.
769
- #
770
- # @param value [ String ] The max staleness string.
771
- #
772
- # @return [ Integer | nil ] The max staleness integer parsed out if it is valid, otherwise nil
773
- # (and a warning will be logged).
774
- def max_staleness(value)
775
- if /\A-?\d+\z/ =~ value
776
- int = value.to_i
777
-
778
- if int == -1
779
- int = nil
780
- end
781
-
782
- if int && (int >= 0 && int < 90 || int < 0)
783
- log_warn("max staleness should be either 0 or greater than 90: #{value}")
784
- end
785
-
786
- return int
787
- end
788
-
789
- log_warn("Invalid max staleness value: #{value}")
790
- nil
791
- end
792
-
793
- # Ruby's convention is to provide timeouts in seconds, not milliseconds and
794
- # to use fractions where more precision is necessary. The connection string
795
- # options are always in MS so we provide an easy conversion type.
796
- #
797
- # @param [ Integer ] value The millisecond value.
798
- #
799
- # @return [ Float ] The seconds value.
800
- #
801
- # @since 2.0.0
802
- def convert_ms(name, value)
803
- unless /\A-?\d+(\.\d+)?\z/ =~ value
804
- log_warn("Invalid ms value for #{name}: #{value}")
805
- return nil
806
- end
807
-
808
- if value[0] == '-'
809
- log_warn("#{name} cannot be a negative number")
810
- return nil
811
- end
812
-
813
- value.to_f / 1000
814
- end
815
-
816
- # Extract values from the string and put them into a nested hash.
817
- #
818
- # @param value [ String ] The string to build a hash from.
819
- #
820
- # @return [ Hash ] The hash built from the string.
821
- def hash_extractor(name, value)
822
- h = {}
823
- value.split(',').each do |tag|
824
- k, v = tag.split(':')
825
- if v.nil?
826
- log_warn("Invalid hash value for #{name}: key `#{k}` does not have a value: #{value}")
827
- end
828
-
829
- h[k.downcase.to_sym] = v
830
- end
831
- h
832
- end
833
-
834
- # Extract values from the string and put them into an array.
835
- #
836
- # @param [ String ] value The string to build an array from.
837
- #
838
- # @return [ Array ] The array built from the string.
839
- def array(value)
840
- value.split(',')
841
- end
842
-
843
462
  def validate_uri_options!
844
463
  # The URI options spec requires that we raise an error if there are conflicting values of
845
464
  # 'tls' and 'ssl'. In order to fulfill this, we parse the values of each instance into an
@@ -861,10 +480,21 @@ module Mongo
861
480
  unless uri_options[:ssl_verify_hostname].nil?
862
481
  raise_invalid_error_no_fmt!("tlsInsecure' and 'tlsAllowInvalidHostnames' cannot both be specified")
863
482
  end
483
+
484
+ unless uri_options[:ssl_verify_ocsp_endpoint].nil?
485
+ raise_invalid_error_no_fmt!("tlsInsecure' and 'tlsDisableOCSPEndpointCheck' cannot both be specified")
486
+ end
487
+ end
488
+
489
+ unless uri_options[:ssl_verify_certificate].nil?
490
+ unless uri_options[:ssl_verify_ocsp_endpoint].nil?
491
+ raise_invalid_error_no_fmt!("tlsAllowInvalidCertificates' and 'tlsDisableOCSPEndpointCheck' cannot both be specified")
492
+ end
864
493
  end
865
494
 
866
- # Since we know that the only URI option that sets :ssl_cert is "tlsCertificateKeyFile", any
867
- # value set for :ssl_cert must also be set for :ssl_key.
495
+ # Since we know that the only URI option that sets :ssl_cert is
496
+ # "tlsCertificateKeyFile", any value set for :ssl_cert must also be set
497
+ # for :ssl_key.
868
498
  if uri_options[:ssl_cert]
869
499
  uri_options[:ssl_key] = uri_options[:ssl_cert]
870
500
  end
@@ -891,4 +521,5 @@ module Mongo
891
521
  end
892
522
  end
893
523
 
524
+ require 'mongo/uri/options_mapper'
894
525
  require 'mongo/uri/srv_protocol'