Class
HTTPGenericRequest
is the parent of the Net::HTTPRequest
class. Do not use this directly; use a subclass of Net::HTTPRequest
.
Mixes in the Net::HTTPHeader
module to provide easier access to HTTP headers.
Attributes
Read
No documentation available
Read
No documentation available
Read
No documentation available
Read
Automatically set to false if the user sets the Accept-Encoding header. This indicates they wish to handle Content-encoding in responses themselves.
Read
No documentation available
Read
No documentation available
Class Methods
lib/net/http/generic_request.rb
View on GitHub
# File tmp/rubies/ruby-3.0.5/lib/net/http/generic_request.rb, line 11
def initialize(m, reqbody, resbody, uri_or_path, initheader = nil)
@method = m
@request_has_body = reqbody
@response_has_body = resbody
if URI === uri_or_path then
raise ArgumentError, "not an HTTP URI" unless URI::HTTP === uri_or_path
raise ArgumentError, "no host component for URI" unless uri_or_path.hostname
@uri = uri_or_path.dup
host = @uri.hostname.dup
host << ":".freeze << @uri.port.to_s if @uri.port != @uri.default_port
@path = uri_or_path.request_uri
raise ArgumentError, "no HTTP request path given" unless @path
else
@uri = nil
host = nil
raise ArgumentError, "no HTTP request path given" unless uri_or_path
raise ArgumentError, "HTTP request path is empty" if uri_or_path.empty?
@path = uri_or_path.dup
end
@decode_content = false
if @response_has_body and Net::HTTP::HAVE_ZLIB then
if !initheader ||
!initheader.keys.any? { |k|
%w[accept-encoding range].include? k.downcase
} then
@decode_content = true
initheader = initheader ? initheader.dup : {}
initheader["accept-encoding"] =
"gzip;q=1.0,deflate;q=0.6,identity;q=0.3"
end
end
initialize_http_header initheader
self['Accept'] ||= '*/*'
self['User-Agent'] ||= 'Ruby'
self['Host'] ||= host if host
@body = nil
@body_stream = nil
@body_data = nil
end
No documentation available
Instance Methods
lib/net/http/generic_request.rb
View on GitHub
# File tmp/rubies/ruby-3.0.5/lib/net/http/generic_request.rb, line 93
def body=(str)
@body = str
@body_stream = nil
@body_data = nil
str
end
No documentation available
lib/net/http/generic_request.rb
View on GitHub
# File tmp/rubies/ruby-3.0.5/lib/net/http/generic_request.rb, line 86
def body_exist?
warn "Net::HTTPRequest#body_exist? is obsolete; use response_body_permitted?", uplevel: 1 if $VERBOSE
response_body_permitted?
end
No documentation available
lib/net/http/generic_request.rb
View on GitHub
# File tmp/rubies/ruby-3.0.5/lib/net/http/generic_request.rb, line 102
def body_stream=(input)
@body = nil
@body_stream = input
@body_data = nil
input
end
No documentation available
lib/net/http/generic_request.rb
View on GitHub
# File tmp/rubies/ruby-3.0.5/lib/net/http/generic_request.rb, line 237
def encode_multipart_form_data(out, params, opt)
charset = opt[:charset]
boundary = opt[:boundary]
require 'securerandom' unless defined?(SecureRandom)
boundary ||= SecureRandom.urlsafe_base64(40)
chunked_p = chunked?
buf = ''
params.each do |key, value, h={}|
key = quote_string(key, charset)
filename =
h.key?(:filename) ? h[:filename] :
value.respond_to?(:to_path) ? File.basename(value.to_path) :
nil
buf << "--#{boundary}\r\n"
if filename
filename = quote_string(filename, charset)
type = h[:content_type] || 'application/octet-stream'
buf << "Content-Disposition: form-data; " \
"name=\"#{key}\"; filename=\"#{filename}\"\r\n" \
"Content-Type: #{type}\r\n\r\n"
if !out.respond_to?(:write) || !value.respond_to?(:read)
# if +out+ is not an IO or +value+ is not an IO
buf << (value.respond_to?(:read) ? value.read : value)
elsif value.respond_to?(:size) && chunked_p
# if +out+ is an IO and +value+ is a File, use IO.copy_stream
flush_buffer(out, buf, chunked_p)
out << "%x\r\n" % value.size if chunked_p
IO.copy_stream(value, out)
out << "\r\n" if chunked_p
else
# +out+ is an IO, and +value+ is not a File but an IO
flush_buffer(out, buf, chunked_p)
1 while flush_buffer(out, value.read(4096), chunked_p)
end
else
# non-file field:
# HTML5 says, "The parts of the generated multipart/form-data
# resource that correspond to non-file fields must not have a
# Content-Type header specified."
buf << "Content-Disposition: form-data; name=\"#{key}\"\r\n\r\n"
buf << (value.respond_to?(:read) ? value.read : value)
end
buf << "\r\n"
end
buf << "--#{boundary}--\r\n"
flush_buffer(out, buf, chunked_p)
out << "0\r\n\r\n" if chunked_p
end
No documentation available
lib/net/http/generic_request.rb
View on GitHub
# File tmp/rubies/ruby-3.0.5/lib/net/http/generic_request.rb, line 293
def flush_buffer(out, buf, chunked_p)
return unless buf
out << "%x\r\n"%buf.bytesize if chunked_p
out << buf
out << "\r\n" if chunked_p
buf.clear
end
No documentation available
#
lib/net/http/generic_request.rb
View on GitHub
# File tmp/rubies/ruby-3.0.5/lib/net/http/generic_request.rb, line 64
def inspect
"\#<#{self.class} #{@method}>"
end
No documentation available
lib/net/http/generic_request.rb
View on GitHub
# File tmp/rubies/ruby-3.0.5/lib/net/http/generic_request.rb, line 288
def quote_string(str, charset)
str = str.encode(charset, fallback:->(c){'&#%d;'%c.encode("UTF-8").ord}) if charset
str.gsub(/[\\"]/, '\\\\\&')
end
No documentation available
lib/net/http/generic_request.rb
View on GitHub
# File tmp/rubies/ruby-3.0.5/lib/net/http/generic_request.rb, line 78
def request_body_permitted?
@request_has_body
end
No documentation available
lib/net/http/generic_request.rb
View on GitHub
# File tmp/rubies/ruby-3.0.5/lib/net/http/generic_request.rb, line 82
def response_body_permitted?
@response_has_body
end
No documentation available
lib/net/http/generic_request.rb
View on GitHub
# File tmp/rubies/ruby-3.0.5/lib/net/http/generic_request.rb, line 183
def send_request_with_body(sock, ver, path, body)
self.content_length = body.bytesize
delete 'Transfer-Encoding'
supply_default_content_type
write_header sock, ver, path
wait_for_continue sock, ver if sock.continue_timeout
sock.write body
end
No documentation available
lib/net/http/generic_request.rb
View on GitHub
# File tmp/rubies/ruby-3.0.5/lib/net/http/generic_request.rb, line 211
def send_request_with_body_data(sock, ver, path, params)
if /\Amultipart\/form-data\z/i !~ self.content_type
self.content_type = 'application/x-www-form-urlencoded'
return send_request_with_body(sock, ver, path, URI.encode_www_form(params))
end
opt = @form_option.dup
require 'securerandom' unless defined?(SecureRandom)
opt[:boundary] ||= SecureRandom.urlsafe_base64(40)
self.set_content_type(self.content_type, boundary: opt[:boundary])
if chunked?
write_header sock, ver, path
encode_multipart_form_data(sock, params, opt)
else
require 'tempfile'
file = Tempfile.new('multipart')
file.binmode
encode_multipart_form_data(file, params, opt)
file.rewind
self.content_length = file.size
write_header sock, ver, path
IO.copy_stream(file, sock)
file.close(true)
end
end
No documentation available
lib/net/http/generic_request.rb
View on GitHub
# File tmp/rubies/ruby-3.0.5/lib/net/http/generic_request.rb, line 192
def send_request_with_body_stream(sock, ver, path, f)
unless content_length() or chunked?
raise ArgumentError,
"Content-Length not given and Transfer-Encoding is not `chunked'"
end
supply_default_content_type
write_header sock, ver, path
wait_for_continue sock, ver if sock.continue_timeout
if chunked?
chunker = Chunker.new(sock)
IO.copy_stream(f, chunker)
chunker.finish
else
# copy_stream can sendfile() to sock.io unless we use SSL.
# If sock.io is an SSLSocket, copy_stream will hit SSL_write()
IO.copy_stream(f, sock.io)
end
end
No documentation available
lib/net/http/generic_request.rb
View on GitHub
# File tmp/rubies/ruby-3.0.5/lib/net/http/generic_request.rb, line 301
def supply_default_content_type
return if content_type()
warn 'net/http: Content-Type did not set; using application/x-www-form-urlencoded', uplevel: 1 if $VERBOSE
set_content_type 'application/x-www-form-urlencoded'
end
No documentation available
lib/net/http/generic_request.rb
View on GitHub
# File tmp/rubies/ruby-3.0.5/lib/net/http/generic_request.rb, line 311
def wait_for_continue(sock, ver)
if ver >= '1.1' and @header['expect'] and
@header['expect'].include?('100-continue')
if sock.io.to_io.wait_readable(sock.continue_timeout)
res = Net::HTTPResponse.read_new(sock)
unless res.kind_of?(Net::HTTPContinue)
res.decode_content = @decode_content
throw :response, res
end
end
end
end
Waits up to the continue timeout for a response from the server provided we’re speaking HTTP 1.1 and are expecting a 100-continue response.
lib/net/http/generic_request.rb
View on GitHub
# File tmp/rubies/ruby-3.0.5/lib/net/http/generic_request.rb, line 324
def write_header(sock, ver, path)
reqline = "#{@method} #{path} HTTP/#{ver}"
if /[\r\n]/ =~ reqline
raise ArgumentError, "A Request-Line must not contain CR or LF"
end
buf = ""
buf << reqline << "\r\n"
each_capitalized do |k,v|
buf << "#{k}: #{v}\r\n"
end
buf << "\r\n"
sock.write buf
end
No documentation available