Sha256: 8f3b2461edf5df9d9e36970e2aa435e427e4ed893dbe9d0bd2588d728c8bfa25

Contents?: true

Size: 1.54 KB

Versions: 8

Compression:

Stored size: 1.54 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
  register "json", JSON
end

Version data entries

8 entries across 8 versions & 1 rubygems

Version Path
httpx-0.22.5 lib/httpx/transcoder/json.rb
httpx-0.22.4 lib/httpx/transcoder/json.rb
httpx-0.22.3 lib/httpx/transcoder/json.rb
httpx-0.22.2 lib/httpx/transcoder/json.rb
httpx-0.22.1 lib/httpx/transcoder/json.rb
httpx-0.22.0 lib/httpx/transcoder/json.rb
httpx-0.21.1 lib/httpx/transcoder/json.rb
httpx-0.21.0 lib/httpx/transcoder/json.rb