diff options
Diffstat (limited to 'lib/net/hippie/rust_connection.rb')
| -rw-r--r-- | lib/net/hippie/rust_connection.rb | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/lib/net/hippie/rust_connection.rb b/lib/net/hippie/rust_connection.rb new file mode 100644 index 0000000..7c37350 --- /dev/null +++ b/lib/net/hippie/rust_connection.rb @@ -0,0 +1,73 @@ +# frozen_string_literal: true + +require_relative 'rust_backend' + +module Net + module Hippie + # Rust-powered connection that mimics the Ruby Connection interface + class RustConnection + def initialize(scheme, host, port, options = {}) + @scheme = scheme + @host = host + @port = port + @options = options + + # Create the Rust client (simplified version for now) + @rust_client = Net::Hippie::RustClient.new + end + + def run(request) + url = build_url_for(request.path) + headers = {} # Simplified for now + body = request.body || '' + method = extract_method(request) + + begin + rust_response = @rust_client.public_send(method.downcase, url, headers, body) + RustBackend::ResponseAdapter.new(rust_response) + rescue => e + # Map Rust errors to Ruby equivalents + raise map_rust_error(e) + end + end + + def build_url_for(path) + return path if path.start_with?('http') + + port_suffix = (@port == 80 && @scheme == 'http') || (@port == 443 && @scheme == 'https') ? '' : ":#{@port}" + "#{@scheme}://#{@host}#{port_suffix}#{path}" + end + + private + + def extract_headers(request) + headers = {} + request.each_header do |key, value| + headers[key] = value + end + headers + end + + def extract_method(request) + request.class.name.split('::').last.sub('HTTP', '').downcase + end + + def map_rust_error(error) + case error.message + when /Net::ReadTimeout/ + Net::ReadTimeout.new + when /Net::OpenTimeout/ + Net::OpenTimeout.new + when /Errno::ECONNREFUSED/ + Errno::ECONNREFUSED.new + when /Errno::ECONNRESET/ + Errno::ECONNRESET.new + when /timeout/i + Net::ReadTimeout.new + else + error + end + end + end + end +end
\ No newline at end of file |
