summaryrefslogtreecommitdiff
path: root/lib/net/hippie/rust_backend.rb
blob: 7d1637ec55dd18f0f4a886e2c651c4dbaa4df4b6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# frozen_string_literal: true

module Net
  module Hippie
    # Rust backend integration
    module RustBackend
      @rust_available = nil

      def self.available?
        return @rust_available unless @rust_available.nil?

        @rust_available = begin
          require 'net_hippie_ext'
          true
        rescue LoadError
          false
        end
      end

      def self.enabled?
        ENV['NET_HIPPIE_RUST'] == 'true' && available?
      end

      # Adapter to make RustResponse behave like Net::HTTPResponse
      class ResponseAdapter
        def initialize(rust_response)
          @rust_response = rust_response
          @code = rust_response.code
          @body = rust_response.body
        end

        def code
          @code
        end

        def body
          @body
        end

        def [](header_name)
          @rust_response[header_name.to_s]
        end

        def class
          case @code.to_i
          when 200
            Net::HTTPOK
          when 201
            Net::HTTPCreated
          when 300..399
            Net::HTTPRedirection
          when 400..499
            Net::HTTPClientError
          when 500..599
            Net::HTTPServerError
          else
            Net::HTTPResponse
          end
        end

        # Make it behave like the expected response class
        def is_a?(klass)
          self.class == klass || super
        end

        def kind_of?(klass)
          is_a?(klass)
        end
      end
    end
  end
end