net-http 0.1.0 → 0.2.1.pre1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/dependabot.yml +6 -0
- data/.github/workflows/test.yml +3 -5
- data/Gemfile +1 -0
- data/LICENSE.txt +22 -0
- data/README.md +1 -1
- data/Rakefile +7 -0
- data/lib/net/http/backward.rb +26 -12
- data/lib/net/http/generic_request.rb +4 -6
- data/lib/net/http/header.rb +36 -16
- data/lib/net/http/response.rb +179 -3
- data/lib/net/http.rb +131 -47
- data/net-http.gemspec +13 -8
- metadata +28 -12
- data/Gemfile.lock +0 -23
- data/lib/net/http/version.rb +0 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 31dbc20c10c0e3ca2a3fc77be6612257bb34ad8cbe8cfded64622fccdea6cb08
|
4
|
+
data.tar.gz: 2f043ee80140523a0d41f690dba72807f95cf8687cdac29de38bdc3bc9e6ccdb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '00890bbc5eb9a6c3930cfc69554e5d76de6395a31fdcb2c865ad77c6fac0c55cbef5206b6adf0c5b97ea1bb1d8ccc79d2302e377f77d95132c87b5327aeef229'
|
7
|
+
data.tar.gz: a1856470ffbfe586204e9a3e97bfd01f86261bf51e9c2760f1b086be45ccafd7edcddb04854f4251b8a033246e7bc485b80a1374eb2a30c507a42d8d61526608
|
data/.github/workflows/test.yml
CHANGED
@@ -7,18 +7,16 @@ jobs:
|
|
7
7
|
name: build (${{ matrix.ruby }} / ${{ matrix.os }})
|
8
8
|
strategy:
|
9
9
|
matrix:
|
10
|
-
ruby: [ 2.7, 2.6, head ]
|
10
|
+
ruby: [ 3.1, '3.0', 2.7, 2.6, head ]
|
11
11
|
os: [ ubuntu-latest, macos-latest ]
|
12
12
|
runs-on: ${{ matrix.os }}
|
13
13
|
steps:
|
14
|
-
- uses: actions/checkout@
|
14
|
+
- uses: actions/checkout@v3
|
15
15
|
- name: Set up Ruby
|
16
16
|
uses: ruby/setup-ruby@v1
|
17
17
|
with:
|
18
18
|
ruby-version: ${{ matrix.ruby }}
|
19
19
|
- name: Install dependencies
|
20
|
-
run:
|
21
|
-
gem install bundler --no-document
|
22
|
-
bundle install
|
20
|
+
run: bundle install
|
23
21
|
- name: Run test
|
24
22
|
run: rake test
|
data/Gemfile
CHANGED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (C) 1993-2013 Yukihiro Matsumoto. All rights reserved.
|
2
|
+
|
3
|
+
Redistribution and use in source and binary forms, with or without
|
4
|
+
modification, are permitted provided that the following conditions
|
5
|
+
are met:
|
6
|
+
1. Redistributions of source code must retain the above copyright
|
7
|
+
notice, this list of conditions and the following disclaimer.
|
8
|
+
2. Redistributions in binary form must reproduce the above copyright
|
9
|
+
notice, this list of conditions and the following disclaimer in the
|
10
|
+
documentation and/or other materials provided with the distribution.
|
11
|
+
|
12
|
+
THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
13
|
+
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
14
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
15
|
+
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
16
|
+
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
17
|
+
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
18
|
+
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
19
|
+
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
20
|
+
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
21
|
+
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
22
|
+
SUCH DAMAGE.
|
data/README.md
CHANGED
data/Rakefile
CHANGED
@@ -7,4 +7,11 @@ Rake::TestTask.new(:test) do |t|
|
|
7
7
|
t.test_files = FileList["test/**/test_*.rb"]
|
8
8
|
end
|
9
9
|
|
10
|
+
task :sync_tool do
|
11
|
+
require 'fileutils'
|
12
|
+
FileUtils.cp "../ruby/tool/lib/core_assertions.rb", "./test/lib"
|
13
|
+
FileUtils.cp "../ruby/tool/lib/envutil.rb", "./test/lib"
|
14
|
+
FileUtils.cp "../ruby/tool/lib/find_executable.rb", "./test/lib"
|
15
|
+
end
|
16
|
+
|
10
17
|
task :default => :test
|
data/lib/net/http/backward.rb
CHANGED
@@ -5,22 +5,36 @@
|
|
5
5
|
|
6
6
|
class Net::HTTP
|
7
7
|
ProxyMod = ProxyDelta
|
8
|
-
|
9
|
-
|
10
|
-
module Net
|
11
|
-
HTTPSession = Net::HTTP
|
8
|
+
deprecate_constant :ProxyMod
|
12
9
|
end
|
13
10
|
|
14
11
|
module Net::NetPrivate
|
15
12
|
HTTPRequest = ::Net::HTTPRequest
|
13
|
+
deprecate_constant :HTTPRequest
|
16
14
|
end
|
17
15
|
|
18
|
-
|
19
|
-
|
20
|
-
Net::HTTPRedirectionCode = Net::HTTPRedirection
|
21
|
-
Net::HTTPRetriableCode = Net::HTTPRedirection
|
22
|
-
Net::HTTPClientErrorCode = Net::HTTPClientError
|
23
|
-
Net::HTTPFatalErrorCode = Net::HTTPClientError
|
24
|
-
Net::HTTPServerErrorCode = Net::HTTPServerError
|
25
|
-
Net::HTTPResponceReceiver = Net::HTTPResponse
|
16
|
+
module Net
|
17
|
+
HTTPSession = HTTP
|
26
18
|
|
19
|
+
HTTPInformationCode = HTTPInformation
|
20
|
+
HTTPSuccessCode = HTTPSuccess
|
21
|
+
HTTPRedirectionCode = HTTPRedirection
|
22
|
+
HTTPRetriableCode = HTTPRedirection
|
23
|
+
HTTPClientErrorCode = HTTPClientError
|
24
|
+
HTTPFatalErrorCode = HTTPClientError
|
25
|
+
HTTPServerErrorCode = HTTPServerError
|
26
|
+
HTTPResponseReceiver = HTTPResponse
|
27
|
+
|
28
|
+
HTTPResponceReceiver = HTTPResponse # Typo since 2001
|
29
|
+
|
30
|
+
deprecate_constant :HTTPSession,
|
31
|
+
:HTTPInformationCode,
|
32
|
+
:HTTPSuccessCode,
|
33
|
+
:HTTPRedirectionCode,
|
34
|
+
:HTTPRetriableCode,
|
35
|
+
:HTTPClientErrorCode,
|
36
|
+
:HTTPFatalErrorCode,
|
37
|
+
:HTTPServerErrorCode,
|
38
|
+
:HTTPResponseReceiver,
|
39
|
+
:HTTPResponceReceiver
|
40
|
+
end
|
@@ -31,12 +31,12 @@ class Net::HTTPGenericRequest
|
|
31
31
|
|
32
32
|
@decode_content = false
|
33
33
|
|
34
|
-
if
|
34
|
+
if Net::HTTP::HAVE_ZLIB then
|
35
35
|
if !initheader ||
|
36
36
|
!initheader.keys.any? { |k|
|
37
37
|
%w[accept-encoding range].include? k.downcase
|
38
38
|
} then
|
39
|
-
@decode_content = true
|
39
|
+
@decode_content = true if @response_has_body
|
40
40
|
initheader = initheader ? initheader.dup : {}
|
41
41
|
initheader["accept-encoding"] =
|
42
42
|
"gzip;q=1.0,deflate;q=0.6,identity;q=0.3"
|
@@ -143,7 +143,7 @@ class Net::HTTPGenericRequest
|
|
143
143
|
end
|
144
144
|
|
145
145
|
if host = self['host']
|
146
|
-
host.sub!(/:.*/
|
146
|
+
host.sub!(/:.*/m, ''.freeze)
|
147
147
|
elsif host = @uri.host
|
148
148
|
else
|
149
149
|
host = addr
|
@@ -202,9 +202,7 @@ class Net::HTTPGenericRequest
|
|
202
202
|
IO.copy_stream(f, chunker)
|
203
203
|
chunker.finish
|
204
204
|
else
|
205
|
-
|
206
|
-
# If sock.io is an SSLSocket, copy_stream will hit SSL_write()
|
207
|
-
IO.copy_stream(f, sock.io)
|
205
|
+
IO.copy_stream(f, sock)
|
208
206
|
end
|
209
207
|
end
|
210
208
|
|
data/lib/net/http/header.rb
CHANGED
@@ -423,30 +423,50 @@ module Net::HTTPHeader
|
|
423
423
|
alias form_data= set_form_data
|
424
424
|
|
425
425
|
# Set an HTML form data set.
|
426
|
-
# +params+
|
427
|
-
#
|
428
|
-
#
|
429
|
-
#
|
426
|
+
# +params+ :: The form data to set, which should be an enumerable.
|
427
|
+
# See below for more details.
|
428
|
+
# +enctype+ :: The content type to use to encode the form submission,
|
429
|
+
# which should be application/x-www-form-urlencoded or
|
430
|
+
# multipart/form-data.
|
431
|
+
# +formopt+ :: An options hash, supporting the following options:
|
432
|
+
# :boundary :: The boundary of the multipart message. If
|
433
|
+
# not given, a random boundary will be used.
|
434
|
+
# :charset :: The charset of the form submission. All
|
435
|
+
# field names and values of non-file fields
|
436
|
+
# should be encoded with this charset.
|
430
437
|
#
|
431
|
-
#
|
432
|
-
#
|
433
|
-
#
|
434
|
-
#
|
435
|
-
#
|
436
|
-
#
|
437
|
-
#
|
438
|
-
#
|
438
|
+
# Each item of params should respond to +each+ and yield 2-3 arguments,
|
439
|
+
# or an array of 2-3 elements. The arguments yielded should be:
|
440
|
+
# * The name of the field.
|
441
|
+
# * The value of the field, it should be a String or a File or IO-like.
|
442
|
+
# * An options hash, supporting the following options, only
|
443
|
+
# used for file uploads:
|
444
|
+
# :filename :: The name of the file to use.
|
445
|
+
# :content_type :: The content type of the uploaded file.
|
439
446
|
#
|
440
447
|
# Each item is a file field or a normal field.
|
441
|
-
# If +value+ is a File object or the +opt+
|
448
|
+
# If +value+ is a File object or the +opt+ hash has a :filename key,
|
442
449
|
# the item is treated as a file field.
|
443
450
|
#
|
444
|
-
# If Transfer-Encoding is set as chunked, this
|
451
|
+
# If Transfer-Encoding is set as chunked, this sends the request using
|
445
452
|
# chunked encoding. Because chunked encoding is HTTP/1.1 feature,
|
446
|
-
# you
|
453
|
+
# you should confirm that the server supports HTTP/1.1 before using
|
454
|
+
# chunked encoding.
|
447
455
|
#
|
448
456
|
# Example:
|
449
|
-
#
|
457
|
+
# req.set_form([["q", "ruby"], ["lang", "en"]])
|
458
|
+
#
|
459
|
+
# req.set_form({"f"=>File.open('/path/to/filename')},
|
460
|
+
# "multipart/form-data",
|
461
|
+
# charset: "UTF-8",
|
462
|
+
# )
|
463
|
+
#
|
464
|
+
# req.set_form([["f",
|
465
|
+
# File.open('/path/to/filename.bar'),
|
466
|
+
# {filename: "other-filename.foo"}
|
467
|
+
# ]],
|
468
|
+
# "multipart/form-data",
|
469
|
+
# )
|
450
470
|
#
|
451
471
|
# See also RFC 2388, RFC 2616, HTML 4.01, and HTML5
|
452
472
|
#
|
data/lib/net/http/response.rb
CHANGED
@@ -84,6 +84,8 @@ class Net::HTTPResponse
|
|
84
84
|
@read = false
|
85
85
|
@uri = nil
|
86
86
|
@decode_content = false
|
87
|
+
@body_encoding = false
|
88
|
+
@ignore_eof = true
|
87
89
|
end
|
88
90
|
|
89
91
|
# The HTTP version supported by the server.
|
@@ -106,6 +108,22 @@ class Net::HTTPResponse
|
|
106
108
|
# Accept-Encoding header from the user.
|
107
109
|
attr_accessor :decode_content
|
108
110
|
|
111
|
+
# The encoding to use for the response body. If Encoding, use that encoding.
|
112
|
+
# If other true value, attempt to detect the appropriate encoding, and use
|
113
|
+
# that.
|
114
|
+
attr_reader :body_encoding
|
115
|
+
|
116
|
+
# Set the encoding to use for the response body. If given a String, find
|
117
|
+
# the related Encoding.
|
118
|
+
def body_encoding=(value)
|
119
|
+
value = Encoding.find(value) if value.is_a?(String)
|
120
|
+
@body_encoding = value
|
121
|
+
end
|
122
|
+
|
123
|
+
# Whether to ignore EOF when reading bodies with a specified Content-Length
|
124
|
+
# header.
|
125
|
+
attr_accessor :ignore_eof
|
126
|
+
|
109
127
|
def inspect
|
110
128
|
"#<#{self.class} #{@code} #{@message} readbody=#{@read}>"
|
111
129
|
end
|
@@ -214,6 +232,17 @@ class Net::HTTPResponse
|
|
214
232
|
end
|
215
233
|
@read = true
|
216
234
|
|
235
|
+
case enc = @body_encoding
|
236
|
+
when Encoding, false, nil
|
237
|
+
# Encoding: force given encoding
|
238
|
+
# false/nil: do not force encoding
|
239
|
+
else
|
240
|
+
# other value: detect encoding from body
|
241
|
+
enc = detect_encoding(@body)
|
242
|
+
end
|
243
|
+
|
244
|
+
@body.force_encoding(enc) if enc
|
245
|
+
|
217
246
|
@body
|
218
247
|
end
|
219
248
|
|
@@ -245,6 +274,141 @@ class Net::HTTPResponse
|
|
245
274
|
|
246
275
|
private
|
247
276
|
|
277
|
+
# :nodoc:
|
278
|
+
def detect_encoding(str, encoding=nil)
|
279
|
+
if encoding
|
280
|
+
elsif encoding = type_params['charset']
|
281
|
+
elsif encoding = check_bom(str)
|
282
|
+
else
|
283
|
+
encoding = case content_type&.downcase
|
284
|
+
when %r{text/x(?:ht)?ml|application/(?:[^+]+\+)?xml}
|
285
|
+
/\A<xml[ \t\r\n]+
|
286
|
+
version[ \t\r\n]*=[ \t\r\n]*(?:"[0-9.]+"|'[0-9.]*')[ \t\r\n]+
|
287
|
+
encoding[ \t\r\n]*=[ \t\r\n]*
|
288
|
+
(?:"([A-Za-z][\-A-Za-z0-9._]*)"|'([A-Za-z][\-A-Za-z0-9._]*)')/x =~ str
|
289
|
+
encoding = $1 || $2 || Encoding::UTF_8
|
290
|
+
when %r{text/html.*}
|
291
|
+
sniff_encoding(str)
|
292
|
+
end
|
293
|
+
end
|
294
|
+
return encoding
|
295
|
+
end
|
296
|
+
|
297
|
+
# :nodoc:
|
298
|
+
def sniff_encoding(str, encoding=nil)
|
299
|
+
# the encoding sniffing algorithm
|
300
|
+
# http://www.w3.org/TR/html5/parsing.html#determining-the-character-encoding
|
301
|
+
if enc = scanning_meta(str)
|
302
|
+
enc
|
303
|
+
# 6. last visited page or something
|
304
|
+
# 7. frequency
|
305
|
+
elsif str.ascii_only?
|
306
|
+
Encoding::US_ASCII
|
307
|
+
elsif str.dup.force_encoding(Encoding::UTF_8).valid_encoding?
|
308
|
+
Encoding::UTF_8
|
309
|
+
end
|
310
|
+
# 8. implementation-defined or user-specified
|
311
|
+
end
|
312
|
+
|
313
|
+
# :nodoc:
|
314
|
+
def check_bom(str)
|
315
|
+
case str.byteslice(0, 2)
|
316
|
+
when "\xFE\xFF"
|
317
|
+
return Encoding::UTF_16BE
|
318
|
+
when "\xFF\xFE"
|
319
|
+
return Encoding::UTF_16LE
|
320
|
+
end
|
321
|
+
if "\xEF\xBB\xBF" == str.byteslice(0, 3)
|
322
|
+
return Encoding::UTF_8
|
323
|
+
end
|
324
|
+
nil
|
325
|
+
end
|
326
|
+
|
327
|
+
# :nodoc:
|
328
|
+
def scanning_meta(str)
|
329
|
+
require 'strscan'
|
330
|
+
ss = StringScanner.new(str)
|
331
|
+
if ss.scan_until(/<meta[\t\n\f\r ]*/)
|
332
|
+
attrs = {} # attribute_list
|
333
|
+
got_pragma = false
|
334
|
+
need_pragma = nil
|
335
|
+
charset = nil
|
336
|
+
|
337
|
+
# step: Attributes
|
338
|
+
while attr = get_attribute(ss)
|
339
|
+
name, value = *attr
|
340
|
+
next if attrs[name]
|
341
|
+
attrs[name] = true
|
342
|
+
case name
|
343
|
+
when 'http-equiv'
|
344
|
+
got_pragma = true if value == 'content-type'
|
345
|
+
when 'content'
|
346
|
+
encoding = extracting_encodings_from_meta_elements(value)
|
347
|
+
unless charset
|
348
|
+
charset = encoding
|
349
|
+
end
|
350
|
+
need_pragma = true
|
351
|
+
when 'charset'
|
352
|
+
need_pragma = false
|
353
|
+
charset = value
|
354
|
+
end
|
355
|
+
end
|
356
|
+
|
357
|
+
# step: Processing
|
358
|
+
return if need_pragma.nil?
|
359
|
+
return if need_pragma && !got_pragma
|
360
|
+
|
361
|
+
charset = Encoding.find(charset) rescue nil
|
362
|
+
return unless charset
|
363
|
+
charset = Encoding::UTF_8 if charset == Encoding::UTF_16
|
364
|
+
return charset # tentative
|
365
|
+
end
|
366
|
+
nil
|
367
|
+
end
|
368
|
+
|
369
|
+
def get_attribute(ss)
|
370
|
+
ss.scan(/[\t\n\f\r \/]*/)
|
371
|
+
if ss.peek(1) == '>'
|
372
|
+
ss.getch
|
373
|
+
return nil
|
374
|
+
end
|
375
|
+
name = ss.scan(/[^=\t\n\f\r \/>]*/)
|
376
|
+
name.downcase!
|
377
|
+
raise if name.empty?
|
378
|
+
ss.skip(/[\t\n\f\r ]*/)
|
379
|
+
if ss.getch != '='
|
380
|
+
value = ''
|
381
|
+
return [name, value]
|
382
|
+
end
|
383
|
+
ss.skip(/[\t\n\f\r ]*/)
|
384
|
+
case ss.peek(1)
|
385
|
+
when '"'
|
386
|
+
ss.getch
|
387
|
+
value = ss.scan(/[^"]+/)
|
388
|
+
value.downcase!
|
389
|
+
ss.getch
|
390
|
+
when "'"
|
391
|
+
ss.getch
|
392
|
+
value = ss.scan(/[^']+/)
|
393
|
+
value.downcase!
|
394
|
+
ss.getch
|
395
|
+
when '>'
|
396
|
+
value = ''
|
397
|
+
else
|
398
|
+
value = ss.scan(/[^\t\n\f\r >]+/)
|
399
|
+
value.downcase!
|
400
|
+
end
|
401
|
+
[name, value]
|
402
|
+
end
|
403
|
+
|
404
|
+
def extracting_encodings_from_meta_elements(value)
|
405
|
+
# http://dev.w3.org/html5/spec/fetching-resources.html#algorithm-for-extracting-an-encoding-from-a-meta-element
|
406
|
+
if /charset[\t\n\f\r ]*=(?:"([^"]*)"|'([^']*)'|["']|\z|([^\t\n\f\r ;]+))/i =~ value
|
407
|
+
return $1 || $2 || $3
|
408
|
+
end
|
409
|
+
return nil
|
410
|
+
end
|
411
|
+
|
248
412
|
##
|
249
413
|
# Checks for a supported Content-Encoding header and yields an Inflate
|
250
414
|
# wrapper for this response's socket when zlib is present. If the
|
@@ -268,12 +432,16 @@ class Net::HTTPResponse
|
|
268
432
|
|
269
433
|
begin
|
270
434
|
yield inflate_body_io
|
435
|
+
success = true
|
271
436
|
ensure
|
272
|
-
orig_err = $!
|
273
437
|
begin
|
274
438
|
inflate_body_io.finish
|
439
|
+
if self['content-length']
|
440
|
+
self['content-length'] = inflate_body_io.bytes_inflated.to_s
|
441
|
+
end
|
275
442
|
rescue => err
|
276
|
-
|
443
|
+
# Ignore #finish's error if there is an exception from yield
|
444
|
+
raise err if success
|
277
445
|
end
|
278
446
|
end
|
279
447
|
when 'none', 'identity' then
|
@@ -296,7 +464,7 @@ class Net::HTTPResponse
|
|
296
464
|
|
297
465
|
clen = content_length()
|
298
466
|
if clen
|
299
|
-
@socket.read clen, dest,
|
467
|
+
@socket.read clen, dest, @ignore_eof
|
300
468
|
return
|
301
469
|
end
|
302
470
|
clen = range_length()
|
@@ -372,6 +540,14 @@ class Net::HTTPResponse
|
|
372
540
|
@inflate.finish
|
373
541
|
end
|
374
542
|
|
543
|
+
##
|
544
|
+
# The number of bytes inflated, used to update the Content-Length of
|
545
|
+
# the response.
|
546
|
+
|
547
|
+
def bytes_inflated
|
548
|
+
@inflate.total_out
|
549
|
+
end
|
550
|
+
|
375
551
|
##
|
376
552
|
# Returns a Net::ReadAdapter that inflates each read chunk into +dest+.
|
377
553
|
#
|
data/lib/net/http.rb
CHANGED
@@ -22,6 +22,7 @@
|
|
22
22
|
|
23
23
|
require 'net/protocol'
|
24
24
|
require 'uri'
|
25
|
+
require 'resolv'
|
25
26
|
autoload :OpenSSL, 'openssl'
|
26
27
|
|
27
28
|
module Net #:nodoc:
|
@@ -327,6 +328,8 @@ module Net #:nodoc:
|
|
327
328
|
# HTTPInformation:: 1xx
|
328
329
|
# HTTPContinue:: 100
|
329
330
|
# HTTPSwitchProtocol:: 101
|
331
|
+
# HTTPProcessing:: 102
|
332
|
+
# HTTPEarlyHints:: 103
|
330
333
|
# HTTPSuccess:: 2xx
|
331
334
|
# HTTPOK:: 200
|
332
335
|
# HTTPCreated:: 201
|
@@ -336,6 +339,7 @@ module Net #:nodoc:
|
|
336
339
|
# HTTPResetContent:: 205
|
337
340
|
# HTTPPartialContent:: 206
|
338
341
|
# HTTPMultiStatus:: 207
|
342
|
+
# HTTPAlreadyReported:: 208
|
339
343
|
# HTTPIMUsed:: 226
|
340
344
|
# HTTPRedirection:: 3xx
|
341
345
|
# HTTPMultipleChoices:: 300
|
@@ -345,6 +349,7 @@ module Net #:nodoc:
|
|
345
349
|
# HTTPNotModified:: 304
|
346
350
|
# HTTPUseProxy:: 305
|
347
351
|
# HTTPTemporaryRedirect:: 307
|
352
|
+
# HTTPPermanentRedirect:: 308
|
348
353
|
# HTTPClientError:: 4xx
|
349
354
|
# HTTPBadRequest:: 400
|
350
355
|
# HTTPUnauthorized:: 401
|
@@ -364,6 +369,7 @@ module Net #:nodoc:
|
|
364
369
|
# HTTPUnsupportedMediaType:: 415
|
365
370
|
# HTTPRequestedRangeNotSatisfiable:: 416
|
366
371
|
# HTTPExpectationFailed:: 417
|
372
|
+
# HTTPMisdirectedRequest:: 421
|
367
373
|
# HTTPUnprocessableEntity:: 422
|
368
374
|
# HTTPLocked:: 423
|
369
375
|
# HTTPFailedDependency:: 424
|
@@ -379,7 +385,10 @@ module Net #:nodoc:
|
|
379
385
|
# HTTPServiceUnavailable:: 503
|
380
386
|
# HTTPGatewayTimeOut:: 504
|
381
387
|
# HTTPVersionNotSupported:: 505
|
388
|
+
# HTTPVariantAlsoNegotiates:: 506
|
382
389
|
# HTTPInsufficientStorage:: 507
|
390
|
+
# HTTPLoopDetected:: 508
|
391
|
+
# HTTPNotExtended:: 510
|
383
392
|
# HTTPNetworkAuthenticationRequired:: 511
|
384
393
|
#
|
385
394
|
# There is also the Net::HTTPBadResponse exception which is raised when
|
@@ -388,11 +397,11 @@ module Net #:nodoc:
|
|
388
397
|
class HTTP < Protocol
|
389
398
|
|
390
399
|
# :stopdoc:
|
400
|
+
VERSION = "0.2.1.pre1"
|
391
401
|
Revision = %q$Revision$.split[1]
|
392
402
|
HTTPVersion = '1.1'
|
393
403
|
begin
|
394
404
|
require 'zlib'
|
395
|
-
require 'stringio' #for our purposes (unpacking gzip) lump these together
|
396
405
|
HAVE_ZLIB=true
|
397
406
|
rescue LoadError
|
398
407
|
HAVE_ZLIB=false
|
@@ -427,7 +436,7 @@ module Net #:nodoc:
|
|
427
436
|
#
|
428
437
|
# Gets the body text from the target and outputs it to $stdout. The
|
429
438
|
# target can either be specified as
|
430
|
-
# (+uri+), or as (+host+, +path+, +port+ = 80); so:
|
439
|
+
# (+uri+, +headers+), or as (+host+, +path+, +port+ = 80); so:
|
431
440
|
#
|
432
441
|
# Net::HTTP.get_print URI('http://www.example.com/index.html')
|
433
442
|
#
|
@@ -435,8 +444,12 @@ module Net #:nodoc:
|
|
435
444
|
#
|
436
445
|
# Net::HTTP.get_print 'www.example.com', '/index.html'
|
437
446
|
#
|
438
|
-
|
439
|
-
|
447
|
+
# you can also specify request headers:
|
448
|
+
#
|
449
|
+
# Net::HTTP.get_print URI('http://www.example.com/index.html'), { 'Accept' => 'text/html' }
|
450
|
+
#
|
451
|
+
def HTTP.get_print(uri_or_host, path_or_headers = nil, port = nil)
|
452
|
+
get_response(uri_or_host, path_or_headers, port) {|res|
|
440
453
|
res.read_body do |chunk|
|
441
454
|
$stdout.print chunk
|
442
455
|
end
|
@@ -446,7 +459,7 @@ module Net #:nodoc:
|
|
446
459
|
|
447
460
|
# Sends a GET request to the target and returns the HTTP response
|
448
461
|
# as a string. The target can either be specified as
|
449
|
-
# (+uri+), or as (+host+, +path+, +port+ = 80); so:
|
462
|
+
# (+uri+, +headers+), or as (+host+, +path+, +port+ = 80); so:
|
450
463
|
#
|
451
464
|
# print Net::HTTP.get(URI('http://www.example.com/index.html'))
|
452
465
|
#
|
@@ -454,13 +467,17 @@ module Net #:nodoc:
|
|
454
467
|
#
|
455
468
|
# print Net::HTTP.get('www.example.com', '/index.html')
|
456
469
|
#
|
457
|
-
|
458
|
-
|
470
|
+
# you can also specify request headers:
|
471
|
+
#
|
472
|
+
# Net::HTTP.get(URI('http://www.example.com/index.html'), { 'Accept' => 'text/html' })
|
473
|
+
#
|
474
|
+
def HTTP.get(uri_or_host, path_or_headers = nil, port = nil)
|
475
|
+
get_response(uri_or_host, path_or_headers, port).body
|
459
476
|
end
|
460
477
|
|
461
478
|
# Sends a GET request to the target and returns the HTTP response
|
462
479
|
# as a Net::HTTPResponse object. The target can either be specified as
|
463
|
-
# (+uri+), or as (+host+, +path+, +port+ = 80); so:
|
480
|
+
# (+uri+, +headers+), or as (+host+, +path+, +port+ = 80); so:
|
464
481
|
#
|
465
482
|
# res = Net::HTTP.get_response(URI('http://www.example.com/index.html'))
|
466
483
|
# print res.body
|
@@ -470,17 +487,23 @@ module Net #:nodoc:
|
|
470
487
|
# res = Net::HTTP.get_response('www.example.com', '/index.html')
|
471
488
|
# print res.body
|
472
489
|
#
|
473
|
-
|
474
|
-
|
490
|
+
# you can also specify request headers:
|
491
|
+
#
|
492
|
+
# Net::HTTP.get_response(URI('http://www.example.com/index.html'), { 'Accept' => 'text/html' })
|
493
|
+
#
|
494
|
+
def HTTP.get_response(uri_or_host, path_or_headers = nil, port = nil, &block)
|
495
|
+
if path_or_headers && !path_or_headers.is_a?(Hash)
|
475
496
|
host = uri_or_host
|
497
|
+
path = path_or_headers
|
476
498
|
new(host, port || HTTP.default_port).start {|http|
|
477
499
|
return http.request_get(path, &block)
|
478
500
|
}
|
479
501
|
else
|
480
502
|
uri = uri_or_host
|
503
|
+
headers = path_or_headers
|
481
504
|
start(uri.hostname, uri.port,
|
482
505
|
:use_ssl => uri.scheme == 'https') {|http|
|
483
|
-
return http.request_get(uri, &block)
|
506
|
+
return http.request_get(uri, headers, &block)
|
484
507
|
}
|
485
508
|
end
|
486
509
|
end
|
@@ -509,14 +532,13 @@ module Net #:nodoc:
|
|
509
532
|
#
|
510
533
|
# { "cmd" => "search", "q" => "ruby", "max" => "50" }
|
511
534
|
#
|
512
|
-
# This method also does Basic Authentication
|
535
|
+
# This method also does Basic Authentication if and only if +url+.user exists.
|
513
536
|
# But userinfo for authentication is deprecated (RFC3986).
|
514
537
|
# So this feature will be removed.
|
515
538
|
#
|
516
539
|
# Example:
|
517
540
|
#
|
518
541
|
# require 'net/http'
|
519
|
-
# require 'uri'
|
520
542
|
#
|
521
543
|
# Net::HTTP.post_form URI('http://www.example.com/search.cgi'),
|
522
544
|
# { "q" => "ruby", "max" => "50" }
|
@@ -571,7 +593,7 @@ module Net #:nodoc:
|
|
571
593
|
# _opt_ :: optional hash
|
572
594
|
#
|
573
595
|
# _opt_ sets following values by its accessor.
|
574
|
-
# The keys are ipaddr, ca_file, ca_path, cert, cert_store, ciphers,
|
596
|
+
# The keys are ipaddr, ca_file, ca_path, cert, cert_store, ciphers, keep_alive_timeout,
|
575
597
|
# close_on_empty_response, key, open_timeout, read_timeout, write_timeout, ssl_timeout,
|
576
598
|
# ssl_version, use_ssl, verify_callback, verify_depth and verify_mode.
|
577
599
|
# If you set :use_ssl as true, you can use https and default value of
|
@@ -676,6 +698,8 @@ module Net #:nodoc:
|
|
676
698
|
@continue_timeout = nil
|
677
699
|
@max_retries = 1
|
678
700
|
@debug_output = nil
|
701
|
+
@response_body_encoding = false
|
702
|
+
@ignore_eof = true
|
679
703
|
|
680
704
|
@proxy_from_env = false
|
681
705
|
@proxy_uri = nil
|
@@ -723,6 +747,18 @@ module Net #:nodoc:
|
|
723
747
|
# The local port used to establish the connection.
|
724
748
|
attr_accessor :local_port
|
725
749
|
|
750
|
+
# The encoding to use for the response body. If Encoding, uses the
|
751
|
+
# specified encoding. If other true value, tries to detect the response
|
752
|
+
# body encoding.
|
753
|
+
attr_reader :response_body_encoding
|
754
|
+
|
755
|
+
# Set the encoding to use for the response body. If given a String, find
|
756
|
+
# the related Encoding.
|
757
|
+
def response_body_encoding=(value)
|
758
|
+
value = Encoding.find(value) if value.is_a?(String)
|
759
|
+
@response_body_encoding = value
|
760
|
+
end
|
761
|
+
|
726
762
|
attr_writer :proxy_from_env
|
727
763
|
attr_writer :proxy_address
|
728
764
|
attr_writer :proxy_port
|
@@ -804,6 +840,10 @@ module Net #:nodoc:
|
|
804
840
|
# The default value is 2 seconds.
|
805
841
|
attr_accessor :keep_alive_timeout
|
806
842
|
|
843
|
+
# Whether to ignore EOF when reading response bodies with defined
|
844
|
+
# Content-Length headers. For backwards compatibility, the default is true.
|
845
|
+
attr_accessor :ignore_eof
|
846
|
+
|
807
847
|
# Returns true if the HTTP session has been started.
|
808
848
|
def started?
|
809
849
|
@started
|
@@ -836,6 +876,7 @@ module Net #:nodoc:
|
|
836
876
|
:@cert,
|
837
877
|
:@cert_store,
|
838
878
|
:@ciphers,
|
879
|
+
:@extra_chain_cert,
|
839
880
|
:@key,
|
840
881
|
:@ssl_timeout,
|
841
882
|
:@ssl_version,
|
@@ -852,6 +893,7 @@ module Net #:nodoc:
|
|
852
893
|
:cert,
|
853
894
|
:cert_store,
|
854
895
|
:ciphers,
|
896
|
+
:extra_chain_cert,
|
855
897
|
:key,
|
856
898
|
:ssl_timeout,
|
857
899
|
:ssl_version,
|
@@ -882,6 +924,10 @@ module Net #:nodoc:
|
|
882
924
|
# Sets the available ciphers. See OpenSSL::SSL::SSLContext#ciphers=
|
883
925
|
attr_accessor :ciphers
|
884
926
|
|
927
|
+
# Sets the extra X509 certificates to be added to the certificate chain.
|
928
|
+
# See OpenSSL::SSL::SSLContext#extra_chain_cert=
|
929
|
+
attr_accessor :extra_chain_cert
|
930
|
+
|
885
931
|
# Sets an OpenSSL::PKey::RSA or OpenSSL::PKey::DSA object.
|
886
932
|
# (This method is appeared in Michal Rokos's OpenSSL extension.)
|
887
933
|
attr_accessor :key
|
@@ -952,6 +998,12 @@ module Net #:nodoc:
|
|
952
998
|
private :do_start
|
953
999
|
|
954
1000
|
def connect
|
1001
|
+
if use_ssl?
|
1002
|
+
# reference early to load OpenSSL before connecting,
|
1003
|
+
# as OpenSSL may take time to load.
|
1004
|
+
@ssl_context = OpenSSL::SSL::SSLContext.new
|
1005
|
+
end
|
1006
|
+
|
955
1007
|
if proxy? then
|
956
1008
|
conn_addr = proxy_address
|
957
1009
|
conn_port = proxy_port
|
@@ -960,17 +1012,16 @@ module Net #:nodoc:
|
|
960
1012
|
conn_port = port
|
961
1013
|
end
|
962
1014
|
|
963
|
-
|
964
|
-
|
965
|
-
|
966
|
-
|
967
|
-
|
968
|
-
|
969
|
-
|
970
|
-
|
971
|
-
}
|
1015
|
+
debug "opening connection to #{conn_addr}:#{conn_port}..."
|
1016
|
+
begin
|
1017
|
+
s = Socket.tcp conn_addr, conn_port, @local_host, @local_port, connect_timeout: @open_timeout
|
1018
|
+
rescue => e
|
1019
|
+
e = Net::OpenTimeout.new(e) if e.is_a?(Errno::ETIMEDOUT) #for compatibility with previous versions
|
1020
|
+
raise e, "Failed to open TCP connection to " +
|
1021
|
+
"#{conn_addr}:#{conn_port} (#{e.message})"
|
1022
|
+
end
|
972
1023
|
s.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1)
|
973
|
-
|
1024
|
+
debug "opened"
|
974
1025
|
if use_ssl?
|
975
1026
|
if proxy?
|
976
1027
|
plain_sock = BufferedIO.new(s, read_timeout: @read_timeout,
|
@@ -999,35 +1050,56 @@ module Net #:nodoc:
|
|
999
1050
|
end
|
1000
1051
|
end
|
1001
1052
|
end
|
1002
|
-
@ssl_context = OpenSSL::SSL::SSLContext.new
|
1003
1053
|
@ssl_context.set_params(ssl_parameters)
|
1004
|
-
@ssl_context.session_cache_mode
|
1005
|
-
|
1006
|
-
|
1007
|
-
|
1008
|
-
|
1054
|
+
unless @ssl_context.session_cache_mode.nil? # a dummy method on JRuby
|
1055
|
+
@ssl_context.session_cache_mode =
|
1056
|
+
OpenSSL::SSL::SSLContext::SESSION_CACHE_CLIENT |
|
1057
|
+
OpenSSL::SSL::SSLContext::SESSION_CACHE_NO_INTERNAL_STORE
|
1058
|
+
end
|
1059
|
+
if @ssl_context.respond_to?(:session_new_cb) # not implemented under JRuby
|
1060
|
+
@ssl_context.session_new_cb = proc {|sock, sess| @ssl_session = sess }
|
1061
|
+
end
|
1062
|
+
|
1063
|
+
# Still do the post_connection_check below even if connecting
|
1064
|
+
# to IP address
|
1065
|
+
verify_hostname = @ssl_context.verify_hostname
|
1066
|
+
|
1067
|
+
# Server Name Indication (SNI) RFC 3546/6066
|
1068
|
+
case @address
|
1069
|
+
when Resolv::IPv4::Regex, Resolv::IPv6::Regex
|
1070
|
+
# don't set SNI, as IP addresses in SNI is not valid
|
1071
|
+
# per RFC 6066, section 3.
|
1072
|
+
|
1073
|
+
# Avoid openssl warning
|
1074
|
+
@ssl_context.verify_hostname = false
|
1075
|
+
else
|
1076
|
+
ssl_host_address = @address
|
1077
|
+
end
|
1078
|
+
|
1079
|
+
debug "starting SSL for #{conn_addr}:#{conn_port}..."
|
1009
1080
|
s = OpenSSL::SSL::SSLSocket.new(s, @ssl_context)
|
1010
1081
|
s.sync_close = true
|
1011
|
-
|
1012
|
-
|
1082
|
+
s.hostname = ssl_host_address if s.respond_to?(:hostname=) && ssl_host_address
|
1083
|
+
|
1013
1084
|
if @ssl_session and
|
1014
1085
|
Process.clock_gettime(Process::CLOCK_REALTIME) < @ssl_session.time.to_f + @ssl_session.timeout
|
1015
1086
|
s.session = @ssl_session
|
1016
1087
|
end
|
1017
1088
|
ssl_socket_connect(s, @open_timeout)
|
1018
|
-
if (@ssl_context.verify_mode != OpenSSL::SSL::VERIFY_NONE) &&
|
1089
|
+
if (@ssl_context.verify_mode != OpenSSL::SSL::VERIFY_NONE) && verify_hostname
|
1019
1090
|
s.post_connection_check(@address)
|
1020
1091
|
end
|
1021
|
-
|
1092
|
+
debug "SSL established, protocol: #{s.ssl_version}, cipher: #{s.cipher[0]}"
|
1022
1093
|
end
|
1023
1094
|
@socket = BufferedIO.new(s, read_timeout: @read_timeout,
|
1024
1095
|
write_timeout: @write_timeout,
|
1025
1096
|
continue_timeout: @continue_timeout,
|
1026
1097
|
debug_output: @debug_output)
|
1098
|
+
@last_communicated = nil
|
1027
1099
|
on_connect
|
1028
1100
|
rescue => exception
|
1029
1101
|
if s
|
1030
|
-
|
1102
|
+
debug "Conn close because of connect error #{exception}"
|
1031
1103
|
s.close
|
1032
1104
|
end
|
1033
1105
|
raise
|
@@ -1159,7 +1231,8 @@ module Net #:nodoc:
|
|
1159
1231
|
# The username of the proxy server, if one is configured.
|
1160
1232
|
def proxy_user
|
1161
1233
|
if ENVIRONMENT_VARIABLE_IS_MULTIUSER_SAFE && @proxy_from_env
|
1162
|
-
proxy_uri&.user
|
1234
|
+
user = proxy_uri&.user
|
1235
|
+
unescape(user) if user
|
1163
1236
|
else
|
1164
1237
|
@proxy_user
|
1165
1238
|
end
|
@@ -1168,7 +1241,8 @@ module Net #:nodoc:
|
|
1168
1241
|
# The password of the proxy server, if one is configured.
|
1169
1242
|
def proxy_pass
|
1170
1243
|
if ENVIRONMENT_VARIABLE_IS_MULTIUSER_SAFE && @proxy_from_env
|
1171
|
-
proxy_uri&.password
|
1244
|
+
pass = proxy_uri&.password
|
1245
|
+
unescape(pass) if pass
|
1172
1246
|
else
|
1173
1247
|
@proxy_pass
|
1174
1248
|
end
|
@@ -1179,6 +1253,11 @@ module Net #:nodoc:
|
|
1179
1253
|
|
1180
1254
|
private
|
1181
1255
|
|
1256
|
+
def unescape(value)
|
1257
|
+
require 'cgi/util'
|
1258
|
+
CGI.unescape(value)
|
1259
|
+
end
|
1260
|
+
|
1182
1261
|
# without proxy, obsolete
|
1183
1262
|
|
1184
1263
|
def conn_address # :nodoc:
|
@@ -1535,6 +1614,8 @@ module Net #:nodoc:
|
|
1535
1614
|
begin
|
1536
1615
|
res = HTTPResponse.read_new(@socket)
|
1537
1616
|
res.decode_content = req.decode_content
|
1617
|
+
res.body_encoding = @response_body_encoding
|
1618
|
+
res.ignore_eof = @ignore_eof
|
1538
1619
|
end while res.kind_of?(HTTPInformation)
|
1539
1620
|
|
1540
1621
|
res.uri = req.uri
|
@@ -1554,10 +1635,10 @@ module Net #:nodoc:
|
|
1554
1635
|
if count < max_retries && IDEMPOTENT_METHODS_.include?(req.method)
|
1555
1636
|
count += 1
|
1556
1637
|
@socket.close if @socket
|
1557
|
-
|
1638
|
+
debug "Conn close because of error #{exception}, and retry"
|
1558
1639
|
retry
|
1559
1640
|
end
|
1560
|
-
|
1641
|
+
debug "Conn close because of error #{exception}"
|
1561
1642
|
@socket.close if @socket
|
1562
1643
|
raise
|
1563
1644
|
end
|
@@ -1565,7 +1646,7 @@ module Net #:nodoc:
|
|
1565
1646
|
end_transport req, res
|
1566
1647
|
res
|
1567
1648
|
rescue => exception
|
1568
|
-
|
1649
|
+
debug "Conn close because of error #{exception}"
|
1569
1650
|
@socket.close if @socket
|
1570
1651
|
raise exception
|
1571
1652
|
end
|
@@ -1575,11 +1656,11 @@ module Net #:nodoc:
|
|
1575
1656
|
connect
|
1576
1657
|
elsif @last_communicated
|
1577
1658
|
if @last_communicated + @keep_alive_timeout < Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
1578
|
-
|
1659
|
+
debug 'Conn close because of keep_alive_timeout'
|
1579
1660
|
@socket.close
|
1580
1661
|
connect
|
1581
1662
|
elsif @socket.io.to_io.wait_readable(0) && @socket.eof?
|
1582
|
-
|
1663
|
+
debug "Conn close because of EOF"
|
1583
1664
|
@socket.close
|
1584
1665
|
connect
|
1585
1666
|
end
|
@@ -1597,15 +1678,15 @@ module Net #:nodoc:
|
|
1597
1678
|
@curr_http_version = res.http_version
|
1598
1679
|
@last_communicated = nil
|
1599
1680
|
if @socket.closed?
|
1600
|
-
|
1681
|
+
debug 'Conn socket closed'
|
1601
1682
|
elsif not res.body and @close_on_empty_response
|
1602
|
-
|
1683
|
+
debug 'Conn close'
|
1603
1684
|
@socket.close
|
1604
1685
|
elsif keep_alive?(req, res)
|
1605
|
-
|
1686
|
+
debug 'Conn keep-alive'
|
1606
1687
|
@last_communicated = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
1607
1688
|
else
|
1608
|
-
|
1689
|
+
debug 'Conn close'
|
1609
1690
|
@socket.close
|
1610
1691
|
end
|
1611
1692
|
end
|
@@ -1660,11 +1741,14 @@ module Net #:nodoc:
|
|
1660
1741
|
default_port == port ? addr : "#{addr}:#{port}"
|
1661
1742
|
end
|
1662
1743
|
|
1663
|
-
|
1744
|
+
# Adds a message to debugging output
|
1745
|
+
def debug(msg)
|
1664
1746
|
return unless @debug_output
|
1665
1747
|
@debug_output << msg
|
1666
1748
|
@debug_output << "\n"
|
1667
1749
|
end
|
1750
|
+
|
1751
|
+
alias_method :D, :debug
|
1668
1752
|
end
|
1669
1753
|
|
1670
1754
|
end
|
data/net-http.gemspec
CHANGED
@@ -1,12 +1,15 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
name = File.basename(__FILE__, ".gemspec")
|
4
|
+
version = ["lib", Array.new(name.count("-")+1, "..").join("/")].find do |dir|
|
5
|
+
break File.foreach(File.join(__dir__, dir, "#{name.tr('-', '/')}.rb")) do |line|
|
6
|
+
/^\s*VERSION\s*=\s*"(.*)"/ =~ line and break $1
|
7
|
+
end rescue nil
|
5
8
|
end
|
6
9
|
|
7
10
|
Gem::Specification.new do |spec|
|
8
|
-
spec.name =
|
9
|
-
spec.version =
|
11
|
+
spec.name = name
|
12
|
+
spec.version = version
|
10
13
|
spec.authors = ["NARUSE, Yui"]
|
11
14
|
spec.email = ["naruse@airemix.jp"]
|
12
15
|
|
@@ -14,6 +17,7 @@ Gem::Specification.new do |spec|
|
|
14
17
|
spec.description = %q{HTTP client api for Ruby.}
|
15
18
|
spec.homepage = "https://github.com/ruby/net-http"
|
16
19
|
spec.required_ruby_version = Gem::Requirement.new(">= 2.6.0")
|
20
|
+
spec.licenses = ["Ruby", "BSD-2-Clause"]
|
17
21
|
|
18
22
|
spec.metadata["homepage_uri"] = spec.homepage
|
19
23
|
spec.metadata["source_code_uri"] = spec.homepage
|
@@ -21,9 +25,10 @@ Gem::Specification.new do |spec|
|
|
21
25
|
# Specify which files should be added to the gem when it is released.
|
22
26
|
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
23
27
|
spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
|
24
|
-
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
28
|
+
`git ls-files -z 2>/dev/null`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
25
29
|
end
|
26
30
|
spec.bindir = "exe"
|
27
|
-
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
28
31
|
spec.require_paths = ["lib"]
|
32
|
+
|
33
|
+
spec.add_dependency "uri"
|
29
34
|
end
|
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: net-http
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.2.1.pre1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- NARUSE, Yui
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
12
|
-
dependencies:
|
11
|
+
date: 2022-04-27 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
15
|
+
requirements:
|
16
|
+
- - ">="
|
17
|
+
- !ruby/object:Gem::Version
|
18
|
+
version: '0'
|
19
|
+
name: uri
|
20
|
+
prerelease: false
|
21
|
+
type: :runtime
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
13
27
|
description: HTTP client api for Ruby.
|
14
28
|
email:
|
15
29
|
- naruse@airemix.jp
|
@@ -17,10 +31,11 @@ executables: []
|
|
17
31
|
extensions: []
|
18
32
|
extra_rdoc_files: []
|
19
33
|
files:
|
34
|
+
- ".github/dependabot.yml"
|
20
35
|
- ".github/workflows/test.yml"
|
21
36
|
- ".gitignore"
|
22
37
|
- Gemfile
|
23
|
-
-
|
38
|
+
- LICENSE.txt
|
24
39
|
- README.md
|
25
40
|
- Rakefile
|
26
41
|
- bin/console
|
@@ -36,15 +51,16 @@ files:
|
|
36
51
|
- lib/net/http/response.rb
|
37
52
|
- lib/net/http/responses.rb
|
38
53
|
- lib/net/http/status.rb
|
39
|
-
- lib/net/http/version.rb
|
40
54
|
- lib/net/https.rb
|
41
55
|
- net-http.gemspec
|
42
56
|
homepage: https://github.com/ruby/net-http
|
43
|
-
licenses:
|
57
|
+
licenses:
|
58
|
+
- Ruby
|
59
|
+
- BSD-2-Clause
|
44
60
|
metadata:
|
45
61
|
homepage_uri: https://github.com/ruby/net-http
|
46
62
|
source_code_uri: https://github.com/ruby/net-http
|
47
|
-
post_install_message:
|
63
|
+
post_install_message:
|
48
64
|
rdoc_options: []
|
49
65
|
require_paths:
|
50
66
|
- lib
|
@@ -55,12 +71,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
55
71
|
version: 2.6.0
|
56
72
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
57
73
|
requirements:
|
58
|
-
- - "
|
74
|
+
- - ">"
|
59
75
|
- !ruby/object:Gem::Version
|
60
|
-
version:
|
76
|
+
version: 1.3.1
|
61
77
|
requirements: []
|
62
|
-
rubygems_version: 3.
|
63
|
-
signing_key:
|
78
|
+
rubygems_version: 3.3.3
|
79
|
+
signing_key:
|
64
80
|
specification_version: 4
|
65
81
|
summary: HTTP client api for Ruby.
|
66
82
|
test_files: []
|
data/Gemfile.lock
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
PATH
|
2
|
-
remote: .
|
3
|
-
specs:
|
4
|
-
net-http (0.1.0)
|
5
|
-
|
6
|
-
GEM
|
7
|
-
remote: https://rubygems.org/
|
8
|
-
specs:
|
9
|
-
power_assert (1.1.5)
|
10
|
-
rake (13.0.1)
|
11
|
-
test-unit (3.3.5)
|
12
|
-
power_assert
|
13
|
-
|
14
|
-
PLATFORMS
|
15
|
-
ruby
|
16
|
-
|
17
|
-
DEPENDENCIES
|
18
|
-
net-http!
|
19
|
-
rake
|
20
|
-
test-unit
|
21
|
-
|
22
|
-
BUNDLED WITH
|
23
|
-
2.1.4
|