Hiroshi SHIBATA
fe7d4eed25
Manually merged https://github.com/ruby/net-http/pull/106
...
Co-authored-by: Peter Zhu <peter@peterzhu.ca>
Co-authored-by: BurdetteLamar <burdettelamar@yahoo.com>
2023-01-31 13:14:05 +09:00
BurdetteLamar
8250b46794
[ruby/net-http] Correct doc error
...
dc006d8419
2023-01-28 21:41:15 +00:00
Burdette Lamar
401aa9ddd1
[ruby/net-http] [DOC] Header doc
...
(https://github.com/ruby/net-http/pull/104 )
3308362d9b
2023-01-19 18:58:40 +00:00
Burdette Lamar
308942920f
[ruby/net-http] [DOC] Enhanced RDoc for set_form
...
(https://github.com/ruby/net-http/pull/103 )
f6506ff889
2023-01-18 21:03:58 +00:00
BurdetteLamar
44b7fd8d4f
[ruby/net-http] Enhanced RDoc for HTTPHeader
...
6a282eccdd
2023-01-01 15:02:14 +00:00
BurdetteLamar
8f678d61a5
[ruby/net-http] Adding links to references
...
1c8151aaf3
2022-12-26 22:17:18 +00:00
Burdette Lamar
8c8645f578
[ruby/net-http] [DOC] Adding links to references
...
(https://github.com/ruby/net-http/pull/97 )
768115167a
2022-12-26 15:09:21 +09:00
BurdetteLamar
35aba09e7f
[ruby/net-http] Adding links to references
...
b85530e6b8
2022-12-26 15:09:21 +09:00
Hiroshi SHIBATA
cd6c7613f3
Apply the accidental commits again before Ruby 3.2.
...
Reverts the following commits:
eb8d4d7b51
edb83dc3a2
d40064d184
2022-12-26 12:07:42 +09:00
Hiroshi SHIBATA
eb8d4d7b51
Revert the additional changes from net-http-0.3.2
2022-12-23 19:36:43 +09:00
BurdetteLamar
172dc98c94
[ruby/net-http] Adding links to references
...
71bae5c0fe
2022-12-21 09:17:19 -05:00
BurdetteLamar
276b84f8ed
[ruby/net-http] Adding links to references
...
e4df80f299
2022-12-21 09:17:19 -05:00
BurdetteLamar
86f0128efe
[ruby/net-http] Adding links to references
...
df5a554fa8
2022-12-21 09:17:18 -05:00
Hiroshi SHIBATA
08d21b4bd2
[ruby/net-http] Bump version to 0.3.2
...
b8bdb7248e
2022-12-19 10:50:21 +09:00
BurdetteLamar
ede7c035d5
[ruby/net-http] Adding links to references
...
6dfe6f411a
2022-12-18 15:37:45 +00:00
BurdetteLamar
d5eafaed81
[ruby/net-http] Enhanced RDoc for Net::HTTP
...
da626e4e42
2022-12-15 21:33:19 +00:00
Burdette Lamar
55f56eb66e
[ruby/net-http] [DOC] New doc for responses classes
...
(https://github.com/ruby/net-http/pull/91 )
d394404402
2022-12-14 22:13:28 +00:00
Burdette Lamar
d2b87456f0
[ruby/net-http] [DOC] Correct formatting in header.rb
...
(https://github.com/ruby/net-http/pull/90 )
d9d829ca53
2022-12-14 21:34:12 +00:00
Burdette Lamar
3e5f8b2af3
[ruby/net-http] [DOC] Enhanced RDoc for Net::HTTP
...
(https://github.com/ruby/net-http/pull/89 )
86b84eb307
2022-12-14 13:55:06 +00:00
Burdette Lamar
63f682ba11
[ruby/net-http] [DOC] Enhanced RDoc for HTTPHeader
...
(https://github.com/ruby/net-http/pull/88 )
46e966be10
2022-12-12 19:34:21 +00:00
Burdette Lamar
f1cdc129d4
[ruby/net-http] [DOC] Enhanced RDoc for Net::HTTP
...
(https://github.com/ruby/net-http/pull/85 )
9d9040fb79
2022-12-11 22:26:18 +00:00
Hiroshi SHIBATA
9557c8edf2
Merge net-protocol-0.2.1
2022-12-09 16:36:22 +09:00
Hiroshi SHIBATA
6f44dc8edf
[ruby/net-protocol] Bump version to 0.2.1
...
06d1420936
2022-12-08 07:23:46 +00:00
Jean Boussier
8547f61daf
[ruby/net-protocol] Undo BufferedIO#rbuf_consume_all_shareable! optimization
...
This optimization is unsafe because `dest` is allowed to be a custom
object responding to `<<` (e.g. a block wrapped in `ReadAdapter`).
So the receiver can hold onto the passed buffer for as long as it wants.
If it was guaranteed that `ReadAdapter` was the only possible receiver
we could dup the buffer there for mutation safety, but I'm not certain
it's the case so I'd rather err on the safe side.
Ref: https://github.com/shrinerb/shrine/issues/610
7efa16d55d
2022-12-08 07:17:51 +00:00
Peter Zhu
9d4483f24d
[ruby/net-http] [DOC] Fix call-seq for Net::HTTP.start
...
The lack of a newline between the call-seq and the documentation was
causing the documentation to be parsed as a call-seq.
1a212e2065
2022-12-06 14:27:15 +00:00
Hiroshi SHIBATA
ad970f5474
[ruby/net-protocol] Bump version to 0.2.0
...
3097bb4cc3
2022-12-05 06:46:33 +00:00
Hiroshi SHIBATA
9e114338b9
[ruby/net-http] Bump version to 0.3.1
...
09a9ea163a
2022-12-05 06:42:56 +00:00
Burdette Lamar
e58c4f97fa
[ruby/net-http] [DOC] Enhanced RDoc for Net::HTTP
...
(https://github.com/ruby/net-http/pull/84 )
660046386f
2022-12-04 20:22:31 +00:00
Burdette Lamar
171e94bd95
[ruby/net-http] [DOC] Enhanced RDoc for Net::HTTPHeader
...
(https://github.com/ruby/net-http/pull/83 )
1ea5004098
2022-12-01 23:17:47 +00:00
Burdette Lamar
ee49fe5d34
[ruby/net-http] Enhanced RDoc for header Range
...
(https://github.com/ruby/net-http/pull/82 )
a26f62a2e5
2022-11-28 23:33:15 +00:00
Burdette Lamar
b55da1cd97
[ruby/net-http] [DOC] Enhanced RDoc for Net::HTTPHeader
...
77c6878970
2022-11-27 00:21:49 +00:00
BurdetteLamar
5ee947314e
[ruby/net-http] Enhanced RDoc for Net::HTTPHeader
...
86b0514239
2022-11-23 17:12:35 +00:00
BurdetteLamar
4b32ed6e33
[ruby/net-http] Enhanced RDoc for Net::HTTPHeader
...
ef0ef53b0c
2022-11-23 17:12:34 +00:00
BurdetteLamar
79a9280aa5
[ruby/net-http] Enhanced RDoc for Net::HTTPHeader
...
0af9fb94a9
2022-11-23 17:12:33 +00:00
BurdetteLamar
c6dc126641
[ruby/net-http] Enhanced RDoc for Net::HTTPHeader
...
995ff356b4
2022-11-23 17:12:33 +00:00
BurdetteLamar
66be0922b7
[ruby/net-http] Enhanced RDoc for Net::HTTPHeader
...
e924f1205b
2022-11-23 17:12:32 +00:00
BurdetteLamar
909ea6b60d
[ruby/net-http] About the Examples moved to separate file
...
0512b5bfc9
2022-11-19 15:33:28 +00:00
BurdetteLamar
e6162728f6
[ruby/net-http] Enhanced RDoc for Net::HTTP
2022-11-19 10:25:12 -05:00
Burdette Lamar
2047636af8
[ruby/net-http] Update lib/net/http/request.rb
...
e3c9011edb
Co-authored-by: Peter Zhu <peter@peterzhu.ca>
2022-11-19 10:17:54 -05:00
BurdetteLamar
dbb902fc91
[ruby/net-http] Enhanced RDoc for Net::HTTP
...
4444e8cea4
2022-11-19 10:17:54 -05:00
BurdetteLamar
951eabdcf2
[ruby/net-http] Enhanced RDoc for Net::HTTP
...
6b30c5310b
2022-11-19 10:17:53 -05:00
Burdette Lamar
a48e01ccba
[ruby/net-http] Update lib/net/http.rb
...
16d042fad6
Co-authored-by: Peter Zhu <peter@peterzhu.ca>
2022-11-11 17:05:29 +00:00
BurdetteLamar
4d9ada223b
[ruby/net-http] Prettify class hierarchies in Net::HTTP
...
4a5732e210
2022-11-11 17:05:28 +00:00
Hiroshi SHIBATA
c5f5403f6e
[ruby/net-http] Bump version to 0.3.0
2022-10-24 05:45:44 +00:00
Hiroshi SHIBATA
f88bff7705
[ruby/net-http] Revert "Replace Timeout.timeout in Net:HTTP#connect"
...
This reverts commit 753cae3bbc
.
98caa38204
2022-10-21 12:39:52 +00:00
Hiroshi SHIBATA
1cda414622
Raise ArgumentError with empty host url again.
...
Fixup dd5118f852
Co-authored-by: Koichi Sasada <ko1@atdot.net>
2022-10-13 12:32:02 +09:00
Jeremy Evans
cd77e71bba
[ruby/net-http] Remove ENVIRONMENT_VARIABLE_IS_MULTIUSER_SAFE
...
This list is out of date. At least OpenBSD since 2013 does not
allow one user to read the environment variables of a process
run by another user.
While we could try to keep the list updated, I think it's a bad
idea to not use the user/password from the environment, even if
another user on the system could read it. If http_proxy exists
in the environment, and other users can read it, it doesn't
make it more secure for Ruby to ignore it. You could argue that
it encourages poor security practices, but net/http should provide
mechanism, not policy.
Fixes [Bug #18908 ]
1e4585153d
2022-09-28 17:26:03 +09:00
Jean Boussier
739380c97d
[ruby/net-protocol] Improve BufferedIO performance
...
`BufferedIO` is a bit inefficient for reading large responses because
it use the classic `buffer.slice!` technique which cause a lot of
unnecessary string copying.
This is particularly visible on line based protocol when reading
line by line.
Instead of repeatedly shifting the string, we can keep track of
which offset we're at, to know how many bytes are left in the buffer.
This change also open the door to further optimization by increasing
the buffer size, as previously `slice!` would get slower the larger
the buffer is.
Benchmark results:
```
=== 1k ===
Warming up --------------------------------------
1k 1.234k i/100ms
1k opt 1.283k i/100ms
Calculating -------------------------------------
1k 12.615k (± 0.9%) i/s - 64.168k in 5.086995s
1k opt 12.856k (± 0.9%) i/s - 65.433k in 5.090051s
Comparison:
1k: 12615.2 i/s
1k opt: 12856.0 i/s - 1.02x (± 0.00) faster
=== 10k ===
Warming up --------------------------------------
10k 1.165k i/100ms
10k opt 1.269k i/100ms
Calculating -------------------------------------
10k 11.550k (± 2.4%) i/s - 58.250k in 5.046378s
10k opt 12.736k (± 1.0%) i/s - 64.719k in 5.081969s
Comparison:
10k: 11550.3 i/s
10k opt: 12736.3 i/s - 1.10x (± 0.00) faster
=== 100k ===
Warming up --------------------------------------
100k 809.000 i/100ms
100k opt 926.000 i/100ms
Calculating -------------------------------------
100k 8.054k (± 3.0%) i/s - 40.450k in 5.028299s
100k opt 9.286k (± 2.2%) i/s - 47.226k in 5.088841s
Comparison:
100k: 8053.6 i/s
100k opt: 9285.5 i/s - 1.15x (± 0.00) faster
=== 1M ===
Warming up --------------------------------------
1M 249.000 i/100ms
1M opt 315.000 i/100ms
Calculating -------------------------------------
1M 2.448k (± 2.5%) i/s - 12.450k in 5.089744s
1M opt 3.119k (± 2.6%) i/s - 15.750k in 5.053772s
Comparison:
1M: 2447.8 i/s
1M opt: 3118.8 i/s - 1.27x (± 0.00) faster
```
Profiling before (1MB responses):
```
==================================
Mode: wall(1000)
Samples: 5276 (0.00% miss rate)
GC: 394 (7.47%)
==================================
TOTAL (pct) SAMPLES (pct) FRAME
1622 (30.7%) 1622 (30.7%) IO#wait_readable
777 (14.7%) 777 (14.7%) IO#read_nonblock
365 (6.9%) 365 (6.9%) (sweeping)
2705 (51.3%) 364 (6.9%) Net::BufferedIO#rbuf_fill
264 (5.0%) 264 (5.0%) String#index
223 (4.2%) 223 (4.2%) String#sub
221 (4.2%) 221 (4.2%) String#slice!
185 (3.5%) 185 (3.5%) String#split
108 (2.0%) 108 (2.0%) IO#write_nonblock
101 (1.9%) 101 (1.9%) String#downcase
66 (1.3%) 66 (1.3%) Net::BufferedIO#LOG
57 (1.1%) 57 (1.1%) String#count
51 (1.0%) 51 (1.0%) String#to_s
391 (7.4%) 50 (0.9%) Net::HTTPGenericRequest#write_header
50 (0.9%) 50 (0.9%) String#capitalize
49 (0.9%) 49 (0.9%) Array#join
47 (0.9%) 47 (0.9%) String#b
106 (2.0%) 36 (0.7%) Net::HTTPHeader#set_field
34 (0.6%) 34 (0.6%) Module#===
33 (0.6%) 33 (0.6%) String#[]
140 (2.7%) 29 (0.5%) Net::BufferedIO#write0
29 (0.5%) 29 (0.5%) (marking)
281 (5.3%) 27 (0.5%) Net::BufferedIO#rbuf_consume
1195 (22.6%) 25 (0.5%) Net::HTTPResponse#read_body
1024 (19.4%) 25 (0.5%) Net::HTTPResponse.each_response_header
86 (1.6%) 24 (0.5%) Net::HTTPHeader#set_field
23 (0.4%) 23 (0.4%) Net::HTTP#proxy_uri
51 (1.0%) 23 (0.4%) Net::HTTPHeader#initialize_http_header
2225 (42.2%) 22 (0.4%) Net::BufferedIO#readuntil
20 (0.4%) 20 (0.4%) Regexp#===
```
Profiling after (1MB responses):
```
==================================
Mode: wall(1000)
Samples: 15180 (0.00% miss rate)
GC: 1688 (11.12%)
==================================
TOTAL (pct) SAMPLES (pct) FRAME
4534 (29.9%) 4534 (29.9%) IO#read_nonblock
10650 (70.2%) 3944 (26.0%) Net::HTTPOpt::BufferedIOOpt#rbuf_fill
2101 (13.8%) 2101 (13.8%) IO#wait_readable
1442 (9.5%) 1442 (9.5%) (sweeping)
360 (2.4%) 360 (2.4%) String#sub
312 (2.1%) 312 (2.1%) String#split
265 (1.7%) 265 (1.7%) String#bytesize
246 (1.6%) 246 (1.6%) (marking)
151 (1.0%) 151 (1.0%) IO#write_nonblock
125 (0.8%) 125 (0.8%) String#downcase
116 (0.8%) 116 (0.8%) String#index
113 (0.7%) 113 (0.7%) Module#===
162 (1.1%) 89 (0.6%) Net::HTTPOpt::BufferedIOOpt#rbuf_consume_all_shareable!
158 (1.0%) 65 (0.4%) Net::HTTPHeader#set_field
63 (0.4%) 63 (0.4%) String#capitalize
63 (0.4%) 63 (0.4%) BasicObject#equal?
58 (0.4%) 58 (0.4%) Regexp#match
58 (0.4%) 58 (0.4%) String#[]
449 (3.0%) 56 (0.4%) Net::HTTPGenericRequest#write_header
53 (0.3%) 53 (0.3%) String#to_s
52 (0.3%) 52 (0.3%) Net::HTTPOpt::BufferedIOOpt#LOG
52 (0.3%) 52 (0.3%) String#count
44 (0.3%) 44 (0.3%) String#byteslice
44 (0.3%) 44 (0.3%) Array#join
1096 (7.2%) 42 (0.3%) Net::HTTPResponse.each_response_header
2617 (17.2%) 40 (0.3%) Net::HTTPOpt::BufferedIOOpt#readuntil
132 (0.9%) 30 (0.2%) Net::HTTPOpt::BufferedIOOpt#rbuf_consume
28 (0.2%) 28 (0.2%) Regexp#===
27 (0.2%) 27 (0.2%) Net::HTTP#proxy_uri
8862 (58.4%) 27 (0.2%) Net::HTTPResponse#read_body
````
Benchmark code:
```ruby
require "fileutils"
DIR = "/tmp/www"
FileUtils.mkdir_p(DIR)
HOST = "127.0.0.1"
PORT = 8080
CONF = <<~EOS
daemon off;
worker_processes 2;
events {
worker_connections 128;
}
http {
server_tokens off;
charset utf-8;
server {
server_name localhost;
listen #{HOST}:#{PORT};
keepalive_requests 10000000;
keepalive_timeout 3600s;
error_page 500 502 503 504 /50x.html;
location / {
root #{DIR};
}
}
}
EOS
File.write(File.join(DIR, "1k.txt"), 'a' * 1024)
File.write(File.join(DIR, "10k.txt"), 'a' * 1024 * 10)
File.write(File.join(DIR, "100k.txt"), 'a' * 1024 * 100)
File.write(File.join(DIR, "1M.txt"), 'a' * 1024 * 1024)
File.write(File.join(DIR, "nginx.conf"), CONF)
require "benchmark/ips"
require "net/http"
nginx_pid = Process.spawn('nginx', '-c', File.join(DIR, "nginx.conf"))
module Net
class HTTPOpt < HTTP
class BufferedIOOpt < ::Net::BufferedIO #:nodoc: internal use only
def initialize(io, read_timeout: 60, write_timeout: 60, continue_timeout: nil, debug_output: nil)
@io = io
@read_timeout = read_timeout
@write_timeout = write_timeout
@continue_timeout = continue_timeout
@debug_output = debug_output
@rbuf = ''.b
@rbuf_offset = 0
end
attr_reader :io
attr_accessor :read_timeout
attr_accessor :write_timeout
attr_accessor :continue_timeout
attr_accessor :debug_output
def inspect
"#<#{self.class} io=#{@io}>"
end
def eof?
@io.eof?
end
def closed?
@io.closed?
end
def close
@io.close
end
#
# Read
#
public
def read(len, dest = ''.b, ignore_eof = false)
LOG "reading #{len} bytes..."
read_bytes = 0
begin
while read_bytes + rbuf_size < len
if s = rbuf_consume_all_shareable!
read_bytes += s.bytesize
dest << s
end
rbuf_fill
end
s = rbuf_consume(len - read_bytes)
read_bytes += s.bytesize
dest << s
rescue EOFError
raise unless ignore_eof
end
LOG "read #{read_bytes} bytes"
dest
end
def read_all(dest = ''.b)
LOG 'reading all...'
read_bytes = 0
begin
while true
if s = rbuf_consume_all_shareable!
read_bytes += s.bytesize
dest << s
end
rbuf_fill
end
rescue EOFError
;
end
LOG "read #{read_bytes} bytes"
dest
end
def readuntil(terminator, ignore_eof = false)
offset = @rbuf_offset
begin
until idx = @rbuf.index(terminator, offset)
offset = @rbuf.bytesize
rbuf_fill
end
return rbuf_consume(idx + terminator.bytesize - @rbuf_offset)
rescue EOFError
raise unless ignore_eof
return rbuf_consume
end
end
def readline
readuntil("\n").chop
end
private
BUFSIZE = 1024 * 16
def rbuf_fill
tmp = @rbuf_empty ? @rbuf : nil
case rv = @io.read_nonblock(BUFSIZE, tmp, exception: false)
when String
@rbuf_empty = false
if rv.equal?(tmp)
@rbuf_offset = 0
else
@rbuf << rv
rv.clear
end
return
when :wait_readable
(io = @io.to_io).wait_readable(@read_timeout) or raise Net::ReadTimeout.new(io)
# continue looping
when :wait_writable
# OpenSSL::Buffering#read_nonblock may fail with IO::WaitWritable.
# http://www.openssl.org/support/faq.html#PROG10
(io = @io.to_io).wait_writable(@read_timeout) or raise Net::ReadTimeout.new(io)
# continue looping
when nil
raise EOFError, 'end of file reached'
end while true
end
def rbuf_flush
if @rbuf_empty
@rbuf.clear
@rbuf_offset = 0
end
nil
end
def rbuf_size
@rbuf.bytesize - @rbuf_offset
end
# Warning: this method may share the buffer to avoid
# copying. The caller must no longer use the returned
# string once rbuf_fill has been called again
def rbuf_consume_all_shareable!
@rbuf_empty = true
buf = if @rbuf_offset == 0
@rbuf
else
@rbuf.byteslice(@rbuf_offset..-1)
end
@rbuf_offset = @rbuf.bytesize
buf
end
def rbuf_consume(len = nil)
if @rbuf_offset == 0 && (len.nil? || len == @rbuf.bytesize)
s = @rbuf
@rbuf = ''.b
@rbuf_offset = 0
@rbuf_empty = true
elsif len.nil?
s = @rbuf.byteslice(@rbuf_offset..-1)
@rbuf = ''.b
@rbuf_offset = 0
@rbuf_empty = true
else
s = @rbuf.byteslice(@rbuf_offset, len)
@rbuf_offset += len
@rbuf_empty = @rbuf_offset == @rbuf.bytesize
rbuf_flush
end
@debug_output << %Q[-> #{s.dump}\n] if @debug_output
s
end
#
# Write
#
public
def write(*strs)
writing {
write0(*strs)
}
end
alias << write
def writeline(str)
writing {
write0 str + "\r\n"
}
end
private
def writing
@written_bytes = 0
@debug_output << '<- ' if @debug_output
yield
@debug_output << "\n" if @debug_output
bytes = @written_bytes
@written_bytes = nil
bytes
end
def write0(*strs)
@debug_output << strs.map(&:dump).join if @debug_output
orig_written_bytes = @written_bytes
strs.each_with_index do |str, i|
need_retry = true
case len = @io.write_nonblock(str, exception: false)
when Integer
@written_bytes += len
len -= str.bytesize
if len == 0
if strs.size == i+1
return @written_bytes - orig_written_bytes
else
need_retry = false
# next string
end
elsif len < 0
str = str.byteslice(len, -len)
else # len > 0
need_retry = false
# next string
end
# continue looping
when :wait_writable
(io = @io.to_io).wait_writable(@write_timeout) or raise Net::WriteTimeout.new(io)
# continue looping
end while need_retry
end
end
#
# Logging
#
private
def LOG_off
@save_debug_out = @debug_output
@debug_output = nil
end
def LOG_on
@debug_output = @save_debug_out
end
def LOG(msg)
return unless @debug_output
@debug_output << msg + "\n"
end
end
BufferedIO = BufferedIOOpt
# Unchanged from ruby 3.1.1, only allow to lookup the mofidied BufferedIO
def connect
if use_ssl?
# reference early to load OpenSSL before connecting,
# as OpenSSL may take time to load.
@ssl_context = OpenSSL::SSL::SSLContext.new
end
if proxy? then
conn_addr = proxy_address
conn_port = proxy_port
else
conn_addr = conn_address
conn_port = port
end
D "opening connection to #{conn_addr}:#{conn_port}..."
begin
s = Socket.tcp conn_addr, conn_port, @local_host, @local_port, connect_timeout: @open_timeout
rescue => e
e = Net::OpenTimeout.new(e) if e.is_a?(Errno::ETIMEDOUT) #for compatibility with previous versions
raise e, "Failed to open TCP connection to " +
"#{conn_addr}:#{conn_port} (#{e.message})"
end
s.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1)
D "opened"
if use_ssl?
if proxy?
plain_sock = BufferedIO.new(s, read_timeout: @read_timeout,
write_timeout: @write_timeout,
continue_timeout: @continue_timeout,
debug_output: @debug_output)
buf = "CONNECT #{conn_address}:#{@port} HTTP/#{HTTPVersion}\r\n"
buf << "Host: #{@address}:#{@port}\r\n"
if proxy_user
credential = ["#{proxy_user}:#{proxy_pass}"].pack('m0')
buf << "Proxy-Authorization: Basic #{credential}\r\n"
end
buf << "\r\n"
plain_sock.write(buf)
HTTPResponse.read_new(plain_sock).value
# assuming nothing left in buffers after successful CONNECT response
end
ssl_parameters = Hash.new
iv_list = instance_variables
SSL_IVNAMES.each_with_index do |ivname, i|
if iv_list.include?(ivname)
value = instance_variable_get(ivname)
unless value.nil?
ssl_parameters[SSL_ATTRIBUTES[i]] = value
end
end
end
@ssl_context.set_params(ssl_parameters)
@ssl_context.session_cache_mode =
OpenSSL::SSL::SSLContext::SESSION_CACHE_CLIENT |
OpenSSL::SSL::SSLContext::SESSION_CACHE_NO_INTERNAL_STORE
@ssl_context.session_new_cb = proc {|sock, sess| @ssl_session = sess }
D "starting SSL for #{conn_addr}:#{conn_port}..."
s = OpenSSL::SSL::SSLSocket.new(s, @ssl_context)
s.sync_close = true
# Server Name Indication (SNI) RFC 3546
s.hostname = @address if s.respond_to? :hostname=
if @ssl_session and
Process.clock_gettime(Process::CLOCK_REALTIME) < @ssl_session.time.to_f + @ssl_session.timeout
s.session = @ssl_session
end
ssl_socket_connect(s, @open_timeout)
if (@ssl_context.verify_mode != OpenSSL::SSL::VERIFY_NONE) && @ssl_context.verify_hostname
s.post_connection_check(@address)
end
D "SSL established, protocol: #{s.ssl_version}, cipher: #{s.cipher[0]}"
end
@socket = BufferedIO.new(s, read_timeout: @read_timeout,
write_timeout: @write_timeout,
continue_timeout: @continue_timeout,
debug_output: @debug_output)
@last_communicated = nil
on_connect
rescue => exception
if s
D "Conn close because of connect error #{exception}"
s.close
end
raise
end
private :connect
end
end
begin
sleep 0.2
connection = Net::HTTP.start(HOST, PORT)
connection.keep_alive_timeout = 3600
connection_opt = Net::HTTPOpt.start(HOST, PORT)
connection_opt.keep_alive_timeout = 3600
unless connection.request_get("/100k.txt").body == connection_opt.request_get("/100k.txt").body
abort("bug?")
end
if ARGV.first == "profile"
require 'stackprof'
require 'json'
StackProf.run(mode: :wall, out: "/tmp/stackprof-net-http.dump", raw: true) do
40_000.times do
connection.request_get("/1M.txt").body
end
end
File.write("/tmp/stackprof-net-http.json", JSON.dump(Marshal.load(File.binread("/tmp/stackprof-net-http.dump"))))
system("stackprof", "/tmp/stackprof-net-http.rb")
StackProf.run(mode: :wall, out: "/tmp/stackprof-net-http-opt.dump", raw: true) do
40_000.times do
connection_opt.request_get("/1M.txt").body
end
end
File.write("/tmp/stackprof-net-http-opt.json", JSON.dump(Marshal.load(File.binread("/tmp/stackprof-net-http-opt.dump"))))
system("stackprof", "/tmp/stackprof-net-http-opt.dump")
else
%w(1k 10k 100k 1M).each do |size|
puts "=== #{size} ==="
Benchmark.ips do |x|
path = "/#{size}.txt"
x.report("#{size}") { connection.request_get(path).body }
x.report("#{size} opt") { connection_opt.request_get(path).body }
x.compare!(order: :baseline)
end
puts
end
end
ensure
Process.kill('TERM', nginx_pid)
Process.wait(nginx_pid)
end
```
781e400389
2022-08-31 12:37:49 +09:00
Shishir Joshi
c310691dd8
[ruby/net-http] Make Net::HTTPHeader#content_range
return nil on non-byte units
...
* Returning nil from the `content_range` method instead of raising an
error when the unit in the content-range header is not "bytes".
Fix https://bugs.ruby-lang.org/issues/11450
0b5030dd86
Co-Authored-By: Nobuyoshi Nakada <nobu@ruby-lang.org>
2022-06-16 23:35:27 +09:00
Nobuyoshi Nakada
2223eb082a
Revert "HTTPHeader.content_range throws error on non-byte units"
...
This reverts commit 63546bfc15
.
2022-06-16 22:10:59 +09:00