mongo 2.13.0.beta1 → 2.14.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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +1 -5
- data/Rakefile +50 -9
- data/lib/mongo.rb +13 -2
- data/lib/mongo/address.rb +1 -1
- data/lib/mongo/address/ipv4.rb +1 -1
- data/lib/mongo/address/ipv6.rb +1 -1
- data/lib/mongo/auth/aws/request.rb +31 -5
- data/lib/mongo/bulk_write.rb +18 -0
- data/lib/mongo/caching_cursor.rb +74 -0
- data/lib/mongo/client.rb +238 -31
- data/lib/mongo/cluster.rb +56 -20
- data/lib/mongo/cluster/sdam_flow.rb +13 -10
- data/lib/mongo/cluster/topology/replica_set_no_primary.rb +3 -2
- data/lib/mongo/cluster/topology/sharded.rb +1 -1
- data/lib/mongo/cluster/topology/single.rb +2 -2
- data/lib/mongo/collection.rb +66 -24
- data/lib/mongo/collection/view.rb +24 -20
- data/lib/mongo/collection/view/aggregation.rb +25 -4
- data/lib/mongo/collection/view/builder/find_command.rb +38 -18
- data/lib/mongo/collection/view/explainable.rb +27 -8
- data/lib/mongo/collection/view/iterable.rb +72 -12
- data/lib/mongo/collection/view/readable.rb +19 -3
- data/lib/mongo/collection/view/writable.rb +55 -5
- data/lib/mongo/crypt/encryption_io.rb +6 -6
- data/lib/mongo/cursor.rb +16 -3
- data/lib/mongo/database.rb +37 -4
- data/lib/mongo/database/view.rb +18 -3
- data/lib/mongo/distinguishing_semaphore.rb +55 -0
- data/lib/mongo/error.rb +5 -0
- data/lib/mongo/error/invalid_read_concern.rb +28 -0
- data/lib/mongo/error/invalid_server_auth_host.rb +22 -0
- data/lib/mongo/error/invalid_session.rb +2 -1
- data/lib/mongo/error/operation_failure.rb +11 -5
- data/lib/mongo/error/server_certificate_revoked.rb +22 -0
- data/lib/mongo/error/sessions_not_supported.rb +35 -0
- data/lib/mongo/error/unsupported_option.rb +14 -12
- data/lib/mongo/event/base.rb +6 -0
- data/lib/mongo/grid/file.rb +5 -0
- data/lib/mongo/grid/file/chunk.rb +2 -0
- data/lib/mongo/grid/fs_bucket.rb +15 -13
- data/lib/mongo/grid/stream/write.rb +9 -3
- data/lib/mongo/index/view.rb +3 -0
- data/lib/mongo/lint.rb +2 -1
- data/lib/mongo/logger.rb +3 -3
- data/lib/mongo/monitoring.rb +38 -0
- data/lib/mongo/monitoring/command_log_subscriber.rb +10 -2
- data/lib/mongo/monitoring/event/command_failed.rb +11 -0
- data/lib/mongo/monitoring/event/command_started.rb +37 -2
- data/lib/mongo/monitoring/event/command_succeeded.rb +11 -0
- data/lib/mongo/monitoring/event/server_closed.rb +1 -1
- data/lib/mongo/monitoring/event/server_description_changed.rb +27 -4
- data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +9 -2
- data/lib/mongo/monitoring/event/server_heartbeat_started.rb +9 -2
- data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +9 -2
- data/lib/mongo/monitoring/event/server_opening.rb +1 -1
- data/lib/mongo/monitoring/event/topology_changed.rb +1 -1
- data/lib/mongo/monitoring/event/topology_closed.rb +1 -1
- data/lib/mongo/monitoring/event/topology_opening.rb +1 -1
- data/lib/mongo/monitoring/publishable.rb +6 -3
- data/lib/mongo/monitoring/server_description_changed_log_subscriber.rb +9 -1
- data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +1 -1
- data/lib/mongo/operation.rb +2 -0
- data/lib/mongo/operation/aggregate/result.rb +9 -8
- data/lib/mongo/operation/collections_info/command.rb +5 -0
- data/lib/mongo/operation/collections_info/result.rb +18 -1
- data/lib/mongo/operation/delete/bulk_result.rb +2 -0
- data/lib/mongo/operation/delete/result.rb +3 -0
- data/lib/mongo/operation/explain/command.rb +4 -0
- data/lib/mongo/operation/explain/legacy.rb +4 -0
- data/lib/mongo/operation/explain/op_msg.rb +6 -0
- data/lib/mongo/operation/explain/result.rb +3 -0
- data/lib/mongo/operation/find/legacy/result.rb +2 -0
- data/lib/mongo/operation/find/result.rb +13 -0
- data/lib/mongo/operation/get_more/result.rb +3 -0
- data/lib/mongo/operation/indexes/result.rb +5 -0
- data/lib/mongo/operation/insert/bulk_result.rb +5 -0
- data/lib/mongo/operation/insert/result.rb +5 -0
- data/lib/mongo/operation/list_collections/result.rb +5 -0
- data/lib/mongo/operation/map_reduce/result.rb +10 -0
- data/lib/mongo/operation/parallel_scan/result.rb +4 -0
- data/lib/mongo/operation/result.rb +35 -6
- data/lib/mongo/operation/shared/bypass_document_validation.rb +1 -0
- data/lib/mongo/operation/shared/causal_consistency_supported.rb +1 -0
- data/lib/mongo/operation/shared/collections_info_or_list_collections.rb +2 -0
- data/lib/mongo/operation/shared/executable.rb +1 -0
- data/lib/mongo/operation/shared/idable.rb +2 -1
- data/lib/mongo/operation/shared/limited.rb +1 -0
- data/lib/mongo/operation/shared/object_id_generator.rb +1 -0
- data/lib/mongo/operation/shared/result/aggregatable.rb +1 -0
- data/lib/mongo/operation/shared/sessions_supported.rb +1 -0
- data/lib/mongo/operation/shared/specifiable.rb +1 -0
- data/lib/mongo/operation/shared/write.rb +1 -0
- data/lib/mongo/operation/shared/write_concern_supported.rb +1 -0
- data/lib/mongo/operation/update/legacy/result.rb +7 -0
- data/lib/mongo/operation/update/result.rb +8 -0
- data/lib/mongo/operation/users_info/result.rb +3 -0
- data/lib/mongo/protocol/message.rb +47 -10
- data/lib/mongo/protocol/msg.rb +34 -1
- data/lib/mongo/protocol/query.rb +36 -0
- data/lib/mongo/protocol/serializers.rb +5 -2
- data/lib/mongo/query_cache.rb +242 -0
- data/lib/mongo/retryable.rb +8 -1
- data/lib/mongo/server.rb +15 -4
- data/lib/mongo/server/app_metadata.rb +27 -3
- data/lib/mongo/server/connection.rb +4 -4
- data/lib/mongo/server/connection_base.rb +38 -12
- data/lib/mongo/server/connection_common.rb +2 -2
- data/lib/mongo/server/connection_pool.rb +3 -0
- data/lib/mongo/server/description.rb +13 -1
- data/lib/mongo/server/monitor.rb +76 -44
- data/lib/mongo/server/monitor/connection.rb +57 -9
- data/lib/mongo/server/pending_connection.rb +14 -4
- data/lib/mongo/server/push_monitor.rb +173 -0
- data/{spec/runners/transactions/context.rb → lib/mongo/server/push_monitor/connection.rb} +9 -14
- data/lib/mongo/server_selector.rb +0 -1
- data/lib/mongo/server_selector/base.rb +583 -1
- data/lib/mongo/server_selector/nearest.rb +1 -6
- data/lib/mongo/server_selector/primary.rb +1 -6
- data/lib/mongo/server_selector/primary_preferred.rb +7 -10
- data/lib/mongo/server_selector/secondary.rb +1 -6
- data/lib/mongo/server_selector/secondary_preferred.rb +1 -7
- data/lib/mongo/session.rb +7 -1
- data/lib/mongo/socket.rb +26 -12
- data/lib/mongo/socket/ocsp_cache.rb +97 -0
- data/lib/mongo/socket/ocsp_verifier.rb +368 -0
- data/lib/mongo/socket/ssl.rb +46 -25
- data/lib/mongo/socket/tcp.rb +1 -1
- data/lib/mongo/srv/monitor.rb +7 -13
- data/lib/mongo/srv/resolver.rb +14 -10
- data/lib/mongo/timeout.rb +2 -0
- data/lib/mongo/topology_version.rb +9 -0
- data/lib/mongo/uri.rb +21 -390
- data/lib/mongo/uri/options_mapper.rb +582 -0
- data/lib/mongo/uri/srv_protocol.rb +3 -2
- data/lib/mongo/utils.rb +73 -0
- data/lib/mongo/version.rb +1 -1
- data/spec/NOTES.aws-auth.md +12 -7
- data/spec/README.aws-auth.md +2 -2
- data/spec/README.md +63 -1
- data/spec/integration/awaited_ismaster_spec.rb +28 -0
- data/spec/integration/bson_symbol_spec.rb +4 -2
- data/spec/integration/bulk_write_spec.rb +67 -0
- data/spec/integration/change_stream_examples_spec.rb +6 -2
- data/spec/integration/change_stream_spec.rb +1 -1
- data/spec/integration/check_clean_slate_spec.rb +16 -0
- data/spec/integration/client_authentication_options_spec.rb +92 -28
- data/spec/integration/client_construction_spec.rb +1 -0
- data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +9 -5
- data/spec/integration/connect_single_rs_name_spec.rb +5 -2
- data/spec/integration/connection_pool_populator_spec.rb +4 -2
- data/spec/integration/connection_spec.rb +7 -4
- data/spec/integration/crud_spec.rb +4 -4
- data/spec/integration/cursor_reaping_spec.rb +54 -18
- data/spec/integration/docs_examples_spec.rb +6 -0
- data/spec/integration/fork_reconnect_spec.rb +56 -1
- data/spec/integration/grid_fs_bucket_spec.rb +48 -0
- data/spec/integration/heartbeat_events_spec.rb +4 -23
- data/spec/integration/ocsp_connectivity_spec.rb +26 -0
- data/spec/integration/ocsp_verifier_cache_spec.rb +188 -0
- data/spec/integration/ocsp_verifier_spec.rb +334 -0
- data/spec/integration/query_cache_spec.rb +1045 -0
- data/spec/integration/query_cache_transactions_spec.rb +190 -0
- data/spec/integration/read_concern_spec.rb +1 -1
- data/spec/integration/retryable_errors_spec.rb +1 -1
- data/spec/integration/retryable_writes/retryable_writes_40_and_newer_spec.rb +1 -0
- data/spec/integration/retryable_writes/shared/performs_legacy_retries.rb +4 -2
- data/spec/integration/retryable_writes/shared/performs_modern_retries.rb +3 -3
- data/spec/integration/retryable_writes/shared/performs_no_retries.rb +2 -2
- data/spec/integration/sdam_error_handling_spec.rb +122 -15
- data/spec/integration/sdam_events_spec.rb +80 -6
- data/spec/integration/sdam_prose_spec.rb +64 -0
- data/spec/integration/server_monitor_spec.rb +25 -1
- data/spec/integration/server_selection_spec.rb +36 -0
- data/spec/integration/size_limit_spec.rb +23 -5
- data/spec/integration/srv_monitoring_spec.rb +38 -3
- data/spec/integration/srv_spec.rb +56 -0
- data/spec/integration/ssl_uri_options_spec.rb +2 -2
- data/spec/integration/transactions_examples_spec.rb +17 -7
- data/spec/integration/zlib_compression_spec.rb +25 -0
- data/spec/lite_spec_helper.rb +20 -9
- data/spec/mongo/address_spec.rb +1 -1
- data/spec/mongo/auth/aws/request_region_spec.rb +42 -0
- data/spec/mongo/auth/aws/request_spec.rb +76 -0
- data/spec/mongo/auth/scram_spec.rb +1 -1
- data/spec/mongo/auth/user_spec.rb +1 -1
- data/spec/mongo/bulk_write_spec.rb +2 -2
- data/spec/mongo/caching_cursor_spec.rb +70 -0
- data/spec/mongo/client_construction_spec.rb +386 -3
- data/spec/mongo/client_encryption_spec.rb +16 -10
- data/spec/mongo/client_spec.rb +85 -3
- data/spec/mongo/cluster/topology/replica_set_spec.rb +53 -10
- data/spec/mongo/cluster/topology/sharded_spec.rb +1 -1
- data/spec/mongo/cluster/topology/single_spec.rb +19 -8
- data/spec/mongo/cluster/topology/unknown_spec.rb +1 -1
- data/spec/mongo/cluster/topology_spec.rb +1 -1
- data/spec/mongo/cluster_spec.rb +37 -35
- data/spec/mongo/collection/view/change_stream_resume_spec.rb +7 -7
- data/spec/mongo/collection/view/explainable_spec.rb +87 -4
- data/spec/mongo/collection/view/map_reduce_spec.rb +2 -0
- data/spec/mongo/collection/view/readable_spec.rb +36 -0
- data/spec/mongo/collection_spec.rb +572 -0
- data/spec/mongo/crypt/auto_decryption_context_spec.rb +1 -1
- data/spec/mongo/crypt/auto_encryption_context_spec.rb +1 -1
- data/spec/mongo/crypt/binary_spec.rb +1 -6
- data/spec/mongo/crypt/binding/binary_spec.rb +1 -6
- data/spec/mongo/crypt/binding/context_spec.rb +2 -7
- data/spec/mongo/crypt/binding/helpers_spec.rb +1 -6
- data/spec/mongo/crypt/binding/mongocrypt_spec.rb +2 -7
- data/spec/mongo/crypt/binding/status_spec.rb +1 -6
- data/spec/mongo/crypt/binding/version_spec.rb +1 -6
- data/spec/mongo/crypt/data_key_context_spec.rb +1 -1
- data/spec/mongo/crypt/explicit_decryption_context_spec.rb +1 -1
- data/spec/mongo/crypt/explicit_encryption_context_spec.rb +1 -1
- data/spec/mongo/crypt/status_spec.rb +1 -6
- data/spec/mongo/database_spec.rb +353 -8
- data/spec/mongo/distinguishing_semaphore_spec.rb +63 -0
- data/spec/mongo/error/no_server_available_spec.rb +1 -1
- data/spec/mongo/error/operation_failure_spec.rb +40 -0
- data/spec/mongo/index/view_spec.rb +148 -2
- data/spec/mongo/logger_spec.rb +13 -11
- data/spec/mongo/monitoring/event/server_closed_spec.rb +1 -1
- data/spec/mongo/monitoring/event/server_description_changed_spec.rb +1 -4
- data/spec/mongo/monitoring/event/server_opening_spec.rb +1 -1
- data/spec/mongo/monitoring/event/topology_changed_spec.rb +1 -1
- data/spec/mongo/monitoring/event/topology_closed_spec.rb +1 -1
- data/spec/mongo/monitoring/event/topology_opening_spec.rb +1 -1
- data/spec/mongo/operation/delete/op_msg_spec.rb +3 -3
- data/spec/mongo/operation/insert/command_spec.rb +2 -2
- data/spec/mongo/operation/insert/op_msg_spec.rb +3 -3
- data/spec/mongo/operation/read_preference_op_msg_spec.rb +1 -1
- data/spec/mongo/operation/update/command_spec.rb +2 -2
- data/spec/mongo/operation/update/op_msg_spec.rb +3 -3
- data/spec/mongo/protocol/msg_spec.rb +10 -0
- data/spec/mongo/query_cache_spec.rb +280 -0
- data/spec/mongo/semaphore_spec.rb +51 -0
- data/spec/mongo/server/app_metadata_shared.rb +82 -2
- data/spec/mongo/server/connection_auth_spec.rb +2 -2
- data/spec/mongo/server/connection_pool_spec.rb +7 -3
- data/spec/mongo/server/connection_spec.rb +15 -8
- data/spec/mongo/server/description_spec.rb +18 -0
- data/spec/mongo/server_selector/nearest_spec.rb +23 -23
- data/spec/mongo/server_selector/primary_preferred_spec.rb +26 -26
- data/spec/mongo/server_selector/primary_spec.rb +9 -9
- data/spec/mongo/server_selector/secondary_preferred_spec.rb +22 -22
- data/spec/mongo/server_selector/secondary_spec.rb +18 -18
- data/spec/mongo/server_selector_spec.rb +6 -6
- data/spec/mongo/session_spec.rb +35 -0
- data/spec/mongo/socket/ssl_spec.rb +4 -4
- data/spec/mongo/socket_spec.rb +1 -1
- data/spec/mongo/uri/srv_protocol_spec.rb +64 -33
- data/spec/mongo/uri_option_parsing_spec.rb +11 -11
- data/spec/mongo/uri_spec.rb +68 -41
- data/spec/mongo/utils_spec.rb +39 -0
- data/spec/runners/auth.rb +3 -0
- data/spec/runners/change_streams/test.rb +3 -3
- data/spec/runners/cmap.rb +1 -1
- data/spec/runners/command_monitoring.rb +3 -34
- data/spec/runners/connection_string.rb +35 -124
- data/spec/runners/crud/context.rb +9 -5
- data/spec/runners/crud/operation.rb +59 -27
- data/spec/runners/crud/spec.rb +0 -8
- data/spec/runners/crud/test.rb +1 -1
- data/spec/runners/crud/test_base.rb +0 -19
- data/spec/runners/sdam.rb +2 -2
- data/spec/runners/server_selection.rb +242 -28
- data/spec/runners/transactions.rb +12 -12
- data/spec/runners/transactions/operation.rb +151 -25
- data/spec/runners/transactions/test.rb +62 -18
- data/spec/shared/LICENSE +20 -0
- data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
- data/spec/shared/lib/mrss/constraints.rb +303 -0
- data/spec/shared/lib/mrss/lite_constraints.rb +175 -0
- data/spec/shared/lib/mrss/spec_organizer.rb +149 -0
- data/spec/spec_helper.rb +3 -1
- data/spec/spec_tests/cmap_spec.rb +7 -3
- data/spec/spec_tests/command_monitoring_spec.rb +22 -12
- data/spec/spec_tests/crud_spec.rb +1 -1
- data/spec/spec_tests/data/change_streams/change-streams-errors.yml +4 -9
- data/spec/spec_tests/data/change_streams/change-streams-resume-whitelist.yml +66 -0
- data/spec/spec_tests/data/change_streams/change-streams.yml +0 -1
- data/spec/spec_tests/data/cmap/pool-checkout-connection.yml +6 -2
- data/spec/spec_tests/data/cmap/pool-create-min-size.yml +3 -0
- data/spec/spec_tests/data/connection_string/valid-warnings.yml +24 -0
- data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/MaxStalenessTooSmall.yml +15 -0
- data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/NoKnownServers.yml +4 -3
- data/spec/spec_tests/data/max_staleness/Unknown/SmallMaxStaleness.yml +1 -0
- data/spec/spec_tests/data/sdam_integration/cancel-server-check.yml +96 -0
- data/spec/spec_tests/data/sdam_integration/connectTimeoutMS.yml +88 -0
- data/spec/spec_tests/data/sdam_integration/find-network-error.yml +83 -0
- data/spec/spec_tests/data/sdam_integration/find-shutdown-error.yml +116 -0
- data/spec/spec_tests/data/sdam_integration/insert-network-error.yml +86 -0
- data/spec/spec_tests/data/sdam_integration/insert-shutdown-error.yml +115 -0
- data/spec/spec_tests/data/sdam_integration/isMaster-command-error.yml +168 -0
- data/spec/spec_tests/data/sdam_integration/isMaster-network-error.yml +162 -0
- data/spec/spec_tests/data/sdam_integration/isMaster-timeout.yml +229 -0
- data/spec/spec_tests/data/sdam_integration/rediscover-quickly-after-step-down.yml +87 -0
- data/spec/spec_tests/data/sdam_monitoring/discovered_standalone.yml +1 -3
- data/spec/spec_tests/data/sdam_monitoring/standalone.yml +2 -2
- data/spec/spec_tests/data/sdam_monitoring/standalone_repeated.yml +2 -2
- data/spec/spec_tests/data/sdam_monitoring/standalone_suppress_equal_description_changes.yml +2 -2
- data/spec/spec_tests/data/sdam_monitoring/standalone_to_rs_with_me_mismatch.yml +2 -2
- data/spec/spec_tests/data/uri_options/auth-options.yml +25 -0
- data/spec/spec_tests/data/uri_options/compression-options.yml +6 -3
- data/spec/spec_tests/data/uri_options/read-preference-options.yml +24 -0
- data/spec/spec_tests/data/uri_options/ruby-connection-options.yml +1 -0
- data/spec/spec_tests/data/uri_options/tls-options.yml +160 -4
- data/spec/spec_tests/dns_seedlist_discovery_spec.rb +9 -1
- data/spec/spec_tests/max_staleness_spec.rb +4 -142
- data/spec/spec_tests/retryable_reads_spec.rb +2 -2
- data/spec/spec_tests/sdam_integration_spec.rb +13 -0
- data/spec/spec_tests/sdam_monitoring_spec.rb +1 -2
- data/spec/spec_tests/server_selection_spec.rb +4 -116
- data/spec/spec_tests/uri_options_spec.rb +31 -33
- data/spec/stress/cleanup_spec.rb +17 -2
- data/spec/stress/connection_pool_stress_spec.rb +10 -8
- data/spec/stress/fork_reconnect_stress_spec.rb +1 -1
- data/spec/support/certificates/atlas-ocsp-ca.crt +28 -0
- data/spec/support/certificates/atlas-ocsp.crt +41 -0
- data/spec/support/client_registry.rb +1 -0
- data/spec/support/client_registry_macros.rb +11 -2
- data/spec/support/cluster_config.rb +4 -0
- data/spec/support/common_shortcuts.rb +45 -0
- data/spec/support/constraints.rb +6 -253
- data/spec/support/event_subscriber.rb +123 -33
- data/spec/support/keyword_struct.rb +26 -0
- data/spec/support/matchers.rb +16 -0
- data/spec/support/ocsp +1 -0
- data/spec/support/session_registry.rb +52 -0
- data/spec/support/shared/server_selector.rb +13 -1
- data/spec/support/spec_config.rb +60 -13
- data/spec/support/spec_setup.rb +1 -1
- data/spec/support/utils.rb +84 -1
- metadata +1027 -937
- metadata.gz.sig +0 -0
- data/lib/mongo/server_selector/selectable.rb +0 -560
- data/spec/runners/sdam_monitoring.rb +0 -89
- data/spec/support/lite_constraints.rb +0 -141
data/lib/mongo/socket/ssl.rb
CHANGED
@@ -15,15 +15,15 @@
|
|
15
15
|
module Mongo
|
16
16
|
class Socket
|
17
17
|
|
18
|
-
# Wrapper for
|
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
|
24
|
+
# Initializes a new TLS socket.
|
25
25
|
#
|
26
|
-
# @example Create the
|
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.
|
@@ -113,7 +113,7 @@ module Mongo
|
|
113
113
|
end
|
114
114
|
end
|
115
115
|
|
116
|
-
# @return [ SSLContext ] context The
|
116
|
+
# @return [ SSLContext ] context The TLS context.
|
117
117
|
attr_reader :context
|
118
118
|
|
119
119
|
# @return [ String ] host The host to connect to.
|
@@ -137,7 +137,7 @@ module Mongo
|
|
137
137
|
#
|
138
138
|
# @since 2.0.0
|
139
139
|
def connect!
|
140
|
-
Timeout.timeout(options[:connect_timeout], Error::SocketTimeoutError) do
|
140
|
+
Timeout.timeout(options[:connect_timeout], Error::SocketTimeoutError, "The socket took over #{options[:connect_timeout]} seconds to connect") do
|
141
141
|
map_exceptions do
|
142
142
|
@tcp_socket.connect(::Socket.pack_sockaddr_in(port, host))
|
143
143
|
end
|
@@ -149,6 +149,7 @@ module Mongo
|
|
149
149
|
@socket.connect
|
150
150
|
end
|
151
151
|
verify_certificate!(@socket)
|
152
|
+
verify_ocsp_endpoint!(@socket)
|
152
153
|
rescue
|
153
154
|
@socket.close
|
154
155
|
@socket = nil
|
@@ -177,29 +178,36 @@ module Mongo
|
|
177
178
|
private
|
178
179
|
|
179
180
|
def verify_certificate?
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
end
|
181
|
+
# If ssl_verify_certificate is not present, disable only if
|
182
|
+
# ssl_verify is 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
|
189
189
|
end
|
190
190
|
|
191
191
|
def verify_hostname?
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
end
|
192
|
+
# If ssl_verify_hostname is not present, disable only if ssl_verify is
|
193
|
+
# explicitly set to false.
|
194
|
+
if options[:ssl_verify_hostname].nil?
|
195
|
+
options[:ssl_verify] != false
|
196
|
+
# If ssl_verify_hostname is present, enable or disable based on its value.
|
197
|
+
else
|
198
|
+
!!options[:ssl_verify_hostname]
|
199
|
+
end
|
201
200
|
end
|
202
201
|
|
202
|
+
def verify_ocsp_endpoint?
|
203
|
+
if !options[:ssl_verify_ocsp_endpoint].nil?
|
204
|
+
options[:ssl_verify_ocsp_endpoint] != false
|
205
|
+
elsif !options[:ssl_verify_certificate].nil?
|
206
|
+
options[:ssl_verify_certificate] != false
|
207
|
+
else
|
208
|
+
options[:ssl_verify] != false
|
209
|
+
end
|
210
|
+
end
|
203
211
|
|
204
212
|
def create_context(options)
|
205
213
|
OpenSSL::SSL::SSLContext.new.tap do |context|
|
@@ -344,13 +352,26 @@ module Mongo
|
|
344
352
|
def verify_certificate!(socket)
|
345
353
|
if verify_hostname?
|
346
354
|
unless OpenSSL::SSL.verify_certificate_identity(socket.peer_cert, host_name)
|
347
|
-
raise Error::SocketError, '
|
355
|
+
raise Error::SocketError, 'TLS handshake failed due to a hostname mismatch.'
|
348
356
|
end
|
349
357
|
end
|
350
358
|
end
|
351
359
|
|
360
|
+
def verify_ocsp_endpoint!(socket)
|
361
|
+
unless verify_ocsp_endpoint?
|
362
|
+
return
|
363
|
+
end
|
364
|
+
|
365
|
+
cert = socket.peer_cert
|
366
|
+
ca_cert = socket.peer_cert_chain.last
|
367
|
+
|
368
|
+
verifier = OcspVerifier.new(@host_name, cert, ca_cert, context.cert_store,
|
369
|
+
**Utils.shallow_symbolize_keys(options))
|
370
|
+
verifier.verify_with_cache
|
371
|
+
end
|
372
|
+
|
352
373
|
def read_buffer_size
|
353
|
-
# Buffer size for
|
374
|
+
# Buffer size for TLS reads.
|
354
375
|
# Capped at 16k due to https://linux.die.net/man/3/ssl_read
|
355
376
|
16384
|
356
377
|
end
|
data/lib/mongo/socket/tcp.rb
CHANGED
@@ -74,7 +74,7 @@ module Mongo
|
|
74
74
|
#
|
75
75
|
# @since 2.0.0
|
76
76
|
def connect!
|
77
|
-
Timeout.timeout(options[:connect_timeout], Error::SocketTimeoutError) do
|
77
|
+
Timeout.timeout(options[:connect_timeout], Error::SocketTimeoutError, "The socket took over #{options[:connect_timeout]} seconds to connect") do
|
78
78
|
socket.setsockopt(IPPROTO_TCP, TCP_NODELAY, 1)
|
79
79
|
map_exceptions do
|
80
80
|
socket.connect(::Socket.pack_sockaddr_in(port, host))
|
data/lib/mongo/srv/monitor.rb
CHANGED
@@ -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
|
40
|
-
# @option
|
41
|
-
# @option
|
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,
|
44
|
-
options = if options
|
45
|
-
options.dup
|
46
|
-
else
|
47
|
-
{}
|
48
|
-
end
|
42
|
+
def initialize(cluster, **opts)
|
49
43
|
@cluster = cluster
|
50
|
-
@
|
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 =
|
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
|
data/lib/mongo/srv/resolver.rb
CHANGED
@@ -28,20 +28,24 @@ module Mongo
|
|
28
28
|
|
29
29
|
# Creates a new Resolver.
|
30
30
|
#
|
31
|
-
# @
|
32
|
-
#
|
33
|
-
# @option
|
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
|
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(
|
39
|
-
@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
@@ -76,5 +76,14 @@ module Mongo
|
|
76
76
|
counter >= other.counter
|
77
77
|
end
|
78
78
|
end
|
79
|
+
|
80
|
+
# Converts the object to a document suitable for being sent to the server.
|
81
|
+
#
|
82
|
+
# @return [ BSON::Document ] The document.
|
83
|
+
#
|
84
|
+
# @api private
|
85
|
+
def to_doc
|
86
|
+
BSON::Document.new(self).merge(counter: BSON::Int64.new(counter))
|
87
|
+
end
|
79
88
|
end
|
80
89
|
end
|
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
|
867
|
-
# value set for :ssl_cert must also be set
|
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'
|