Sha256: 22fd2fd593aeddf599a7dcc94d4284ab5cf737e5586161be13eb29bf9ddfbee3

Contents?: true

Size: 1.52 KB

Versions: 13

Compression:

Stored size: 1.52 KB

Contents

# frozen_string_literal: true

require "forwardable"

module HTTPX::Transcoder
  module JSON
    JSON_REGEX = %r{\bapplication/(?:vnd\.api\+)?json\b}i.freeze

    using HTTPX::RegexpExtensions unless Regexp.method_defined?(:match?)

    module_function

    class Encoder
      extend Forwardable

      def_delegator :@raw, :to_s

      def_delegator :@raw, :bytesize

      def initialize(json)
        @raw = JSON.json_dump(json)
        @charset = @raw.encoding.name.downcase
      end

      def content_type
        "application/json; charset=#{@charset}"
      end
    end

    def encode(json)
      Encoder.new(json)
    end

    def decode(response)
      content_type = response.content_type.mime_type

      raise HTTPX::Error, "invalid json mime type (#{content_type})" unless JSON_REGEX.match?(content_type)

      method(:json_load)
    end

    # rubocop:disable Style/SingleLineMethods
    if defined?(MultiJson)
      def json_load(*args); MultiJson.load(*args); end
      def json_dump(*args); MultiJson.dump(*args); end
    elsif defined?(Oj)
      def json_load(response, *args); Oj.load(response.to_s, *args); end
      def json_dump(*args); Oj.dump(*args); end
    elsif defined?(Yajl)
      def json_load(response, *args); Yajl::Parser.new(*args).parse(response.to_s); end
      def json_dump(*args); Yajl::Encoder.encode(*args); end
    else
      require "json"
      def json_load(*args); ::JSON.parse(*args); end
      def json_dump(*args); ::JSON.dump(*args); end
    end
    # rubocop:enable Style/SingleLineMethods
  end
end

Version data entries

13 entries across 13 versions & 1 rubygems

Version Path
httpx-0.24.7 lib/httpx/transcoder/json.rb
httpx-0.24.6 lib/httpx/transcoder/json.rb
httpx-0.24.5 lib/httpx/transcoder/json.rb
httpx-0.24.4 lib/httpx/transcoder/json.rb
httpx-0.24.3 lib/httpx/transcoder/json.rb
httpx-0.24.2 lib/httpx/transcoder/json.rb
httpx-0.24.1 lib/httpx/transcoder/json.rb
httpx-0.24.0 lib/httpx/transcoder/json.rb
httpx-0.23.4 lib/httpx/transcoder/json.rb
httpx-0.23.3 lib/httpx/transcoder/json.rb
httpx-0.23.2 lib/httpx/transcoder/json.rb
httpx-0.23.1 lib/httpx/transcoder/json.rb
httpx-0.23.0 lib/httpx/transcoder/json.rb