mirror of
https://github.com/discourse/discourse.git
synced 2026-08-06 13:08:40 +08:00
Ruby 3.4 shipped support for happy eyeballs in `Socket.tcp` and `TCPSocket`. However, our `FinalDestination::HTTP` wrapper was performing a DNS lookup and passing IP addresses one at a time when opening the socket. That meant that we didn't benefit from the new Ruby feature in most Discourse features. This commit factors the strategy. Now, `FinalDestination::HTTP` encodes the DNS result and passes it to the underlying implementation as a fake hostname string. A patch to `Addrinfo` detects this fake hostname and returns the given IPs instead of performing its own lookup. For this Addrinfo patch to work, we also had to patch `TCPSocket` so that it uses the ruby-based `Socket.tcp` rather than its native C socket-opening code. The result is that we now get the benefit of the native Ruby 'Happy Eyeballs' support for concurrent ipv4 and ipv6 connections. All this patching of low-level ruby classes is not ideal, but there is no native way to control name resolution in `Net::HTTP` or its dependencies. |
||
|---|---|---|
| .. | ||
| active_record_attribute_methods.rb | ||
| active_record_disable_serialization.rb | ||
| ams_include_without_root.rb | ||
| copy_file.rb | ||
| cose_rsapkcs1.rb | ||
| fast_image.rb | ||
| final_destination_connect.rb | ||
| inflector_backport.rb | ||
| ip_addr.rb | ||
| message_pack_extensions.rb | ||
| net_http.rb | ||
| net_http_header.rb | ||
| pitchfork_sock_stream.rb | ||
| propshaft_patches.rb | ||
| rails_multisite.rb | ||
| request_server_session.rb | ||
| rspec_mocks_from_described_class.rb | ||
| safe_buffer.rb | ||
| safe_migrations.rb | ||
| schema_migration_details.rb | ||
| translate_accelerator.rb | ||
| web_push_request.rb | ||