lib/httpx/transcoder/form.rb in httpx-0.24.7 vs lib/httpx/transcoder/form.rb in httpx-1.0.0
- old
+ new
@@ -1,58 +1,78 @@
# frozen_string_literal: true
require "forwardable"
require "uri"
+require_relative "multipart"
-module HTTPX::Transcoder
- module Form
- module_function
+module HTTPX
+ module Transcoder
+ module Form
+ module_function
- PARAM_DEPTH_LIMIT = 32
+ PARAM_DEPTH_LIMIT = 32
- class Encoder
- extend Forwardable
+ class Encoder
+ extend Forwardable
- def_delegator :@raw, :to_s
+ def_delegator :@raw, :to_s
- def_delegator :@raw, :to_str
+ def_delegator :@raw, :to_str
- def_delegator :@raw, :bytesize
+ def_delegator :@raw, :bytesize
- def initialize(form)
- @raw = form.each_with_object("".b) do |(key, val), buf|
- HTTPX::Transcoder.normalize_keys(key, val) do |k, v|
- buf << "&" unless buf.empty?
- buf << URI.encode_www_form_component(k)
- buf << "=#{URI.encode_www_form_component(v.to_s)}" unless v.nil?
+ def initialize(form)
+ @raw = form.each_with_object("".b) do |(key, val), buf|
+ HTTPX::Transcoder.normalize_keys(key, val) do |k, v|
+ buf << "&" unless buf.empty?
+ buf << URI.encode_www_form_component(k)
+ buf << "=#{URI.encode_www_form_component(v.to_s)}" unless v.nil?
+ end
end
end
- end
- def content_type
- "application/x-www-form-urlencoded"
+ def content_type
+ "application/x-www-form-urlencoded"
+ end
end
- end
- module Decoder
- module_function
+ module Decoder
+ module_function
- def call(response, *)
- URI.decode_www_form(response.to_s).each_with_object({}) do |(field, value), params|
- HTTPX::Transcoder.normalize_query(params, field, value, PARAM_DEPTH_LIMIT)
+ def call(response, *)
+ URI.decode_www_form(response.to_s).each_with_object({}) do |(field, value), params|
+ HTTPX::Transcoder.normalize_query(params, field, value, PARAM_DEPTH_LIMIT)
+ end
end
end
- end
- def encode(form)
- Encoder.new(form)
- end
+ def encode(form)
+ if multipart?(form)
+ Multipart::Encoder.new(form)
+ else
+ Encoder.new(form)
+ end
+ end
- def decode(response)
- content_type = response.content_type.mime_type
+ def decode(response)
+ content_type = response.content_type.mime_type
- raise HTTPX::Error, "invalid form mime type (#{content_type})" unless content_type == "application/x-www-form-urlencoded"
+ case content_type
+ when "application/x-www-form-urlencoded"
+ Decoder
+ when "multipart/form-data"
+ Multipart::Decoder.new(response)
+ else
+ raise Error, "invalid form mime type (#{content_type})"
+ end
+ end
- Decoder
+ def multipart?(data)
+ data.any? do |_, v|
+ Multipart::MULTIPART_VALUE_COND.call(v) ||
+ (v.respond_to?(:to_ary) && v.to_ary.any?(&Multipart::MULTIPART_VALUE_COND)) ||
+ (v.respond_to?(:to_hash) && v.to_hash.any? { |_, e| Multipart::MULTIPART_VALUE_COND.call(e) })
+ end
+ end
end
end
end